连接查询
等值与非等值连接查询
当连接运算符为“=”时,称为等值连接。使用其他运算符称为非等值连接。
select cno, grade
from s, sc
where s.sno=sc.sno and sname='zhangsan';
自身连接
一个表与自己进行连接,需要给表起别名用于区别,由于所有属性名都是同名属性,因此必须使用表别名前缀
select a.*, b.*
from sc a, sc b
where a.sno=b.sno;
复合条件连接
where子句中含多个连接条件
select s.sno, sname
from s, sc
where s.sno=sc.sno and cno=‘002’and grade>90;
自然连接
自然连接(natural join)运算作用于两个关系,并产生一个关系作为结果,自然连接只考虑那些在两个关系模式中都出现的属性上取值相同的元组对。
例如:
select name,course_id
from instruct,teaches
where instructor.ID = teaches.ID
两关系表中仅有同名属性ID,该查询可以用SQL的自然连接运算更简洁地写作:
select name,course_id
from instructor natural join teaches;
在一个SQL查询的from子句中,可以用自然连接将多个关系结合在一起
select A1,A2,A3,...,An
from r1 natural join r2 natural join ... natural join rm
where P;
join … using
示例1:
select name,title
from instructor natural join teaches,course
where teaches.course_id = course.course_id;
示例1中该语句先计算instruct和teaches的自然连接,再计算该结果与course的笛卡尔积
示例2:
select name,title
from instructor natural join teaches natural join course;
示例2中,若instructor与teaches的自然连接包括属性(ID,name,dept_name,salary,course_id,sec_id),而course关系包含的属性为(course_id,title,dept_name,credits)这二者进行自然连接的结果要求dept_name与course_id在各自取值上相同,与上述查询语句不同,可能会查询出空的结果关系。
因此SQL提供了一种自然连接的构造形式,允许用户指定需要哪些列相等r1 join r2 using(A1,A2)
select name,title
from (instructor natural join teaches) join course using(course_id)
外连接
- 悬浮元组:两个关系在做自然连接时被舍弃的元组
- 外连接:把悬浮元组也保存在自然连接的结果关系中,而在其他属性上填空值
- 左外连:只保留左边关系R中的悬浮元组
- 右外连:只保留右边关系S中的悬浮元组
外连接:
select s.*, cno, grade
from s, sc
where s.sno=sc.sno
左外连:
select s.sno, sname, ssex, sbirth, college, cno, grade
from s left outer join sc on (s.sno=sc.sno);
等值连接
inner join
(等值连接) 只返回两个表中联结字段相等的元组- 等值连接中重复列不删除.
select * from a
inner join b
on A.ID = B.ID