mysql的复杂查询_mysql复杂查询

所谓复杂查询,指涉及多个表、具有嵌套等复杂结构的查询。这里简要介绍典型的几种复杂查询格式。

一、连接查询

连接是区别关系与非关系系统的最重要的标志。通过连接运算符可以实现多个表查询。连接查询主要包括内连接、外连接等。

假设有Student和Grade两个表如下:

+-----+--------+-------+ +-----+------------+--------+

| sID | sName | sDept | | gID | gCourse | gScore |

+-----+--------+-------+ +-----+------------+--------+

| 1 | Paul | CS | | 1 | Math | 87 |

| 2 | Oliver | MS | | 2 | English | 95 |

| 3 | Jack | SE | | 3 | Physics | 76 |

| 4 | Robin | CS | | 7 | Philosophy | 76 |

+-----+--------+-------+ +-----+------------+--------+

1.1 内连接

内连接(INNER JOIN)使用比较运算符进行表间列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,组合成新的记录。

当比较操作符是=时,称为等值连接:

SELECT * FROM Student INNER JOIN Grade ON Student.sID = Grade.gID;

等价于

SELECT * FROM Student,Grade WHERE Student.sID = Grade.gID;

结果如下:

+-----+--------+-------+-----+---------+--------+

| sID | sName | sDept | gID | gCourse | gScore |

+-----+--------+-------+-----+---------+--------+

| 1 | Paul | CS | 1 | Math | 87 |

| 2 | Oliver | MS | 2 | English | 95 |

| 3 | Jack | SE | 3 | Physics | 76 |

+-----+--------+-------+-----+---------+--------+

可以看出,在内连接查询中,只有满足条件的记录才能出现在结果关系中。

1.2 外连接

与内连接不同的是,外连接返回的查询结果集中不仅包含符合连接条件的行,而且还包括左表(左连接)、右表(右连接)或两个表(全外连接)中的所有数据行。

1.2.1 左连接

LEFT JOIN(左连接),即LEFT OUTER JOIN,返回左表的全部记录,即使右表中没有对应匹配记录。

SELECT * FROM Student LEFT JOIN Grade ON Student.sID = Grade.gID;

结果如下:

+-----+--------+-------+------+---------+--------+

| sID | sName | sDept | gID | gCourse | gScore |

+-----+--------+-------+------+---------+--------+

| 1 | Paul | CS | 1 | Math | 87 |

| 2 | Oliver | MS | 2 | English | 95 |

| 3 | Jack | SE | 3 | Physics | 76 |

| 4 | Robin | CS | NULL | NULL | NULL |

+-----+--------+-------+------+---------+--------+

1.2.2 右连接

RIGHT JOIN(右连接),即RIGHT OUTER JOIN,返回右表的全部记录,即使左表中没有对应匹配记录。

SELECT * FROM Student RIGHT JOIN Grade ON Student.sID = Grade.gID;

结果如下:

+------+--------+-------+-----+------------+--------+

| sID | sName | sDept | gID | gCourse | gScore |

+------+--------+-------+-----+------------+--------+

| 1 | Paul | CS | 1 | Math | 87 |

| 2 | Oliver | MS | 2 | English | 95 |

| 3 | Jack | SE | 3 | Physics | 76 |

| NULL | NULL | NULL | 7 | Philosophy | 76 |

+------+--------+-------+-----+------------+--------+

1.2.3 全连接

FULL JOIN(全连接),即FULL OUTER JOIN,返回左表、右表的全部记录,即使没有对应的匹配记录。

**注意:**MySQL不支持FULL JOIN,不过可以通过UNION关键字来合并 LEFT JOIN 与 RIGHT JOIN来模拟。

SELECT * FROM Student LEFT JOIN Grade ON Student.sID = Grade.gID

UNION

SELECT * FROM Student RIGHT JOIN Grade ON Student.sID = Grade.gID

结果如下:

+------+--------+-------+------+------------+--------+

| sID | sName | sDept | gID | gCourse | gScore |

+------+--------+-------+------+------------+--------+

| 1 | Paul | CS | 1 | Math | 87 |

| 2 | Oliver | MS | 2 | English | 95 |

| 3 | Jack | SE | 3 | Physics | 76 |

| 4 | Robin | CS | NULL | NULL | NULL |

| NULL | NULL | NULL | 7 | Philosophy | 76 |

+------+--------+-------+------+------------+--------+

