Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ค้นหาข้อมูลที่ไม่มีค่าในฟิลด์เฉพาะด้วย Subquery ใน MySQL

การเตรียมข้อมูล

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

  1. Subquery ดึง UserName ที่เป็น Admin: 'Chris'
  2. Main query หา UserName ที่ ไม่อยู่ใน รายการนั้น
  3. ได้ '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 แทนเพื่อความปลอดภัยและประสิทธิภาพ