按功能分
- 内连接
- 等值连接
- 非等值连接
- 自连接
- 外连接
- 左外连接
- 右外连接
- 全外连接
- 交叉连接
1. 内连接(INNER JOIN)
获取所有的员工名
和其对应的部门名
SELECT e.last_name, d.department_name
FROM employees e INNER JOIN departments dON e.department_id = d.department_id;
查询部门个数>3
的城市名
和部门个数
SELECT city, COUNT(1) 部门个数
FROM departments d INNER JOIN locations lON d.location_id = l.location_id
GROUP BY city
HAVING 部门个数 > 3;
查询员工名、部门名、工种名,并按部门名排序【三表连接】
SELECT last_name, department_name, job_title
FROM employees e INNER JOIN departments d ON e.department_id = d.department_idINNER JOIN jobs jON e.job_id = j.job_id
ORDER BY department_name DESC;
2. 外连接
作用:查询一个表有
,另一个表没有
的记录
然后我们可以分别使用内连接和外连接分别连接beauty
和boys
这两张表,查看结果的差异:
此时我们可以获得如下几张表:
然后我们可以分别使用内连接和外连接分别连接beauty
和boys
这两张表,查看结果的差异:
内连接:
SELECT *
FROM beauty b INNER JOIN boys yON b.boyfriend_id = y.id;
外连接(左外):
SELECT *
FROM beauty b LEFT JOIN boys yON b.boyfriend_id = y.id;
可以发现,当左表(即beauty表)的boyfriend_id字段找不到boys表中对应的id进行连接时,它也仍会保留这一记录,而右表(即boys表)的记录则全部设置为Null。
一句话来说,就是左表的数据不管是否满足连接条件,都至少会保留在最终查询集的一条记录之中。
查找男朋友不在男神表的女神名【左外连接】:
SELECT `name`, boyName
FROM beauty b LEFT JOIN boys yON b.boyfriend_id = y.id
WHERE y.id IS NULL;
【右外连接】
SELECT `name`, boyName
FROM boys y RIGHT JOIN beauty bON b.boyfriend_id=y.id
WHERE y.id IS NULL;
查询没有联系女神
的男生
SELECT `name`, boyName
FROM beauty b RIGHT JOIN boys yON b.boyfriend_id=y.id
WHERE b.id IS NULL;
查询哪个部门
没有员工
SELECT department_name, COUNT(*)
FROM departments d LEFT JOIN employees eON d.department_id = e.department_id
GROUP BY department_name
HAVING COUNT(*)=0;