📅  最后修改于: 2023-12-03 15:03:04.692000             🧑  作者: Mango
MySQL EXISTS 运算符用于在子查询中测试是否存在任何行。如果子查询返回至少一个行,则 EXISTS 条件就成立。
SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name(s) FROM table_name WHERE condition);
我们假设有两个表:
Orders
表
| OrderID | CustomerID | OrderDate | |--------|------------|-----------| | 1 | 123 | 2020-01-01| | 2 | 456 | 2020-01-02| | 3 | 789 | 2020-01-03| | 4 | 123 | 2020-01-04| | 5 | 456 | 2020-01-05|
Customers
表
| CustomerID | CustomerName | ContactName | Country | |------------|--------------|--------------|----------| | 123 | Alphabet Inc. | John Smith | USA | | 456 | Amazone Inc. | Jane Doe | USA | | 789 | Microsoft Inc.| Bob Johnson | USA |
此示例使用子查询来查找具有 CustomerID 等于 123 的任何订单:
SELECT OrderID
FROM Orders
WHERE EXISTS
(SELECT * FROM Customers WHERE Customers.CustomerID = Orders.CustomerID AND CustomerID = 123);
SELECT * FROM Customers WHERE Customers.CustomerID = Orders.CustomerID AND CustomerID = 123
返回查询结果:| CustomerID | CustomerName | ContactName | Country | |------------|--------------|--------------|----------| | 123 | Alphabet Inc. | John Smith | USA |
SELECT OrderID FROM Orders WHERE EXISTS (SELECT * FROM Customers WHERE Customers.CustomerID = Orders.CustomerID AND CustomerID = 123)
返回查询结果:| OrderID | |---------| | 1 | | 4 |
此查询在 Orders
表中查找具有 CustomerID
等于 123 的任何 OrderID
。如果子查询返回结果,则 EXISTS
子句就成立,然后将返回匹配子查询条件的 OrderID
。
与使用子查询不同,在此示例中,我们使用 INNER JOIN
操作符来加入 Orders
和 Customers
表。
只有一行数据满足我们的查询条件(订单编号为 1),因此查询结果只返回 1 行数据。
SELECT Orders.OrderID
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
WHERE Customers.CustomerID = 123;
SELECT Orders.OrderID FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID WHERE Customers.CustomerID = 123
返回查询结果:| OrderID | |---------| | 1 |
在此示例中,我们可以看到 INNER JOIN
操作符通过等于语句来加入两个表。
MySQL EXISTS 运算符用于在子查询中测试是否存在任何行。如果子查询返回至少一个行,则 EXISTS 条件就成立。
可以使用子查询或 JOIN
操作符来与其他表一起使用此运算符。