因为在实际系统中,一张表无法涵盖业务的所有信息,即使能,使用一张表来存储所有业务数据也会使数据变得难以维护,提高耦合性,失去可维护性。比如一个超市系统将会员表,库存表,进货表,售价表糅合成一张表,相信没有任何管理员愿意去使用这种表。
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写一个查询,显示所有员工姓名,部门编号,部门名称
SELECT ENAME,EMP.DEPTNO,DNAME
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
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
查询每个员工的姓名,工资,工资等级
SELECT ENAME,SAL,GRADE
FROM EMP,SALGRADE
WHERE EMP.SAL BETWEEN SALGRADE.LOSAL AND SALGRADE.HISAL
练习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
查询所有部门及所有员工,包括没有员工的部门
SELECT EMP.ENAME, DEPT.DEPTNO,DEPT.DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO(+) = DEPT.DEPTNO
查询每个员工的姓名和直接上级姓名
SELECT WORKER.ENAME||' leader is '||MANAGER.ENAME
FROM EMP WORKER, EMP MANAGER
WHERE WORKER.MGR = MANAGER.EMPNO(+);
练习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')
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
3-3查询所有员工编号,姓名,部门名称,包括没有员工的部门也要显示出来。
SELECT EMPNO,ENAME,DNAME
FROM EMP,DEPT
WHERE EMP.DEPTNO(+) = DEPT.DEPTNO
ANNSI-99是ANSI标准提供的写法,所有关系型数据库必须支持