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