MySQL数据查询之子查询的示例分析

49次阅读
没有评论

共计 5711 个字符,预计需要花费 15 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章主要介绍了 MySQL 数据查询之子查询的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

子查询是指一个查询语句嵌套在另一个查询语句内部的查询。在 select 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。

子查询中常用的操作符有 any(some)、all、in、exists。子查询可以添加到 select、update 和 delete 语句中,而且可以进行多层嵌套。子查询中也可以使用比较运算符,如,=,,=“和”!=。

(1)带 any、some 关键字的子查询
(2) 带 all 关键字的子查询
(3) 带 exists 关键字的子查询
(4) 带 in 关键字的子查询
(5) 带比较运算符的子查询

(免费学习推荐:mysql 视频教程)

(1)、带 any、some 关键字的子查询

any 和 some 关键字是同义词,表示满足其中任一条件,允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。

下面定义两个表 tbl1 和 tbl2,并向两个表中插入数据:

mysql  create table tbl1( num1 int not null);Query OK, 0 rows affected (0.13 sec)mysql  create table tbl2(num2 int not null);Query OK, 0 rows affected (0.10 sec)mysql  insert into tbl1 values(1),(5),(13),(27);Query OK, 4 rows affected (0.05 sec)Records: 4 Duplicates: 0 Warnings: 0mysql  insert into tbl2 values(6),(14),(11),(20);Query OK, 4 rows affected (0.06 sec)Records: 4 Duplicates: 0 Warnings: 0

any 关键字接在一个比较操作符后面,表示若与子查询返回的任何职比较为 true,则返回 true。

【例】返回 tbl2 表的所有 num2 列,然后将 tbl1 中的 num1 的值与之进行比较,只要大于 num2 的任何一个值,即为符合条件的结果。

mysql  select num1 from tbl1 where num1   any(select num2 from tbl2);+------+| num1 |+------+| 13 || 27 |+------+2 rows in set (0.00 sec)

(2)、带 all 关键字的子查询

all 关键字需要同时满足所有内层查询的条件。

all 关键字接在一个比较操作符后面,表示与子查询返回的所有值比较为 true,则返回 true。

【例】返回 tbl1 表中比 tbl2 表 num2 列所有值都大的值,SQL 语句如下:

mysql  select num1 from tbl1 where num1   all(select num2 from tbl2);+------+| num1 |+------+| 27 |+------+1 row in set (0.00 sec)

(3)、带 exists 关键字的子查询

exists 关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么 exists 的结果为 true,此时外层查询语句将进行查询;如果子查询没有返回任何行,那么 exists 返回的结果是 false,此时外层语句将不进行查询。

【例 1】查询 suppliers 表中是否存在 s_id=107 的的供应商,如果存在,则查询 fruits 表中的记录,SQL 语句如下:

mysql  select * from fruits -  where exists
 -  (select s_name from suppliers where s_id = 107);+------+------+------------+---------+| f_id | s_id | f_name | f_price |+------+------+------------+---------+| 12 | 104 | lemon | 6.40 || a1 | 101 | apple | 5.20 || a2 | 103 | apricot | 2.20 || b1 | 101 | blackberry | 10.20 || b2 | 104 | berry | 7.60 || b5 | 107 | xxxx | 3.60 || bs1 | 102 | orange | 11.20 || bs2 | 105 | melon | 8.20 || c0 | 101 | cherry | 3.20 || m1 | 106 | mango | 15.70 || m2 | 105 | xbabay | 2.60 || m3 | 105 | xxtt | 11.60 || o2 | 103 | coconut | 9.20 || t1 | 102 | banana | 10.30 || t2 | 102 | grape | 5.30 || t4 | 107 | xbabay | 3.60 |+------+------+------------+---------+16 rows in set (0.00 sec)

由结果可知,内层查询结果表明 suppliers 表中存在 s_id=107 的记录,因此 exists 表达式返回 true;外层查询语句接收 true 之后对表 fruits 进行查询,返回所有记录。

【例 2】查询 suppliers 表中是否存在 s_id=107 的供应商,如果存在,则查询 fruits 表中的 f_price 大于 10.20 的记录,SQL 语句如下:

mysql  select * from fruits -  where f_price   10.20 and exists
 -  (select s_name from suppliers where s_id = 107);+------+------+--------+---------+| f_id | s_id | f_name | f_price |+------+------+--------+---------+| bs1 | 102 | orange | 11.20 || m1 | 106 | mango | 15.70 || m3 | 105 | xxtt | 11.60 || t1 | 102 | banana | 10.30 |+------+------+--------+---------+4 rows in set (0.00 sec)

