Oracles数据库学习笔记(三)多表查询

多表查询

一、为什么使用多表连接

因为在实际系统中,一张表无法涵盖业务的所有信息,即使能,使用一张表来存储所有业务数据也会使数据变得难以维护,提高耦合性,失去可维护性。比如一个超市系统将会员表,库存表,进货表,售价表糅合成一张表,相信没有任何管理员愿意去使用这种表。

二、笛卡尔积

1.笛卡尔积是:
第一个表中的所有行和第二个表中的所有行都发生连接。
2.笛卡尔积在下列情况产生:
 (1)连接条件被省略;
 (2)连接条件是无效的;
3.为了避免笛卡尔积的产生,通常需要在WHERE子句中包含一个有效的连接条件。
4.笛卡尔积的写法:

SELECT EMP.EMPNO, EMP.ENAME, EMP.DEPTNO, DEPT.DEPTNO, DEPT.LOC
FROM EMP, DEPT;

三、连接查询

多表连接的写法

  1.分析要查询的列都来自于哪些表,构成FROM子句;
  2.分析这些表之间的关联关系,如果表之间没有直接关联关系,而是通过另一个中间表关联,则也要在FROM子句中补充中间关联表;
  3.接下来在WHERE子句中补充表之间的关联关系,通常N个表,至少要有N-1个关联关系;
  4.分析是否还有其它限制条件,补充到WHERE子句的表关联关系之后,作为限制条件;
  5.根据用户想要显示的信息,补充SELECT子句。
  6.分析是否有排序要求,如果排序要求中还涉及到其它表,则也要进行第2步补充排序字段所在的表,并且添加表之间的关联关系;

1.等值连接。两个表中的相同字段可以使用“=”进行连接,作为限制条件,不过要使用表名作为前缀

练习1
1-1写一个查询,显示所有员工姓名,部门编号,部门名称

SELECT ENAME,EMP.DEPTNO,DNAME
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO

Oracles数据库学习笔记(三)多表查询_第1张图片
1-2写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金

SELECT ENAME,LOC,COMM
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO AND COMM IS NOT NULL AND LOC = 'CHICAGO'

这里写图片描述
1-3写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点

SELECT ENAME,LOC
FROM EMP,DEPT
WHERE ENAME LIKE '%A%' AND EMP.DEPTNO = DEPT.DEPTNO

Oracles数据库学习笔记(三)多表查询_第2张图片

2.非等值连接。一边的数据对应到另一边的多个列形成的区间中

查询每个员工的姓名,工资,工资等级

SELECT ENAME,SAL,GRADE
FROM EMP,SALGRADE
WHERE EMP.SAL BETWEEN SALGRADE.LOSAL AND SALGRADE.HISAL

Oracles数据库学习笔记(三)多表查询_第3张图片
练习2
查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序

SELECT EMPNO, ENAME, SAL, GRADE, LOC
FROM DEPT,SALGRADE,EMP
WHERE EMP.SAL BETWEEN SALGRADE.LOSAL AND SALGRADE.HISAL AND EMP.DEPTNO = DEPT.DEPTNO
ORDER BY GRADE

Oracles数据库学习笔记(三)多表查询_第4张图片

3.外部链接。为符号(+)所在边的表增加空行,用于和另一边的表中所有不满足连接条件的行进行连接

查询所有部门及所有员工,包括没有员工的部门

SELECT EMP.ENAME, DEPT.DEPTNO,DEPT.DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO(+) = DEPT.DEPTNO

Oracles数据库学习笔记(三)多表查询_第5张图片

4.自身连接。也叫自连接,是一个表通过某种条件和本身进行连接的一种方式,就如同多个表连接一样

查询每个员工的姓名和直接上级姓名

SELECT WORKER.ENAME||' leader is '||MANAGER.ENAME
FROM    EMP WORKER, EMP MANAGER
WHERE   WORKER.MGR = MANAGER.EMPNO(+);

Oracles数据库学习笔记(三)多表查询_第6张图片
练习3
3-1查询所有工作在NEW YORK和CHICAGO的员工姓名,员工编号,以及他们的经理姓名,经理编号。

SELECT WORKER.ENAME,WORKER.EMPNO,MANAGER.ENAME AS MGRNAME,MANAGER.EMPNO AS MGRNO
FROM EMP WORKER, EMP MANAGER, DEPT
WHERE WORKER.MGR = MANAGER.EMPNO AND DEPT.DEPTNO = WORKER.DEPTNO AND DEPT.LOC IN ('NEW YORK','CHICAGO')

Oracles数据库学习笔记(三)多表查询_第7张图片
3-2第上一题的基础上,添加没有经理的员工King,并按照员工编号排序。

SELECT WORKER.ENAME,WORKER.EMPNO,MANAGER.ENAME AS MGRNAME,MANAGER.EMPNO AS MGRNO
FROM EMP WORKER, EMP MANAGER, DEPT
WHERE WORKER.MGR = MANAGER.EMPNO(+) AND DEPT.DEPTNO = WORKER.DEPTNO AND DEPT.LOC IN ('NEW YORK','CHICAGO')
ORDER BY WORKER.EMPNO

Oracles数据库学习笔记(三)多表查询_第8张图片
3-3查询所有员工编号,姓名,部门名称,包括没有员工的部门也要显示出来。

SELECT EMPNO,ENAME,DNAME
FROM EMP,DEPT
WHERE EMP.DEPTNO(+) = DEPT.DEPTNO

Oracles数据库学习笔记(三)多表查询_第9张图片

四、另外补充一下,oracle支持ANNSI-99写法

ANNSI-99是ANSI标准提供的写法,所有关系型数据库必须支持

你可能感兴趣的:(Java复习笔记,数据库)