两个表或多个表做选择操作时,形成的关系会出现以下三种情况,我们先给出两张表:T_SY_LENGTH(ID,TJMONTH,LENGTH)学习时长表,其中ID为学习员工的ID(参照员工表中ID)、TJMONTH为月份,LENGTH为学习时长(分钟)
T_SY_STAFF(ID,NAME)员工信息表,ID为员工ID,NAME是员工姓名
笛卡尔积
如果我们对表不做任何连接条件时,我们得到的新的关系就是两个关系做笛卡尔积。如员工表和学习时长表不做连接时,我们sql语句的写法为
SELECT *
FROM T_SY_STAFF,T_SY_LENGTH
得到新关系的记录数为32*35=1120,即T_SY_STAFF的记录数32乘以T_SY_LENGTH的记录数35.
内连接:
我们通过对这两个关系做等值连接,形成一个新的关系,就是内连接。内连接的语法为
SELECT *
FROM T_SY_STAFF a INNER JOIN T_SY_LENGTH b ON a.id=b.id
或者
SELECT *
FROM T_SY_STAFF a, T_SY_LENGTH b
WHERE a.id=b.id
这两种写法是等效的,建议使用第二种写法
外连接
在使用内连接时,我们会丢失一些记录,如T_SY_STAFF总共有35个员工,其中20个员工参与学习了,在T_SY_LENGTH表中有记录,15个员工没有参与学习,T_SY_LENGTH表中没有记录,这时这15个员工的学习情况就丢失了。当我们需要统计所有的员工的学习时长时,内连接就不能满足要求,就需要使用一种特殊的等值连接——外连接,外连接分左外连接、右外连接和外连接。左外连接就是把左边表的没有匹配上的元祖补齐,新关系中右边表的元祖置空值; 右外连接就是把右边表的没有匹配上的元祖补齐,新关系中左边表的元祖置空值; 外连接就是把两边的没有匹配上的元祖补齐,没有匹配上的属性置空。以上关系为例,统计所有员工的学习情况,代码为:
SELECT a.name,a.id,IFNULL(SUM(b.LENGTH),0)
FROM T_SY_STAFF a LEFT JOIN T_SY_LENGTH b ON a.id=b.id
GROUP BY a.name,a.id
或者
SELECT b.name,b.id,IFNULL(SUM(a.LENGTH),0)
FROM T_SY_LENGTH a RIGHT JOIN T_SY_STAFF b ON a.id=b.id
GROUP BY b.name,b.id
这样所有员工的学习状况均统计出来了,没有参与学习的员工学习时长为0而已