SQL92、SQL99中的多表连接查询区别
SQL99多表连接查询
1. cross join(交叉连接)
交叉连接会产生一个笛卡尔积
select * from emp cross join dept;
在笛卡尔积中, 有很多数据是无意义的, 所以需要消除, 可以通过 where 子句来消除
select * from emp cross join dept where
emp.deptno=dept.deptno;
可以在查询时, 给表格起别名(如果不是e.*,则后面必须直接跟from,否则会报错)
select e.*, dname, loc from emp e cross join dept d
where e.deptno=d.deptno;
2. natural join(自然连接)
natural join 用于针对多张表的同名字段进行等值连接
select * from emp e natural join dept d;
特点: a) 在自然连接时, 自动进行所有同名列的等值连接, 不需 要写连接的条件 b) 同名列只显示一列, 而且在使用时, 不能加表前缀(e.、d.、) 查询所有员工的姓名, 部门编号和部门名称
select e.ename, deptno, d.dname from emp e natural join dept d;
3. inner join(内连接)
inner可以省略不写
select * from emp inner join dept
on emp.deptno=dept.deptno;
4. using 子句
用来指定进行等值连接的同名字段, 针对自然连接提供的. 同名字段依然不能使用表前缀.
a) 查询 20 部门员工的姓名, 工资, 部门编号和部门名称
select e.ename, e.sal, deptno, d.dname from emp e
natural join dept d where deptno=20;
select e.ename, e.sal, deptno, d.dname from emp e
join dept d using (deptno) where deptno=20;
5. on 子句
on 子句是使用非常广泛的子句, 它可以被用来指定连接的(特别是非等值连接) 条件. 用于将过滤条件和关联条件分开.
a) 查询所有员工的姓名, 工资和工资等级
select e.ename, e.sal, s.grade from emp e join
salgrade s on e.sal>=s.losal and e.sal<=s.hisal;
select e.ename, e.sal, s.grade from emp e join
salgrade s on e.sal between s.losal and s.hisal;
b) 查询 30 部门员工的编号, 姓名, 部门名称和所在地
select e.empno, e.ename, d.dname, d.loc
from emp e
join dept d
on e.deptno=d.deptno
where d.deptno=30;
c) 查询所有员工的姓名, 部门名称, 工资及工资等级
N 张表连接, 至少需要 N-1 个连接条件
select e.ename, d.dname, e.sal, s.grade
from emp e
join dept d
on e.deptno=d.deptno
join salgrade s
on e.sal between s.losal and s.hisal;
6. 外连接
外连接除了能显示满足连接条件的数据以外, 还用于显示不 满足连接条件的数据
左外连接
left [outer] join, 表示左外连接, 可以显示左表中不满足 连接条件的数据
select e.ename, e.job, d.deptno, d.dname, d.loc
from dept d
left join emp e
on e.deptno=d.deptno;
右外连接
right [outer] join, 表示右外连接, 可以显示右表中不满 足连接条件的数据
select e.ename, e.job, d.deptno, d.dname, d.loc
from emp e
right join dept d
on e.deptno=d.deptno;
全外连接
full [outer] join, 表示全外连接, 可以显示左右两表中不满足连接条件的数据
select e1.empno, e1.ename, e2.empno, e2.ename
from emp e1
full join emp e2
on e1.mgr=e2.empno
order by e1.empno;
自连接
自连接是发生在同一个表格中的连接
a) 查询所有员工的编号, 姓名和领导的编号及姓名
select e1.empno, e1.ename, e2.empno, e2.ename
from emp e1
join emp e2
on e1.mgr=e2.empno
order by e1.empno;
b) 查询所有员工的编号, 姓名和领导的编号及姓名, 并显示 没有领导的员工信息
select e1.empno, e1.ename, e2.empno, e2.ename
from emp e1
left join emp e2
on e1.mgr=e2.empno
order by e1.empno;
SQL92多表连接查询
1 笛卡尔积
多张表通过逗号分隔
select * from emp e, dept d;
消除无意义数据
select * from emp e, dept d where e.deptno=d.deptno;
2 等值连接
a) 查询 10 部门员工的姓名, 职位和部门名称
select e.ename, e.job, d.dname from emp e, dept d where
e.deptno=d.deptno and d.deptno=10;
3 非等值连接
a) 查询所有员工的姓名, 工资和工资等级
select e.ename, e.sal, s.grade from emp e, salgrade
s where e.sal between s.losal and s.hisal;
4 外连接
通过”(+)”符号实现外连接
左外连接
select e.ename, d.deptno, d.dname, d.loc
from emp e, dept d
where d.deptno=e.deptno(+);
右外连接
select e.ename, d.deptno, d.dname, d.loc
from emp e, dept d
where e.deptno(+)=d.deptno;
自连接
select e1.empno, e1.ename, e2.empno, e2.ename
from emp e1, emp e2
where e1.mgr=e2.empno(+);
- Java多态性的“飘渺之旅”
- Java动态代理一览笔录
- activiti-explorer部署笔记
- 没有准考证号我是如何暴力查询英语六级成绩的
- asp.net web api 2.2 基础框架(带例子)
- 走近科学:如何一步一步解码复杂的恶意软件
- OpenAI 开源机器人模拟 Python 库:优化API接口提升400%处理速度
- 远控木马上演白利用偷天神技:揭秘假破解工具背后的盗刷暗流
- 设计模式学习(三): 装饰者模式 (附C#实现)
- 浅谈非PE的攻击技巧
- hbase源码系列(十)HLog与日志恢复
- hbase源码系列(六)HMaster启动过程
- 如何写好一篇漏洞报告(国外篇)
- hbase源码系列(八)从Snapshot恢复表
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- hadoop伪分布式之启动HDFS并运行MR程序(WordCount)
- 细品Reids的HyperLogLog数据结构
- 布隆过滤器与缓存击穿
- spring之通过注解方式配置Bean(二)
- 【python-leetcode103-树的宽度遍历】二叉树的锯齿形层次遍历
- 图卷积网络(GCN)python实现
- hadoop伪分布式之配置yarn并运行MR程序(WordCount)
- 【python-leetcode637-树的宽度遍历】二叉树的层平均值
- graphSAGE的python实现
- 【python-leetcode111-树的宽度遍历】二叉树的最小深度
- 基于TypeScript封装Axios笔记(四)
- spring之泛型依赖注入
- 【python-leetcode113-树的深度遍历】路径总和Ⅱ
- spring之为什么要使用AOP(面向切面编程)?
- useContext更佳实践