另外,如果在一个连接查询中涉及到的两个表是同一个表,这种查询称为自连接查询。为了防止产生二义性,自连接查询中通常对表使用别名。

二、子查询

子查询是指一个查询语句嵌套在另一个查询语句内部的查询。在 SELECT 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件。

子查询中常用的操作符有ANY、SOME、ALL、EXISTS、IN,也可以使用比较运算符。子查询可以添加到 SELECT、UPDATE 和 DELETE 语句中,而且可以进行多层嵌套。

2.1 在条件表达式中产生标量的子查询

SELECT *

FROM score

WHERE id = (SELECT event_id

FROM event

WHERE date='2015-07-01'

AND type='Q');

所谓标量,就是单个属性的一个原子值。当子查询出现在 WHERE 子句中的比较运算符(= ,>, >= ,< , <= ,<>)的右边,其输出结果应该只有一个才对。很容易理解,如果返回多条结果,就无法进行比较,系统就会报错。

又如:

SELECT * FROM teacher WHERE birth = MIN(birth); /*错误*/

这个查询是错的!因为MySQL不允许在子句里面使用统计函数,所以改用子查询:

SELECT *

FROM teacher

WHERE birth = (SELECT MIN(birth)

FROM teacher);

2.2 在条件表达式中产生集合的子查询

如果子查询的输出是一个结果集合,可以通过 ANY、ALL、IN 进行比较。

2.2.1 ANY与SOME

ANY和SOME关键字是同义词,表示满足其中任一条件。它们允许创建一个表达式对子查询的返回结果集进行比较:

SELECT num1

FROM t1

WHERE num1 > ANY(SELECT num2

FROM t2);

上面的子查询返回 t2 的 num2 列,然后将 t1 中的 num1 值与之进行比较,只要大于 num2 的任何一个值,即为符合查询条件的结果。

等价于:

SELECT num1

FROM t1

WHERE num1 > SOME(SELECT num2

FROM t2);

2.2.2 ALL

与ANY/SOME不同,使用ALL时需要同时满足所有内层查询的条件。

SELECT num1

FROM t1

WHERE num1 > ALL(SELECT num2

FROM t2);

上面的子查询还是返回 t2 的 num2 列,然后将 t1 中的 num1 值与之进行比较。但是只有大于所有 num2 值的 num1 才是符合查询条件的结果。

2.2.3 IN

IN关键字后接一个子查询,若在子查询结果集中,返回true,否则返回false。与之相对的是NOT IN。

SELECT num1

FROM t1

WHERE num1 IN (SELECT num2

FROM t2);

2.3 在条件表达式中测试空/非空的子查询

EXISTS关键字后接一个任意的子查询,系统对子查询进行运算以判断它是否返回行。

若至少返回一行,那么 EXISTS 的结果为 true,此时外层查询语句将进行查询;

若没有返回任何行,那么 EXISTS 的结果为 false,此时外层语句将不进行查询。

SELECT sName

FROM Student

WHERE EXISTS (SELECT *

FROM Grade

WHERE gScore < 60);

EXISTS和NOT EXISTS的结果只取决于是否会返回行,而不取决于这些行的内容。

2.4 关联子查询

一般的子查询只计算一次,其结果用于外层查询。但关联子查询需要计算多次。

子查询中使用了主查询中的某些字段,主查询每扫描一行都要执行一次子查询,这种子查询称为关联子查询(Correlated Subquery)。

SELECT sName

FROM Student

WHERE '450' NOT IN (SELECT courseID

FROM Course

WHERE sID = Student.sID);

上面的子查询中使用了 Student 表的 sID 字段。对于 Student 表中每一个 sID 都会执行一次子查询。

2.5 FROM子句中的子查询

子查询可以用括号括起来作为一个关系,从而出现在 FROM 列表中。由于子查询的结果关系没有正式的名字,故必须给它取一个别名。

SELECT *

FROM Grade,

(SELECT * FROM Student WHERE sDept='CS')x

WHERE x.sID=Grade.gID;

x 就是子查询的结果关系的别名。

三、合并查询结果

利用UNION或UNION ALL关键字,可以将多个 SELECT 语句的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同。

UNION:合并查询结果时,删除重复的记录,返回的行都是唯一的。

UNION ALL:合并查询结果时,不删除重复行。

3.1 UNION ALL

SELECT * FROM Student

UNION ALL

SELECT * FROM Student;

结果如下:

+-----+--------+-------+

