连接查询、嵌套查询和集合查询
连接查询、嵌套查询和集合查询
连接查询:
若一个查询同时涉及2个或以上的表,则称为连接查询。连接查询是关系数据库中最主要的查询,包括等值和非等值连接查询,自然连接查询,外连接查询,复合条件连接查询等。
一、等值和非等值连接
连接查询的时候where子句中用来连接2个表的条件称为连接条件或连接谓词,一般格式为: www.zzzyk.com
[<表名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,那么这种连接就叫外连接。 www.zzzyk.com
如果只把左边关系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个条件连接在一起就是了。。。主要还是看大家怎么想,怎么用吧。。。