背景:
emp表中有14条记录:
dept表中4条记录:
salgrade表中有5条记录:
交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积。
例如:下面的语句1和语句2的结果是相同的(均为56条记录)。
语句1:隐式的交叉连接,没有CROSS JOIN。
select empno,ename,sal,dname,loc from emp,dept
select empno,ename,sal,dname,loc from emp CROSS JOIN dept
内连接是根据指定的连接条件进行连接查询,只有满足连接条件的数据才会出现在结果集中。
当执行两个表内连接查询的时,首先在第一个表中查找到第一个记录,然后从头开始扫描第二个表,逐一查找满足条件的记录,找到后将其与第一个表中的的第一个记录拼接形成结果集中的第一个记录。当第二个表被扫描一遍后,再从第一个表中查询第二个记录,然后再从头扫描第二个表,逐一查找满足条件的记录,找到后将其与第一个表中的第二个记录拼接形成结果集中的一个记录。重复执行,知道第一个表中的全部记录都处理完毕为止。
通过两个表具有相同意义的列,可以建立相等连接条件。只有连接列上在两个表中都出现且值相等的行才会出现在查询结果中。
例如,查询10号部门员工的员工号、员工名、工资、部门号和部门名:
SELECT empno,ename,sal,emp.deptno FROM EMP
join DEPT on EMP.DEPTNO = DEPT.DEPTNO and EMP.DEPTNO=10
结果如下图:
小注:
如果左边与右表的关系是一对多的关系,在选出的任一记录中,假若右表有多个记录与其对应,那么,连接后的左表,主键将不再唯一。
典型应用:将存在多关系的引用表放在左表,将存在一关系的被引用表放在右表,通过=号将主外键进行连接,通过对右表设定过滤条件,选出相应的且主键唯一的左表记录。
备注:inner join 是默认的连接方式,可缩写为join。
比如下面两种方式效果是一样的:
SELECT * FROM emp,dept
WHERE emp.deptno=dept.deptno;
SELECT * FROM emp
INNER JOIN dept ON dept.deptno=emp.deptno;
如果连接条件中的运算符不是等号而是其他关系的运算符,这成为不相等连接。
例如,查询10号部门员工的工资等级:
select empno,ename,sal,grade
from emp
join salgrade
on sal>losal and sal
结果如下图:
自身连接是指在同一个表或者视图中进行连接,相当于同一个表作为两个或多个表使用。
例如:查询所有员工的员工号、员工名与该员工领导的员工名、员工号:
select work.empno,work.ename,manager.empno,manager.ename
from emp work
join emp manager
on work.mgr=manager.empno
结果如下图:
外连接是指在内连接的基础上,将某个连接表中不符合连接条件的记录加入到结果集中。
在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。 如果基表的数据在另一张表没有记录。 那么在相关联的结果集行中列显示为空值(NULL)。
左外连接是指在内连接的基础上,将连接操作符左侧表中不符合连接条件的记录加入到结果集中,与之对应的连接操作符右侧表列用NULL填充。
例如,查询10号部门的部门名 、员工号、员工名和所有其他部门的名称:
select dname,empno,ename
from dept
left join emp
on dept.deptno=emp.deptno
and dept.deptno=10;
在这个例子中,首先要保证的是:我要查出10号部门的部门名称,即使10号部门中一个员工也没有,也要显示10号部门所有的部门名称,而部门名称在dept表中,故dept表放在左侧,有匹配数据的前三行就是用Join时,查出的数据,即满足On条件的数据。
结果如下图:
小注:关于left join的个人理解
假如说你有两个表,资金结算单据(JSDJXX)、位信息(DWXX)
一个表用来存放资金结算单据的信息(资金结算单据中肯定有单位嘛,但资金结算单据中得单位信息肯定是编号),另一个表用来存放单位信息(单位表里的数据比如会有:单位编号、单位名称、单位内码等等),现在我要查资金结算单据的信息,同时我又想让资金结算单据中的单位信息不显示编号,而是显示单位名称,这时候,我就需要用left join来关联单位信息表,因为我需要的数据是资金结算单据中的信息,即使在单位信息表表查不到某个单位编号对应的单位名称,这条数据我还是要显示的嘛,所以用left join而不是join。
SELECT JSDJXX_DWBH,DWXX_DWMC
from JSDJXX
left JOIN DWXX ON JSDJXX_DWBH = DWXX_DWBH
通过执行上面的SQL,获取ds,我就可以在往Gridcontrol上绑定数据的时候,绑定单位名称。
比如:
SELECT JSDJXX_DWBH,DWXX_DWMC as DWMC
from JSDJXX
left JOIN DWXX ON JSDJXX_DWBH = DWXX_DWBH
在Dev Gridcontrol上绑定列名的时候就可以用DWMC,即可。
右外连接是指在内连接的基础上,将连接操作符右侧表中不符合连接条件的记录加入到结果集中,与之对应的连接操作符左侧表列用NULL填充。
例如,查询20号部门的部门名称及其员工号、员工名和所有其他部门的员工号、员工名:
select empno ,ename,dname
from dept
right join emp
on dept.deptno=emp.deptno
and dept.deptno=20;
结果如下图:
全外连接是指在内外连接的基础上,将连接操作符两侧表中不符合的记录加入到结果集中。
例如,查询所有的部门名和员工名:
select dname,ename
from emp
full join dept
on emp.deptno=dept.deptno
结果如下图:
1、左右外连接小结:
左外连接(LEFT OUTER JOIN)告诉DBMS生成的结果表中,除了包括匹配行外,还包括JOIN关键字(FROM子句中)左边表的不匹配行。左外连接实际上可以表示为:
左外连接 = 内连接 + 左边表中失配的元组
其中,缺少的右边表中的属性值用NULL表示。
右外连接(RIGHT OUTER JOIN)告诉DBMS生成的结果表中,除了包括匹配行外,还包括JOIN关键字(FROM子句中)右边表的不匹配行。右外连接实际上可以表示为:
右外连接 = 内连接 + 右边表中失配的元组
其中,缺少的左边表中的属性值用NULL表示。
全外连接(FULL OUTER JOIN)告诉DBMS生成的结果表中,除了包括匹配行外,还包括JOIN关键字(FROM子句中)左边表和右边表的不匹配行。全外连接实际上可以表示为:
全外连接 = 内连接 + 左边表中失配的元组 + 右边表中失配的元组。
其中,缺少的左边表或者右边表中的属性值用NULL表示。
2、类似文章推荐:点击打开链接
3、小结
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。