| sID | sName | sDept |

+-----+--------+-------+

| 1 | Paul | CS |

| 2 | Oliver | MS |

| 3 | Jack | SE |

| 4 | Robin | CS |

| 1 | Paul | CS |

| 2 | Oliver | MS |

| 3 | Jack | SE |

| 4 | Robin | CS |

+-----+--------+-------+

3.2 UNION

SELECT * FROM Student

UNION

SELECT * FROM Student;

结果如下:

+-----+--------+-------+

| sID | sName | sDept |

+-----+--------+-------+

| 1 | Paul | CS |

| 2 | Oliver | MS |

| 3 | Jack | SE |

| 4 | Robin | CS |

+-----+--------+-------+

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库调优要点纪要

数据库瓶颈一般在IO和CPU 1、少用group by, order by 2、通过索引来排序&#xff08;不要所有字段都用索引&#xff0c;因为insert、update要重构索引很耗时&#xff09; 3、避免select * 4、少用join 5、join和子查询&#xff0c;还是用join来代替子查询吧 6、少用or 7、用uni…

Unity3D 之UGUI 滑动条(Slider)

这里来讲解下UGUI 滑动条(Slider)的用法 控件下面有三个游戏对象 Background -->背景 Fill Area --> 前景区域 Handle Slide Area --> 滑动条 Slider的属性 其他几个设置和其他控件都差不多&#xff0c;这里来讲解几个特有的属性。 Direction -->方向 Whole Number…

Android Studio导入别人的module提示错误Plugin with id ‘com.jfrog.bintray‘ not found.

