子查询概述

子查询是指一个查询语句嵌套在另一个查询语句内部的查询;该查询语句可以嵌套在一个 SELECT、SELECT…INTO、INSERT…INTO等语句中。在执行查询时,首先会执行子查询中的语句,再将返回的结果作为外层查询的过滤条件。在子査询中通常可以使用比较运算符和IN、EXISTS、ANY、ALL等关键字。

在开始学习子查询之前,我们先准备好数据,代码如下:

DROP TABLE IF EXISTS student;DROP TABLE IF EXISTS class;-- 创建班级表CREATE TABLE class( cid int (4) NOT NULL PRIMARY KEY, cname varchar(20));-- 创建学生表CREATE TABLE student ( sid int (4) NOT NULL PRIMARY KEY, sname varchar (20), sage int (2), classid int (4) NOT NULL);-- 向班级表插入数据INSERT INTO class VALUES(1001,'Java');INSERT INTO class VALUES(1002,'C++');INSERT INTO class VALUES(1003,'Python');INSERT INTO class VALUES(1004,'PHP');INSERT INTO class VALUES(1005,'Android');-- 向学生表插入数据INSERT INTO student VALUES(1,'刘婷婷',20,1001);INSERT INTO student VALUES(2,'王琴琴',21,1002);INSERT INTO student VALUES(3,'杨洋洋',24,1003);INSERT INTO student VALUES(4,'李霞霞',23,1004);INSERT INTO student VALUES(5,'吴桃桃',21,1001);INSERT INTO student VALUES(6,'高倩倩',26,1001);INSERT INTO student VALUES(7,'甘丽丽',27,1002);

带比较运算符的子查询

在子查询中可使用>、=、<=、!=等比较运算符。

示例如下:-- 查询高倩倩同学所在班级的信息SELECT * FROM class WHERE cid=(SELECT classid FROM student WHERE sname='高倩倩');-- 查询比高倩倩同学所在班级编号还大的班级的信息SELECT * FROM class WHERE cid>(SELECT classid FROM student WHERE sname='高倩倩');

结果如下:

as count mysql 子查询 mysql数据库子查询语句_as count mysql 子查询

带[NOT] IN关键字的子查询

使用[NOT] IN关键字进行子查询时内层查询语句仅返回一个数据列,这个数据列中的值供外层查询语句进行比较操作。

示例如下:

-- 查询年纪大小为21的学生的所在班级的信息SELECT * FROM class WHERE cid IN (SELECT classid FROM student WHERE sage=21);

结果如下:

as count mysql 子查询 mysql数据库子查询语句_as count mysql 子查询_02

结果分析:使用IN关键字查询出年纪大小为21的学生所在班级的编号;这些编号作为一个列供外层查询使用

在外层查询语句中依据班级编号查询每个班级的信息

示例如下:-- 查询年纪大小不为21的学生的所在班级的信息SELECT * FROM class WHERE cid NOT IN (SELECT classid FROM student WHERE sage=21);

结果如下:

as count mysql 子查询 mysql数据库子查询语句_ci_03

带EXISTS关键字的子查询

EXISTS关键字后面的参数可以是任意一个子查询, 它不产生任何数据只返回TRUE或FALSE。当返回值为TRUE时外层查询才会 执行。

示例如下:

-- 假若高倩倩同学在学生表中则从班级表查询所有班级信息SELECT * FROM class WHERE EXISTS (SELECT * FROM student WHERE sname='高倩倩');

结果如下:

as count mysql 子查询 mysql数据库子查询语句_as count mysql 子查询_04

带ANY关键字的子查询

ANY关键字表示满足其中任意一个条件就返回一个结果作为外层查询条件。

示例如下:-- 查询比任一学生所属班级号还大的班级编号SELECT * FROM class WHERE cid > ANY (SELECT classid FROM student);

结果如下:

as count mysql 子查询 mysql数据库子查询语句_mysql数据库教程子查询_05

结果分析:在子查询中从学生表查出所有学生的班级号,即1001,1002,1003,1004

从班级表中查询比1001,1002,1003,1004中任意一个班级号还的班级号

带ALL关键字的子查询

ALL关键字与ANY有点类似,只不过带ALL关键字的子査询返回的结果需同时满足所有内层査询条件。

示例如下:

-- 查询比所有学生所属班级号还大的班级编号SELECT * FROM class WHERE cid > ALL (SELECT classid FROM student);

结果如下:

as count mysql 子查询 mysql数据库子查询语句_ci_06

查询语句的书写顺序和执行顺序

在此总结,查询语句的书写顺序和执行顺序。

查询语句的书写顺序

select ===> from ===> where ===> group by ===> having ===> order by ===> limit

查询语句的执行顺序

from ===> where ===> group by ===> having ===> select ===> order by ===> limit

附录

在此,以附录的形式给出本节教程的源码,如下所示:DROP TABLE IF EXISTS student;DROP TABLE IF EXISTS class;-- 创建班级表CREATE TABLE class( cid int (4) NOT NULL PRIMARY KEY, cname varchar(20));-- 创建学生表CREATE TABLE student ( sid int (4) NOT NULL PRIMARY KEY, sname varchar (20), sage int (2), classid int (4) NOT NULL);-- 向班级表插入数据INSERT INTO class VALUES(1001,'Java');INSERT INTO class VALUES(1002,'C++');INSERT INTO class VALUES(1003,'Python');INSERT INTO class VALUES(1004,'PHP');INSERT INTO class VALUES(1005,'Android');-- 向学生表插入数据INSERT INTO student VALUES(1,'刘婷婷',20,1001);INSERT INTO student VALUES(2,'王琴琴',21,1002);INSERT INTO student VALUES(3,'杨洋洋',24,1003);INSERT INTO student VALUES(4,'李霞霞',23,1004);INSERT INTO student VALUES(5,'吴桃桃',21,1001);INSERT INTO student VALUES(6,'高倩倩',26,1001);INSERT INTO student VALUES(7,'甘丽丽',27,1002);-- 查询高倩倩同学所在班级的信息SELECT * FROM class WHERE cid=(SELECT classid FROM student WHERE sname='高倩倩');-- 查询比高倩倩同学所在班级编号还大的班级的信息SELECT * FROM class WHERE cid>(SELECT classid FROM student WHERE sname='高倩倩');-- 查询年纪大小为21的学生的所在班级的信息SELECT * FROM class WHERE cid IN (SELECT classid FROM student WHERE sage=21);-- 查询年纪大小不为21的学生的所在班级的信息SELECT * FROM class WHERE cid NOT IN (SELECT classid FROM student WHERE sage=21);-- 假若高倩倩同学在学生表中则从班级表查询所有班级信息SELECT * FROM class WHERE EXISTS (SELECT * FROM student WHERE sname='高倩倩');-- 查询比所有学生所属班级号还大的班级编号SELECT * FROM class WHERE cid > ALL (SELECT classid FROM student);