SQL - EXISTS 運算子



SQL EXISTS 運算子

SQL EXISTS 運算子用於驗證特定記錄是否存在於 MySQL 表中。使用此運算子時,需要使用子查詢指定要檢查其存在的記錄。

EXISTS 運算子用於SELECT 語句的WHERE 子句中,根據另一表中相關記錄的存在與否來篩選記錄。

  • 它是一個邏輯運算子。

  • 它返回布林值 TRUE 或 FALSE。

  • 如果子查詢返回至少一條記錄,則返回 TRUE。

  • 如果 EXISTS 運算子返回 TRUE,則外部查詢將執行;否則不執行。

  • 它可以用於 SELECT、UPDATE、DELETE 或 INSERT 語句。

EXISTS 運算子比其他運算子(如 IN)更高效,因為它只需要確定子查詢是否返回任何行,而不需要實際返回資料。

在許多現實場景中,使用 EXISTS 運算子是篩選資料的有效方法,包括根據相關資料的是否存在篩選記錄、根據相關記錄的存在與否聚合資料以及最佳化查詢。

語法

SQL EXISTS 運算子的基本語法如下:

WHERE EXISTS (subquery);

其中,使用的子查詢是 SELECT 語句。如果子查詢在其結果集中返回至少一條記錄,則 EXISTS 運算子將評估為 TRUE;否則為 FALSE。

EXISTS 運算子與 SELECT 語句

SQL 中的 SELECT 語句用於從資料庫中的一個或多個表中檢索資料。我們可以將 EXISTS 運算子與 SELECT 語句一起使用,以檢查滿足特定條件的行是否存在。

示例

為了更好地理解它,讓我們考慮 CUSTOMERS 表,該表包含客戶的個人詳細資訊,包括他們的姓名、年齡、地址和工資等,如下所示:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),       
   PRIMARY KEY (ID)
); 

現在,使用 INSERT 語句將值插入此表:

INSERT INTO CUSTOMERS VALUES 
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

表將如下建立:

ID 姓名 年齡 地址 工資
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

讓我們建立另一個表CARS,其中包含客戶 ID、汽車名稱和價格等詳細資訊,使用以下查詢:

create table CARS(
   ID INT NOT NULL, 
   NAME VARCHAR(20) NOT NULL, 
   PRICE INT NOT NULL, 
   PRIMARY KEY(ID)
);

使用 INSERT 語句,讓我們將值插入此表:

insert INTO CARS VALUES
(2, 'Maruti Swift', 450000),
(4, 'VOLVO', 2250000),
(7, 'Toyota', 2400000);

獲得的“CARS”表如下:

ID 姓名 價格
2 Maruti Swift 450000
4 VOLVO 2250000
7 Toyota 2400000

現在,我們正在檢索汽車價格高於 2,000,000 的客戶列表:

SELECT * FROM CUSTOMERS WHERE 
EXISTS (
   SELECT PRICE FROM CARS 
   WHERE CARS.ID = CUSTOMERS.ID AND PRICE > 2000000
);

輸出

產生的結果如下:

ID 姓名 年齡 地址 工資
4 Chaitali 25 Mumbai 6500.00
7 Muffy 24 Indore 10000.00

EXISTS 運算子與 UPDATE 語句

我們還可以將 SQL EXISTS 運算子與 UPDATE 語句一起使用。它可以幫助我們根據另一表中匹配行的存在來更新表中的行。

示例

假設我們想更改先前建立的 CUSTOMERS 和 CARS 表中某些客戶的姓名,那麼可以使用 UPDATE 語句來完成此操作。在這裡,我們使用EXISTS 運算子修改所有其 ID 等於 CARS 表 ID 的客戶的姓名“Kushal”,如下所示:

UPDATE CUSTOMERS SET NAME = 'Kushal' 
WHERE EXISTS (
   SELECT NAME FROM CARS WHERE CUSTOMERS.ID = CARS.ID
);

輸出

我們得到以下結果。我們可以觀察到已修改了 3 行:

Query OK, 3 rows affected (0.01 sec)
Rows matched: 3  Changed: 3  Warnings: 0

驗證

我們可以使用 SELECT 語句檢索其內容來驗證更改是否反映在表中。以下是顯示 CUSTOMERS 表中記錄的查詢:

SELECT * FROM CUSTOMERS;

表顯示如下:

ID 姓名 年齡 地址 工資
1 Ramesh 32 Ahmedabad 2000.00
2 Kushal 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Kushal 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Kushal 24 Indore 10000.00

正如我們在上表中看到的,'Khilan'、'Chaitali' 和 'Muffy' 的 NAME 已更新為 'Kushal'。

EXISTS 運算子與 DELETE 語句

EXISTS 運算子也可以與 DELETE 語句一起使用,以根據子查詢返回的行是否存在來刪除行。

示例

在這裡,我們正在刪除 CUSTOMERS 表中 ID 等於 CARS 表中價格等於“2250000”的 ID 的行:

DELETE FROM CUSTOMERS WHERE 
EXISTS (
   SELECT * FROM CARS 
   WHERE CARS.ID = CUSTOMERS.ID AND CARS.PRICE = 2250000
);

輸出

我們得到以下結果。我們可以觀察到已刪除 1 行:

Query OK, 1 row affected (0.01 sec)

驗證

我們可以使用以下查詢來糾正對 CUSTOMERS 表所做的更改:

SELECT * FROM CUSTOMERS;

表顯示如下:

ID 姓名 年齡 地址 工資
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

正如我們在上表中看到的,NAME 為“Chaitali”的行已被刪除,因為 CUSTOMERS 表中 Chaitali 的 ID 為“4”,這等於 CARS 表中價格等於“2250000”的 ID。

NOT 運算子與 EXISTS 運算子

在 SQL 中,NOT EXISTS 運算子用於從一個表中選擇在另一個表中不存在的記錄。

語法

以下是 SQL 中 NOT EXISTS 運算子的基本語法:

WHERE NOT EXISTS (subquery);

其中,使用的子查詢是 SELECT 語句。

示例

以下查詢列出了尚未購買任何汽車的客戶姓名:

SELECT * FROM CUSTOMERS WHERE NOT 
EXISTS (
   SELECT * FROM CARS WHERE CUSTOMERS.ID = CARS.ID
);

輸出

執行上述查詢後獲得以下輸出:

ID 姓名 年齡 地址 工資
1 Ramesh 32 Ahmedabad 2000.00
3 Kaushik 23 Kota 2000.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00

SQL EXISTS 運算子的用法

SQL 中的 EXISTS 運算子廣泛用於現實場景中,以根據另一表中相關資料的是否存在來篩選記錄。一些常見的用例包括:

  • 檢查多對多關係中記錄的存在與否 - EXISTS 運算子可用於檢查多對多關係的聯接表中是否存在記錄,例如,查詢已購買特定產品的所有客戶。

  • 根據相關記錄的存在與否篩選記錄 - EXISTS 運算子可用於根據另一表中相關記錄的存在與否篩選記錄。例如,查詢所有具有關聯訂單詳細資訊的訂單。

  • 根據相關記錄的存在與否聚合資料 - EXISTS 運算子可用於根據相關記錄的存在與否聚合資料。例如,查詢已下訂單的客戶數量。

  • 最佳化查詢 - EXISTS 運算子可用於最佳化查詢,方法是僅返回必要的資料。例如,查詢每個客戶的第一個訂單,而無需使用自連線。

這些只是 EXISTS 運算子如何在現實場景中使用的一些示例。具體的用例將取決於資料和查詢的要求。

廣告