MySQL系列总结————子查询
子查询
定义:其他语句内部的select语句,称为子查询或内查询
注意事项:
非法使用子查询
- 多行查询使用单行比较符
- 子查询不返回任何行,或者为NULL
分类
where型子查询(把内层查询结果当作外层查询的比较条件)
例: 查询id最大的一件商品(使用排序+分页实现)
1
2
3
4
5
6SELECT goods_id,goods_name,shop_price
FROM goods
WHERE goods_id = (
SELECT MAX(goods_id)
FROM goods
);from型子查询(把内层的查询结果当成临时表,供外层sql再次查询。查询结果集可以当成表看待。临时表要使用一个别名。)
例: 查询每个类别下id最大的商品(使用from型子查询)
1
2
3
4
5
6
7SELECT 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子查询]
1
2
3
4
5
6
7SELECT 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子查询]
1
2
3
4
5
6
7SELECT 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 | 和子查询返回的所有值进行比较 |