MySQl 子查询 (ANY,SOME,ALL, IN 的运用)

引言

子查询概述:
  • 子查询(Subquery)是指出现在其他 SQl 语句内的 SELECT 子句。
  • 子查询指嵌套在查询内部,且必须始终出现在圆括号内;
  • 子查询可以包含多个关键字或条件
    如: DISTINCT , GROUP BY , ORDER BY ,LIMIT, 函数等;
  • 子查询的外层查询可以是:
    SELECT ,INSERT, UPDATE,DELETE, SET 或 DO;
  • 子查询返回值
    子查询可以返回标量,一行,一列或子查询
例如:
SELECT * FROM table_name1(表名) WHERE col1(字段名) = (SELECT col2(字段名) FROM table_name2(表名) )

注:
其中 SELECT * FROM table_name1(表名) 称为 Outer Query/Outer Statement
SELECT col2(字段名) FROM table_name2(表名) 称为 Subquery

子查询

1. 使用比较运算符的子查询
  • 比较运算符:
    =、>、<、>= 、<= 、!= 、<>
  • 语法结构:
    operand comparison_operator subquery

例如:

  • 创建表
    CREATE TABLE subquery (
    	id tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
    	price float(6,4) NOT NULL,
    	PRIMARY KEY (id)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
    
  • 插入数据
    INSERT INTO subquery (price) VALUES
    ('50.5'),('20.23'),('34.32'),('56.78'),('55.55'),('30.55');
    
    lchh
  • 嵌套子查询
    SELECT * FROM subquery WHERE price > (SELECT AVG(price) FROM subquery);
    
    lchh
  • 出现的问题:
    SELECT * FROM subquery WHERE price > (SELECT price FROM subquery WHERE id > 3);
    
    lchh
    这个时候会报错, 因为子查询返回并不是一个值,而是一个集合值,所以这个时候我们就需要用到下面的ANY,SOME, ALL 或 IN;
2. 用 ANY,SOME,ALL 修饰的比较运算符
  • 关键字:
    ANY,SOME,ALL
  • 语法结构:
    operand comparison_operator ANY(subquery)
    operand comparison_operator SOME(subquery)
    operand comparison_operator ALL(subquery)

例如:
还是同样的表,同样的数据

  • 查询
    这里把上面报错的语句修改一下

    SELECT * FROM subquery WHERE price > ANY(SELECT price FROM subquery WHERE id > 3);
    

    lchh

  • 修饰的比较运算符的作用

    ANYSOMEALL
    >, >=最小值最小值最大值
    <, <=最大值最大值最小值
    =任意值任意值
    != , <>任意值

解释: (ANY 修饰 >) 等价于 (查询出来的集合里只要外查询的字段值> 集合里的最小值)就满足情况。

  • 测试:

    SELECT price FROM subquery WHERE id > 3;
    

    内部子查询结果:
    lchh

    SELECT * FROM subquery WHERE price > ANY(SELECT price FROM subquery WHERE id > 3);
    

    外部查询结果:
    lchh
    如图所示, (ANY 修饰 >) 取出 子查询当中的最小值 30.5500 , 表中只要price > (最小值 30.5500) 的行 满足情况。

3. 使用 [NOT] IN 的子查询
  • 关键字:
    IN, NOT IN
  • 语法结构:
    operand comparison_operator [NOT] IN(subquery)
  • =ANY 与 IN 等效
  • !=ALL 或 <>ALL 与 NOT IN 等效

还是那张表,那些数据

  • 测试
    SELECT * FROM subquery WHERE price IN (SELECT price FROM subquery WHERE id > 3);
    
    SELECT * FROM subquery WHERE price = ANY (SELECT price FROM subquery WHERE id > 3);
    
    lchh
    SELECT * FROM subquery WHERE price NOT IN (SELECT price FROM subquery WHERE id > 3);
    
    SELECT * FROM subquery WHERE price != ALL(SELECT price FROM subquery WHERE id > 3);
    
    lchh
  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值