MySQL EXISTS关键字
MySQL中的存在运算符是一种布尔运算符,它返回 真或假 结果。它与子查询结合使用,检查子查询中的数据是否存在。这意味着如果子查询返回任何记录,该运算符将返回true。否则,它将返回false。真值总是表示为数字值1,假值表示为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 column、SELECT a_constant或子查询中的任何内容开始。它将产生相同的输出,因为MySQL会忽略子查询中的选择列表。
在找到匹配结果后,此操作符立即终止进一步处理。这个特性提高了MySQL的查询性能。
参数解释
以下是EXISTS操作符中使用的参数:
参数名称 | 描述 |
---|---|
col_names | 这是包含于指定表中的列名。 |
tab_name | 这是我们将要执行EXISTS操作的表名。 |
condition | 它用于从表中搜索特定值。 |
subquery | 通常这是以SELECT * 开头的SELECT语句,但MySQL会在子查询中忽略它。 |
MySQL EXISTS运算符示例
让我们了解一下在MySQL中EXIST运算符如何工作。这里,我们将首先使用以下语句创建两个表,分别名为 “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 Statement Example
假设我们想要从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,意味着为真。因此,cust_id=104在表中存在。
EXISTS和IN操作符之间的区别
主要区别以表格形式给出:
SN | IN | EXISTS |
---|---|---|
1 | 它用于最小化MySQL中的多个OR条件。 | 它用于检查子查询中数据的存在性。 |
2 | SELECT col_names FROM tab_name WHERE col_name IN (subquery); | SELECT col_names FROM tab_name WHERE [NOT] EXISTS (subquery); |
3 | 它比较IN运算符内的所有值。 | 它一旦找到第一个true的情况就停止进一步执行。 |
4 | 它可以用于比较NULL值。 | 它不能用于比较NULL值。 |
5 | 当子查询结果较少时,它执行得更快。 | 当子查询结果较大时,它执行得更快。 |
6 | 它执行父查询和子查询之间的比较。 | 它不执行父查询和子查询之间的比较。 |