可以看到, 内层查询表名 suppliers 表中存在 s_id=107 的记录,因此 exists 表达式返回 true;外层查询语句接收 true 之后根据查询条件 f_price 10.20 对 fruits 表进行查询,返回结果为 4 条 f_price 大于 10.20 的记录。

not exists 与 exists 使用方法相同,返回的结果相反。子查询如果至少返回一行,那么 not exists 的结果为 false,此时外层查询语句将不进行查询;如果子查询没有返回任何行,那么 not exists 返回的结果就是 true,此时外层语句将进行查询。

【例 3】查询 suppliers 表中是否存在 s_id =107 的供应商,如果不存在就查询 fruits 表中的记录,SQL 语句如下:

mysql  select * from fruits -  where not exists
 -  (select s_name from suppliers where s_id = 107);Empty set (0.00 sec)

可以看到,内层查询返回结果为 false,外层表达式接收 false 将不再查询 fruits 表中的记录。

注意:exists 和 not exists 的结果只取决于是否会返回行,而不取决于这些行的内容,所以这个子查询输入列表通常是无关紧要的。

(4)、带 in 关键字的子查询

in 关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据列里的值将提供给外层查询语句进行比较操作。

【例 1】在 orderitems 表中查询 f_id 为 c0 的订单号,并根据订单号查询具有订单号的客户 c_id,SQL 语句如下:

mysql  select c_id from orders where o_num in
 -  (select o_num from orderitems where f_id =  c0 +-------+| c_id |+-------+| 10004 || 10001 |+-------+2 rows in set (0.00 sec)

上面的语句是下面查询方式的简写:

mysql  select o_num from orderitems where f_id =  c0 +-------+| o_num |+-------+| 30003 || 30005 |+-------+2 rows in set (0.00 sec)mysql  select c_id from orders where o_num in (30003,30005);+-------+| c_id |+-------+| 10004 || 10001 |+-------+2 rows in set (0.00 sec)

下面介绍与 in 相反的 not in 关键字:

【例 2】与例 1 类似,但 select 语句中使用 not in 关键字。SQL 语句如下:

mysql  select c_id from orders where o_num not in
 -  (select o_num from orderitems where f_id = c0 +-------+| c_id |+-------+| 10001 || 10003 || 10005 |+-------+3 rows in set (0.00 sec)

可以看到返回了三个表, 查看 orders 中的记录可知,c_id 等于 10001 的客户的订单不止一个:

mysql  select * from orders;+-------+---------------------+-------+| o_num | o_date | c_id |+-------+---------------------+-------+| 30001 | 2008-09-01 00:00:00 | 10001 || 30002 | 2008-09-12 00:00:00 | 10003 || 30003 | 2008-09-30 00:00:00 | 10004 || 30004 | 2008-10-03 00:00:00 | 10005 || 30005 | 2008-10-08 00:00:00 | 10001 |+-------+---------------------+-------+5 rows in set (0.00 sec)

结果只是排除了订单号,但仍然有可能选择同一个客户。

子查询的功能也可以通过连接查询完成,但子查询使得 MySQL 代码更容易阅读和编写。

(5)、带比较运算符的子查询

【例 1】在 suppliers 表中查询 s_city 等于 Tianjin 的供应商 s_id,然后在 fruits 表中查询所有该供应商提供的水果的种类,SQL 语句如下:

mysql  select s_id,f_name from fruits -  where s_id =
 -  (select s1.s_id from suppliers as s1 where s1.s_city =  Tianjin +------+------------+| s_id | f_name |+------+------------+| 101 | apple || 101 | blackberry || 101 | cherry |+------+------------+3 rows in set (0.00 sec)

【例 2】在 suppliers 表中查询 s_city 等于 Tianjin 的供应商,s_id,然后在 fruits 表中查询所有非该供应商提供的水果的种类,SQL 语句如下:

mysql  select s_id , f_name from fruits -  where s_id  
 -  (select s1.s_id from suppliers as s1 where s1.s_city = Tianjin +------+---------+| s_id | f_name |+------+---------+| 104 | lemon || 103 | apricot || 104 | berry || 107 | xxxx || 102 | orange || 105 | melon || 106 | mango || 105 | xbabay || 105 | xxtt || 103 | coconut || 102 | banana || 102 | grape || 107 | xbabay |+------+---------+13 rows in set (0.00 sec)

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“MySQL 数据查询之子查询的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计5711字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)