SQL中比较运算符单独使用与搭配ANY的区别及子查询使用问题咨询
比较运算符与
ANY关键字的使用区别 原错误写法的核心问题
普通比较运算符(<、>、=等)直接拼接子查询的写法,强制要求子查询必须返回单行单列的单值结果。
你编写的查询:
SELECT * FROM salesman WHERE name < (SELECT cust_name FROM customer);
其中括号内的子查询会返回customer表中所有行的cust_name值,是一个包含多行数据的单列结果集。此时数据库无法判断name字段要和结果集中的哪一个客户姓名做比较,执行时会直接抛出“子查询返回多于一行”的错误,无法得到预期结果。
加上ANY的正确写法:
SELECT * FROM salesman WHERE name < ANY (SELECT cust_name FROM customer);
本质是调整了比较规则:只要当前salesman表的name值,和子查询返回的任意一个客户姓名满足小于的比较关系,这条销售记录就会被纳入结果集。
参考的样例数据包含两张关联表:
salesman表:存储销售人员编号、姓名、所属城市、个人销售额信息customer表:存储客户编号、姓名、所属城市、对接销售编号、客户评级信息
两类写法的适用场景区分
- 无需加
ANY的场景
当可以确定子查询只会返回1个单值时,直接在比较运算符后接子查询即可,不需要加ANY。这类场景通常是子查询内使用了聚合函数(如MAX()、MIN()、COUNT())、带有唯一值过滤条件,保证返回结果永远是单行单值。
举个具体场景:要筛选“姓名字典序比全公司销售额最高的销售人员更靠前的客户”,此时子查询SELECT name FROM salesman WHERE sales = (SELECT MAX(sales) FROM salesman)只会返回1个最高销售额对应的销售姓名,直接拼接比较运算符即可正常运行。 - 需要加
ANY的场景
当子查询会返回多行单列的结果集,且要实现“只要和结果集中任意一个值满足比较条件就算匹配”的筛选逻辑时,必须加上ANY关键字。
补充便于理解的等价规则:= ANY的筛选效果和IN关键字完全等价,比如salesman.id = ANY (SELECT salesman_id FROM customer)和salesman.id IN (SELECT salesman_id FROM customer)的返回结果没有区别。
内容的提问来源于stack exchange,提问作者Light Yagami
相关产品推荐
相关产品推荐

