DQL:内连接查询与外连接查询

1.内连接查询:实际开发中往往需要针对两张甚至更多张数据表进行操作,而这多张表之间需要使用主键和外键关联在一起,然后使用连接查询来查询多张表中满足要求的数据记录。在SQL99中,连接查询需要使用join关键字实现。内连接查询的类型: cross natural using on (1)交叉连接(0CROSS JOIN):对两个或多个表进行笛卡尔积操作, 笛卡尔积不管是否匹配,都连接。没有实际意义,有理论意义。笛卡尔积便于理解连接查询的原理

select *
from dept  
cross join emp;--表有左右之分   左连接 右连接  
-- dept表4条记录
-- emp表14条记录 ,一共14*4=56条记录

(2)自然连接(natural join):会自动的按照所有的同名列进行匹配,并且同名列只显示一次 查看员工的编号,姓名,部门编号,部门名称(两张表通过部门编号deptno关联)

select e.empno,e.ename,deptno,dname -- 自然连接中不能使用表明前缀(例如deptno)
from emp e
natural join dept d

自然连接的缺点:会自动的按照所有的同名列进行匹配,自然连接无法进行某一个同名列的匹配。 需要用到using子句 (3)using子句

select e.empno,e.ename,deptno,d.dname
from emp e
join dept d
using(deptno)

natural、using的缺点:都必须有同名列 ,前提 连接查询要求两个表必须有关联列(比如emp的deptno和dept的deptno),若不同名 则需要用on子句 (4)on子句 :关联列名不一样时使用using子句

select e.empno,e.ename,d.deptno,d.dname -- 注意:关联列必须使用前缀(d.deptno或)
from emp e
join dept d
on(e.deptno=e.deptno)
where sal > 2000

总结:开发中尽量使用on子句 ,不管是否有同名列,都可以使用;虽然稍显复杂,但是可读性高 SQL99连接查询的优点:连接条件和筛选条件是分开 连接条件:on (e.deptno = d.deptno) using(deptno) natural cross 筛选条件 where sal > 2000 SQL92中 连接条件和筛选条件没有分开 2.外连接查询:与内连接不同,外连接不仅显示匹配的数据,也会显示部分或全部不匹配的数据 (1)左外连接:除了显示匹配的数据,还要显示左表的不匹配数据(显示左表的所有数据) 现在把员工名称为"scott"的deptno设为null,当进行左外连接时,即使scott没有deptno,但含有的scott这条记录仍会被查询显示,即显示左表的全部信息(前提:emp表是左表)

select * 
from emp e
left join dept d
on(d.deptno=e.deptno)

(2)右外连接:除了显示匹配的数据之外,还要显示右表中不匹配的数据 dept表中有部门编号为40的,而emp表中没有。进行右外连接后,将deptno=40的这条记录保存(前提dept表为右表)

select *
from emp  e  
right join dept d 
on(e.deptno=d.deptno)

(3)全外连接:即显示匹配的数据,也显示左右表不匹配的数据 注意:full outer join MySQL目前为止仍旧没有支持全外连接,可以用union或union all关键字连接,其中union进行了去重,而union all未进行去重

select * 
from emp e
left join dept d
on (d.deptno=e.deptno)
union -- 并集 去重
select * 
from emp e
right join dept d
on(e.deptno=d.deptno)
select * 
from emp e
left join dept d
on (d.deptno=e.deptno)
union all  -- 并集 未去重
select * 
from emp e
right join dept d
on(e.deptno=d.deptno)

注意:union all效率更高,如果没有去重的要求尽量使用union all

经验分享 程序员 微信小程序 职场和发展