MySQL子查询

6 篇文章 0 订阅
6 篇文章 0 订阅

子查询

  • 定义:其他语句内部的select语句,称为子查询或内查询
  • 注意事项:
    • 子查询要放在括号里面
    • 子查询放在比较条件右侧
    • 单行操作符1对应单行子查询,多行操作符2对应多行子查询
  • 非法使用子查询
    • 多行查询使用单行比较符
    • 子查询不返回任何行,或者为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 | 和子查询返回的所有值进行比较 |


  1. 只返回一行,使用单行比较操作符 ↩︎

  2. 返回多行,使用多行比较操作符 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值