导读跟大家讲解下有关MySQL数据查询之子查询,相信小伙伴们对这个话题应该也很关注吧,现在就为小伙伴们说说MySQL数据查询之子查询,小编也
跟大家讲解下有关MySQL数据查询之子查询,相信小伙伴们对这个话题应该也很关注吧,现在就为小伙伴们说说MySQL数据查询之子查询,小编也收集到了有关MySQL数据查询之子查询的相关资料,希望大家看到了会喜欢。
子查询是指一个查询语句嵌套在另一个查询语句内部的查询。在lect子句中先计算子查询子查询结果作为外层另一个查询的过滤条件查询可以基于一个表或者多个表。
子查询中常用的操作符有any(some)、all、in、exists。子查询可以添加到lect、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 c)mysql> create table tbl2(num2 int not null);Query OK, 0 rows affected (0.10 c)mysql> inrt into tbl1 values(1),(5),(13),(27);Query OK, 4 rows affected (0.05 c)Records: 4 Duplicates: 0 Warnings: 0mysql> inrt into tbl2 values(6),(14),(11),(20);Query OK, 4 rows affected (0.06 c)Records: 4 Duplicates: 0 Warnings: 0
any关键字接在一个比较操作符后面表示若与子查询返回的任何职比较为true则返回true。
【例】返回tbl2表的所有num2列然后将tbl1中的num1的值与之进行比较只要大于num2的任何一个值即为符合条件的结果。
mysql> lect num1 from tbl1 where num1 > any(lect num2 from tbl2);+------+| num1 |+------+| 13 || 27 |+------+2 rows in t (0.00 c)
(2)、带all关键字的子查询all关键字需要同时满足所有内层查询的条件。all关键字接在一个比较操作符后面表示与子查询返回的所有值比较为true则返回true。
【例】返回tbl1表中比tbl2表num2列所有值都大的值SQL语句如下:
mysql> lect num1 from tbl1 where num1 > all(lect num2 from tbl2);+------+| num1 |+------+| 27 |+------+1 row in t (0.00 c)
(3)、带exists关键字的子查询exists关键字后面的参数是一个任意的子查询系统对子查询进行运算以判断它是否返回行如果至少返回一行那么exists的结果为true此时外层查询语句将进行查询;如果子查询没有返回任何行那么exists返回的结果是fal此时外层语句将不进行查询。
【例1】查询suppliers表中是否存在s_id=107的的供应商如果存在则查询fruits表中的记录SQL语句如下:
mysql> lect * from fruits -> where exists -> (lect 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 t (0.00 c)
由结果可知内层查询结果表明suppliers表中存在s_id=107的记录因此exists表达式返回true;外层查询语句接收true之后对表fruits进行查询返回所有记录。
【例2】查询suppliers表中是否存在s_id=107的供应商如果存在则查询fruits表中的f_price大于10.20的记录,SQL语句如下:
mysql> lect * from fruits -> where f_price > 10.20 and exists -> (lect 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 t (0.00 c)
可以看到,内层查询表名suppliers表中存在s_id=107的记录因此exists表达式返回true;外层查询语句接收true之后根据查询条件f_price>10.20对fruits表进行查询返回结果为4条f_price大于10.20的记录。
not exists与exists使用方法相同返回的结果相反。子查询如果至少返回一行那么not exists的结果为fal此时外层查询语句将不进行查询;如果子查询没有返回任何行那么not exists返回的结果就是true此时外层语句将进行查询。
【例3】查询suppliers表中是否存在s_id =107的供应商如果不存在就查询fruits表中的记录SQL语句如下:
mysql> lect * from fruits -> where not emaroon 5 sugarxists -> (lect s_name from suppliers where s_id = 107);Empty t (0.00 c)
可以看到内层查询返回结果为fal外层表达式接收fal将不再查询fruits表中的记录。
注意:exists 和 not exists的结果只取决于是否会返回行而不取决于这些行的内容所以这个子查询输入列表通常是无关紧要的。
(4)、带in关键字的子查询in关键字进行子查询时内层查询语句仅仅返回一个数据列这个数据列里的值将提供给外层查询语句进行比较操作。
【例1】在orderitems表中查询f_id为c0的订单号并根据订单号查询具有订单号的客户c_idSQL语句如下:
mysql> lect c羚羊清肺丸_id from orders where o_num in -> (lect o_num from orderitems where f_id = 'c0');+-------+| c_id |+-------+| 10004 || 10001 |+-------+2 rows in t (0.00 c)
上面的语句是下面查询方式的简写:
mysql> lect o_num from orderitems where f_id = 'c0';+-------+| o_num |+-------+| 30003 || 30005 |+-------+2 rows in t (0.00 c)mysql> lect c_id from orders where o_num in (30003,30005);+-------+| c_id |+-------+| 10004 || 10001 |+-------+2 rows in t (0.00 c)
下面介绍与in相反的not in关键字:
【例2】与例1类似但lect语句中使用not in 关键字。SQL语句如下:
mysql> lect c_id from orders where o_num not in -> (lect o_num from orderitems where f_id ='c0');+-------+| c_id |+-------+| 10001 || 10003 || 10005 |+-------+3 rows in t (0.00 c)
可以看到返回了三个表,查看orders中的记录可知,c_id等于10001的客户的订单不止一个:
mysql> lect * 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 t (0.00 c)
结果只是排除了订单号但仍然有可能选择同一个客户。
子查询的功能也可以通过连接查询完成但子查询使得MySQL代码更容易阅读和编写。
(5)、带比较运算符的子查询
【例1】在suppliers表中查询s_city等于”Tianjin”的供应商s_id然后在fruit信息组织s表中查询所有该供应商提供的水果的种类SQL语句如下:
mysql> lect s_id,f_name from fruits -> where s_id = -> (lect 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 t (0.0防化指挥工程学院0 c)
【例2】在suppliers表中查询s_city等于”Tianjin”的供应商s_id然后在fruits表中查询所有非该供应商提供的水果的种类SQL语句如下:
mysql> lect s_id , f_name from fruits -> where s_id <> -> (lect s1.s_id from suppliers as s1 where s1.s_city ='Tianjin');+------+---------+| s_id | f_name |+------+---------+| 104 | lemon || 103 | apricot || 104 | be钱文忠解读三字经rry || 107 | xxxx || 102 | orange || 105 | melon || 106 | mango || 105 | xbabay || 105 | xxtt || 103 | coconut || 102 | banana || 102 | grape || 107 | xbabay |+------+---------+13 rows in t (0.00 c)
更多相关免费学习推荐:mysql教程(视频)
以上就是MySQL数据查询之子查询的详细内容!
来源:php中文网
本文发布于:2023-02-26 17:32:49,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/167740396955554.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:互联网常识:MySQL数据查询之子查询.doc
本文 PDF 下载地址:互联网常识:MySQL数据查询之子查询.pdf
留言与评论(共有 0 条评论) |