EXISTS เป็นคำสั่งที่ใช้ในการตรวจสอบว่าข้อมูลในชุดผลลัพธ์ของคำสั่งย่อย (subquery) นั้นมีอยู่หรือไม่ ถ้ามีอย่างน้อยหนึ่งแถวที่ตรงกับเงื่อนไข คำสั่ง EXISTS จะคืนค่า TRUE ทำให้คำสั่งหลัก (outer query) สามารถดำเนินการได้ แต่ถ้าไม่มีแถวที่ตรงกับเงื่อนไข คำสั่ง EXISTS จะคืนค่า FALSE และคำสั่งหลักจะไม่ทำงาน
สร้างตารางตัวอย่าง
สมมติว่าเรามีตารางดังนี้
- customers – เก็บข้อมูลของลูกค้า
- orders – เก็บข้อมูลการสั่งซื้อสินค้า
ใช้คำสั่งต่อไปนี้เพื่อสร้างตาราง
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(255),
country VARCHAR(255)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
amount DECIMAL(10, 2),
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);ใช้คำสั่งต่อไปนี้เพื่อแทรกข้อมูลลงในตาราง
INSERT INTO customers (customer_id, customer_name, country) VALUES
(1, 'John Doe', 'USA'),
(2, 'Jane Smith', 'UK'),
(3, 'Michael Brown', 'Canada'),
(4, 'Lisa White', 'Australia');
INSERT INTO orders (order_id, customer_id, order_date, amount) VALUES
(101, 1, '2024-01-15', 500.00),
(102, 2, '2024-02-20', 700.00),
(103, 1, '2024-03-10', 200.00),
(104, 3, '2024-04-25', 150.00);ข้อมูลในตาราง customers

ข้อมูลในตาราง orders

การใช้ EXISTS เพื่อเลือกข้อมูลเฉพาะลูกค้าที่มีการสั่งซื้อสินค้า
เราสามารถใช้ EXISTS เพื่อดึงข้อมูลลูกค้าที่มีการสั่งซื้อ โดยใช้คำสั่ง SQL ดังนี้
SELECT customer_name
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);- คำสั่งย่อย (subquery) จะดึงข้อมูลจากตาราง
ordersเพื่อตรวจสอบว่ามีการสั่งซื้อที่เกี่ยวข้องกับลูกค้าในตารางcustomersหรือไม่ - ถ้า
customer_idในตารางordersตรงกับcustomer_idในตารางcustomersคำสั่งย่อยจะส่งผลลัพธ์ว่ามีข้อมูลอยู่ ทำให้ EXISTS คืนค่าTRUEและแสดงรายชื่อลูกค้าออกมา
จะได้ผลลัพธ์ดังนี้

การใช้ EXISTS กับ NOT EXISTS
เราสามารถใช้ NOT EXISTS เพื่อเลือกเฉพาะข้อมูลลูกค้าที่ไม่มีการสั่งซื้อสินค้าได้เช่นกัน โดยใช้คำสั่งดังนี้
SELECT customer_name
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);- คำสั่งนี้จะเลือกข้อมูลของลูกค้าที่ไม่มีการสั่งซื้อสินค้า
ผลลัพธ์

การใช้ EXISTS เพื่อตรวจสอบเงื่อนไขที่ซับซ้อนยิ่งขึ้น
สามารถใช้ EXISTS ในกรณีที่ต้องการตรวจสอบเงื่อนไขหลายระดับ เช่น การดึงข้อมูลลูกค้าที่มีการสั่งซื้อในช่วงเวลาที่กำหนด
SELECT customer_name
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
AND o.order_date BETWEEN '2024-01-01' AND '2024-03-31'
);- ตัวอย่างนี้จะดึงข้อมูลเฉพาะลูกค้าที่มีการสั่งซื้อในช่วงวันที่ 1 มกราคม 2024 ถึง 31 มีนาคม 2024
ผลลัพธ์

การใช้ EXISTS กับหลายตาราง
หากมีหลายตารางที่เกี่ยวข้อง เราสามารถใช้ EXISTS เพื่อตรวจสอบการมีอยู่ของข้อมูลในหลายตารางพร้อมกันได้ ดังนี้
สร้างตาราง products และ order_items สำหรับใช้เป็นตัวอย่าง
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(255),
price DECIMAL(10, 2)
);
CREATE TABLE order_items (
order_item_id INT PRIMARY KEY,
order_id INT,
product_id INT,
quantity INT,
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);แทรกข้อมูลลงในตารางที่เพิ่งสร้างไป
INSERT INTO products (product_id, product_name, price) VALUES
(1, 'Laptop', 1000.00),
(2, 'Smartphone', 500.00),
(3, 'Tablet', 300.00);
INSERT INTO order_items (order_item_id, order_id, product_id, quantity) VALUES
(1, 101, 1, 1),
(2, 102, 2, 2),
(3, 103, 3, 1),
(4, 104, 1, 1);ใช้คำสั่ง EXISTS เพื่อตรวจสอบข้อมูลจากหลายตารางได้ ดังนี้
SELECT customer_name
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
AND EXISTS (
SELECT 1
FROM order_items oi
WHERE oi.order_id = o.order_id
AND EXISTS (
SELECT 1
FROM products p
WHERE p.product_id = oi.product_id
AND p.product_name = 'Laptop'
)
)
);- ในตัวอย่างนี้ เราตรวจสอบว่ามีลูกค้าคนใดบ้างที่เคยสั่งซื้อสินค้าที่ชื่อว่า “Laptop”
- เราใช้ EXISTS ซ้อนกันสามระดับ โดยระดับแรกตรวจสอบว่ามีการสั่งซื้ออยู่ในตาราง
ordersหรือไม่ ระดับที่สองตรวจสอบว่ามีสินค้าอยู่ในคำสั่งซื้อ (order_items) หรือไม่ และระดับที่สามตรวจสอบว่ามีสินค้าที่ตรงกับproduct_name = 'Laptop'หรือไม่
ผลลัพธ์

สรุป
คำสั่ง EXISTS ใน SQL ใช้ในการตรวจสอบข้อมูลที่มีอยู่ในคำสั่งย่อย สามารถประยุกต์ใช้ในหลายๆ รูปแบบ ทั้งการตรวจสอบการมีอยู่ของข้อมูล การตรวจสอบเงื่อนไขหลายระดับ และการตรวจสอบข้อมูลในหลายตาราง
