MySQL数据查询之子查询
MySQL数据查询之子查询
子查询是指一个查询语句嵌套在另一个查询语句内部的查询。在 select 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。子查询中常用的操作符有 any(some)、all、in、exists。子查询可以添加到 select、update 和 delete 语句中,而且可以进行多层嵌套。子查询中也可以使用比较运算符,如 "<","",">="和“!=”。
1.带 any、some 关键字的子查询
any 和 some 关键字是同义词,表示满足其中任一条件,允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。
【例】返回 tbl2 表的所有 num2 列,然后将 tbl1 中的 num1 的值与之进行比较,只要大于 num2 的任何一个值,即为符合条件的结果。
SELECT num1 FROM tbl1 WHERE num1 > ANY (SELECT num2 FROM tbl2);
2.带 all 关键字的子查询
all 关键字需要同时满足所有内层查询的条件。all 关键字接在一个比较操作符后面,表示与子查询返回的所有值比较为 true,则返回 true。
【例】返回 tbl1 表中比 tbl2 表 num2 列所有值都大的值。
SELECT num1 FROM tbl1 WHERE num1 > ALL (SELECT num2 FROM tbl2);
3.带 exists 关键字的子查询
exists 关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么 exists 的结果为 true,此时外层查询语句将进行查询;如果子查询没有返回任何行,那么 exists 返回的结果是 false,此时外层语句将不进行查询。
【例1】查询 suppliers 表中是否存在 s_id=107 的供应商,如果存在,则查询 fruits 表中的记录。
SELECT * FROM fruits WHERE EXISTS (SELECT s_name FROM suppliers WHERE s_id=107);
【例2】查询 suppliers 表中是否存在 s_id=107 的供应商,如果存在,则查询 fruits 表中的 f_price 大于 10.20 的记录。
SELECT * FROM fruits WHERE f_price > 10.20 AND EXISTS (SELECT s_name FROM suppliers WHERE s_id=107);
not exists 与 exists 使用方法相同,返回的结果相反。
4.带 in 关键字的子查询
in 关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据列里的值将提供给外层查询语句进行比较操作。
【例1】在 orderitems 表中查询 f_id 为 c0 的订单号,并根据订单号查询具有订单号的客户 c_id。
SELECT c_id FROM orders WHERE o_num IN (SELECT o_num FROM orderitems WHERE f_id='c0');
【例2】与例1 类似,但 select 语句中使用 not in 关键字。
SELECT c_id FROM orders WHERE o_num NOT IN (SELECT o_num FROM orderitems WHERE f_id='c0');
5.带比较运算符的子查询
【例1】在 suppliers 表中查询 s_city 等于 "Tianjin" 的供应商 s_id,然后在 fruits 表中查询所有该供应商提供的水果的种类。
SELECT s_id, f_name FROM fruits WHERE s_id = (SELECT s1.s_id FROM suppliers AS s1 WHERE s1.s_city='Tianjin');
【例2】在 suppliers 表中查询 s_city 等于 "Tianjin" 的供应商,s_id,然后在 fruits 表中查询所有非该供应商提供的水果的种类。
SELECT s_id,f_name FROM fruits WHERE s_id (SELECT s1.s_id FROM suppliers AS s1 WHERE s1.s_city='Tianjin');
以上就是 MySQL 数据查询之子查询的详细内容。子查询的功能也可以通过连接查询完成,但子查询使得 MySQL 代码更容易阅读和编写。

-
mysql怎么将查询结果赋给变量 2023-05-14 07:00:03
-
mysql乐观锁和悲观锁的区别是什么 2023-05-14 07:00:03
-
一起聊聊MySQL主从延时的处理方案 2023-05-14 07:00:03
-
mysql修改表结构的语句是什么 2023-05-14 07:00:03
-
mysql驱动是什么 2023-05-14 07:00:03
-
MySQL 语法整理介绍 2023-05-14 07:00:03
-
qt5.8如何连接mysql 2023-05-14 07:00:03
-
mysql怎么查询数据并起别名 2023-05-14 07:00:02
-
centos7 怎么编译安装mysql 2023-05-14 07:00:02
-
sql语句中创建表的语句是什么 2023-05-14 07:00:02