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 |
+----+----------+-----+---------+----------+