前面说了很多MySQL中的查询,比如条件查询、分组聚合查询、连接查询,今天来说一下另外两个非常的重要的查询,MySQL中的子查询和联合查询。

PART01

子查询

子查询也称嵌套查询,是将一个查询语句嵌套在另一个查询语句的WHERE子句或者HAVING短语中,前者被称为内层查询或子查询,后者被称为外层查询或父查询。在整个SELECT语句中,先计算子查询,然后将子查询的结果作为父查询的过滤条件,嵌套查询可以用多个简单的查询构成一个复杂的查询,用来增强SQL的查询能力。

1、带IN关键字的查询

带IN关键字的子查询是最常用的一类子查询,用于判定一个给定值是否存在与子查询的结果集中,使用IN关键字进行子查询是,内层查询语句仅仅返回一个数据列,其值将提供给外层查询进行比较操作。

#在学生表tb_student中,将学号出现在成绩表tb_score中(表明该学生选修了课程)的学生姓名查询出来

SELECT studentName

FROM tb_student

WHERE tb_student.studentNo IN

(SELECT DISTINCT tb_score, studentNo FROM tb_score);

SELECT DISTINCT studentName

FROM tb_student, tb_score

WHERE tb_student.studentNo = tb_score.studentNo;

说明:在处理这类子查询时MySQL实际上执行了两个操作,即先执行内层查询,再执行外层查询,内层查询的结果作为外层查询的比较条件。也可以使用NOT IN来判定一个给定值不属于子查询的结果。但是,这类表示否定的查询不能用连接查询来改写。

2、带比较运算符的子查询

带比较运算符的子查询是指父查询与子查询之间用用比较运算符进行连接,当用户能确定知道内层查询返回的是单值时,可以用=、>、=、<=、!=(<>)等比较运算符构造子查询。

#查询班级“计算机17-1班”所有学生的学号、姓名

SELECT studentNo, studentName FROMtb_student

WHERE classNo =

(SELECT classNo FROM tb_class

WHERE className = ‘计算机17-1班’)

#查询与“李明”在同一个班学习的学生学号、姓名、班号

SELECT studentNo, studentName, classNo FROMtb_student s1

WHERE classNo =

(SELECT classNo FROM tb_ students s2

WHERE studentName=’李明’) AND studentName != ’李明’;

#上面的最后一个条件,是为了从结果集中去掉李明本人。

比较运算符还可以与ALL、SOME、ANY关键字一起构造子查询。ALL、SOME、ANY用于指定对比较运算符的限制,ALL用于指定表达式需要与子查询结果集中的每个值都进行比较当表达式与每个值都满足比较关系时,会返回TRUE,否则返回FALSE,SOME和ANY是同义词,表示表达式与子查询结果集中的某个值满足比较关系时,就返回TRUE,否则返回FALSE。

#查询男生中比某个女生出生年份晚的学生姓名和出生年份

SELECT studentName, YEAR(birthday) FROM tb_student

WHERE sex=’男’ AND YEAR(birthday)>ANY(

SELECT YEAR(birthday) FROM tb_student WHEREsex=’女’);

3、带EXISTS关键字的子查询

使用关键字EXISTS构建子查询时,系统对子查询进行运算以判断它是否返回结果集,如果子查询的结果集不为空,则EXISTS返回的结果为TRUE,此时外层查询语句将进行查询,如果子查询的结果集为空,则EXISTS返回的结果为FALSE,此时外层查询不进行查询。

由于带EXISTS的子查询只返回TRUE或FALSE,内层查询的SELECT 子句给出字段名称的实际意义,所以其目标列表达式通常用星号“*”。与EXISTS相对应的是NOT EXISTS,使用方法相同。

#查询选修了课程号为“31002”的学生姓名

SELECT studentName FROM tb_student a

WHERE EXISTS

(SELECT * FROM tb_score b

WHERE a.studentNo= b.studentNo AND courseNo=’31002’);

SELECT studentName FROM tb_student

WHERE studentNo IN

(SELECT studentNo FROM tb_score WHERE courseNo=’31002’);

说明:与关键字IN不同的是,外层的WHERE子句中关键字EXISTS前面没有指定内层查询结果集与外层查询的比较条件,故使用关键字EXISTS构造子查询时内层的WHERE子句中需要指定连接条件,即a.studentNo=b.studentNo。

PART02

联合查询

使用UNION关键字可以把来自多个SELECT语句的结果组合到一个结果集中,这种查询称为并(UNION)运算或联合查询。合并时,多个SELECT子句中对应的字段数和数据类型必须相同。下面不使用ALL关键字,执行的时候去掉重复的记录,所有返回的行都是唯一的,使用关键字ALL的作用是不去掉重复的记录,也不对结果进行自动排序。

语法格式是:

SELECT -FROM -WHERE

UNION [ALL]

SELECT -FROM -WHERE

[...UNION [ALL]

SELECT -FROM -WHERE]

例子:

#使用UNION查询选修了“管理学”或“计算机基础”的学生学号

SELECT studentNo FROM tb_score, tb_course

WHERE tb_score .courseNo= tb_course. courseNoAND courseName=’管理学’

UNION

SELECT studentNo FROM tb_score, tb_course

WHERE tb_score .courseNo= tb_course. courseNoAND courseName=’ 计算机基础’;

使用UNION语句需要注意以下几点:

UNION语句必须由两条或两条以上的SELECT语句组成,且彼此间用关键字UNION分隔。

UNION语句中的每个SELECT子句必须包含相同的列、表达式或聚合函数。

