MySQL 中的 EXISTS 运算符是一种布尔运算符,它返回true 或 false结果。它与子查询结合使用并检查子查询中数据的存在。这意味着如果子查询返回任何记录,则此运算符返回 true。否则,它将返回false。true 值总是表示数值 1,false 值表示 0。我们可以将它与 SELECT、UPDATE、DELETE、INSERT 语句一起使用。
句法
以下是在MySQL 中使用 EXISTS 运算符的语法:
SELECT col_names
FROM tab_name
WHERE [NOT] EXISTS (
SELECT col_names
FROM tab_name
WHERE condition
);
NOT 运算符用于否定 EXISTS 运算符。当子查询不返回任何行时,它返回 true。否则,它返回 false。
通常,EXISTS 查询以 SELECT * 开头,但也可以以 SELECT 列、SELECT a_constant 或子查询中的任何内容开头。它将给出相同的输出,因为 MySQL 忽略 SUBQUERY 中的选择列表。
该运算符在找到匹配结果后立即终止以进行进一步处理。此功能提高了 MySQL 中查询的性能。
参数说明
以下是 EXISTS 运算符中使用的参数:
参数名称 | 说明 |
---|---|
col_names | 它是包含在指定表中的列的名称。 |
tab_name | 它是我们将要执行 EXISTS 运算符的表的名称。 |
condition | 它指定从表中搜索特定值。 |
子查询 | 通常是以 SELECT * 开头的 SELECT 语句,但 MySQL 在子查询中忽略它。 |
MySQL EXISTS 运算符示例
让我们了解 EXISTS 运算符在 MySQL 中的工作原理。在这里,我们将首先使用以下语句创建两个名为“customer”和“orders”的表:
CREATE TABLE customer(
cust_id int NOT NULL,
name varchar(35),
occupation varchar(25),
age int
);
CREATE TABLE orders (
order_id int NOT NULL,
cust_id int,
prod_name varchar(45),
order_date date
);
接下来,我们需要将值插入到两个表中。执行以下语句:
INSERT INTO customer(cust_id, name, occupation, age)
VALUES (101, 'Peter', 'Engineer', 32),
(102, 'Joseph', 'Developer', 30),
(103, 'John', 'Leader', 28),
(104, 'Stephen', 'Scientist', 45),
(105, 'Suzi', 'Carpenter', 26),
(106, 'Bob', 'Actor', 25),
(107, NULL, NULL, NULL);
INSERT INTO orders (order_id, cust_id, prod_name, order_date)
VALUES (1, '101', 'Laptop', '2020-01-10'),
(2, '103', 'Desktop', '2020-02-12'),
(3, '106', 'Iphone', '2020-02-15'),
(4, '104', 'Mobile', '2020-03-05'),
(5, '102', 'TV', '2020-03-20');
要验证表,请运行SELECT 命令,如下所示:
msql> SELECT * FROM customer;
AND,
mysql> SELECT * FROM orders;
我们将得到以下输出:
MySQL SELECT EXISTS 示例
在本例中,我们将使用 EXISTS 运算符来查找至少下过一个订单的客户的姓名和职业:
mysql> SELECT name, occupation FROM customer
WHERE EXISTS (SELECT * FROM Orders
WHERE customer.cust_id = Orders.cust_id);
出现以下输出:
同样,如果我们想获取尚未下订单的客户的姓名,请使用 NOT EXISTS 运算符:
mysql> SELECT name, occupation FROM customer
WHERE NOT EXISTS (SELECT * FROM Orders
WHERE customer.cust_id = Orders.cust_id);
它将给出以下输出:
MySQL EXISTS with DELETE 语句示例
假设我们要从 Orders 表中删除一条 order_id = 3 的记录,执行以下查询将永久删除 Orders 表中的记录:
mysql> DELETE FROM Orders WHERE EXISTS (
SELECT * FROM customer
WHERE order_id=3);
要验证输出,请运行以下命令:
mysql> SELECT * FROM Orders;
在输出中,我们可以看到order_id=3的表记录删除成功。
如果我们想检查表中是否存在某行,请使用以下查询:
mysql> SELECT EXISTS(SELECT * from customer WHERE cust_id=104) AS Result;
我们将得到表示 true 的输出 1。因此,表中存在 cust_id=104。
EXISTS 和 IN 运算符的区别
EXISTS 和 IN 运算符之间的主要区别以表格形式给出:
SN | IN | EXISTS |
---|---|---|
1. | 它用于最小化 MySQL 中的多个 OR 条件。 | 它用于检查子查询中数据的存在。 |
2. | SELECT col_names FROM tab_name WHERE col_name IN(子查询); | 选择列名 从选项卡名称 WHERE [NOT] EXISTS(子查询); |
3. | 它比较 IN 运算符中的所有值。 | 一旦找到第一个真正的事件,它就会停止以进一步执行。 |
4. | 它可用于比较 NULL 值。 | 它不能用于比较 NULL 值。 |
5. | 当子查询结果较少时,它执行得更快。 | 当子查询结果很大时,它执行得更快。 |
6. | 它执行父查询和子查询或子查询之间的比较。 | 它不执行父查询和子查询或子查询之间的比较。 |