MySQL Exists条件

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 它指定从表中搜索特定值。
subquery 通常是以 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;  

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;  

我们将得到输出 1 表示为 true。因此,cust_id=104 存在于表中。

五、EXISTS 和 IN 运算符的区别

EXISTS 和 IN 运算符之间的主要区别以表格形式给出:

Exists In
它用于最小化 MySQL 中的多个 OR 条件。 它用于检查子查询中是否存在数据。
SELECT col_names FROM tab_name WHERE col_name IN(子查询);

SELECT col_names
FROM tab_name
WHERE [NOT] EXISTS(子查询);

它比较 IN 运算符中的所有值。 一旦发现第一个真正的事件,它就会停止进一步执行。
它可用于比较 NULL 值。 它不能用于比较 NULL 值。
当子查询结果较少时,它执行得更快。 当子查询结果很大时,它执行得更快。
它执行父查询和子查询或子查询之间的比较。 它不执行父查询和子查询或子查询之间的比较。

热门文章

优秀文章