【MySQL】子查询

181 阅读4分钟

本人已参与「新人创作礼」活动,一起开启掘金创作之路。

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情

目录

今天阿文介绍的内容:

  • 什么是子查询
  • ANY与SOME关键字
  • ALL关键字
  • EXISTS和NOT EXISTS关键字
  • IN和NOT IN关键字
  • 子查询与比较运算符一起使用

1.子查询

所谓的子查询是指一个查询语句中嵌套另一个查询语句。子查询结果作为外围查询语句的过滤条件,查询可以基于一个表或者多个表,并且可以进行多出嵌套。

1.1带ANY、SOME关键字的子查询

ANYSOME关键字是同义词,表示满足其中任一条件。

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

例子:

SELECT * FROM tbl1 WHERE nums1 > ANY (SELECT * FROM tbl2);

查询结果为:

子查询1.png

tbl1表中的所有数据为:

子查询2.png

tbl2表中的所有数据为:

子查询3.png

那么为什么查询结果为13和27呢?

因为在tbl1表中的数据1和5都比tbl2表中的所有数据的值都要小,不满足任一比较满足为True的条件 。而13比tbl2表中的6和11大,27比tbl2表中所有数据都要大,所以查询出13和27。

1.2带ALL关键字的子查询

ALL关键字与ANY和SOME不同,使用ALL时需要同时满足所有内存查询的条件。

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

例子:

SELECT * FROM tbl1 WHERE nums1 > ALL (SELECT * FROM tbl2);

查询结果为:

子查询4.png

因为在tbl1表中只有数据27满足大于tbl2表中所有数据的条件,所以只查询出数据27。

1.3带EXISTS关键字或NOT EXISTS的子查询

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

EXISTS关键字可以和条件表达式一起使用。

例子:

SELECT * FROM fruits WHERE EXISTS (SELECT * FROM suppliers WHERE s_id = 107) AND s_id = 107;

查询结果为:

子查询5.png

例子:

SELECT * FROM fruits WHERE EXISTS (SELECT * FROM suppliers WHERE s_id = 108) AND s_id = 108;

查询结果为:

子查询6.png

因为在suppliers表中是没有s_id为108的数据的。

suppliers表中的数据:

子查询7.png

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

提示:

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

1.4带IN关键字或NOT IN的子查询

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

SELECT语句中可以使用NOT IN关键字,其作用与IN正好相反

例子:

SELECT * FROM fruits WHERE s_id IN(SELECT s_id FROM suppliers WHERE s_id IN (105,106,107));

查询结果为:

子查询8.png

可以看到fruits表中s_id为105、106和107的数据全部查询出来了,在括号里面的子查询所查询的是suppliers表中s_id是105、106和107的数据。

提示:

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

1.5带比较运算符的子查询

在前面介绍的带ANY、ALL关键字的子查询时使用了“>”比较运算符,子查询时还可以使用其他的比较运算符,如<<==>=!=等。

例子:

SELECT s_id, f_name FROM fruits WHERE s_id = (SELECT s1.s_id FROM suppliers AS s1 WHERE s1.s_city = 'Tianjin');

查询结果为:

子查询9.png

因为子查询语句为:

SELECT s1.s_id FROM suppliers AS s1 WHERE s1.s_city = 'Tianjin';

查询结果为:

子查询10.png

所以可以看到'Tianjin'地区的供应商提供的水果种类有3种,为'apple'、'blackberry'、'cherry'。

总结

  • ANY 与SOME关键字的作用是一样的,只需满足其中任一条件就返回true,而ALL需满足所有条件才返回true
  • EXISTS和NOT EXISTS的结果只取决于是否会返回行,而不取决于这些行的内容
  • IN关键字是只要是子查询中的返回数据就返回true,NOT IN 则和IN相反
  • 子查询通常和各种比较运算符一起使用

好了,今天阿文就介绍到这了...