SQL - แบบสอบถามย่อย
แบบสอบถามย่อยหรือแบบสอบถามภายในหรือแบบสอบถามที่ซ้อนกันคือแบบสอบถามภายในแบบสอบถาม SQL อื่นและฝังอยู่ภายในส่วนคำสั่ง WHERE
แบบสอบถามย่อยใช้เพื่อส่งคืนข้อมูลที่จะใช้ในแบบสอบถามหลักเป็นเงื่อนไขในการ จำกัด ข้อมูลที่จะเรียกเพิ่มเติม
แบบสอบถามย่อยสามารถใช้ได้กับคำสั่ง SELECT, INSERT, UPDATE และ DELETE พร้อมกับตัวดำเนินการเช่น =, <,>,> =, <=, IN, BETWEEN เป็นต้น
มีกฎสองสามข้อที่ต้องปฏิบัติตามแบบสอบถามย่อย -
แบบสอบถามย่อยต้องอยู่ในวงเล็บ
แบบสอบถามย่อยสามารถมีได้เพียงคอลัมน์เดียวในส่วนคำสั่ง SELECT เว้นแต่ว่าจะมีหลายคอลัมน์ในแบบสอบถามหลักเพื่อให้แบบสอบถามย่อยเปรียบเทียบคอลัมน์ที่เลือก
ไม่สามารถใช้คำสั่ง ORDER BY ในแบบสอบถามย่อยแม้ว่าแบบสอบถามหลักสามารถใช้ ORDER BY ได้ คำสั่ง GROUP BY สามารถใช้เพื่อดำเนินการฟังก์ชันเดียวกับ ORDER BY ในแบบสอบถามย่อย
แบบสอบถามย่อยที่ส่งคืนมากกว่าหนึ่งแถวสามารถใช้ได้เฉพาะกับตัวดำเนินการหลายค่าเช่นตัวดำเนินการ IN
รายการ SELECT ไม่สามารถรวมการอ้างอิงถึงค่าที่ประเมินเป็น BLOB, ARRAY, CLOB หรือ NCLOB
ไม่สามารถใส่เคียวรีย่อยในฟังก์ชัน set ได้ทันที
ไม่สามารถใช้ตัวดำเนินการ BETWEEN กับแบบสอบถามย่อย อย่างไรก็ตามสามารถใช้ตัวดำเนินการ BETWEEN ภายในแบบสอบถามย่อยได้
แบบสอบถามย่อยที่มีคำสั่ง SELECT
แบบสอบถามย่อยมักใช้กับคำสั่ง SELECT ไวยากรณ์พื้นฐานมีดังนี้ -
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])
ตัวอย่าง
พิจารณาตารางลูกค้าที่มีบันทึกต่อไปนี้ -
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 35 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
ตอนนี้ให้เราตรวจสอบการสืบค้นย่อยต่อไปนี้ด้วยคำสั่ง SELECT
SQL> SELECT *
FROM CUSTOMERS
WHERE ID IN (SELECT ID
FROM CUSTOMERS
WHERE SALARY > 4500) ;
สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้
+----+----------+-----+---------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+---------+----------+
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+---------+----------+
แบบสอบถามย่อยที่มีคำสั่ง INSERT
นอกจากนี้ยังสามารถใช้แบบสอบถามย่อยกับคำสั่ง INSERT คำสั่ง INSERT ใช้ข้อมูลที่ส่งกลับจากเคียวรีย่อยเพื่อแทรกลงในตารางอื่น ข้อมูลที่เลือกในแบบสอบถามย่อยสามารถแก้ไขได้ด้วยฟังก์ชันอักขระวันที่หรือตัวเลขใด ๆ
ไวยากรณ์พื้นฐานมีดังนี้
INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]
ตัวอย่าง
พิจารณาตาราง CUSTOMERS_BKP ที่มีโครงสร้างคล้ายกับตาราง CUSTOMERS ตอนนี้เพื่อคัดลอกตาราง CUSTOMERS ทั้งหมดลงในตาราง CUSTOMERS_BKP คุณสามารถใช้ไวยากรณ์ต่อไปนี้
SQL> INSERT INTO CUSTOMERS_BKP
SELECT * FROM CUSTOMERS
WHERE ID IN (SELECT ID
FROM CUSTOMERS) ;
แบบสอบถามย่อยที่มีคำสั่ง UPDATE
สามารถใช้แบบสอบถามย่อยร่วมกับคำสั่ง UPDATE สามารถอัปเดตคอลัมน์เดียวหรือหลายคอลัมน์ในตารางได้เมื่อใช้แบบสอบถามย่อยกับคำสั่ง UPDATE
ไวยากรณ์พื้นฐานมีดังนี้
UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
ตัวอย่าง
สมมติว่าเรามีตาราง CUSTOMERS_BKP ซึ่งเป็นข้อมูลสำรองของตาราง CUSTOMERS ตัวอย่างต่อไปนี้จะอัปเดต SALARY 0.25 เท่าในตาราง CUSTOMERS สำหรับลูกค้าทั้งหมดที่มี AGE มากกว่าหรือเท่ากับ 27
SQL> UPDATE CUSTOMERS
SET SALARY = SALARY * 0.25
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
WHERE AGE >= 27 );
สิ่งนี้จะส่งผลกระทบต่อสองแถวและในที่สุดตารางลูกค้าจะมีบันทึกต่อไปนี้
+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 35 | Ahmedabad | 125.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 2125.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+-----------+----------+
แบบสอบถามย่อยที่มีคำสั่ง DELETE
แบบสอบถามย่อยสามารถใช้ร่วมกับคำสั่ง DELETE เช่นเดียวกับข้อความอื่น ๆ ที่กล่าวถึงข้างต้น
ไวยากรณ์พื้นฐานมีดังนี้
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
ตัวอย่าง
สมมติว่าเรามีตาราง CUSTOMERS_BKP ซึ่งเป็นข้อมูลสำรองของตาราง CUSTOMERS ตัวอย่างต่อไปนี้จะลบบันทึกจากตาราง CUSTOMERS สำหรับลูกค้าทั้งหมดที่มี AGE มากกว่าหรือเท่ากับ 27
SQL> DELETE FROM CUSTOMERS
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
WHERE AGE >= 27 );
สิ่งนี้จะส่งผลกระทบต่อสองแถวและในที่สุดตารางลูกค้าจะมีบันทึกต่อไปนี้
+----+----------+-----+---------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+---------+----------+
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
| 7 | Muffy | 24 | Indore | 10000.00 |
+----+----------+-----+---------+----------+