ALL、ANY和SOME子查询
ALL和ANY操作符的常见用法是结合一个相对比较操作符对一个数据列子查询的结果进行测试。它们测试比较值是否与子查询所返回的全部或一部分值匹配。比如说,如果比较值小于或等于子查询所返回的每一个值,<= ALL将是true;只要比较值小于或等于子查询所返回的任何一个值,<= ANY将是true。SOME是ANY的一个同义词。
下面这条语句用来检索最早出生的总统,具体做法是选取出生日期小于或等于president数据表里的所有出生日期(只有最早的出生日期满足这一条件)的那个数据行:
- mysql> SELECT last_name, first_name, birth FROM president
- -> WHERE birth <= ALL (SELECT birth FROM president);
- +------------+------------+------------+
- | last_name | first_name | birth |
- +------------+------------+------------+
- | Washington | George | 1732-02-22 |
- +------------+------------+------------+
下面这条语句的用处就不大了,它将返回所有的数据行,因为对于每个日期,至少有一个日期(它本身)大于或等于它:
- mysql> SELECT last_name, first_name, birth FROM president
- -> WHERE birth <= ANY (SELECT birth FROM president);
- +------------+---------------+------------+
- | last_name | first_name | birth |
- +------------+---------------+------------+
- | Washington | George | 1732-02-22 |
- | Adams | John | 1735-10-30 |
- | Jefferson | Thomas | 1743-04-13 |
- | Madison | James | 1751-03-16 |
- | Monroe | James | 1758-04-28 |
- ...
当ALL、ANY或SOME操作符与"="比较操作符配合使用时,子查询可以是一个数据表子查询。此时,你需要使用一个数据行构造器来提供与子查询所返回的数据行进行比较的比较值。
- mysql> SELECT last_name, first_name, city, state FROM president
- -> WHERE (city, state) = ANY
- -> (SELECT city, state FROM president
- -> WHERE last_name = 'Roosevelt');
- +-----------+-------------+-----------+-------+
- | last_name | first_name | city | state |
- +-----------+-------------+-----------+-------+
- | Roosevelt | Theodore | New York | NY |
- | Roosevelt | Franklin D. | Hyde Park | NY |
- +-----------+-------------+-----------+-------+
前一节里提到过,IN和NOT IN操作符是= ANY和< > ALL的简写。也就是说,IN操作符的含义是"等于子查询所返回的某个数据行",NOT IN操作符的含义是"不等于子查询所返回的任何数据行"。