MySQL复习(2)
/*
多表查询 : 同时查询两张表及以上就称为多表查询
笛卡尔积:笛卡尔全集 存在大量错误数据不能直接使用的
学习多表查询: 本质就是学习如何从笛卡尔积中筛选出正确的数据
连接条件 :当我们进行N(>=2)张表查询时,所需的连接至少是N-1个
内连接 :
自然连接
左外连接
右外连接
自连接
*/
– 等值连接
– 查询员工姓名、员工部门编号以及员工名称,要求值查询10部门的员工
SELECT e.ENAME,e.DEPTNO,d.DEPTNO,d.DNAME FROM emp e,dept d
WHERE e.DEPTNO=d.DEPTNO AND e.DEPTNO=10;
– 不等值连接的情况
– 查询员工姓名、月薪、月薪等级
SELECT e.ENAME,e.SAL,s.GRADE
FROM emp e, salgrade s
WHERE e.SAL BETWEEN s.LOSAL AND s.HISAL;
– INNER JOIN 内连接 INNER关键字可以省略
SELECT e.ENAME,e.DEPTNO,d.DEPTNO,d.DNAME
FROM emp e INNER JOIN dept d
ON e.DEPTNO = d.DEPTNO AND e.DEPTNO=10; – 连接查询时 连接条件需要写在on子句
– NATURAL JOIN 自然连接
– 自然连接: 会自动提取两张表中相同的字段进行比较,并且会消除重复字段,只保留一个
SELECT *
FROM emp e NATURAL JOIN dept d; – 自然连接不能有ON e.DEPTNO = d.DEPTNO
– LEFT JOIN 左外链接
– 统计各部门员工人数
– 以左边的表(部门表)为基准,用右边表(员工表)的数据进行匹配
– 使用左外连接时,只要是左边表存在的数据一定会查询出来,即使不满足连接条件
SELECT d.DEPTNO,COUNT(e.EMPNO)
FROM dept d LEFT JOIN emp e
ON d.DEPTNO = e.DEPTNO
GROUP BY d.DEPTNO
– RIGHT JOIN 右外连接
SELECT d.DEPTNO,COUNT(e.EMPNO)
FROM emp e RIGHT JOIN dept d
ON d.DEPTNO = e.DEPTNO
GROUP BY d.DEPTNO
– 全外连接 mysql不支持
SELECT d.DEPTNO,COUNT(e.EMPNO)
FROM emp e full JOIN dept d
ON d.DEPTNO = e.DEPTNO
GROUP BY d.DEPTNO;
– 自连接: 核心思想是将一张表看成两张表
– 查询出每个员工直接上司的姓名(要求显示 员工编号、姓名、上司的姓名)
SELECT e1.EMPNO,e1.ENAME,e2.ENAME
FROM emp e1,emp e2
WHERE e1.MGR = e2.EMPNO;
– UNION 合并两条查询结果(取并集) 去除重复数据
SELECT EMPNO,ENAME FROM emp WHERE SAL BETWEEN 1000 AND 1500 – 5
UNION
SELECT EMPNO,ENAME FROM emp WHERE COMM IS NOT NULL – 4
– UNION ALL 直接合并查询结果 不会去除重复数据
SELECT EMPNO,ENAME FROM emp WHERE SAL BETWEEN 1000 AND 1500 – 5
UNION ALL
SELECT EMPNO,ENAME FROM emp WHERE COMM IS NOT NULL – 4