T-SQL - แบบสอบถามย่อย

sub-query หรือ Inner query หรือ Nested queryเป็นแบบสอบถามภายในแบบสอบถาม SQL Server อื่นและฝังอยู่ภายในส่วนคำสั่ง WHERE แบบสอบถามย่อยใช้เพื่อส่งคืนข้อมูลที่จะใช้ในแบบสอบถามหลักเป็นเงื่อนไขในการ จำกัด ข้อมูลที่จะเรียกเพิ่มเติม

แบบสอบถามย่อยสามารถใช้กับคำสั่ง SELECT, INSERT, UPDATE และ DELETE พร้อมกับตัวดำเนินการเช่น =, <,>,> =, <=, IN, BETWEEN เป็นต้น

มีกฎสองสามข้อที่การสืบค้นย่อยต้องปฏิบัติตาม -

  • คุณต้องใส่เคียวรีย่อยในวงเล็บ

  • การสืบค้นย่อยต้องมีส่วนคำสั่ง SELECT และส่วนคำสั่ง FROM

  • การสืบค้นย่อยอาจรวมถึงคำสั่ง WHERE, GROUP BY และ HAVING ที่เป็นทางเลือก

  • แบบสอบถามย่อยไม่สามารถรวมส่วนคำสั่ง COMPUTE หรือ FOR BROWSE ได้

  • คุณสามารถรวมคำสั่ง ORDER BY ได้ก็ต่อเมื่อรวมคำสั่ง TOP

  • คุณสามารถซ้อนคิวรีย่อยได้ถึง 32 ระดับ

แบบสอบถามย่อยที่มีคำสั่ง 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     32        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

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

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

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     32        Ahmedabad           500.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

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