SQL92、SQL99中的多表连接查询区别

简介: 盘点在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(+);

相关文章
|
4天前
|
SQL
sql语句加正则 简化查询
sql语句加正则 简化查询
17 0
sql语句加正则 简化查询
|
4天前
|
SQL 关系型数据库 MySQL
mysql一条sql查询出多个统计结果
mysql一条sql查询出多个统计结果
17 0
|
2天前
|
SQL 关系型数据库 MySQL
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
MYSQL根据查询结果删除sql 去除重复id 新增对比前一条与后一条数据 去重3种方法​ 窗口函数
|
4天前
|
SQL Java 关系型数据库
Mybatis多表关联查询与动态SQL(下)
Mybatis多表关联查询与动态SQL
18 0
|
4天前
|
SQL Java 数据库连接
Mybatis多表关联查询与动态SQL(上)
Mybatis多表关联查询与动态SQL
9 0
|
4天前
|
SQL Java 数据库连接
JDBC的连接参数的设置导致rowid自动添加到sql
JDBC的连接参数的设置导致rowid自动添加到sql
12 1
|
2天前
|
SQL 存储 数据处理
实时计算 Flink版产品使用合集之flink-connector-mysql-cdc 和 flink-sql-connector-mysql-cdc有什么区别
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
12 1
|
4天前
|
SQL 分布式计算 DataWorks
实时数仓 Hologres产品使用合集之查询分区表的生命周期(即之前设置的'auto_partitioning.num_retention'值)的SQL语句,可以使用什么查询
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
17 0
|
4天前
|
SQL 前端开发
基于jeecgboot复杂sql查询的列表自定义列实现
基于jeecgboot复杂sql查询的列表自定义列实现
11 0
|
4天前
|
SQL Java 数据库连接
MyBatis #与$的区别以及动态SQL
MyBatis #与$的区别以及动态SQL
13 0