SQL การใช้งาน EXISTS Operator

EXISTS เป็นคำสั่งที่ใช้ในการตรวจสอบว่าข้อมูลในชุดผลลัพธ์ของคำสั่งย่อย (subquery) นั้นมีอยู่หรือไม่ ถ้ามีอย่างน้อยหนึ่งแถวที่ตรงกับเงื่อนไข คำสั่ง EXISTS จะคืนค่า TRUE ทำให้คำสั่งหลัก (outer query) สามารถดำเนินการได้ แต่ถ้าไม่มีแถวที่ตรงกับเงื่อนไข คำสั่ง EXISTS จะคืนค่า FALSE และคำสั่งหลักจะไม่ทำงาน

สร้างตารางตัวอย่าง

สมมติว่าเรามีตารางดังนี้

  1. customers – เก็บข้อมูลของลูกค้า
  2. orders – เก็บข้อมูลการสั่งซื้อสินค้า

ใช้คำสั่งต่อไปนี้เพื่อสร้างตาราง

SQL
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)
);

ใช้คำสั่งต่อไปนี้เพื่อแทรกข้อมูลลงในตาราง

SQL
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 ดังนี้

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 เพื่อเลือกเฉพาะข้อมูลลูกค้าที่ไม่มีการสั่งซื้อสินค้าได้เช่นกัน โดยใช้คำสั่งดังนี้

SQL
SELECT customer_name
FROM customers c
WHERE NOT EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id = c.customer_id
);
  • คำสั่งนี้จะเลือกข้อมูลของลูกค้าที่ไม่มีการสั่งซื้อสินค้า

ผลลัพธ์

การใช้ EXISTS เพื่อตรวจสอบเงื่อนไขที่ซับซ้อนยิ่งขึ้น

สามารถใช้ EXISTS ในกรณีที่ต้องการตรวจสอบเงื่อนไขหลายระดับ เช่น การดึงข้อมูลลูกค้าที่มีการสั่งซื้อในช่วงเวลาที่กำหนด

SQL
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 สำหรับใช้เป็นตัวอย่าง

SQL
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)
);

แทรกข้อมูลลงในตารางที่เพิ่งสร้างไป

SQL
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 เพื่อตรวจสอบข้อมูลจากหลายตารางได้ ดังนี้

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

แชร์เรื่องนี้