连接查询、嵌套查询和集合查询

连接查询:

若一个查询同时涉及2个或以上的表,则称为连接查询。连接查询是关系数据库中最主要的查询,包括等值和非等值连接查询,自然连接查询,外连接查询,复合条件连接查询等。

一、等值和非等值连接

连接查询的时候where子句中用来连接2个表的条件称为连接条件或连接谓词,一般格式为:

[<表名1>.]<列名1>  <比较运算符>  [<表名2>.]<列名2>

其中主要比较运算符:= , > , < , <= , >= , !=(<>) 等

此外还可以用between  and  ,当连接符为=的时候为等值连接,其余的都为非等值连接。

select student.*, course.* from student ,course where student.sno=course.sno;这个就是等值连接

自然连接是一种特殊的等值连接,要求2个关系中进行比较的分量必须是相同的属性组,并在结果中把重复的属性列去掉。


二、外连接

在通常的连接操作中,只有满足连接条件的元组才能作为结果输出。

2个关系S和R在做自然连接的时候,选择2个关系在公共属性上的值相等的元组构成新的关系,此时关系R中某些元组可能在S中不存在公共属性上值相等的元组,造成R中这些元组在操作时候被舍弃了。同理,S的也可能被舍弃。

如果把这些舍弃的元组也保存在结果关系中,而在其他属性上填空值Null,那么这种连接就叫外连接

如果只把左边关系S中要舍弃的元组保留就叫左外连接(left out join或left join

如果只把右边关系R中要舍弃的元组保留就叫右外连接(right out join或right join

select student.*,cno,grade from student left out join course on (student.sno=course.sno);


三、复合条件连接

where子句中可以有多个连接条件 , 称为复合条件连接。如:

select student.sno , name from student ,course where student.sno=course.sno and course.cno='2' and course.grade>90;


四、自身连接

一个表自己与自己连接查询,称为自身连接。主要要为表自身取2个别名。


嵌套查询:

在sql语言中,一个select-from-where语句称为一个查询块。将一个查询块嵌套在另外一个查询块的where子句或having短语的条件中的查询叫做嵌套查询。如:

select name from student where sno in (select sno from course where cno = '2');

上层的查询块称为层查询或父查询,下层查询块称为内层查询或子查询。

子查询select语句中不能用order by 子句,它只能对最终查询结果排序。


嵌套查询中,子查询结果往往是一个集合,所以谓词in是用的最多的。

但是,当确认子查询结果是单值的时候也可以用 = , < , > 等运算符。此时 = 作用和 in 相等。

select sno , cno from course x where grade <= (select avg(grade) from course y where y.sno=x.sno);


集合查询:

集合操作主要包括并操作union,交操作intersect和差操作except。

注意:集合操作各查询结果列数必须相同;对应项的数据类型也必须相同。

select * from student where dept = 'cs' union select  * from student where age<19;

用到差, 交操作的时候把union换掉就是了。


个人而言,这个集合操作貌似没多大用处,只要换成一个and把2个条件连接在一起就是了。。。主要还是看大家怎么想,怎么用吧。。。

猜你喜欢

转载自634082093-qq-com.iteye.com/blog/1757016
今日推荐