分享

MySQL数据库实操教程(17)——子查询

 佬总图书馆 2019-12-19

自定义View系列教程00–推翻自己和过往,重学自定义View
自定义View系列教程01–常用工具介绍
自定义View系列教程02–onMeasure源码详尽分析
自定义View系列教程03–onLayout源码详尽分析
自定义View系列教程04–Draw源码分析及其实践
自定义View系列教程05–示例分析
自定义View系列教程06–详解View的Touch事件处理
自定义View系列教程07–详解ViewGroup分发Touch事件
自定义View系列教程08–滑动冲突的产生及其处理


探索Android软键盘的疑难杂症
深入探讨Android异步精髓Handler
详解Android主流框架不可或缺的基石
站在源码的肩膀上全解Scroller工作机制


Android多分辨率适配框架(1)— 核心基础
Android多分辨率适配框架(2)— 原理剖析
Android多分辨率适配框架(3)— 使用指南


Android程序员C语言自学完备手册
讲给Android程序员看的前端系列教程(图文版)
讲给Android程序员看的前端系列教程(视频版)


版权声明


子查询概述

子查询是指一个查询语句嵌套在另一个查询语句内部的查询;该查询语句可以嵌套在一个 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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

带比较运算符的子查询

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

示例如下:

-- 查询高倩倩同学所在班级的信息SELECT * FROM class WHERE cid=(SELECT classid FROM student WHERE sname='高倩倩');-- 查询比高倩倩同学所在班级编号还大的班级的信息SELECT * FROM class WHERE cid>(SELECT classid FROM student WHERE sname='高倩倩');
  • 1
  • 2
  • 3
  • 4
  • 5

结果如下:
在这里插入图片描述

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

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

示例如下:

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

结果如下:
在这里插入图片描述
结果分析:

  • 使用IN关键字查询出年纪大小为21的学生所在班级的编号;这些编号作为一个列供外层查询使用
  • 在外层查询语句中依据班级编号查询每个班级的信息

示例如下:

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

结果如下:
在这里插入图片描述

带EXISTS关键字的子查询

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

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

结果如下:
在这里插入图片描述

带ANY关键字的子查询

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

示例如下:

-- 查询比任一学生所属班级号还大的班级编号SELECT * FROM class WHERE cid > ANY (SELECT classid FROM student);
  • 1
  • 2

结果如下:
在这里插入图片描述
结果分析:

  • 在子查询中从学生表查出所有学生的班级号,即1001,1002,1003,1004
  • 从班级表中查询比1001,1002,1003,1004中任意一个班级号还的班级号

带ALL关键字的子查询

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

示例如下:

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

结果如下:
在这里插入图片描述

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

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

查询语句的书写顺序

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多