mysql怎么子查询_在mysql中如何进行子查询?
在mysql中,子查询是指将一个查询语句嵌套在另一个查询语句中,可以在SELECT、UPDATE和 DELETE语句中配合WHERE子句进行实现,WHERE子句中语法格式为“WHERE (另一个查询语句)”。
(推荐教程:mysql视频教程)
子查询是 MySQL 中比较常用的查询方法,通过子查询可以实现多表查询。子查询指将一个查询语句嵌套在另一个查询语句中。子查询可以在 SELECT、UPDATE 和 DELETE 语句中使用,而且可以进行多层嵌套。在实际开发时,子查询经常出现在 WHERE 子句中。
子查询在 WHERE 中的语法格式如下:WHERE (子查询语句)
其中,操作符可以是比较运算符和 IN、NOT IN、EXISTS、NOT EXISTS 等关键字。
1)IN | NOT IN
当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回值正好相反。
2)EXISTS | NOT EXISTS
用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回的值正好相反。
例 1
使用子查询在 tb_students_info 表和 tb_course 表中查询学习 Java 课程的学生姓名,SQL 语句和运行结果如下。mysql> SELECT name FROM tb_students_info
-> WHERE course_id IN (SELECT id FROM tb_course WHERE course_name = 'Java');
+-------+
| name |
+-------+
| Dany |
| Henry |
+-------+
2 rows in set (0.01 sec)
结果显示,学习 Java 课程的只有 Dany 和 Henry。上述查询过程也可以分为以下 2 步执行,实现效果是相同的。
1)首先单独执行内查询,查询出 tb_course 表中课程为 Java 的 id,SQL 语句和运行结果如下。mysql> SELECT id FROM tb_course
-> WHERE course_name = 'Java';
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00 sec)
可以看到,符合条件的 id 字段的值为 1。
2)然后执行外层查询,在 tb_students_info 表中查询 course_id 等于 1 的学生姓名。SQL 语句和运行结果如下。mysql> SELECT name FROM tb_students_info
-> WHERE course_id IN (1);
+-------+
| name |
+-------+
| Dany |
| Henry |
+-------+
2 rows in set (0.00 sec)
习惯上,外层的 SELECT 查询称为父查询,圆括号中嵌入的查询称为子查询(子查询必须放在圆括号内)。MySQL 在处理上例的 SELECT 语句时,执行流程为:先执行子查询,再执行父查询。
例 2
与例 1 类似,在 SELECT 语句中使用 NOT IN 关键字,查询没有学习 Java 课程的学生姓名,SQL 语句和运行结果如下。mysql> SELECT name FROM tb_students_info
-> WHERE course_id NOT IN (SELECT id FROM tb_course WHERE course_name = 'Java');
+--------+
| name |
+--------+
| Green |
| Jane |
| Jim |
| John |
| Lily |
| Susan |
| Thomas |
| Tom |
| LiMing |
+--------+
9 rows in set (0.01 sec)
可以看出,运行结果与例 1 刚好相反,没有学习 Java 课程的是除了 Dany 和 Henry 之外的学生。
例 3
使用=运算符,在 tb_course 表和 tb_students_info 表中查询出所有学习 Python 课程的学生姓名,SQL 语句和运行结果如下。mysql> SELECT name FROM tb_students_info
-> WHERE course_id = (SELECT id FROM tb_course WHERE course_name = 'Python');
+------+
| name |
+------+
| Jane |
+------+
1 row in set (0.00 sec)
结果显示,学习 Python 课程的学生只有 Jane。
例 4
使用<>运算符,在 tb_course 表和 tb_students_info 表中查询出没有学习 Python 课程的学生姓名,SQL 语句和运行结果如下。mysql> SELECT name FROM tb_students_info
-> WHERE course_id <> (SELECT id FROM tb_course WHERE course_name = 'Python');
+--------+
| name |
+--------+
| Dany |
| Green |
| Henry |
| Jim |
| John |
| Lily |
| Susan |
| Thomas |
| Tom |
| LiMing |
+--------+
10 rows in set (0.00 sec)
可以看出,运行结果与例 3 刚好相反,没有学习 Python 课程的是除了 Jane 之外的学生。
例 5
查询 tb_course 表中是否存在 id=1 的课程,如果存在,就查询出 tb_students_info 表中的记录,SQL 语句和运行结果如下。mysql> SELECT * FROM tb_students_info
-> WHERE EXISTS(SELECT course_name FROM tb_course WHERE id=1);
+----+--------+------+------+--------+-----------+
| id | name | age | sex | height | course_id |
+----+--------+------+------+--------+-----------+
| 1 | Dany | 25 | 男 | 160 | 1 |
| 2 | Green | 23 | 男 | 158 | 2 |
| 3 | Henry | 23 | 女 | 185 | 1 |
| 4 | Jane | 22 | 男 | 162 | 3 |
| 5 | Jim | 24 | 女 | 175 | 2 |
| 6 | John | 21 | 女 | 172 | 4 |
| 7 | Lily | 22 | 男 | 165 | 4 |
| 8 | Susan | 23 | 男 | 170 | 5 |
| 9 | Thomas | 22 | 女 | 178 | 5 |
| 10 | Tom | 23 | 女 | 165 | 5 |
| 11 | LiMing | 22 | 男 | 180 | 7 |
+----+--------+------+------+--------+-----------+
11 rows in set (0.01 sec)
由结果可以看到,tb_course 表中存在 id=1 的记录,因此 EXISTS 表达式返回 TRUE,外层查询语句接收 TRUE 之后对表 tb_students_info 进行查询,返回所有的记录。
EXISTS 关键字可以和其它查询条件一起使用,条件表达式与 EXISTS 关键字之间用 AND 和 OR 连接。
例 6
查询 tb_course 表中是否存在 id=1 的课程,如果存在,就查询出 tb_students_info 表中 age 字段大于 24 的记录,SQL 语句和运行结果如下。mysql> SELECT * FROM tb_students_info
-> WHERE age>24 AND EXISTS(SELECT course_name FROM tb_course WHERE id=1);
+----+------+------+------+--------+-----------+
| id | name | age | sex | height | course_id |
+----+------+------+------+--------+-----------+
| 1 | Dany | 25 | 男 | 160 | 1 |
+----+------+------+------+--------+-----------+
1 row in set (0.01 sec)
结果显示,从 tb_students_info 表中查询出了一条记录,这条记录的 age 字段取值为 25。内层查询语句从 tb_course 表中查询到记录,返回 TRUE。外层查询语句开始进行查询。根据查询条件,从 tb_students_info 表中查询 age 大于 24 的记录。
拓展
子查询的功能也可以通过表连接完成,但是子查询会使 SQL 语句更容易阅读和编写。
一般来说,表连接(内连接和外连接等)都可以用子查询替换,但反过来却不一定,有的子查询不能用表连接来替换。子查询比较灵活、方便、形式多样,适合作为查询的筛选条件,而表连接更适合于查看连接表的数据。
mysql怎么子查询_在mysql中如何进行子查询?相关推荐
- apex 查询_在 Apex 中使用合并统计查询
SOQL 中的合并统计查询 在 SOQL 中,我们可以使用一系列函数来进行合并统计查询.它们的功能和标准 SQL 中的 SUM(),COUNT() 等函数类似. Apex 中使用合并统计查询 在 Ap ...
- idea中链接mysql查询_在Idea中编写Java程序连接查询Sqlite数据库
1.使用SqliteSpy建立好数据库文件SqliteSpy运行界面 2.准备好一个空文件夹存放java工程和数据库文件,准备好数据库驱动jar包拷贝到文件夹中sqlite数据库文件和驱动 3.在Id ...
- java数组子类型_在vhdl中获取数组子类型的范围属性
您的问题是您尝试在类型上使用属性 . 但是,范围仅定义为数组(因此原型中为A) . 这意味着,即使数组类型受到约束,也需要使用实际数组 . -- Declarations -- Constrained ...
- mysql执行计划命令_【MySQL】EXPLAIN命令详解--解释执行计划
具体参考: 原文如下: 在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还不算完事,我们还需要知道该SQL的执行计划,比如是全表扫描,还是索 ...
- from server sql 拼接统计两个子查询_[SQL SERVER系列]之嵌套子查询和相关子查询
子查询有两种类型,一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数:另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的 ...
- .net函数查询_特来电智能分析平台动态查询架构创新实践
一.业务背景及痛点 目前主流互联网智能分析平台中,数据查询作为基础的设施服务支撑着基础数据及业务分析的功能展现.随着数据量的增长,数据存储方式多元化,相对静态数据可能存储到关系型数据库中,订单类动态数 ...
- mysql 录入窗体设计_在Access中,可用于设计输入界面的对象是 A)窗体 B)报表 C)查询 D)表...
展开全部 在Access中,可用于设计输入界面的对象是窗体.不属于Access数据类型62616964757a686964616fe4b893e5b19e31333431373330的是报表. 窗体对 ...
- mysql单台跨数据库查询_在MySQL中怎样进行跨库查询?
在MySQL中跨库查询主要分为两种情况,一种是同服务的跨库查询:另一种是不同服务的跨库查询:它们进行跨库查询是不同的,下面就具体介绍这两种跨库查询. 一.同服务的跨库查询 同服务的跨库查询只需要在关联 ...
- 高性能mysql 小查询_高性能MySql进化论(十一):常见查询语句的优化
总结一下常见查询语句的优化方式 1 COUNT 1. COUNT的作用 · COUNT(table.filed)统计的该字段非空值的记录行数 · ...
最新文章
- Web前端工程师的一些常见误区
- 基因组组装----k-mer
- IE和Firefox在JS方面的不兼容及统一方法总结
- java verbose gc_jvm参数-verbose:gc和-XX:+PrintGC有区别?
- 数据增强之图像旋转及坐标对应(附代码)
- 辽宁活跃ip段_有泰国女排影子!激情辽宁女排,打出快乐排球,输了比赛赢了球迷...
- SAP CRM Enterprise Search change pointer的存储数据库表
- python爬取豆瓣前25个影片内容的正则表达式练习
- 去掉边框_安卓也有堪比 VOUN 的加边框应用了,素材丰富到没朋友
- (六)Docker简介
- mtl库在GCC编译器下的使用
- 【转载】RESTful 架构风格概述
- 克隆硬盘后进不去系统_硬盘GHOST克隆后,为什么新的硬盘系统启动不了?
- python中delay__python delay函数
- Trace32 simulator调试以及简单实用命令介绍
- 港股通与全球一体化投资交易系统实践
- SVN冲突 One or more files are in a conflicted state
- Ural1671 Anansi's Cobweb 并查集
- (BN)批量归一化全面解析
- 程序开发中 status 还是 state