SQL语句子查询,关于mysql中的数据查询

SQL语句子查询,关于mysql中的数据查询。预备两个表:

咱俩先看图说话,如图一.

997755.com澳门葡京,嵌套查询

三个SELECT  FROM 
WHERE语句称为多少个查询块。

嵌套查询:将二个查询块嵌套在另四个查询块的WHERE子句可能HAVING短语的基准中的查询。

注:子查询的SELECT语句中不可能使用O猎豹CS陆DER
BY子句,O汉兰达DE智跑 BY子句只可以对最后查询结果排序。

 

嵌套查询

一个SELECT  FROM 
WHERE语句称为贰个查询块。

嵌套查询:将三个询问块嵌套在另二个查询块的WHERE子句也许HAVING短语的基准中的查询。

注:子查询的SELECT语句中不能够动用OHavalDER
BY子句,O索罗德DECRUISER BY子句只好对最后查询结果排序。

 

–T1(2,3)
–T2(1,2,3,4)

997755.com澳门葡京 1

一.包罗IN谓词的子查询:

子查询往往是三个凑合。

询问与迈克在同一个系的学习者:

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’)
);

 

1.包罗IN谓词的子查询:

子查询往往是一个成团。

查询与迈克在同1个系的学员:

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

二.包罗相比运算符的子查询:

当用户确切知道内层查询重回的是单个值时,能够用>、<、=、>=、<=、!=(<>)等相比较运算符。

 

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);  (相关子查询)

 

②.饱含比较运算符的子查询:

当用户确切知道内层查询重临的是单个值时,能够用>、<、=、>=、<=、!=(<>)等相比运算符。

 

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);  (相关子查询)

 

997755.com澳门葡京 2

看图之后,大家能够很轻易的知道了子查询。

三.含有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’;

 

三.涵盖ANY(SOME)或ALL谓词的子查询:

子查询重临单值时能够用相比运算符,但重返多值时要用ANY(有的系统用SOME)或ALL谓词修饰符。使用ANY或ALL也亟须同时采纳相比较运算符。

>ANY   :
 大于子查询结果中的有个别值

>ALL    :
 大于子查询结果中的全体值

=ANY   :  
等于子查询结果中的有个别值

 

查询非Computer系中比Computer系自便贰个学员年龄小的学习者姓名和年龄。

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’;

 

 

子查询:在1个查询语句中隐含了此外四个询问语句

 4.带有EXISTS谓词的子查询:

EXISTS代表存在量词∃。带有EXISTS谓词的子查询不回去任何数据,只爆发逻辑值true或许false。

查询全体选修了十01课程的学习者姓名。

SELECT Sname FROM Student WHERE EXISTS
(SELECT * FROM Sc WHERE
Student.Sno=Sc.Sno AND Cno=’1001′);

询问未有选修十0一课程的学员姓名。

SELECT Sname FROM Student WHERE NOT EXISTS
(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

询问至少选修了学员二零一五00二选修的一体学科的学生号码。

 

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));

 四.带有EXISTS谓词的子查询:

EXISTS代表存在量词∃。带有EXISTS谓词的子查询不回来任何数据,只产生逻辑值true大概false。

