คิวรีย่อยคือคําสั่ง SELECT ที่ซ้อนกันภายใน SELECT, SELECT... INTO, INSERT... คําสั่ง INTO, DELETE หรือ UPDATE หรือภายในคิวรีย่อยอื่น
ไวยากรณ์
คุณสามารถใช้ไวยากรณ์ได้สามรูปแบบเพื่อสร้างคิวรีย่อย ดังนี้
การเปรียบเทียบ [ANY | ทั้งหมด | ทั้งหมด SOME] (sqlstatement)
นิพจน์ [NOT] IN (sqlstatement)
[NOT] EXISTS (sqlstatement)
คิวรีย่อยมีส่วนต่างๆ ดังนี้
ส่วน |
คำอธิบาย |
เปรียบ เทียบ |
นิพจน์ และตัวดําเนินการเปรียบเทียบที่เปรียบเทียบนิพจน์กับผลลัพธ์ของคิวรีย่อย |
นิพจน์ |
นิพจน์ที่มีการค้นหาชุดผลลัพธ์ของคิวรีย่อย |
sqlstatement |
คําสั่ง SELECT ที่ตามหลังรูปแบบและกฎเดียวกันกับคําสั่ง SELECT อื่นๆ ซึ่งต้องอยู่ภายในวงเล็บ |
ข้อสังเกต
คุณสามารถใช้คิวรีย่อยแทนนิพจน์ในรายการเขตข้อมูลของคําสั่ง SELECT หรือในส่วนคําสั่ง WHERE หรือ HAVING ในคิวรีย่อย คุณใช้คําสั่ง SELECT เพื่อให้ชุดของค่าที่ระบุอย่างน้อยหนึ่งค่าเพื่อประเมินในนิพจน์ส่วนคําสั่ง WHERE หรือ HAVING
ใช้เพรดิเคต ANY หรือ SOME ซึ่งเป็นคําพ้องความหมายเมื่อต้องการเรียกใช้ระเบียนในคิวรีหลักที่ตรงกับการเปรียบเทียบกับระเบียนใดๆ ที่เรียกใช้ในคิวรีย่อย ตัวอย่างต่อไปนี้ส่งกลับผลิตภัณฑ์ทั้งหมดที่มีราคาต่อหน่วยมากกว่าผลิตภัณฑ์ใดๆ ที่ขายในส่วนลด 25 เปอร์เซ็นต์หรือมากกว่า:
SELECT * FROM Products WHERE UnitPrice > ANY (SELECT UnitPrice FROM OrderDetails WHERE Discount >= .25);
ใช้เพรดิเคต ALL เพื่อเรียกใช้เฉพาะระเบียนเหล่านั้นในคิวรีหลักที่ตรงกับการเปรียบเทียบกับระเบียนทั้งหมดที่เรียกใช้ในคิวรีย่อย ถ้าคุณเปลี่ยน ใดๆ เป็น ทั้งหมด ในตัวอย่างก่อนหน้า คิวรีจะส่งกลับเฉพาะผลิตภัณฑ์ที่มีราคาต่อหน่วยมากกว่าผลิตภัณฑ์ทั้งหมดที่ขายในส่วนลด 25 เปอร์เซ็นต์หรือมากกว่า นี่เป็นข้อ จํากัด มากขึ้น
ใช้เพรดิเคต IN เพื่อเรียกใช้เฉพาะระเบียนเหล่านั้นในคิวรีหลักที่บางระเบียนในคิวรีย่อยมีค่าที่เท่ากัน ตัวอย่างต่อไปนี้จะส่งกลับผลิตภัณฑ์ทั้งหมดที่มีส่วนลด 25 เปอร์เซ็นต์หรือมากกว่า:
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
ในทางกลับกัน คุณสามารถใช้ NOT IN เพื่อเรียกใช้เฉพาะระเบียนเหล่านั้นในคิวรีหลักที่ไม่มีระเบียนในคิวรีย่อยมีค่าที่เท่ากัน
ใช้เพรดิเคต EXISTS (ที่มีคําสงวน NOT ที่เป็นตัวเลือก) ในการเปรียบเทียบจริง/เท็จเพื่อกําหนดว่าคิวรีย่อยจะส่งกลับระเบียนใดๆ หรือไม่
คุณยังสามารถใช้นามแฝงของชื่อตารางในคิวรีย่อยเพื่ออ้างอิงตารางที่แสดงในส่วนคําสั่ง FROM ภายนอกคิวรีย่อย ตัวอย่างต่อไปนี้ส่งกลับชื่อของพนักงานที่มีเงินเดือนเท่ากับหรือมากกว่าเงินเดือนเฉลี่ยของพนักงานทั้งหมดที่มีตําแหน่งงานเดียวกัน ตารางพนักงานจะได้รับนามแฝง "T1":
SELECT LastName, FirstName, Title, Salary FROM Employees AS T1 WHERE Salary >= (SELECT Avg(Salary) FROM Employees WHERE T1.Title = Employees.Title) Order by Title;
ในตัวอย่างก่อนหน้า คำสงวน AS จะทําหรือไม่ก็ได้
คิวรีย่อยบางรายการได้รับอนุญาตในคิวรีแบบตาราง กล่าวคือ เพรดิเคต (รายการในส่วนคําสั่ง WHERE) โดยเฉพาะ คิวรีย่อยเป็นผลลัพธ์ (รายการ SELECT) ไม่ได้รับอนุญาตให้ใช้งานในคิวรีแบบตาราง