MYSQL的外连接

两个表或多个表做选择操作时,形成的关系会出现以下三种情况,我们先给出两张表: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而已

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值