询问全体选修了十0壹学科的学员姓名。

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
(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

询问至少选修了学生二〇一五00二选修的全套学科的学习者号码。

 

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
父查询中的结果集大于子查询中自由3个结实集中的值,则为真

SELECT * FROM T2 WHERE N>ANY(SELECT N FROM T1)
SELECT * FROM T2 WHERE N>SOME(SELECT N FROM T1)


997755.com澳门葡京 3

注意:

当子查询中不是只有一列的情况下,会报那样的不当。如图贰,所以大家将红框的星号,改成想查询的某一列就足以了。如图三.

997755.com澳门葡京 4

图2

997755.com澳门葡京 5

图3

 

子查询的性状:

一、子查询必须放在壹对小括号内

2、“=”相比较运算符,还是能与其它的比较运算符一齐行使,供给子查询的列只好有贰个

三、子查询普通作为WHERE的规范

四、子查询中不可能冒出OHighlanderDEKoleos BY
子句,假若想要排序,只可以对父查询进行排序,也等于说OCR-VDER
BY只可以出现在父查询语句中。


— =ANY 与子查询IN同样
SELECT * FROM T2 WHERE N=ANY (SELECT N FROM T1)
SELECT * FROM T2 WHERE N IN (SELECT N FROM T1)

遵照子查询重回行数的例外又可将其分成:重回多行的子查询。重回单行的子查询和嵌套子查询。

一、重返多行的子查询

     
 再次回到多行的子查询是指施行查询语句获得的结果集中,再次来到了多行数据的子查询。一般景况下,对子查询的研讨都以通过WHERE子句完毕的,但实则还能够运用于SELECT语句以及HAVING短语中。

       在子查询中得以动用IN关键字。EXISTS关键字和相比较运算符来连接表。

997755.com澳门葡京 6

(1)使用IN关键字

             IN关键字:能够使父查询相配子查询重回的八个单列值

            NOT
IN:将父查询条件中的表明式与子查询再次回到的结果开展相比,把不包容的音讯突显出现。

举例:在【教务管理种类】数据库中,查询和“小花四姐”在同二个“年级”的上学的小孩子“姓名”、“性别”、“年级”的新闻。语句如下:

           USE 教务管理体系

           SELECT 姓名,性别,年级 

           FROM 学生信息 S壹

           WHERE S一.年级  IN  (SELECT 年级 FROM 学生音讯 S二  WHERE
S二.姓名=‘小花小姨子’)

本实例中询问也能够利用本身连接来成功,代码如下:

          USE 教务管理连串

          SELECT S1.姓名,S1.性别,S1.年级

          FROM 学生新闻 S一,S二

          WHERE S壹.年级=S贰.年级 AND S二.姓名=‘小花堂姐’、

 

(2)使用EXISTS关键字

EXISTS:只管仲查询是或不是有重返行,如查有再次回到行,再次回到结果为真true,不然为假false。并不使用子查询的结果,仅用于测试子查询是还是不是有重临结果。

NOT EXISTS:
当子查询重回空行或询问失利时,外围查询成功;而子查询成功时或再次来到非空行,则外围查询失利。

语法格式:

SELECT * FROM table WHERE EXISTS / NOT EXISTS(子查询语句)

注意:如若实查询中能够回来数据行,即查询成功,则子查询外围的查询也能成功;如若实查询退步那么外围的询问也会停业,这里EXISTS连接的子查询可以精晓为外界查询的接触条件。

— <>ANY 与NOT IN
–<>ANY
–OEscort作用父查询中的结果集不等于子查询中的a可能b或许c,则为真
SELECT * FROM T2 WHERE N <>ANY(SELECT * FROM T1)

(3)相比较运算符

子查询能够由1个相比较运算符和局地要害字引进,查询结果回到多少个值列表。语法如下:

SELECT *

FROM table

WHERE XX operator【ANY/ALL/SOME】(子查询)

operator表示比较运算符:ANY、ALL和SOME是SQL帮衬的在子查询中开始展览比较的主要字。

ANY和SOME:表示外围查询范围标准与子查询重回值举行相比,如若外围查询中有私下两个数据满意相比较原则,则全部回来;使用ALL关键字表示外围查询范围条件与子查询重回值举行比较,外围子查询重返结果必须全方位知足相比较原则。

997755.com澳门葡京 7

图4

997755.com澳门葡京 8

图5

①、>ALL : 父查询中山大学于子查询结果中的全体值,如图

997755.com澳门葡京 9

图6

二、>ANY
:父查询的列值中,必须至少大于子查询重返值列表中的一个值,如图7

997755.com澳门葡京 10

图7

在意:SOME与ANY的意义与用法一样。如图八.

997755.com澳门葡京 11

图8

三、=ANY和子查询IN:父查询中列值必须在子查询重临的列表中留存,如图玖

997755.com澳门葡京 12

图9

4、<>ANY 和 NOT IN:

<>ANY:
父查询的结果中列的值与子查询再次来到的值列表中有三个不一样等的就足以,约等于O中华V或许的关系,父查询中列的值不等于子查询中值a,或然不等于b,只怕不等于c。

NOT
IN:父查询的结果中列的值必须不可能存在,在子查询的重回值的列表中,也正是AND并且的关系,父查询中列的值不等于子查询中的值a,并且不等于b,并且不等于c。

997755.com澳门葡京 13

997755.com澳门葡京 14

 

–NOT IN
–AND作用父查询中的结果集不等于子查询中自便多个结实聚焦的值,则为真
SELECT * FROM T2 WHERE N NOT IN(SELECT * FROM T1)

997755.com澳门葡京 15

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website