撰写时间:2019年3月31日
一般查询数据的时候都是用到多表查询,多表查询就必须要连接表,如果不连接,就会出现笛卡尔集,两表数据量相乘,如果是很小数据量的数据库问题还不大,但如果是大数据量的话,那么机器可能会炸,所有我们要严谨,小心,将表通过有效的连接条件连接起来。
笛卡尔集产生:省略连接条件、连接条件无效、所有表中的所有行互相连接。
Oracle表连接分为几种:等值连接、不等值连接、自连接、外连接...
演示数据:
select * select *
from student --6 from SCORE --12
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190401213256399.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/20190401213246613.png)
select *
from student,SCORE --无有效条件连接,产生笛卡尔集 6*12=72
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190401213404375.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lhbmdsbDI5,size_16,color_FFFFFF,t_70)
一、等值连接:
等值连接是最常用的连接,因为它指定的连接条件是一个表中的一个字段必须等于另一个表中的一个字段
select *
from STUDENT,SCORE
where STUDENT.SNO=SCORE.SNO
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190401213421478.png)
多个连接条件用 AND 操作符拼接,相同的列要使用表名前缀区分(表名前缀下划线标注),还可以使用表的别名(下例),简化查询,提高执行效率。连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。
表别名使用:
select a.SNO,a.SNAME,a.SSEX,a.SBIRTHDAY,a.CLASS,b.CNO,b.DEGREE
from STUDENT a,SCORE b
where a.SNO=b.SNO
等值连接,两个表相连,两个表相关联的主外键都是非空,主键还是唯一,若有一个表有一个没有对应上的主外键,那么该数据查询不出来。
二、不等值连接:
不等值连接相对于等值连接来说,不同的就是,等值连接的连接条件是一个表中的一个字段必须等于另一个表中的一个字段,而不等值连接在连接条件中可以使用小于(<)、大于(>)、不等于(<>)等运算符,而且还可以使用LIKE、BETWEEN AND等运算符,甚至还可以使用函数。下面举例说明
SELECT a.sname,b.sno,b.DEGREE,c.grades_level
FROM student a,SCORE b,SCORE_grades c
WHERE b.degree
BETWEEN c.lowest_score AND c.highest_score and a.sno=b.sno
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190401213444416.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lhbmdsbDI5,size_16,color_FFFFFF,t_70)
这个例子的连接条件用到的是等值跟不等值 BETWEEN AND 运算符,这个不等值连接的意思通俗点解释就是,a表的这个字段,不一定等于b表的字段,可以是相似或者两个字段的闭区间。比如我的成绩是80分,当连接条件以我的成绩与c表检索的每条数据的最小成绩跟最大成绩的这个闭区间的一个任意实数对应上,那么我的成绩在这个表就跟c表关联上了,否则就关联不上,我80分成绩这条数据就不会查询出来。
判断80在不在【BETWEEN 80 AND 89】 √ 判断80在不在【BETWEEN 70 AND 79】×
三、自连接:
自连接,自己连自己,连接条件里面的两个或以上的表都是同一个表,只是两个表的某一字段对某一字段不一样。比如,一个员工表里面,有员工的详细信息,上司的ID,那么上司也是员工,也是在员工表里面,那么就当我需要查询某个员工的信息,跟他上司的信息,那么两个表都是用一个表——员工表,连接条件就是,员工1表的上司ID=员工2表的员工ID。
自连接可以根据自己的需要,是否使用外连接,不附加其他连接的自连接是等值连接。
select a.last_name,a.manager_id,b.employee_id,b.last_name
from employees a,employees b
where a.manager_id=b.employee_id and b.last_name like '%King%'
![在这里插入图片描述](https://img-blog.csdnimg.cn/201904012135043.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lhbmdsbDI5,size_16,color_FFFFFF,t_70)
四、外连接:
外连接可以查询不满足连接条件的数据,跟等值连接不同的就是,外连接就算连接条件其中一个表中的一个字段为空,也可以查询出来,外连接的符号是(+),外连接又分:右外连接、左外连接;
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190401213648354.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lhbmdsbDI5,size_16,color_FFFFFF,t_70)
数据中可以看到,当学生表(左表)中的数据不满足连接条件时,左连接返回左表中不满足条件的行。当成绩表(右表)中的数据不满足连接条件时,右连接返回右表中不满足条件的行。
结论:内连接: 将满足连接条件的两个以上的表数据合并为一个表,结果集不包含一个表与另一个表不匹配的行
外连接: 不但返回满足连接条件的两个以上的表数据,并且还返回左(或右)表不满足连接条件的表数据,这种连接称为左(或右)外连接。不满足连接条件的表的数据在结果集的列为空(NULL),外连接的where 子句类似于内部连接,只是连接条件中没有匹配行的表的列后面要加外连接运算符(+)
SQL: 1999 语法连接:join..on..
SELECT a.sname,b.sno,b.DEGREE
FROM student a join SCORE b on a.sno=b.sno
内连接只返回满足连接条件的数据
左(或右)外连接除了返回满足条件的数据以外还返回左(或右)表中不满足条件的
满外连接除了返回满足条件的数据以外还都返回两个表中不满足条件的数据
左外连接
SELECT a.sname,b.sno,b.DEGREE
FROM student a LEFT OUTER JOIN SCORE b on a.sno=b.sno
右外连接
SELECT a.sname,b.sno,b.DEGREE
FROM student a RIGHT OUTER JOIN SCORE b on a.sno=b.sno
满外连接
SELECT a.sname,b.sno,b.DEGREE
FROM student a FULL OUTER JOIN SCORE b on a.sno=b.sno