文章目录
10、连接查询(外连接)
-
应用场景:用于查询一个表中有,另一个表没有的记录
-
特点:
1、外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示 null
外连接查询结果=内连接结果 + 主表中有而从表没有的记录
2、左外连接,left join左边的是主表
右外连接,right join右边的是主表
3、左外和右外交换两个表的顺序,可以实现同样的效果
4、全外连接 = 内连接的结果 + 表1中有但表2没有的+ 表2有但表1没有的
10.1、引入:查询男朋友不在男神表的的女神名
SELECT * FROM beauty;
SELECT * FROM boys;
SELECT b.name
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.`boyfriend_id` = bo.`id`
WHERE bo.`id` IS NULL;
10.2、案例1:查询哪个部门没有员工
#左外
SELECT d.* , e.`employee_id`
FROM departments d
LEFT OUTER JOIN employees e
ON d.`department_id` = e.`department_id`
WHERE e.`employee_id` IS NULL;
#右外
SELECT d.*,e.`employee_id`
FROM employees e
RIGHT OUTER JOIN departments d
ON d.`department_id` = e.`department_id`
WHERE e.`employee_id` IS NULL;
10.3、全外(Mysql 不支持这个,但别的数据库语言支持)
USER girls;
SELECT b.* ,bo.*
FROM beauty b
FULL OUTER JOIN boys bo
ON b.boyfriend_id = bo.id
10.4、交叉连接
SELECT b.* , bo.*
FROM beauty b
CROSS JOIN boys bo;
- 总结
功能:sql99支持的较多
可读性:sql99实现连接条件和筛选条件的分享,可读性较高
10.5、练习题目
#1、查询编号 > 3的女神的男朋友信息,如果有则列出详细,如果没有,用NULl填充
SELECT b.id , b.name ,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.`boyfriend_id` = bo.id
WHERE b.id > 3;
#2、查询哪个城市没有部门(部门为主)
SELECT d.department_name ,l.city
FROM locations l
LEFT OUTER JOIN departments d
ON d.`location_id` = l.`location_id`
WHERE d.`department_name` IS NULL
#3、查询部门名为SAL或IT的员工信息
#下面是以 departments 为主表
SELECT d.department_name , e.*
FROM departments d
LEFT OUTER JOIN employees e
ON d.`department_id` = e.`department_id`
WHERE d.`department_name` IN ('SAL','IT')