目录
前言
前面学习了数据单表的查询,接下来我要继续进行多表的查询了。
一、连接查询
1.等值与非等值连接查询
2.自身连接
3.外连接
4.多表连接
二.嵌套查询
1.带有in谓词的子查询
2.带有比较运算符的子查询
3.带有any 或 all 的谓词的子查询
4.带有exists谓词的子查询
三、集合查询
四.基于派生表的查询
总结
以上就是这次复习的了,继续加油。
https://mp.csdn.net/mp_blog/creation/editor/124282946(单表查询链接)
包括:
1)连接查询
a.等值与非等值连接查询
b.自身连接
c.外连接
d.多表连接
2)嵌套查询
a.带有in谓词的子查询
b.带有比较运算符的子查询
c.带有any 或 all 的谓词的子查询
d.带有exists谓词的子查询
3)集合查询
4)基于派生表的查询
连接查询的where子句中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为:
[<表名1.>] <列名1><比较运算符>[<表名2.>] <列名2>
举个栗子:select student.sname,sc.sno from student,sc where student.sno=sc.sno;
使用连接谓词的格式:
[<表名1.>] <列名1> between [<表名2.>] <列名2> and [<表名2.>]<列名3>
举个栗子:select student.sname,sc.sno from student,sc where student.sno=sc.sno and sc.cno="22" and sc.grade>90;
当连接符为"="时称为等值连接,使用其他运算符称为非等值连接。
(注意:栗子中的属性(标明颜色)明前都加了表名前缀,这是为了避免混淆,如果属性名在表中唯一,则可以省略表名)
举栗子:我们可以在select 后加 distinct 去除重复学号
一个表和自身进行连接,称为自身连接。
操作:要为同一个表取两个别名,一个是first,另一个是second。
举个栗子:select后包含student表和course表的属性
舍弃的元组称为悬浮元组,把悬浮元组存储在结果关系中,而在其他属性上填空值,就叫做外连接;保留左边关系的悬浮元组叫左外连接(left outer join 或 left join),反之,保留在右边的元组就叫做右外连接(right outer join 或 right join)。
举个栗子:查询 每个学生及其选修课程的情况
多个表相互连接。
举个栗子:select后包含student表和course表以及sc表的属性
在sql语言中,一个 select-from-where 语句称为一个查询块,将一个查询块嵌套在另一个查询块的 where 子句或 having 短语的条件中的查询称为嵌套查询。
子查询:第二个 select-from-where 开始的查询块,第一个称为父查询,子查询条件不依赖父查询的称为不相关子查询,反之,称为相关子查询。
(注:子查询的 select 语句不能使用 order by 子句, order by 子句只能对最终结果进行排序)
步骤:先分布来完成各自的查询任务,然后再构造嵌套查询
举个带 in 谓词的子查询:(不相关子查询)查询没有选修 操作系统 课程的 cs 系的学生的姓名;
(我们思考的顺序应该从后往前读: 1)学生姓名 2)是cs系 3)没选 操作系统)
顾名思义,带比较运算的子查询就是含比较符号的查询。
举个栗子:(相关子查询)找出每个学生超过他自身平均成绩的课程号
子查询返回单值时可以用比较运算符,但返回多值时要用 any|all 谓词修饰符,使用时必须要搭配比较运算符使用。
举个栗子:查询 非计算机科学系 中比 计算机科学系任意一个学生年龄小或者等于的学生姓名和年龄。
(通常使用聚集函数实现子查询比直接用any或all查询效率更高)
带有exists谓词的子查询不返回任何数据,只产生逻辑真‘ture’ 和 逻辑假 ‘false’。
exists与not exists的区别
exists是查询的值非空,返回真值,否则返回假值
not exists 是查询的值为空则返回真值,否则返回假值
举栗子:查询所有选修了22号课程的学生姓名
select 语句要查询的是元组的集合,所以多个select语句的结果可以进行集合操作。
集合的操作主要包括并操作union、交操作intersect 和 差操作except.
其中 并操作类似于 或 ,交操作类似于 和
举差操作的一个栗子: 查询计算机科学系的学生与年龄不大于19岁的学生的差集
select * from student where sdept="cs" except select * from student where sage<=19
子查询不仅可以出现在where 子句中,还可以出现在from子句中,这是子查询生成的临时派生表成为主查询的查询对象。
举个栗子:查询所有选修了22号课程的学生