MySQL-ANY关键字和ALL关键字

时间:2020-02-23 14:40:59  来源:igfitidea点击:

在本教程中,我们将学习MySQL中的ANY和ALL运算符。

ANY运算符

如果子查询返回的任何值的比较为TRUE,则ANY运算符将返回TRUE。

ANY语法

SELECT column_name
FROM table_name
WHERE
  some_column comparison_operator ANY (
    SELECT some_other_column
    FROM some_other_table
    WHERE some_other_condition
  )

其中" comparison_operator"是任何比较运算符,例如" =,<,>,<=,> =,!=,<>"。

ALL运算符

如果子查询返回的所有值的比较为TRUE,则ALL运算符将返回TRUE。

ALL语法

SELECT column_name
FROM table_name
WHERE
  some_column comparison_operator ALL (
    SELECT some_other_column
    FROM some_other_table
    WHERE some_other_condition
  )

示例表

在本教程中,我们将使用"员工"和"评论"表。

表:员工

mysql> SELECT * FROM employee;
+------------+-----------+----------+----------------------+-------+------------+---------------------+---------------------+
| employeeid | firstname | lastname | email                | score | birthday   | lastmodified        | created             |
+------------+-----------+----------+----------------------+-------+------------+---------------------+---------------------+
| e01        |      |   | @example.com    |     7 | 1900-01-01 | 2016-02-04 06:08:10 | 2016-01-01 01:01:01 |
| e02        | John      | Doe      | [email protected]  |     8 | 1900-02-03 | 2016-02-04 06:08:10 | 2016-01-01 01:01:04 |
| e03        | Jane      | Doe      | [email protected]  |     9 | 1900-05-20 | 2016-02-04 06:08:10 | 2016-01-01 01:01:04 |
| e04        | Tin       | Tin      | [email protected]   |     6 | 1900-10-20 | 2016-02-04 06:08:10 | 2016-01-01 01:02:03 |
| e05        | Bob       | Coder    | [email protected] |     7 | 1900-08-20 | 2016-02-04 06:08:10 | 2016-01-01 01:02:10 |
+------------+-----------+----------+----------------------+-------+------------+---------------------+---------------------+
5 rows in set (0.00 sec)

表:评论

mysql> SELECT * FROM comments;
+-----------+------------+---------------------+---------------------+---------------------+
| commentid | employeeid | commentbody         | lastmodified        | created             |
+-----------+------------+---------------------+---------------------+---------------------+
|         1 | e03        | Awesome             | 2016-01-01 02:03:04 | 2016-01-01 02:03:04 |
|         2 | e03        | Hello World         | 2016-01-02 01:02:03 | 2016-01-02 01:02:03 |
|         3 | e01        | Happy               | 2016-01-02 01:04:03 | 2016-01-02 01:04:03 |
|         4 | e04        | This is my comment. | 2016-01-01 02:03:04 | 2016-01-01 02:03:04 |
|         5 | e01        | Keep coding....     | 2016-04-04 03:02:01 | 2016-05-04 03:02:01 |
+-----------+------------+---------------------+---------------------+---------------------+
5 rows in set (0.00 sec)

示例:ANY运算符

在下面的示例中,我们将显示那些至少评论过两次的员工的详细信息。

mysql> SELECT 
    e.employeeid, e.firstname, e.lastname
FROM
    employee e
WHERE
    e.employeeid = ANY (SELECT
            c.employeeid
        FROM
            comments c
        GROUP BY c.employeeid
        HAVING COUNT(c.commentid) >= 2);

+------------+-----------+----------+
| employeeid | firstname | lastname |
+------------+-----------+----------+
| e01        |      |   |
| e03        | Jane      | Doe      |
+------------+-----------+----------+
2 rows in set (0.00 sec)

说明:

如果子查询返回的任何c.employeeid等于employee表的e.employeeid且c.employeeid至少评论了两次,则上面的查询将列出雇员的详细信息。

子查询返回以下值。

mysql> SELECT
    c.employeeid
FROM
    comments c
GROUP BY c.employeeid
HAVING COUNT(c.commentid) >= 2;

+------------+
| employeeid |
+------------+
| e01        |
| e03        |
+------------+
2 rows in set (0.00 sec)

因此,我们的查询如下。

mysql> SELECT 
    e.employeeid, e.firstname, e.lastname
FROM
    employee e
WHERE
    e.employeeid = ANY ('e01', 'e03');

这意味着,如果" e.employeeid"等于子查询的两个值中的任何一个,则将列出该雇员的详细信息。

示例:ALL运算符

在以下示例中,我们将仅列出员工从未发表评论的详细信息。

mysql> SELECT 
    e.employeeid, e.firstname, e.lastname
FROM
    employee e
WHERE
    e.employeeid != ALL (SELECT DISTINCT
            c.employeeid
        FROM
            comments c);

+------------+-----------+----------+
| employeeid | firstname | lastname |
+------------+-----------+----------+
| e02        | John      | Doe      |
| e05        | Bob       | Coder    |
+------------+-----------+----------+
2 rows in set (0.01 sec)

上面的查询提供了从未评论的雇员ID" e02"和" e05"的详细信息。

说明:

对于给定的子查询,我们得到以下输出。

mysql> SELECT DISTINCT
    c.employeeid
FROM
    comments c;

+------------+
| employeeid |
+------------+
| e01        |
| e03        |
| e04        |
+------------+
3 rows in set (0.00 sec)

因此,雇员编号" e01"," e03"和" e04"至少评论了一次。

替换上面的值,我们将得到以下查询。

mysql> SELECT 
    e.employeeid, e.firstname, e.lastname
FROM
    employee e
WHERE
    e.employeeid != ALL ('e01', 'e03', 'e05');

因此,上述查询返回了雇员编号不是" e01"," e03"和" e05"的那些雇员的详细信息。