MySQL IN Clause: ตรวจสอบค่าในชุดข้อมูลอย่างง่าย
หลังจากที่เราได้เรียนรู้การใช้ LIKE Clause เพื่อค้นหาข้อมูลด้วยรูปแบบ (Pattern) ที่ซับซ้อนกันไปแล้ว ในบทนี้เราจะมาทำความรู้จักกับ IN Clause อีกหนึ่งเครื่องมือสำคัญในการดึงข้อมูลจากฐานข้อมูล MySQL ของเรา IN Clause ช่วยให้เราตรวจสอบว่าค่าของคอลัมน์ที่เราสนใจนั้นตรงกับค่าใดค่าหนึ่งในชุดข้อมูลที่เรากำหนดไว้หรือไม่ ทำให้การเขียนเงื่อนไขการค้นหาข้อมูลมีความกระชับและเข้าใจง่ายยิ่งขึ้น
IN (value1, value2, ...) คืออะไร?
IN Clause เป็นส่วนหนึ่งของ WHERE Clause ใน SQL ที่ใช้สำหรับระบุว่าเราต้องการเลือกข้อมูลเฉพาะแถวที่ค่าในคอลัมน์ที่ระบุ ตรงกับค่าใดค่าหนึ่งในชุดข้อมูลที่เรากำหนดไว้ในวงเล็บ รูปแบบการใช้งานคือ:
SELECT column1, column2, ...
FROM table_name
WHERE column_name IN (value1, value2, value3, ...);
โดยที่:
column1, column2, ...คือ คอลัมน์ที่เราต้องการเลือกtable_nameคือ ชื่อตารางที่เราต้องการดึงข้อมูลcolumn_nameคือ คอลัมน์ที่เราต้องการตรวจสอบค่าvalue1, value2, value3, ...คือ ชุดข้อมูลที่เราต้องการตรวจสอบว่าค่าในcolumn_nameตรงกับค่าใดค่าหนึ่งในชุดข้อมูลนี้หรือไม่
ตัวอย่างการใช้งาน IN Clause
สมมติว่าเรามีตาราง customers ที่เก็บข้อมูลลูกค้า ประกอบด้วยคอลัมน์ customer_id, customer_name, city, และ country ดังนี้:
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(255),
city VARCHAR(255),
country VARCHAR(255)
);
INSERT INTO customers (customer_id, customer_name, city, country) VALUES
(1, 'Alfreds Futterkiste', 'Berlin', 'Germany'),
(2, 'Ana Trujillo Emparedados y helados', 'Mexico City', 'Mexico'),
(3, 'Antonio Moreno Taquería', 'Mexico City', 'Mexico'),
(4, 'Around the Horn', 'London', 'UK'),
(5, 'Berglunds snabbköp', 'Luleå', 'Sweden'),
(6, 'Blauer See Delikatessen', 'Mannheim', 'Germany');
หากเราต้องการดึงข้อมูลลูกค้าที่อาศัยอยู่ในเมือง 'Berlin', 'Mexico City', หรือ 'London' เราสามารถใช้ IN Clause ได้ดังนี้:
SELECT *
FROM customers
WHERE city IN ('Berlin', 'Mexico City', 'London');
ผลลัพธ์ที่ได้คือ:
+-------------+------------------------------------------+-------------+---------+
| customer_id | customer_name | city | country |
+-------------+------------------------------------------+-------------+---------+
| 1 | Alfreds Futterkiste | Berlin | Germany |
| 2 | Ana Trujillo Emparedados y helados | Mexico City | Mexico |
| 3 | Antonio Moreno Taquería | Mexico City | Mexico |
| 4 | Around the Horn | London | UK |
+-------------+------------------------------------------+-------------+---------+
จะเห็นว่าเราได้ข้อมูลลูกค้าที่อาศัยอยู่ในเมืองที่เรากำหนดไว้ใน IN Clause เท่านั้น
การเปรียบเทียบหลายค่าด้วย IN Clause
IN Clause มีประโยชน์อย่างมากเมื่อเราต้องการเปรียบเทียบค่าของคอลัมน์กับชุดข้อมูลที่มีหลายค่า แทนที่จะต้องใช้ OR หลายครั้ง ตัวอย่างเช่น หากเราต้องการดึงข้อมูลลูกค้าที่มาจากประเทศ 'Germany' หรือ 'Mexico' เราสามารถเขียนได้ดังนี้:
SELECT *
FROM customers
WHERE country IN ('Germany', 'Mexico');
ซึ่งให้ผลลัพธ์เหมือนกับการเขียนด้วย OR ดังนี้:
SELECT *
FROM customers
WHERE country = 'Germany' OR country = 'Mexico';
แต่การใช้ IN Clause จะอ่านง่ายและจัดการได้สะดวกกว่า โดยเฉพาะอย่างยิ่งเมื่อมีค่าที่ต้องการเปรียบเทียบจำนวนมาก
การใช้ NOT IN Clause
นอกจาก IN Clause แล้ว เรายังสามารถใช้ NOT IN Clause เพื่อเลือกข้อมูลที่ *ไม่* ตรงกับค่าใดๆ ในชุดข้อมูลที่กำหนดได้ ตัวอย่างเช่น หากเราต้องการดึงข้อมูลลูกค้าที่ไม่ได้อาศัยอยู่ในเมือง 'Berlin', 'Mexico City', หรือ 'London' เราสามารถเขียนได้ดังนี้:
SELECT *
FROM customers
WHERE city NOT IN ('Berlin', 'Mexico City', 'London');
ผลลัพธ์ที่ได้คือ:
+-------------+-----------------------+--------+---------+
| customer_id | customer_name | city | country |
+-------------+-----------------------+--------+---------+
| 5 | Berglunds snabbköp | Luleå | Sweden |
| 6 | Blauer See Delikatessen | Mannheim | Germany |
+-------------+-----------------------+--------+---------+
IN Clause กับ Subquery
IN Clause ยังสามารถใช้ร่วมกับ Subquery ได้ ซึ่งช่วยให้เราสามารถดึงข้อมูลจากตารางหนึ่ง โดยอ้างอิงจากข้อมูลในอีกตารางหนึ่ง ตัวอย่างเช่น สมมติว่าเรามีตาราง orders ที่เก็บข้อมูลการสั่งซื้อ ประกอบด้วยคอลัมน์ order_id, customer_id, และ order_date:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
INSERT INTO orders (order_id, customer_id, order_date) VALUES
(1, 1, '2023-01-15'),
(2, 2, '2023-02-20'),
(3, 1, '2023-03-10'),
(4, 5, '2023-04-05'),
(5, 3, '2023-05-12');
หากเราต้องการดึงข้อมูลลูกค้าที่เคยสั่งซื้อสินค้า เราสามารถใช้ IN Clause ร่วมกับ Subquery ได้ดังนี้:
SELECT *
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders);
Subquery (SELECT customer_id FROM orders) จะดึงรายการ customer_id ทั้งหมดที่ปรากฏในตาราง orders จากนั้น IN Clause จะตรวจสอบว่า customer_id ในตาราง customers ตรงกับค่าใดค่าหนึ่งในรายการที่ได้จาก Subquery หรือไม่
ข้อควรระวังในการใช้งาน IN Clause
- ประสิทธิภาพ: การใช้
INClause กับชุดข้อมูลขนาดใหญ่อาจส่งผลต่อประสิทธิภาพของ Query ได้ ในกรณีเช่นนี้ การใช้JOINอาจเป็นทางเลือกที่ดีกว่า - ค่า NULL:
INClause จะไม่ทำงานอย่างถูกต้องเมื่อมีค่าNULLในชุดข้อมูลที่เปรียบเทียบ หากต้องการตรวจสอบว่ามีค่าNULLหรือไม่ ควรใช้IS NULLหรือIS NOT NULLแทน - จำนวนค่าในชุดข้อมูล: แม้ว่าโดยทั่วไปแล้ว MySQL จะรองรับค่าจำนวนมากใน
INClause แต่การมีค่ามากเกินไปอาจทำให้ Query อ่านยากและจัดการได้ยาก
สรุป
IN Clause เป็นเครื่องมือที่มีประโยชน์ในการตรวจสอบว่าค่าของคอลัมน์ตรงกับค่าใดค่าหนึ่งในชุดข้อมูลที่กำหนดไว้หรือไม่ ช่วยให้การเขียนเงื่อนไขการค้นหาข้อมูลมีความกระชับและเข้าใจง่ายยิ่งขึ้น เราได้เรียนรู้การใช้งาน IN Clause ทั้งแบบปกติ และแบบที่ใช้ร่วมกับ Subquery รวมถึงข้อควรระวังในการใช้งาน หวังว่าบทความนี้จะเป็นประโยชน์ในการพัฒนาทักษะการเขียน SQL ของคุณ
ในบทความต่อไป เราจะมาเรียนรู้เกี่ยวกับ BETWEEN Clause ซึ่งเป็นอีกหนึ่งเครื่องมือที่ช่วยให้เราสามารถเลือกข้อมูลในช่วงที่กำหนดได้ อย่าพลาดติดตาม!