第七章:多表查询1. 在oracle系统中,查询的数据可以来自多个表,即一个查询语句可以对多个表操作。造成这一现象的原因是数据库的规范化(Normalization)
2. 主键和实体完整性:
3. 主键:是关系数据库表中的某一列或某几列的组合,能唯一的标识关系数据库表中的一行
4. 实体完整性:主键不能包含NULL值,并且主键必须能唯一的标识任一行。
5. 表的设计者负责定义主键,关系数据库管理系统负责维护实体完整性。
6. 第一范式:
7. 所有的键属性(列)都已定义
8. 没有重复的组,即每行和没列的交汇处可以而只能包含一个值,而不能包含一组值。
9. 所有属性(列)都依赖于主键
10. 部分依赖,只依赖部分主键的依赖关系,我们可以把存在部分依赖关系的列拿出来重新生成一个表。只依赖主键的一部分
11. 外键和引用完整性
12. 外键:是关系数据库表中某一列或几列的组合;它的值或者与另一表中(有时也可能是同一个表)的某一列(一般为主键)相匹配或者为NULL值。
13. 引用完整性:
a) 外键必须或者为NULL值,或者有相匹配的项
b) 外键可以没有相对应的键属性,但不可以有无效的项
14. 表的设计者定义外键,关系数据库管理系统负责维护引用完整性。
15. 第二范式:
a) 该表为第一范式的表
b) 该表不包含部分依赖
16. 如果一个表为第一范式表,并且它的主键由一列(单一属性)组成,那么该表自动成为第二范式表
17. 第三范式:
a) 该表已经为第二范式
b) 该表不包含传递依赖
18. 传递依赖:一个或多个属性列依赖于非主键的属性
19. 对于大多数商业数据库来说,第三范式是规范化过程的终点。
20. 多表连接:4种连接
21. Oracle是用join来完成多表查询的
22. 相等连接,自连接,不等连接,外连接
23. 相等连接:这种连接通常涉及到主键和外键,也叫简单连接或内连接,连接n个表,需要n-1个条件(用=连接)
24. 在列名前加上表名,可以改善系统效率
25. 表别名的定义,一旦在查询语句种使用了表别名,就不能再使用表名了。
26. 如果忘了用where条件,就会出现笛卡尔乘积:笛卡尔乘积形成条件:
a) 查询语句漏掉连接条件
b) 查询语句中两个表中所有行都满足连接条件
c) 查询语句中连接条件无效
27. 实际工作中应该避免产生笛卡尔乘积。应该在连接查询中使用where子句中,使用有效,正确的连接条件。
28. 自连接:可以用2个单独的查询代替
29. 自连接:是通过把一个表定义2个别名(即把一个表隐射成2个表)来完成自连接的
30. 不等连接:除了=以外的运算符产生的连接叫不等连接,如BETWWEN AND等运算符
31. 外连接:外连接运算符为(+),可以在等号的左边,也可以在右面,但一定要在缺少信息的那一面,如:select empno,emp.deptno,dept.deptno,loc from emp,dept
32. where emp.deptno(+)=dept.deptno
33. 新的SQL99的语法连接
34. 自然连接:select e.empno,d.loc from emp e cross join dept d
35. order by d.loc;这是一个笛卡尔乘积
36. 使用USING子句的连接:select e.empno,d.loc from emp e join dept d using(deptno) order by d.loc
37. NATURAL JOIN 子句和USING子句是互斥的。
38. 在所引用的列中不能用表名或列名
39. 当有多列时,USING子句只能匹配之中一列
40. ON子句的连接select e.empno,d.loc from emp e join dept d on(e.deptno=d.deptno) order by d.loc
a) 在所引用的列中要使用表名或列名
b) 相等连接条件在on子句中
41. 使用on子句的多表连接和附加条件:
42. select e.empno,d.loc,m.deptno from emp e join dept d on(e.deptno=d.deptno)
43. join manager m on (m.deptno=d.deptno)
44. where e.job in('clerk','analyst')
45. order by d.loc
46. 也可以直接把and加入条件语句中,如在上面语句中,把where改成and
47. 左外连接:select e.empno,d.loc from emp e 
48. left outer join dept d on(e.deptno = d.deptno)
49. 有外连接 select e.empno,d.loc from emp e 
50. right outer join dept d on(e.deptno = d.deptno)
51. 相等于用(+)