连接查询分类
根据语法出现年代划分:
SQL92(DBA,数据库管理)、 SQL99
根据表的连接方式来划分:
- 内连接:
- 等值连接
- 非等值连接
- 直连接
- 外连接:
- 左外连接(左连接)
- 右外连接(右连接)
- 全连接
笛卡尔积现象
笛卡尔乘积现象:
案例:找出每一个员工的部门名,要求显示员工名和部门名 找出每一个员工对应的部门:【EMP】
找出编号对应部门:【dept】
当两个表进行联合查询时,在 EMP 表取 enamel,在 dept 取 dname:
因为没有添加筛选条件,所以查询时,ename 会和每个 dname 进行组合并进行输出,输出的条数时 14*4 为 56 条。
TIP
两张表联合查询没有任何条件限制的话,最终查询结果条数是两个表的记录的成绩乘积,这种现象被称为笛卡尔积现象
如何避免:
加条件进行限制。
增加限制条件也不能避免笛卡尔积现象,不会减少记录的匹配次数,次数不会变。 只不过显示的记录是有效记录
增加限制条件:【SQL92写法】
匹配时还是逐条进行匹配,但是只有当两个表中的DEPTNO相同时才会进行显示,反之进行过滤。
内连接
等值连接
最大的特点是:条件是等量关系。
SQL99:
Jion ... on:
。。。
表A
(inner) Join
表B
On
连接条件
Where
。。。
inner可省略,带inner可读性更好 SQL99语法结构更清晰,表的连接条件和后来的where条件进行了分离
案例:查询每个员工部门名称,要求显示员工名和部门名
非等值连接
特点:来连接条件中的关系是非等量关系的。
案例:找出每个员工的工资等级,要求显示员工名、工资、工资等级。
自连接
特点:一张表看作两张表,自己连自己
案例:找出每个员工的上级领导,要求显示员工名和对应的领导名
外连接
什么外连接,和内连接有什么区别。
内连接:
假设A和B表进行连接,使用内连接连接,凡是A表和B表能匹配上的记录都查询出来,这是内连接,两张表是平等的,两张表没有主副之分。
外连接:
假设A和B表进行连接,使用外连接连接,AB两个表有一个是主表,另一个是副表,主要查询主表中的数据,捎带查询副表中的数据,当副表中的数据没有和主表中的数据匹配上时,副表自动模拟出NULL与之匹配。
左外连接:左边的表是主表 右外连接:右边的表是主表
右连接有左连接写法,左连接也有对应的左连接的写法。
TIP
外连接最主要的特点是:主表中的数据全部无条件地显示出来
案例:找出每个员工的上级领导,没有的也要找出来。 左连接:
Select
字段。。。
From
表1
Left / right (outer) join
表2
On
条件
outer (可以省略)
找出哪个部门没有员工;
逻辑:查找两个表中所有的元素,将部门(DEPT)作为主表,并进行筛选,将表中为NULL的元素全部删除,得出结果
三表联查
案例:找出每一个员工的部门名称以及工资等级
emp先和dept进行连接;再和salgrade连接
案例:找出每一个员工的部门名称以及工资等级,以及上级领导
多表查询注意事项
多表查询原理:
在第一张表中拿到第一个字段,和第二张表中的所有指定字段进行匹配
当多表查询时,最好为每个表取一个别名 好处:
执行效率高(不用取每张表中找指定的字段名) 可读性好