บทความต่อไปนี้จะแสดงวิธีใช้แบบสอบถามย่อยใน SQL Server พร้อมกับไวยากรณ์และตัวอย่าง
คิวรีย่อยใน SQL คืออะไร (เคียวรีย่อย)
ใน SQL Server คิวรีย่อยคือคิวรีที่อยู่ในคิวรีอื่น คุณสามารถสร้างแบบสอบถามในคำสั่ง SQL แบบสอบถามย่อยเหล่านี้อยู่ในส่วนคำสั่ง WHERE, FROM หรือ SELECT
หมายเหตุ:
- แบบสอบถามย่อยเรียกอีกอย่างว่า INNER QUERY หรือ INNER SELECT
- แบบสอบถามหลักที่มีแบบสอบถามย่อยเรียกว่า OUTER QUERY หรือ OUTER SELECT
ส่วนคำสั่งไหน
โดยปกติแบบสอบถามย่อยจะอยู่ในส่วนคำสั่ง WHERE แบบสอบถามย่อยเหล่านี้เรียกว่าการสืบค้นข้อมูลที่ซ้อนกันหรือแบบสอบถามย่อย
SELECT s.sanpham_id, s.sanpham_ten
FROM sanpham s
WHERE s.sanpham_id IN
(SELECT htk.sanpham_id
FROM hangtonkho htk
WHERE htk.soluong >
10);
นี่คือส่วนข้อความค้นหาย่อยในคำสั่ง SELECT ด้านบน:
(SELECT htk.sanpham_id
FROM hangtonkho htk
WHERE htk.soluong
> 10);
แบบสอบถามย่อยช่วยให้สามารถค้นหาค่า sanpham_id จากตาราง hangtonkho ที่มีตัวเลขมากกว่า 10 จากนั้นเคียวรีย่อยจะใช้ในการกรองผลลัพธ์จากการสืบค้นหลักโดยใช้เงื่อนไข IN .
แบบสอบถามย่อยสามารถเขียนเป็น INNER JOIN ดังที่แสดงด้านล่าง
SELECT s.sanpham_id, s.sanpham_ten
FROM sanpham s
INNER JOIN hangtonkho htk
ON s.sanpham_id = htk.sanpham_id
WHERE htk.soluong > 10;
INNER JOIN จะแสดงผลอย่างมีประสิทธิภาพมากกว่าการสืบค้นย่อยเดิม โปรดทราบด้วยว่า JOIN จะไม่มีการสืบค้นใดๆ ใหม่
ส่วนคำสั่ง FROM
SELECT nhacung.nhacung_ten, truyvancon1.tong_sl
FROM nhacung,
(SELECT nhacung_id, SUM(donhang.soluong) AS tong_sl
FROM donhang
GROUP BY nhacung_id) truyvancon1
WHERE truyvanco
n1.nhacung_id = nhacung.nhacung_id;
ในตัวอย่างนี้ เราได้สร้างแบบสอบถามย่อยในส่วนคำสั่ง FROM ดังนี้:
(SELECT nhacung_id, SUM(donhang.soluong) AS tong_sl
FROM donhang
GROUP BY nhacung
_id) truyvancon1
แบบสอบถามย่อยนี้เชื่อมโยงกับนามแฝง truyvancon1 ด้วย นี่จะเป็นชื่อที่ใช้เพื่ออ้างถึงข้อความค้นหาย่อยนี้หรือฟิลด์ข้อมูลใดๆ
ส่วนคำสั่ง SELECT
โดยปกติเคียวรีย่อยจะถูกตั้งค่าในส่วนคำสั่ง SELECT เพื่อคำนวณโดยฟังก์ชันผลรวม เช่น SUM, COUNT, MIN หรือ MAX แต่ไม่ต้องการนับในการสืบค้นหลัก
พี>SELECT n1.ho, n1.ten,
(SELECT MAX(luong)
FROM nhanvien n2
WHERE n1.nhanvien_id = n2.nhanvien_id) truyvancon2
FROM nhanvien n1
;
ด้านล่างคือข้อความค้นหาย่อยที่สร้างขึ้นในตัวอย่างด้านบน
(SELECT MAXong)
FROM nhanvien n2
WHERE n1.nhanvie
n_id = n2.nhanvien_id) truyvancon2
แบบสอบถามย่อยนี้เชื่อมโยงกับนามแฝง truyvancon2 ด้วย นี่จะเป็นชื่อที่ใช้เพื่ออ้างถึงข้อความค้นหาย่อยนี้หรือฟิลด์ข้อมูลใดๆ
เคล็ดลับในการวางเคียวรีย่อยในส่วนคำสั่ง SELECT ถูกใช้เพราะว่าเคียวรีย่อยคืนค่าเพียงค่าเดียว นั่นเป็นสาเหตุที่ฟังก์ชันผลรวมเช่น SUM, COUNT, MIN หรือ MAX มักใช้ในแบบสอบถามย่อย