当数据库的内模式由于某种原因要修改时,可通过对逻辑模式与内模式之间的映象的修改,使逻辑模式尽可能地保持不变,实现内模式的改变尽可能地不修改应用程序。
也就说:在改变内部结构的时候,只要不会触及外部的数据时,外部的数据并不需要做改变。两级映像概念的提出也就是程序中耦合的问题!
为什么我们要学习数据库关系运算?学习和理解关系运算的机理,对于理解关系数据库中的数据查询机制有十分重要的意义。
我们可能知道多表查询的时候要消除重复多余的数据,那重复多余的数据怎么产生的呢??WHERE字句又是怎么筛选数据的呢??这些问题我们在关系运算中可以找到答案的。
学习数据库的关系运算,会让我们明白SQL语句是怎么执行的,是通过什么手段让我们得到想要的结果。
学习大纲 笛卡尔积 什么是笛卡尔积?笛卡尔积简单来说就是两个集合相乘的结果。
为什么查询数据库会出现笛卡尔积前面的博文已经说了,关系模型是关系模式的集合。
数据库中的两张表就相当于两个集合,当我们使用SELECT语句查询数据的时候,DBMS内部就是以集合相乘的运算得出结果
笛卡尔积的产生过程我们发现:笛卡尔积的基数是每个集合的元组相乘!
得出来的数据内容是难以符合现实中的实际情况的
为了更好地看见效果,我都会以实际的SQL语句来看效果,然后说明问题的。
emp表的记录有14条:
dept表有4条记录:
我们来看看SMITH,在emp表中,他只在20部门。
但在两张表查询后,10、20、30、40部门他都在了!!我们再观察56条数据,发现每个人都有4个部门,这样的数据是不合理的!!
再回到初衷,我们查询两张表的目的是什么??在查询员工信息的同时,也能知道员工的部门名称是什么!!!所以,我们查询的记录数是不应该有56条这么多的。。我们查询的记录数应该是员工表的记录数,也就是14条而已!
我们再来分析:emp表中有deptno字段,dept表中也有deptno字段!而且发现,emp表中的deptno字段的取值范围是由dept表中deptno字段来决定的!!!
所以,我们可以使用等值连接(emp.deptno=dept.deptno)来消除笛卡尔积,这样就达到我们的目的了!
基于传统集合理论的关系运算在Oracle上,操作集合的语法提供了4个关键字:
UNION(并集,重复的元组不显示)
UNION ALL(并集,重复的元组也会显示)
MINUS(差集)
INTERSECT(交集)
并显示查询结果的全部信息,消除重复的元组