MySQL基础篇补充 | 多表查询中使用SQL99实现7种JOIN操作、SQL99语法新特性

目录

一:多表查询中使用SQL99实现7种JOIN操作 

二:SQL99语法新特性

1. 自然连接Natural

2. USING连接


一:多表查询中使用SQL99实现7种JOIN操作 

在多表查询中,除了遇到最多的内连接、左外连接和右外连接,还有其它的连接方式;接下来就聊聊其它的连接方式,如下图:  ​​​​​​

并且在正式讲解之前,需要先了解UNION的使用,因为有些结果集我们可以使用其它结果集合并的方式得到!

UNION的使用

合并查询结果:利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同,并且相互对应。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。

语法格式:

SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2

UNION操作符:返回两个查询的结果集的并集,去除重复记录。

UNION ALL操作符:返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。

注意:执行UNION ALL语句时所需要的资源比UNION语句少。如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率。  

首先查询三张表:

员工表emp

部门表dept

等级表salgrade

1. 内连接 A∩B---》对应上图3

需求:找出每个员工的上级领导?(不包括上级领导为null的King)

SELECT e1.ename '员工',e2.ename '领导'
FROM emp e1
INNER JOIN emp e2
ON e1.mgr = e2.empno;

执行结果:13条数据,只有e1表和e2表ON中等值关系能对上才会显示,相当于A∩B

2. 左外连接---》对应上图1

需求:找出每个员工的上级领导?(所有员工必须全部查询出来包括King)

select e1.ename '员工',e2.ename '领导'
from emp e1
Left outer join emp e2
on e1.mgr = e2.empno;

执行结果:14条数据,此时相当于e1表是主表,e2是副表,主表的内容会全部显示;所以KING虽然没有上级领导也会显示

3. 右外连接---》对应图2

需求:找出每个员工的上级领导?(所有员工必须全部查询出来包括King)

SELECT e1.ename '员工',e2.ename '领导'
FROM emp e2
RIGHT OUTER JOIN emp e1
ON e1.mgr = e2.empno;

执行结果:14条数据,和左外连接差不多,此时还是e1是主表,e2是副表;因为是右外连接,此时把原来两张表的位置调换一下即可

4. 左中图 A - A∩B ---》对应图4

需求:取出上级领导为NULL的员工

SELECT e1.ename '员工',e2.ename '领导'
FROM emp e1
LEFT OUTER JOIN emp e2
ON e1.mgr = e2.empno
WHERE e2.empno IS NULL;

执行结果:前面我们使用左外连接取出所有的员工对应的领导,所以这里在使用where加一个限制条件就能取出上级领导为NULL的员工;就等同于A - A∩B

5. 右中图 B-A∩B ---》对应图5

需求:取出上级领导为NULL的员工

SELECT e1.ename '员工',e2.ename '领导'
FROM emp e2
RIGHT OUTER JOIN emp e1
ON e1.mgr = e2.empno
WHERE e2.empno IS NULL;

6. 满连接---》对应图6

对于满连接我们可以使用UNION ALL把 “图1和图5” 或者 “图2和图4”拼接在一起就能得到!

SELECT e1.ename '员工',e2.ename '领导'
FROM emp e1
LEFT OUTER JOIN emp e2
ON e1.mgr = e2.empno;
UNION ALL
SELECT e1.ename '员工',e2.ename '领导'
FROM emp e2
RIGHT OUTER JOIN emp e1
ON e1.mgr = e2.empno
WHERE e2.empno IS NULL;

7. 右下图--》对应图7

使用UNION ALL把 “图4和图5” 拼接在一起就能得到!

SELECT e1.ename '员工',e2.ename '领导'
FROM emp e1
LEFT OUTER JOIN emp e2
ON e1.mgr = e2.empno
WHERE e2.empno IS NULL;
UNION ALL
SELECT e1.ename '员工',e2.ename '领导'
FROM emp e2
RIGHT OUTER JOIN emp e1
ON e1.mgr = e2.empno
WHERE e2.empno IS NULL;

注:上面我使用的是表的自连接,例子不太恰当!主要理解原理会掌握使用即可! 

二:SQL99语法新特性

1. 自然连接Natural

SQL99 在 SQL92 的基础上提供了一些特殊语法,比如 NATURAL JOIN 用来表示自然连接。我们可以把 自然连接理解为 SQL92 中的等值连接。它会帮你自动查询两张连接表中所有相同的字段 ,然后进行等值连接

需求:显示每个员工信息,并显示所属的部门名称

在SQL92标准中:

SELECT e.ename,d.dname
FROM emp e,dept d
WHERE e.deptno = d.deptno;

在 SQL99 中可以写成:

# 使用join...on
SELECT e.ename,d.dname
FROM emp e
JOIN dept d
ON e.deptno = d.deptno;

# 使用自然连接---就相当于等值连接
SELECT e.ename,d.dname
FROM emp e
NATURAL JOIN dept d;

优缺点:虽然简化了连接操作的代码,但是不够灵活,因为它会把两张表或者多张表中所有相同的字段都关联起来;在实际开发中我们可能只需要某一个字段关联,而不是多个字段!

2. USING连接

①当我们进行连接的时候,SQL99还支持使用 USING 指定数据表里的 同名字段 进行等值连接。但是只能配合JOIN一起使用

②实际上USING是自然连接Natural Join的一种优化,但是必须是同名字段才可以这样使用,例如:表的自连接就无法使用,因为不是同一个字段。

# 使用join...on
SELECT e.ename,d.dname
FROM emp e
JOIN dept d
ON e.deptno = d.deptno;

# 使用USING
SELECT e.ename,d.dname
FROM emp e
JOIN dept d
USING(deptno);

总结表连接的约束条件可以有三种方式:WHERE, ON, USING

①WHERE:适用于所有关联查询。

②ON :只能和JOIN一起使用,只能写关联条件。虽然关联条件可以并到WHERE中和其他条件一起写,但分开写可读性更好。

③USING:只能和JOIN一起使用,而且要求两个关联字段在关联表中名称一致,而且只能表示关联字段值相等。

猜你喜欢

转载自blog.csdn.net/m0_61933976/article/details/130482085
今日推荐