作用:在内连接的基础之上,保全左表的全部数据,右边没有的数据用NULL替代。
格式:select 列名 from 左表 left join 右表 on 从表.外键=主表.主键
SELECT * FROM emp e LEFT JOIN dept d ON e.`dept_id` = d.`id`
右连接(右外连接)
作用:在内连接的基础之上,保全右表的全部数据,左边没有的数据用NULL替代。
格式:select 列名 from 左表 right join 右表 on 从表.外键=主表.主键
SELECT * FROM emp e RIGHT JOIN dept d ON e.`dept_id` = d.`id`
子查询 (一般而言在一个查询中,可以嵌套另一个查询. 子查询是一个完整的的SELECT语句)
-- a.子查询是单行单列的情况 原理:实际上就是子查询出来的结果是一个值,外部sql可以使用:= > >= < <= != ...
-- 查询工资大于5000的员工的部门名称
SELECT NAME FROM dept WHERE id IN (SELECT dept_id FROM emp WHERE salary > 5000)
-- b.子查询: 多行单列的情况 原理:实际上就是子查询的结果是多个值,可以当数组使用 外部查询可以使用 IN / ANY / ALL
SELECT * FROM emp WHERE salary > (SELECT MAX(salary) FROM emp WHERE dept_id = 1)
-- c.多行多列的情况原理:子查询出来的结果实际上就是一个新表,可以继续当虚拟表使用
SELECT e.* , d.name 部门名称 FROM (SELECT * FROM emp WHERE join_date >= '2011-01-01') e
LEFT JOIN dept d ON e.dept_id = d.id;