MySql中的子查询关键字用法

本文深入解析了SQL中的ALL、ANY、SOME关键字及其与IN、EXISTS的关系,详细阐述了它们在子查询中的使用场景与逻辑判断,帮助读者理解如何在SQL查询中进行复杂的条件筛选。
ALL、ANY、SOME
  • 形式:
operand comparison_operator keyword (subquery)

其中,comparison_operator是这些操作符中的一个:

= > < >= <= <> !=

keyword是All、Any、Some中的一个,下边分别说明:

  • ALL:
    ALL关键字当操作数和子查询返回的所有值比较都为true的时候返回true:
SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);

如果t1表中某行记录的s1大于所有t2表中所有的s1,那么该行记录的 >ALL 返回true。如果t2是空表,那么>ALL比较也会返回true。
需要注意的是,如果t2中的s1查询存在null值,那么所有的比较都会是unknown。

  • ANY
    ANY关键字当操作数和子查询返回的某一个值比较为true的时候返回true:
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);

如果t1表中某行记录的s1大于t2表中任意一个s1,那么 > ANY 返回true。如果t2是空表,那么 > ANY 返回的结果为false。
需要注意的是,如果t2表查出来的结果全是null,那么>ANY返回的结果是unknown;如果t2表中正常值和null值同时存在,那么>ANY将会正常比较除了null的值并正确返回。

  • SOME
    作用和ANY相同,为了解决某些情况下的语义问题而设,具体例子看:
    https://dev.mysql.com/doc/refman/5.7/en/any-in-some-subqueries.html
IN / NOT IN

IN关键字等价于 =ANY,NOT IN关键字等价于 !=ALL,例如,下面两组语句都是相等的:

1.SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2); 
2.SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2);

1.SELECT s1 FROM t1 WHERE s1 <> ALL (SELECT s1 FROM t2); 
2.SELECT s1 FROM t1 WHERE s1 NOT IN (SELECT s1 FROM t2);
EXISTS、NOT EXIST

如果一个子查询(subquery)返回任何一条记录,那么exist (subquery)返回true而not exist (subquery)返回false:

SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);

通常来说,exist子查询都写作select *,但是它也可以写为select 5或者select col1,MySQL会在exist子查询忽略这些区别,所以上边的写法都是一样的。
在上边的例子中,如果t2包含任意行,甚至只包含空值的行,那么exist都会返回true.
exist/not exist通常用于相关子查询里边,例如:

--查询什么类型的store出现在一个或多个城市中
SELECT DISTINCT store_type 
FROM stores 
WHERE EXISTS (
    SELECT * FROM cities_stores 
    WHERE cities_stores.store_type = stores.store_type
);
### MySQL 中 `AS` 关键字的用途和用法MySQL 中,`AS` 是一个用于为列或表命名别名的关键字,主要用于简化查询语句、增强可读性以及在复杂查询中重命名派生表或计算字段。通过使用 `AS`,可以将原始的列名或表达式结果赋予一个新的名称,以便在查询的其他部分引用或者在结果集中显示更友好的名称[^1]。 #### 1. 列别名(Column Alias) 当查询中涉及复杂的表达式、函数调用或多表连接时,可以使用 `AS` 为列指定别名,使输出更具可读性。 示例: ```sql SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees; ``` 该语句将 `first_name` 和 `last_name` 拼接后命名为 `full_name` 显示[^1]。 #### 2. 表别名(Table Alias) 在多表连接查询中,为表设置简短的别名可以减少书写量并提高可读性。通常在 `FROM` 或 `JOIN` 子句中使用 `AS` 来定义表别名。 示例: ```sql SELECT e.name, d.department_name FROM employees AS e JOIN departments AS d ON e.department_id = d.id; ``` 此查询中,`employees` 表被简写为 `e`,`departments` 被简写为 `d`,便于后续引用。 #### 3. 派生表别名(Derived Table Alias) 在子查询中,若子查询返回的结果集作为临时表参与后续查询,必须为其指定别名,否则会引发语法错误。 示例: ```sql SELECT avg_salary FROM ( SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id ) AS dept_avg WHERE avg_salary > 5000; ``` 该查询中,子查询结果被命名为 `dept_avg`,以便主查询从中筛选数据[^1]。 #### 4. 与聚合函数结合使用 在执行分组统计或聚合计算时,通常配合 `AS` 使用别名来标识聚合结果。 示例: ```sql SELECT department_id, COUNT(*) AS employee_count FROM employees GROUP BY department_id; ``` 该语句为 `COUNT(*)` 的结果命名 `employee_count`,方便后续处理或展示。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值