前面已经说了数据系统的概述了,关系模型是目前用得最多的数据模型,其中一个优势就是:有严格的数学理论根据。本文就是来说解数据库中的各类关系运算的!本文不作数学概念的深刻,只要理解相关的概念便可!sql
学习和理解关系运算的机理,对于理解关系数据库中的数据查询机制有十分重要的意义。数据库
咱们可能知道多表查询的时候要消除重复多余的数据,那重复多余的数据怎么产生的呢??WHERE字句又是怎么筛选数据的呢??这些问题咱们在关系运算中能够找到答案的。markdown
学习数据库的关系运算,会让咱们明白SQL语句是怎么执行的,是经过什么手段让咱们获得想要的结果。性能
笛卡尔积简单来讲就是两个集合相乘的结果。学习
前面的博文已经说了,关系模型是关系模式的集合。spa
数据库中的两张表就至关于两个集合,当咱们使用SELECT语句查询数据的时候,DBMS内部就是以集合相乘的运算得出结果code
咱们发现:笛卡尔积的基数是每一个集合的元组相乘!
图片
得出来的数据内容是难以符合现实中的实际状况的数学
为了更好地看见效果,我都会以实际的SQL语句来看效果,而后说明问题的。it
emp表的记录有14条:
dept表有4条记录:
咱们来看看SMITH,在emp表中,他只在20部门。
但在两张表查询后,十、20、30、40部门他都在了!!咱们再观察56条数据,发现每一个人都有4个部门,这样的数据是不合理的!!
再回到初衷,咱们查询两张表的目的是什么??在查询员工信息的同时,也能知道员工的部门名称是什么!!!因此,咱们查询的记录数是不该该有56条这么多的。。咱们查询的记录数应该是员工表的记录数,也就是14条而已!
咱们再来分析:emp表中有deptno字段,dept表中也有deptno字段!并且发现,emp表中的deptno字段的取值范围是由dept表中deptno字段来决定的!!!
因此,咱们能够使用等值链接(emp.deptno=dept.deptno)来消除笛卡尔积,这样就达到咱们的目的了!
在Oracle上,操做集合的语法提供了4个关键字:
显示查询结果的所有信息,消除重复的元组
查询全部办事员和经理的信息
SELECT * FROM emp WHERE job = 'MANAGER' UNION SELECT * FROM emp WHERE job = 'CLERK';
注意:使用UNION并操做,比使用关键字OR的性能要好!
返回查询结果相同的部分
查询10部门的信息
SELECT * FROM dept INTERSECT SELECT * FROM dept WHERE deptno = 10;
(所有部门和部门10只有部门10是相同的,因此最后返回的是部门10的结果)
返回的查询结果是
SELECT * FROM dept MINUS SELECT * FROM dept WHERE deptno = 10;
投影的运算过程:
首先按照j1,j2,…,jk的顺序,从关系R 中取出列序号为j1,j2,…,jk(或属性名序列为Aj1,Aj2,…,Ajk )的k 列,而后除去结果中的重复元组,构成一个以Aj1,Aj2,…,Ajk为属性顺序的k 目关系。
简单来讲:取出一个查询结果中某某列,并消除重复的数据,这就是投影!
查询出全部部门的编号
SELECT deptno FROM dept;
查询时的过程:先查询得出dept表的全部结果,再经过投影运算只提取”deptno”的列数据,若是 SELECT 后边跟的是”*”,那么就是投影所有数据!
使用比较运算符、逻辑运算符,挑出知足条件的元组,运算出结果!
查询出工资大于2000的员工的姓名
SELECT ename FROM emp WHERE sal > 2000;
过程:首先查询出emp表的全部结果,使用选择运算筛选得出工资大于2000的结果,最后使用投影运算得出工资大于2000员工的名字!
除运算的实际应用我还没想明白~~~若是有朋友知道除运算可以用在数据库的哪处,请告诉我一声哈。。
咱们也了解一下除运算的过程吧:关系R有ABCD,关系S有CD,首先投影出AB(由于S有CD),再用投影出来AB的结果和关系S作笛卡尔积运算。若是作的笛卡尔积运算记录在R关系中找到相对应的记录,那么投影的AB就是结果了!
链接运算其实就在笛卡尔积运算的基础上限定了条件(某列大于、小于、等于某列),只匹配和条件相符合的,从而得出结果!
天然链接就是一种特殊的链接运算,它限定的条件是【某列等于某列】。天然链接咱们常常使用到。消除笛卡尔积其实就是天然链接了!
SELECT * FROM emp, dept WHERE dept.deptno = emp.deptno;
设定将dept表的deptno列和emp的deptno列为相同【这就是天然链接】