MySql子查询

MySQL系列总结————子查询

子查询

  • 定义:其他语句内部的select语句,称为子查询或内查询

  • 注意事项:

    • 子查询要放在括号里面
    • 子查询放在比较条件右侧
    • 单行操作符^1对应单行子查询,多行操作符^2对应多行子查询
  • 非法使用子查询

    • 多行查询使用单行比较符
    • 子查询不返回任何行,或者为NULL
  • 分类

    • where型子查询(把内层查询结果当作外层查询的比较条件)

      例: 查询id最大的一件商品(使用排序+分页实现)

      1
      2
      3
      4
      5
      6
      SELECT 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
      7
      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子查询]

        1
        2
        3
        4
        5
        6
        7
        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子查询]

        1
        2
        3
        4
        5
        6
        7
        SELECT c.cat_id,c.cat_name
        FROM category c
        WHERE EXISTS (
        SELECT 1
        FROM goods g
        WHERE g.cat_id = c.cat_id
        );
      • MySQL中exists和in的区别及使用场景


单行操作符:

操作符 含义
= 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 和子查询返回的所有值进行比较