背景:
emp表中有14条记录:
dept表中4条记录:
salgrade表中有5条记录:
一、交叉连接(CROSS JOIN)
交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积。
例如:下面的语句1和语句2的结果是相同的(均为56条记录)。
语句1:隐式的交叉连接,没有CROSS JOIN。
select empno,ename,sal,dname,loc from emp,dept
语句2:显式的交叉连接,使用CROSS JOIN
select empno,ename,sal,dname,loc from emp CROSS JOIN dept
二、内连接
内连接是根据指定的连接条件进行连接查询,只有满足连接条件的数据才会出现在结果集中。
当执行两个表内连接查询的时,首先在第一个表中查找到第一个记录,然后从头开始扫描第二个表,逐一查找满足条件的记录,找到后将其与第一个表中的的第一个记录拼接形成结果集中的第一个记录。当第二个表被扫描一遍后,再从第一个表中查询第二个记录,然后再从头扫描第二个表,逐一查找满足条件的记录,找到后将其与第一个表中的第二个记录拼接形成结果集中的一个记录。重复执行,知道第一个表中的全部记录都处理完毕为止。
1. 相等连接
通过两个表具有相同意义的列,可以建立相等连接条件。只有连接列上在两个表中都出现且值相等的行才会出现在查询结果中。
例如,查询10号部门员工的员工号、员工名、工资、部门号和部门名:
SELECT empno,ename,sal,emp.deptno FROM EMP
join DEPT on EMP.DEPTNO = DEPT.DEPTNO and EMP.DEPTNO=10
结果如下图:
2、不相等连接
如果连接条件中的运算符不是等号而是其他关系的运算符,这成为不相等连接。
例如,查询10号部门员工的工资等级:
select empno,ename,sal,grade
from emp
join salgrade
on sal>losal and sal
and deptno=10
结果如下图:
3、自身连接
自身连接是指在同一个表或者视图中进行连接,相当于同一个表作为两个或多个表使用。
例如:查询所有员工的员工号、员工名与该员工领导的员工名、员工号:
select work.empno,work.ename,manager.empno,manager.ename
from emp work
join emp manager
on work.mgr=manager.empno
结果如下图:
三、外连接
外连接是指在内连接的基础上,将某个连接表中不符合连接条件的记录加入到结果集中。
在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。 如果基表的数据在另一张表没有记录。 那么在相关联的结果集行中列显示为空值(NULL)。
1、 左外连接
左外连接是指在内连接的基础上,将连接操作符左侧表中不符合连接条件的记录加入到结果集中,与之对应的连接操作符右侧表列用NULL填充。
例如,查询10号部门的部门名 、员工号、员工名和所有其他部门的名称:
select dname,empno,ename
from dept
left join emp
on dept.deptno=emp.deptno
and dept.deptno=10;
结果如下图:
2、 右外连接
右外连接是指在内连接的基础上,将连接操作符右侧表中不符合连接条件的记录加入到结果集中,与之对应的连接操作符左侧表列用NULL填充。
例如,查询20号部门的部门名称及其员工号、员工名和所有其他部门的员工号、员工名:
select empno ,ename,dname
from dept
right join emp
on dept.deptno=emp.deptno
and dept.deptno=20;
结果如下图:
3、 全连接
全外连接是指在内外连接的基础上,将连接操作符两侧表中不符合的记录加入到结果集中。
例如,查询所有的部门名和员工名:
select dname,ename
from emp
full join dept
on emp.deptno=dept.deptno
结果如下图: