多表关系
- 一对多(多对一)
- 多对多
- 一对一
内连接
#隐式内连接
select e.name,d.name from emp e,dept d WHERE d.id=e.dept_id
#显示内连接
select e.name,d.name from emp e INNER JOIN dept d on d.id=e.dept_id
select e.name,d.name from emp e JOIN dept d on d.id=e.dept_id
外连接
#左外
select e.name,d.name from emp e LEFT JOIN dept d on d.id=e.dept_id
#右外
select e.name,d.name from emp e RIGHT OUTER JOIN dept d on d.id=e.dept_id
自连接
#查询员工和其领导名字
SELECT e1.first_name,e2.first_name ldname FROM
employees e1 join employees e2
on e1.manager_id=e2.employee_id;
#查询员工和其领导名字,没有领导也要查询出来
SELECT e1.first_name,e2.first_name ldname FROM
employees e1 LEFT join employees e2
on e1.manager_id=e2.employee_id;
联合查询
union:吧多次查询的结果合并起来,形成一个新的查询结果集
#没有ALL会去重,两个查询的字段要相同
select a语句
UNION ALL
select b语句
子查询
不同子查询的外层可用的操作符
- 标量子查询:=,>,<,<=,>=
- 列子查询:in,not in,any,some,all(some和any作用相同,表示有一个满足条件)
SELECT * from emp WHERE salary> ALL(SELECT salary FROM emp WHERE dept_id=1)
- 行子查询:=,<>,IN,NOT IN
SELECT * FROM emp WHERE(salary,manager_id) =(SELECT salary,manager_id FROM emp WHERE name='hh')
- 表子查询:IN
SELECT * FROM emp WHERE(salary,manager_id) in(SELECT salary,manager_id FROM emp WHERE name='hh' or name='gg')