การเตรียมข้อมูล
mysql> CREATE TABLE DemoTable1840 (
UserName VARCHAR(20),
UserType ENUM('GUEST','ADMIN')
);
mysql> INSERT INTO DemoTable1840 VALUES('Chris','Admin');
mysql> INSERT INTO DemoTable1840 VALUES('David','Guest');
mysql> INSERT INTO DemoTable1840 VALUES('Chris','Guest');
ข้อมูลในตาราง
+----------+----------+
| UserName | UserType |
+----------+----------+
| Chris | ADMIN |
| David | GUEST |
| Chris | GUEST |
+----------+----------+
Query หา User ที่ไม่เคยเป็น Admin
mysql> SELECT UserName FROM DemoTable1840
WHERE UserName NOT IN (
SELECT UserName FROM DemoTable1840 WHERE UserType = 'Admin'
);
ผลลัพธ์:
+----------+
| UserName |
+----------+
| David |
+----------+
การทำงานของ Subquery
- Subquery ดึง UserName ที่เป็น Admin:
'Chris' - Main query หา UserName ที่ ไม่อยู่ใน รายการนั้น
- ได้ 'David' เพราะไม่เคยเป็น Admin
วิธีอื่นที่เทียบเท่า
-- ใช้ NOT EXISTS (มักเร็วกว่า)
SELECT UserName FROM DemoTable1840 t1
WHERE NOT EXISTS (
SELECT 1 FROM DemoTable1840 t2
WHERE t2.UserName = t1.UserName AND t2.UserType = 'Admin'
);
-- ใช้ LEFT JOIN
SELECT DISTINCT t1.UserName FROM DemoTable1840 t1
LEFT JOIN DemoTable1840 t2 ON t1.UserName = t2.UserName AND t2.UserType = 'Admin'
WHERE t2.UserName IS NULL;
ข้อควรระวัง
NOT INจะคืนค่าว่างถ้า Subquery มี NULL อยู่ในผลลัพธ์- แนะนำใช้
NOT EXISTSแทนเพื่อความปลอดภัยและประสิทธิภาพ