Oracle多表查询
1、多表查询
所谓的多表查询就是同时从多张表中取出数据并显示的一种操作。
多表查询语法1:
【3⃣️选出所需要的数据列】SELECT * | 列 [别名], 列 [别名], 列 [别名], ......
【1⃣️确定数据来源】FROM 表(行与列的集合)名1 [别名1],表名2 [别名2], ......
【2⃣️筛选数据行】[WHERE 限定条件]
【4⃣️数据排序】[ORDER BY 排序字段 [ASC | DESC], 排序字段 [ASC | DESC], .......]
注意⚠️:多表查询存在笛卡尔积问题。虽然可以通过一些关联字段消除笛卡尔积,但是笛卡尔积一直都存在着,无法彻底消除。如果表之间的数据量不大,那么多表查询还可以承受,若表之间的数据量太大,那么多表查询直接会带来严重的性能问题。
判断程序慢的两个方式:程序算法慢(CPU占用率高)、数据库数据大(内存占用率高)
范例1:查询雇员编号、姓名、工资、部门名称、部门地点
SQL语句:SELECT e.EMPNO, e.ENAME, e.JOB, d.DNAME, d.LOC FROM EMP e, DEPT d WHERE e.DEPTNO = d.DEPTNO
范例2:查询雇员编号、姓名、工作、工资以及工资等级
SQL语句:SELECT e.EMPNO, e.ENAME, e.JOB, e.SAL, s.GRADE FROM EMP e , SALGRADE s WHERE e.SAL BETWEEN s.LOSAL AND s.HISAL;
范例3:查询每个雇员的员工编号、姓名、职位、基本工资、部门名称、工资等级
分析:
(1)确定所需要的表
EMP表-----员工编号、姓名、职位、基本工资
DEPT表----部门名称
SALGRADE表----工资等级
(2)确定已知的关联字段
雇员与部门:emp.DEPTNO = dept.DEPYNO
雇员与工资等级:emp.SAL BETWEEN salgrade.LOSAL AND salgrade.HISAL
第一步:查询 员工编号、姓名、职位、基本工资
SQL:SELECT e.EMPNO, e.ENAME, e.JOB, e.SAL FROM EMP e;
第二步:添加部门名称,增加一张表 就添加一个查询条件消除笛卡尔积
SQL:SELECT e.EMPNO, e.ENAME, e.JOB, e.SAL, d.DNAME FROM EMP e, DEPT d WHERE e.DEPTNO = d.DEPTNO;
第三步:增加员工工资等级时因该与之前消除笛卡尔积同时满足,所以使用AND连接
SQL:SELECT e.EMPNO, e.ENAME, e.JOB, e.SAL, d.DNAME, s.GRADE FROM
EMP e, DEPT d, SALGRADE s WHERE e.DEPTNO = d.DEPTNO and e.SAL BETWEEN s.LOSAL AND s.HISAL;
2、Oracle表的连接
两张表或两张表以上进行多表查询时消除笛卡尔积的方式是依靠连接模式处理的。而对于表的连接模式,Oracle提供两种模式:
1⃣️内连接:以上范例1、范例2、范例3利用WHEWE子句消除笛卡尔积,这就属于内连接,只有满足条件的数据才显示
2⃣️外连接:外连接分为左外连接、右外连接、全外连接
(1)左外连接:左表的数据全部显示,右表数据不足时为null
语法:
【3⃣️选出所需要的数据列】SELECT * | 列 [别名], 列 [别名], 列 [别名], ......
【1⃣️确定数据来源】FROM 表(行与列的集合)名1 [别名1] LEFT JOIN 表名2 [别名2] ON 消除条件1 LEFT JOIN 表名3 [别名3]
ON 消除条件2 ........
【2⃣️筛选数据行】[WHERE 限定条件]
【4⃣️数据排序】[ORDER BY 排序字段 [ASC | DESC], 排序字段 [ASC | DESC], .......]
若有N张表左外连接关联查询,则LEFT JOIN ON就有N-1个。
范例:查询雇员的全部信息以及部门名称
SQL语句:SELECT e.* , d.DNAME FROM EMP e LEFT JOIN DEPT d ON e.DEPTNO = d.DEPTNO
(2)右外连接:右表数据全部显示,左表数据不足为null
语法:
【3⃣️选出所需要的数据列】SELECT * | 列 [别名], 列 [别名], 列 [别名], ......
【1⃣️确定数据来源】FROM 表(行与列的集合)名1 [别名1] RIGHT JOIN 表名2 [别名2] ON 消除条件1 RIGHT JOIN 表名3 [别名3] ON 消除条件2 ........
【2⃣️筛选数据行】[WHERE 限定条件]
【4⃣️数据排序】[ORDER BY 排序字段 [ASC | DESC], 排序字段 [ASC | DESC], .......]
若有N张表右外连接关联查询,则RIGHT JOIN ON就有N-1个。
范例:查询雇员的全部信息以及部门名称
(3)全连接
语法:
3⃣️选出所需要的数据列】SELECT * | 列 [别名], 列 [别名], 列 [别名], ......
【1⃣️确定数据来源】FROM 表(行与列的集合)名1 [别名1] FULL JOIN 表名2 [别名2] ON 消除条件1 FULL JOIN 表名3 [别名3] ON 消除条件2 ........
【2⃣️筛选数据行】[WHERE 限定条件]
【4⃣️数据排序】[ORDER BY 排序字段 [ASC | DESC], 排序字段 [ASC | DESC], .......]
范例:使用全连接查询雇员编号、姓名、工资、部门名称、工资等级信息
SQL语句:SELECT e.EMPNO, e.ENAME, e.SAL, d.DNAME, s.GRADE FROM EMP e FULL JOIN DEPT d ON e.DEPTNO = d.DEPTNO FULL JOIN SALGRADE s ON e.SAL BETWEEN s.LOSAL AND s.HISAL;
后期持续更新中。。。。。。。