1 问题 Android Studio导入别人的module提示错误如下 Plugin with id com.jfrog.bintray not found. Plugin with id com.github.dcendents.android-maven not found 2 解决办法 在我们的项目的build.gradle添加如下配置 buildscript {repositories {google()jcenter()}dep…

C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言。

真不难 C语言难不难&#xff1f;这个问题是相对的&#xff0c;对于找到合适方法学习C语言的同学想必是觉得很简单&#xff1b;但对于一部分同学来说&#xff0c;没有众观全局就会误以为刚入门就需要学习庞大的知识&#xff0c;学着学着开始看不懂&#xff0c;由于心理作怪&…

【中间件】.net Core中使用HttpReports进行接口统计,分析, 可视化, 监控,追踪等...

HttpReports 基于.Net Core 开发的APM监控系统&#xff0c;使用MIT开源协议&#xff0c;主要功能包括&#xff0c;统计, 分析, 可视化&#xff0c; 监控&#xff0c;追踪等&#xff0c;适合在微服务环境中使用。官方地址&#xff1a;https://www.yuque.com/httpreports/docs/u…

【遥感数字图像处理】实验:遥感影像辐射纠正(大气纠正)完整操作图文教程(Erdas版)

一、实验平台:Erdas 9.1 二、实验数据:dmtm.img 三、实验内容:利用回归分析法校正影像 四、实验原理:大气散射只影响短波波段,长短波进行对比,找出影响短波的程辐射值,将其减去 五、实验目的:掌握回归分析法校正影像的方法及步骤,能熟练地对影像进行校正 六、实…

Android之开源视频压缩框架RxFFmpeg的commands设置

1 Android视频压缩框架 地址:https://github.com/microshow/RxFFmpeg 2 问题 用ffmpeg进行压缩的时候,我们需要采用ffmpeg命令压缩官网给的命令如下 String text = "ffmpeg -y -i /storage/emulated/0/1/input.mp4 -vf boxblur=25:5 -preset superfast /storage/emul…

Acitivty生命周期

为什么80%的码农都做不了架构师&#xff1f;>>> Acitivty 有七个生命周期&#xff1a; onCreate&#xff1a;当第一次调用一个Activity就会执行onCreate方法 onStart&#xff1a;当Activity处于可见状态的时候就会调用onStart方法 onResume&#xff1a;当Activity可…

listview嵌套gridview

1.首先要自定义一个继承gridview的类 public class MyGridView extends GridView {public boolean hasScrollBar true;public MyGridView(Context context) {super(context);}public MyGridView(Context context, AttributeSet attrs) {super(context, attrs);}Overrideprotec…

还不懂你现在学习的编程语言能做什么?还不懂如何进阶?过来看图

前言说七说八 本篇文章的配图标注、内容并不代表仅有&#xff1b;本篇仅以个人经验及当前大学&#xff08;大专、本科&#xff09;相关课程作对比&#xff0c;列出比较常规的语言发展走向及相关技术&#xff1b;再次重申&#xff0c;本图及本文所涉及的技术发展走向并不代表着…

IT新起之秀

辞职以后自己比较迷茫&#xff0c;不知道自己能干什么&#xff0c;09年毕业到现在虽然工作经验有7、8年&#xff0c;但是感觉自己什么都不会&#xff0c;除了自己能下车间别的好像也做不成&#xff0c;没有一技之长。我更像是一个经验用了7、8年而不是有7、8年的经验 在齐鲁人才…

【遥感数字图像处理】实验:遥感影像几何纠正完整操作流程(Erdas版)

☆☆☆ 几何纠正预备知识 ☆☆☆ 1、几何变形误差的影响因素 遥感器本身引起的畸变外部因素引起的畸变处理过程中引起的畸变2、需要做精纠正的情况 景与景之间作比较GIS建模之前监督分类时提取样本创建高精度比例尺的影像地图与矢量数据叠加源于不同比例尺的地图之间比较提取精…

openid 钉钉_钉钉开发入门,微应用识别用户身份,获取用户免登授权码code,获取用户userid,获取用户详细信息...

最近有个需求,在钉钉内,点击微应用,获取用户身份,根据获取到的用户身份去企业内部的用户中心做校验,校验通过,相关子系统直接登陆;就是在获取这个用户身份的时候,网上的资料七零八落的,找的人烦躁的很,所以自己记录一下;实现这个要求,有好几种方式,使用ISV方式相对来说比较简单…

趣味二维码生成

1背景介绍 最近在 Github 看到了一个有趣的项目 amazing-qr&#xff0c;它支持生成普通二维码&#xff0c;带图片的艺术二维码&#xff0c;动态二维码。项目是用 python 编写的&#xff0c;以命令行的方式运行生成&#xff0c;不太方便调用&#xff0c;因此&#xff0c;我…

学习进度博客十二

本周学习软件工程所花时间为&#xff1a;4小时 代码&#xff1a;200行 博客发表篇数&#xff1a;3 了解到的知识点&#xff1a;这周我们开始了第二次冲刺阶段 转载于:https://www.cnblogs.com/wulun/p/5610433.html

Android Studio提示No virtual method asBitmap()Lcom/bumptech/glide/RequestBuilder

1 问题 android studio导入别人项目的module,运行点击app,程序奔溃&#xff0c;错误日志如下 Process: com.example.chenyu, PID: 6302java.lang.NoSuchMethodError: No virtual method asBitmap()Lcom/bumptech/glide/RequestBuilder; in class Lcom/bumptech/glide/RequestM…

电脑开机后,就会自动运行chkdsk,我想取消chkdsk,怎么取消

&#xfeff;&#xfeff;每次开机都自动检查磁盘&#xff0c;检测通过后下次还是一样,NTFS/FAT32分区都有可能有这样的情况&#xff0c;即使重装系统&#xff0c;仍可能出现同样情况&#xff0c;但是硬盘可以通过Dell 随机带的检测程序解决方法&#xff1a;在命令行窗口中输入…

《零基础看得懂的C++入门教程 》——(1)第一个C++程序就让你知其所以然

一、学习目标 了解第一个C程序了解第一个C程序结构了解什么是注释了解什么是命名空间了解C语言的输出&#xff08;如何在程序运行时显示内容&#xff09;了解语句结束后需要使用什么符号表示结束 了解程序入口 目录 预备第一篇&#xff0c;使用软件介绍在这一篇&#xff0c;…

1、Locust压力测试环境搭建

环境准备&#xff1a;阿里云服务器一台、python2.7、pip Locust 介绍Locust 是一个开源负载测试工具。使用 Python 代码定义用户行为&#xff0c;也可以仿真百万个用户。 Locust 简单易用&#xff0c;分布式&#xff0c;用户负载测试工具。Locust 主要为网站或者其他系统进行负…

MicroStation V8i简体中文版完全补丁安装教程(附安装包下载)

MicroStation是一款非常不错的二维和三维设计软件,由奔特力(Bentley)工程软件系统有限公司开发的一款软件。在CAD设计上该软件是和AutoCAD是齐名的软件,其专用的文件格式是DGN,当然该软件还兼容AutoCAD的DWG/DXF等格式,该软件的应用已经非常广泛,在建筑、土木工程、交通…