多表查询
笛卡尔积:有两个集合 A,B,取这两个集合的所有组成情况
要完成多表查询,需要去除无用的数据
- 分类
- 内连接查询
- 隐式内连接:使用where消除无用的数据
SELECT emp.id, emp.name, dept.name FROM emp, dept where emp.dept_id = dept.id;
- 显式内连接
SELECT emp.id, emp.NAME, dept.name FROM emp INNER JOIN dept WHERE emp.dept_id = dept.id;
- 隐式内连接:使用where消除无用的数据
- 外连接查询
- 左外连接
- 左连接只影响右表,左边有右边没有的为null
SELECT emp.id, emp.NAME, dept.name FROM emp LEFT JOIN dept ON emp.dept_id = dept.id;
- 右外连接
- 右连接只影响左表,右边有的,左边没有为null
SELECT emp.id, emp.NAME, dept.name FROM emp RIGHT JOIN dept ON emp.dept_id = dept.id;
- 左外连接
- 子查询
- 查询中嵌套查询,称为子查询
SELECT * FROM emp WHERE age = ( SELECT max( age ) FROM emp );
- 不同情况:
- 子查询的结果是单行单列的
- 子查询作为条件,使用运算符进行判断
- 子查询的结果是多行单列的
- 子查询作为条件,使用
in
进行判断 SELECT * FROM emp WHERE dept_id IN ( SELECT id FROM dept WHERE NAME = '监察部' OR NAME = '监督部' );
-子查询的结果是多行多列的SELECT * FROM dept t1, ( SELECT * FROM emp WHERE age > 18 ) t2 WHERE t1.id = t2.dept_id;
- 子查询作为条件,使用
- 子查询的结果是单行单列的
- 内连接查询