Mysql的子查询


随着业务量的逐渐复杂,我们将不可避免的使用一些比较复杂的查询语句,子查询可以在一定程度上帮助我们解决这些问题。我们将介绍基础的子查询,和配合子查询的比较运算符的SOME、ANY、ALL、IN、NOT IN等关键字,帮助我们更精准的匹配我们需要的数据。



子查询即为将某个查询语句的结果用于另一个操作SQL语句的操作依据,子句需要放在括号内。



示例:

SELECT name, age FROM users WHERE age > (SELECT ROUND(AVG(age), 0) FROM users);


查询用户表中大于平均年龄的用户的用户名和年龄。


ROUND():mysql聚合函数,对原数进行取整或保留几位小数处理。形式为ROUND(num1, num2),num1为原数字,num2为保留的小数位数,返回值为处理好的数字。


AVG():mysql聚合函数,对一组数据求平均数。



示例:

UPDATE users SET age = (SELECT age FROM users WHERE id = 1) WHERE age = 0;


将id为1的用户的年龄设置到所有用户为零的年龄上。(业务情景有点无厘头,具体示范用法)


通常来讲,子句的返回值只能有一个。但是有的时候,我们要求要以子句查询出的多个结果作为主句的操作依据,这时候就需要用到SOME、ANY、ALL关键字。



SOME、ANY、ALL


举个例子,有多名用户的name都是“张三”。然而此刻的需求是——需要在用户表中找出年龄比“张三”大的用户,那么我们的查询语句常规应该是这样:


SELECT name, age FROM users WHERE age > (SELECT ROUND(AVG(age), 0) FROM users WHERE name = '张三');


结果是报错,因为子句返回了不止一个结果,故报错。


正确的查询方式应该是这样:


SELECT name, age FROM users WHERE age > ALL (SELECT ROUND(AVG(age), 0) FROM users WHERE name = '张三');


SOME、ANY、ALL是用于修饰子句前的比较运算符的,功能是用于筛选子句中的查询结果。


SOME等价于ANY代表子句中有一项符合条件即可,而ALL则是子句中查询的所有结果符合才可以。



以上边的SQL语句为例:


当使用ALL时,查询到的用户为年龄大于所有name为张三的用户。


当使用SOME/ANY时,查询到的用户为年龄大于任意一个name为“张三”的用户。



IN、NOT IN


IN 等效于 “= ANY”


NOT IN 等效于 “!= ALL” 或 “<> ALL”

(用法相同)


作者:筱剑Beta

2019-12-20 16:34:39.0编辑

2019-08-06 11:58:39.0创作

所属分类:Mysql

mysql
sql
发布

街角有人祝福,巷口有人哭,这里却没人评论ε=(´ο`*)))