本人已参与「新人创作礼」活动,一起开启掘金创作之路。
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情
目录
今天阿文介绍的内容:
- 什么是
子查询? - ANY与SOME关键字
- ALL关键字
- EXISTS和NOT EXISTS关键字
- IN和NOT IN关键字
- 子查询与比较运算符一起使用
1.子查询
所谓的子查询是指一个查询语句中嵌套另一个查询语句。子查询结果作为外围查询语句的过滤条件,查询可以基于一个表或者多个表,并且可以进行多出嵌套。
1.1带ANY、SOME关键字的子查询
ANY和SOME关键字是同义词,表示满足其中任一条件。
ANY关键字接在一个比较操作符的后面,表示若与子查询返回的任何值比较为True,则返回True。
例子:
SELECT * FROM tbl1 WHERE nums1 > ANY (SELECT * FROM tbl2);
查询结果为:
tbl1表中的所有数据为:
tbl2表中的所有数据为:
那么为什么查询结果为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);
查询结果为:
因为在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;
查询结果为:
例子:
SELECT * FROM fruits WHERE EXISTS (SELECT * FROM suppliers WHERE s_id = 108) AND s_id = 108;
查询结果为:
因为在suppliers表中是没有s_id为108的数据的。
suppliers表中的数据:
NOT EXISTS与EXISTS使用方法相同,返回的结果相反。子查询如果至少返回一行,那么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));
查询结果为:
可以看到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');
查询结果为:
因为子查询语句为:
SELECT s1.s_id FROM suppliers AS s1 WHERE s1.s_city = 'Tianjin';
查询结果为:
所以可以看到'Tianjin'地区的供应商提供的水果种类有3种,为'apple'、'blackberry'、'cherry'。
总结
- ANY 与SOME关键字的作用是一样的,只需满足其中任一条件就返回true,而ALL需满足所有条件才返回true
- EXISTS和NOT EXISTS的结果只取决于是否会返回行,而不取决于这些行的内容
- IN关键字是只要是子查询中的返回数据就返回true,NOT IN 则和IN
相反 - 子查询通常和各种比较运算符一起使用
好了,今天阿文就介绍到这了...