每个SELECT子句对应的目标列的数据类型必须兼容,目标列的数据类型不必完全相同,但必须是MySQL可以隐含转换的类型,例如,不同的数值类型或不同的日期类型。

第一个SELECT子句对应的目标列名会被作 为UNION语句结果集的列名称。

联合查询中只能使用一条ORDER BY自己或LIMIMT自己,且它们置于最后一条SELECT语句之后。

今天分享下MySQL中的子查询和联合查询,这对多层查询很有帮助,在工作中,我们常用的是子查询,因为很多数据都不是存储在一个表中,需要进行多层查询。

欢迎关注微信公众号,访问更多精彩:数据之魅。

如需转载,请联系授权,谢谢合作。

mysql子查询日期比较_数据分析系列 16/32 | MySQL中子查询与联合查询相关推荐

  1. mysql去掉两个最高分_数据分析系列 16/32 | MySQL中子查询与联合查询

    前面说了很多MySQL中的查询,比如条件查询.分组聚合查询.连接查询,今天来说一下另外两个非常的重要的查询,MySQL中的子查询和联合查询. PART 01 子查询 子查询也称嵌套查询,是将一个查询语 ...

  2. 异常数据4种剔除方法_数据分析系列 22/32 | 9种常用的数据分析方法

    要使各种结构化的.非结构化的.海量的数据实现标准化.信息化,能够提供业务绩效评估.业务决策支持等要求,我们首先需要进行数据分析. 同时,围绕业务问题,采用合适的分析方法,分析模型,以及分析工具,这是数 ...

  3. excel显著性检验_数据分析系列 10/32 | Excel方差分析之单因素方差分析

    无论是什么活动,影响产品质量和产品的因素都有多种,如影响农作物产量的因素有品种.天气.施肥量.肥料的种类等等.如果我们想要了解这些因素中哪些因素对产量有显著性影响,或各个因素之间的交互作用,以及对结果 ...

  4. 您访问的网页出错了! 网络连接异常、网站服务器失去响应_数据分析系列——静态网页爬虫进阶(requests)...

    在之前"数据分析系列--数据分析入门"16篇中有与爬虫的相关内容,介绍的相对简单.静态网页爬虫进阶系列将分别从网页的自动爬取(Requests).网络数据解析(BeautifulS ...

  5. mysql删除分表键_一文看懂 MySQL 分区和分表,提高表增删改查效率

    原标题:一文看懂 MySQL 分区和分表,提高表增删改查效率 作者:冯帅,精通Oracle. MySQL. 擅长异构数据库数据同步及迁移.数据库的设计和调优,对高可用方案有深入研究. MySQL分区和 ...

  6. mysql和linux的题目_最强Linux和Mysql面试题套餐,让你的面试无懈可击!

    引言: 大家好,我是一菲,在软件测试当中linux 操作系统和Mysql数据库的内容是十分的知识同时也是十分重要的.所以一菲这两天通过查阅资料等其他方式为大家梳理了liunx和Mysql面试题大礼包, ...

  7. mysql架构设计书籍推荐_最近很火的MySQL:抛开复杂的架构设计,MySQL优化思想基本都在这...

    摘要: 冲区才用缓冲区,即SQL_CACHE:sort_buffer_size:排序缓冲区.3)分库分表因为数据库压力过大,首先一个问题就是高峰期系统性能可能会降低,因为数据库负载过高对性能会有影响. ...

  8. db2分页查询语句优化_面试官:数据量很大,分页查询很慢,怎么优化?

    当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点. 下面简单说一下我知道的一些 ...

  9. mysql killed进程不结束_优秀的数据库产品——MySQL 云数据库服务

    作为一种低成本,高性能,高可靠性和开放源代码的数据库产品,MySQL已在Internet公司中广泛使用. 例如,淘宝有数千个MySQL服务器. 尽管NoSQL在过去两年中发展迅速,新产品层出不穷,但N ...

最新文章

  1. python绘制三维轨迹_Python学习(一) —— matplotlib绘制三维轨迹图
  2. SQL 2005 Express 的“企业管理器” 下载
  3. php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
  4. 力荐!Python的14张思维导图 | 附下载方式
  5. ORA-01855: AM/A.M. or PM/P.M. required问题排查与解析
  6. JS保留4位小数(合集)
  7. m.2接口和nvme区别_原来M.2、SATA接口的固态盘有这样的差别,难怪大家都选“它”!...
  8. 智能音箱 之 功放介绍
  9. 得罪前女友到底有多可怕?
  10. chrome 发送请求出现:Provisional headers are shown 提示
  11. 福利 | 干大事,成大事,2018 幸福如是!
  12. warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8): No such file or directory
  13. 【论文总结】TextGCN
  14. 【MSP是什么】最佳管理实践指南
  15. 面试精选-solr篇
  16. [FAQ10926][USB serial number客制化][系列5]:如何实现可以通过pc工具来修改serialnumber?
  17. 销售管理软件系统的两大优势是什么?
  18. html 中全角波浪线,中间波浪怎么打出来,靠上的波浪符号怎么打
  19. 面向对象-当谈论面向对象的时候,我们到底在谈论什么?
  20. excel文件分割器

热门文章

  1. 09机器学习实战之多元线性回归
  2. ansible代码发布系统
  3. 讨论Linux目录结构
  4. LVS的DR模式配置
  5. C++ union 使用总结
  6. Linux下oracle 9i图文安装二
  7. Python安装hmmlearn
  8. KS008基于SSM的新闻发布系统
  9. 鹅厂2020暑期实习第一次一面
  10. 大数据计算引擎发展的四个阶段