子查询
- 定义:其他语句内部的select语句,称为子查询或内查询
- 注意事项:
- 非法使用子查询
- 多行查询使用单行比较符
- 子查询不返回任何行,或者为NULL
- 分类
-
where型子查询(把内层查询结果当作外层查询的比较条件)
例: 查询id最大的一件商品(使用排序+分页实现)
SELECT goods_id,goods_name,shop_price FROM goods WHERE goods_id = ( SELECT MAX(goods_id) FROM goods );
-
from型子查询(把内层的查询结果当成临时表,供外层sql再次查询。查询结果集可以当成表看待。临时表要使用一个别名。)
例: 查询每个类别下id最大的商品(使用from型子查询)
SELECT goods_id,goods_name,cat_id,shop_price FROM ( SELECT goods_id,goods_name,cat_id,shop_price FROM goods ORDER BY cat_id ASC,goods_id DESC ) AS tmp GROUP BY cat_id;
-
exists型子查询(把外层sql的结果,拿到内层sql去测试,如果内层的sql成立,则该行取出。内层查询是exists后的查询。)
- 从类别表中取出其类别下有商品的类别(如果该类别下没有商品,则不取出)[使用where子查询]
SELECT c.cat_id,c.cat_name FROM category c WHERE c.cat_id IN ( SELECT g.cat_id FROM goods g GROUP BY g.cat_id );
- 从类别表中取出其类别下有商品的类别(如果该类别下没有商品,则不取出)[使用exists子查询]
SELECT c.cat_id,c.cat_name FROM category c WHERE EXISTS ( SELECT 1 FROM goods g WHERE g.cat_id = c.cat_id );
-
单行操作符:
| 操作符 | 含义 |
|: — |: — |
| = | Equal to |
| > | Greater than |
| >= | Greater than or equal to |
| < | Less than |
| <= | Less than or equal to |
| <> | Not equal to |
多行操作符:
| 操作符 | 含义 |
|: — |: — |
| IN/NOT IN | (不)等于列表中任意一个 |
| ANY/SOME | 和子查询返回的某一个值进行比较 |
| ALL | 和子查询返回的所有值进行比较 |