父查询中的结果集大于子查询中每一个结果集中
准备两个表:
我们先看图说话,如图1.
嵌套查询
一个SELECT FROM WHERE语句称为一个查询块。
嵌套查询:将一个查询块嵌套在另一个查询块的WHERE子句或者HAVING短语的条件中的查询。
注:子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序。
--T1(2,3)
--T2(1,2,3,4)
1.带有IN谓词的子查询:
子查询往往是一个集合。
查询与Mike在同一个系的学生:
SELECT Sno,Sname,Sdept FROM Student WHERE
Sdept IN
(SELECT Sdept FROM Student WHERE
Sname='Mike');
子查询的查询条件不依赖于父查询,成称为不相关子查询。
子查询的查询条件依赖于父查询,成称为相关子查询。
查询选修了DB_Design的学生学好和姓名。
SELECT Sno,Sname FROM Student WHERE Sno
IN
(SELECT Sno FROM SC WHERE Cno IN
(SELECT Cno FROM Course WHERE
Cname='DB_Design')
);
--ALL,ANY,SOME
的子查询
-- >ALL
父查询中的结果集大于子查询中每一个结果集中的值,则为真
SELECT * FROM T2 WHERE N>ALL (SELECT N FROM T1)
图1
2.带有比较运算符的子查询:
当用户确切知道内层查询返回的是单个值时,可以用>、<、=、>=、<=、!=(<>)等比较运算符。
SELECT Sno,Sname,Sdegree FROM Student
WHERE Sdegree=
(SELECT Sdegree FROM Student WHERE
Sname='Mike');
SELECT Sno,Cno FROM SC x WHERE
Grade>=
(SELECT AVG(Grade) FROM SC y WHERE
y.Sno=x.Sno); (相关子查询)
看图之后,我们可以很容易的理解了子查询。
3.带有ANY(SOME)或ALL谓词的子查询:
子查询返回单值时可以用比较运算符,但返回多值时要用ANY(有的系统用SOME)或ALL谓词修饰符。使用ANY或ALL也必须同时使用比较运算符。
>ANY : 大于子查询结果中的某个值
>ALL : 大于子查询结果中的所有值
=ANY : 等于子查询结果中的某个值
查询非计算机系中比计算机系任意一个学生年龄小的学生姓名和年龄。
SELECT Sname,Sage FROM Student
WHERE Sage<ANY(SELECT Sage FROM Student WHERE Sdegree='CS') AND Sdegree!='CS';
可使用聚集函数,且效率更高:
SELECT Sname,Sage FROM Student
WHERE Sage<
(SELECT MAX(Sage) FROM Student WHERE Sdegree='CS')
AND Sdegree!='CS';
子查询:在一个查询语句中包含了另外一个查询语句
4.带有EXISTS谓词的子查询:
EXISTS代表存在量词∃。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑值true或者false。
查询所有选修了1001课程的学生姓名。
SELECT Sname FROM Student WHERE EXISTS
(SELECT * FROM Sc WHERE
Student.Sno=Sc.Sno AND Cno='1001');
查询没有选修1001课程的学生姓名。
SELECT Sname FROM Student WHERE NOT EXISTS
www.9159.com,(SELECT * FROM Sc WHERE
Student.Sno=Sc.Sno AND Cno='1001');
一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询代替,但所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用到EXISTS谓词的子查询代替。
SQL中没有全称量词,全称量词用存在量词表示。
查询选修了全部课程的学生姓名。(有点绕)
SELECT Sname FROM Student WHERE NOT
EXISTS(
SELECT * FROM Course WHERE NOT EXISTS(
SELECT * FROM Sc WHERE Student.Sno=Sc.Sno
AND Course.Cno=Sc.Cno));
SQL中没有蕴含逻辑运算 p→q=¬p∨q
查询至少选修了学生2016002选修的全部课程的学生号码。
SELECT DISTINCT Sno FROM SC SCX WHERE NOT
EXISTS(
SELECT * FROM SC SCY WHERE
SCY.Sno='2016002' AND NOT EXISTS (
SELECT * FROM SC SCZ WHERE
SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno));
-- >ANY,SOME
父查询中的结果集大于子查询中任意一个结果集中的值,则为真
SELECT * FROM T2 WHERE N>ANY(SELECT N FROM T1)
SELECT * FROM T2 WHERE N>SOME(SELECT N FROM T1)
注意:
当子查询中不是只有一列的情况下,会报这样的错误。如图2,所以我们将红框的星号,改成想查询的某一列就可以了。如图3.
图2
图3
子查询的特点:
1、子查询必须放在一对小括号内
2、“=”比较运算符,还可以与其他的比较运算符一起使用,要求子查询的列只能有一个
3、子查询通常作为WHERE的条件
4、子查询中不能出现ORDER BY 子句,如果想要排序,只能对父查询进行排序,也就是说ORDER BY只能出现在父查询语句中。
-- =ANY 与子查询IN相同
SELECT * FROM T2 WHERE N=ANY (SELECT N FROM T1)
SELECT * FROM T2 WHERE N IN (SELECT N FROM T1)
根据子查询返回行数的不同又可将其分为:返回多行的子查询。返回单行的子查询和嵌套子查询。
1、返回多行的子查询
返回多行的子查询是指执行查询语句获得的结果集中,返回了多行数据的子查询。一般情况下,对子查询的讨论都是通过WHERE子句实现的,但实际上还能应用于SELECT语句以及HAVING短语中。
在子查询中可以使用IN关键字。EXISTS关键字和比较运算符来连接表。
(1)使用IN关键字
IN关键字:可以使父查询匹配子查询返回的多个单列值
NOT IN:将父查询条件中的表达式与子查询返回的结果进行比较,把不匹配的信息显示出现。
例如:在【教务管理系统】数据库中,查询和“小花妹妹”在同一个“年级”的学生“姓名”、“性别”、“年级”的信息。语句如下:
USE 教务管理系统
SELECT 姓名,性别,年级
FROM 学生信息 S1
WHERE S1.年级 IN (SELECT 年级 FROM 学生信息 S2 WHERE S2.姓名=‘小花妹妹’)
本实例中查询也可以利用自身连接来完成,代码如下:
USE 教务管理系统
SELECT S1.姓名,S1.性别,S1.年级
FROM 学生信息 S1,S2
WHERE S1.年级=S2.年级 AND S2.姓名=‘小花妹妹’、
(2)使用EXISTS关键字
EXISTS:只管子查询是否有返回行,如查有返回行,返回结果为真true,否则为假false。并不使用子查询的结果,仅用于测试子查询是否有返回结果。
NOT EXISTS: 当子查询返回空行或查询失败时,外围查询成功;而子查询成功时或返回非空行,则外围查询失败。
语法格式:
SELECT * FROM table WHERE EXISTS / NOT EXISTS(子查询语句)
注意:如果子查询中能够返回数据行,即查询成功,则子查询外围的查询也能成功;如果子查询失败那么外围的查询也会失败,这里EXISTS连接的子查询可以理解为外围查询的触发条件。
-- <>ANY 与NOT IN
--<>ANY
--OR作用
父查询中的结果集不等于子查询中的a或者b或者c,则为真
SELECT * FROM T2 WHERE N <>ANY(SELECT * FROM T1)
(3)比较运算符
子查询可以由一个比较运算符和一些关键字引入,查询结果返回一个值列表。语法如下:
SELECT *
FROM table
WHERE XX operator【ANY/ALL/SOME】(子查询)
operator表示比较运算符:ANY、ALL和SOME是SQL支持的在子查询中进行比较的关键字。
ANY和SOME:表示外围查询限定条件与子查询返回值进行比较,如果外围查询中有任意多个数据满足比较条件,则全部返回;使用ALL关键字表示外围查询限定条件与子查询返回值进行比较,外围子查询返回结果必须全部满足比较条件。
图4
图5
1、>ALL : 父查询中大于子查询结果中的所有值,如图
图6
2、>ANY :父查询的列值中,必须至少大于子查询返回值列表中的一个值,如图7
图7
注意:SOME与ANY的含义与用法相同。如图8.
图8
3、=ANY和子查询IN:父查询中列值必须在子查询返回的列表中存在,如图9
图9
4、<>ANY 和 NOT IN:
<>ANY: 父查询的结果中列的值与子查询返回的值列表中有一个不相同的就可以,相当于OR或者的关系,父查询中列的值不等于子查询中值a,或者不等于b,或者不等于c。
NOT IN:父查询的结果中列的值必须不能存在,在子查询的返回值的列表中,相当于AND并且的关系,父查询中列的值不等于子查询中的值a,并且不等于b,并且不等于c。
--NOT IN
--AND作用
父查询中的结果集不等于子查询中任意一个结果集中的值,则为真
SELECT * FROM T2 WHERE N NOT IN(SELECT * FROM T1)
本文由9159.com发布于www.9159.com,转载请注明出处:父查询中的结果集大于子查询中每一个结果集中
关键词: