15.多表查询--内连接
2018-12-21 本文已影响100人
Liuzhl
1. 合并结果集
- 只要从多张表查出来的数据的结果集列数和类型相同,就能合并
- UNION ALL 不去重
SELECT deptno, dname FROM dept
UNION ALL
SELECT empno, ename FROM emp
- UNION 去重
SELECT deptno, dname FROM dept
UNION
SELECT empno, ename FROM emp
内连接
1. 笛卡尔积
- 直接查询2张表会产生笛卡尔积,即a表的每条数据都要匹配一次b表的每条数据,那么总数据就是 a表数据条数 * b表数据条数,这里面的有许多数据都不是我们需要的
SELECT * FROM emp, dept
笛卡尔积.png
- 这里截取了12条数据,只有3条数据是我们需要的,条件就是emp.deptno = dept.deptno, 所以我们就可以用这个条件来去除笛卡尔积
SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno
去除笛卡尔积后的结果.png
2. 多表取指定列,以及表别名
- 在多表中取出指定列来得到一个结果集,需要指定表名
- 如查询员工名字、工作、工资、部门
SELECT emp.ename, emp.job, emp.sal, dept.dname
FROM emp, dept
WHERE emp.deptno = dept.deptno
查询多表指定列.png
- 有些时候,因为命名规范会造成表名过长,我们可以给表取别名来简化sql语句
SELECT e.ename, e.job, e.sal, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno
内连接的3种写法
- 方言, 只在mysql数据库中生效,也就是上面我们用的写法
SELECT * FROM 表1, 表2 WHERE表1.xx = 表2.xx
SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno
- 标准: sql规范
SELECT * FROM 表1 INNER JOIN 表2 ON 表1.xx = 表2.xx
SELECT * FROM emp INNER JOIN dept ON emp.deptno = dept.deptno
- 自然:根据2张表中列名相同的列进行自动匹配
SELECT * FROM 表1 NATURAL JOIN 表2
SELECT * FROM emp NATURAL JOIN dept