主要是想记录一下多表查询
emp表中的dept_id 是 dept表中的外键和 id相对应
一、内连接 (就比如两个集合 A,B,取他们相交的元素)
1.隐式内连接 (获取员工和部门的信息)
SELECT * FROM emp e,dept d WHERE e.dept_id = d.id
结果
2.显式内连接 (获取女员工和部门的信息)
SELECT * FROM emp e INNER JOIN dept d ON e.dept_id = d.id WHERE e.gender=‘女‘
结果
可以看到,员工关羽没有填写dept_id 无法与dept表相匹配,导致记录不存在。因此可以采用外连接方式。
二、外连接
左外连接 (就比如两个集合 A,B,取他们相交的元素)
SELECT * FROM emp e LEFT JOIN dept d ON e.dept_id = d.id
结果
带有条件查询 (查询所有员工和部门信息以及工资大于2000)
SELECT * FROM emp e LEFT JOIN dept d ON e.dept_id = d.id WHERE e.salary>2000
结果
三、子查询
1. 查询部门为市场部的员工信息 (单行单列)
SELECT * FROM emp WHERE emp.dept_id = (SELECT id FROM dept WHERE name=‘市场部‘)
结果
2. 查询部门为市场部和科研部的员工信息 (多行单列)
SELECT * FROM emp e WHERE e.dept_id IN (SELECT id FROM dept WHERE name=‘市场部‘ OR name=‘科研部‘)
结果
3. 查询入职时间为2018-04-05 10:08:48 之后的员工信息和部门信息 (多行多列)
SELECT * FROM dept d,(SELECT * FROM emp e WHERE date>‘2018-04-05 10:08:48‘) t WHERE d.id = t.dept_id
结果
这里将 SELECT * FROM emp e WHERE date>‘2018-04-05 10:08:48‘ 作为虚拟表 来查询,这里由于员工关羽没有填写dept_id,因此没被 添加。
可以采用左外连接实现 SELECT * FROM emp e LEFT JOIN dept d ON e.dept_id = d.id WHERE e.date>‘2018-04-05 10:08:48‘
结果
四、例子
获取部门编号,部门名称,每个部门人数
SELECT d.*,t.total FROM dept d,(SELECT dept_id,count(*) total FROM emp e GROUP BY e.dept_id) t
WHERE d.id = t.dept_id
结果
原文:https://www.cnblogs.com/Alida/p/12997087.html