Table of Contents
Subquery คืออะไร?
Subquery เป็นเหมือนกับการ Query ในภาษา SQL หรือคือการเขียน SELECT
Statement เพื่อทำการดึงข้อมูลในคอลัมน์หรือค่าในคอลัมน์จากตารางหรือฐานข้อมูลที่เราต้องการ เพื่อนำไปใช้ประโยชน์ต่อไป แต่ Subquery จะคือการ Query ซ้อน Query อีกทีหนึ่ง
SELECT column_1, column_2 FROM table1
ตัวอย่างการใช้ SELECT
ใน SQL
Subquery ในภาษา SQL คือ SELECT
statement ย่อยที่ถูกครอบด้วย SELECT
Statement อีกอันที่ใหญ่กว่า ซึ่งบางคนก็จะเรียกว่า Inner query หรือ Nested query โดยหน้าตาของ Subquery จะสังเกตได้ง่ายๆ จากวงเล็บ นั่นคือ Query ไหนที่มีวงเล็บครอบอยู่ Query นั้นจะถูกเรียกว่า Subquery และ Query ที่อยู่ด้านนอกเรียกว่า Outer Query หรือ Main Query นั่นเอง
SELECT ... FROM ( SELECT ... FROM ...)
จากคำสั่งข้างบน (SELECT ...)
คือ Subquery นั่นเอง
หากใครอ่านมาถึงตรงนี้โดยที่ยังไม่รู้จักภาษา SQL สามารถอ่านเพิ่มเติมได้ที่นี่
ประโยชน์หรือข้อดีของ Subquery
Subquery สามารถคืนค่าหลายรูปแบบ
การคืนค่าได้หลายรูปแบบนี้ทำให้เราสามารถนำไปใช้ประโยชน์ต่อได้หลายรูปแบบมากยิ่งขึ้น
- ไม่ว่าจะเป็น Scalar ที่เป็นค่าเดียว หรือตัวเลขหนึ่งตัว เช่น
SELECT COUNT (x)
ก็จะได้จำนวนแถวกลับมา 1 ค่า - คืนค่ากลับมาเป็นแถว 1 แถว (Single row) ,คืนค่ากลับมาเป็นคอลัมน์ 1 คอลัมน์ (Single Column) หรือคืนค่ากลับมาเป็นตาราง 1 ตาราง
Subquery สามารถเอาไปใช้ได้หลายที่
- Calculated value หรือใช้ใน
SELECT
Clause เพื่อคำนวณค่าอะไรบางอย่างที่ไม่สามารถทำได้ในการ query ครั้งเดียว (calculated value) - Data source หรือใช้ใน
FROM
Clause /JOIN
เพื่อนำข้อมูลจากหลายๆ แหล่งมาประมวลผลก่อนนำไปใช้ - Selection criteria หรือใช้ใน
WHERE
Clause เพื่อเป็นเงื่อนไขในการกรองข้อมูลก่อนนำไปใช้ เช่นเลือกเฉพาะแถว 1 แถว ที่อยู่ในอีกตารางมาประมวลผลกับอีกตาราง
ตัวอย่างการใช้ Subquery
เพื่อให้เห็นภาพการใช้งาน Subquery มากขึ้น จะขอยกตัวอย่างโดยใช้ข้อมูลภาพยนตร์จากวิกิพีเดีย ที่ประกอบไปด้วย ข้อมูล 4 คอลัมน์ ดังรูป
โดยเป็นการ Query ด้วยชุดคำสั่ง
SELECT * FROM thai_boxoffice ORDER BY studio, gross
การใช้ Subquery ใน SELECT
Clause
จากตัวอย่างข้างต้น แต่ละ Studio จะมีภาพยนตร์หลายเรื่อง ถ้าเราต้องการเพิ่มคอลัมน์ studio_max_gross
ที่จะแสดงรายได้สูงสุดของภาพยนตร์ในค่ายนั้น สามารถทำได้โดยการเพิ่ม Subquery เข้าไป
SELECT *, ( SELECT MAX(gross) FROM thai_boxoffice WHERE studio = m.studio ) AS studio_max_gross FROM thai_boxoffice m ORDER BY studio, gross
จากชุดคำสั่งข้างบน เราได้ทำการเพิ่ม Subquery เข้าไปเพื่อทำการคำนวณหาค่า MAX(gross)
และเพิ่มเข้าไปเป็นคอลัมน์ใหม่ที่ชื่อว่า studio_max_gross
และตั้งชื่อของตาราง (Alias) thai_boxoffice
ที่ Main Query เป็น m
โดยเขียนชื่อ Alias เข้ามาต่อท้าย thai_boxoffice
เพื่อให้สามารถกำหนดเงื่อนไข WHERE
ใน Subquery ให้ filter มาเฉพาะแถวที่ studio = m.studio
(การที่เรากำหนดเงื่อนไขนี้ จะทำให้เห็นว่า subquery นี้เป็น Correlated Subquery)
ผลลัพท์จากคำสั่งข้างต้น
อีกวิธีที่ทำได้ คือเราสามารถนำไปใช้ร่วมกับคำสั่ง JOIN ได้ด้วยคำสั่ง
SELECT m.*, mm.studio_max_gross FROM thai_boxoffice m JOIN ( SELECT studio, MAX(gross) AS studio_max_gross FROM thai_boxoffice GROUP BY studio ) mm ON m.studio = mm.studio ORDER BY studio, gross
การใช้ Subquery ใน WHERE
Clause
จากตัวอย่างเดิม เราต้องการแสดงเฉพาะรายละเอียดภาพยนตร์ที่ทำรายได้สูงสุดของแต่ละค่าย สามารถทำได้โดยการเพิ่ม Subquery เข้าไปในเงื่อนไข
SELECT * FROM thai_boxoffice m WHERE gross = ( SELECT MAX(gross) FROM thai_boxoffice WHERE studio = m.studio ) ORDER BY studio
จากชุดคำสั่งข้างบน เราได้ทำการเพิ่ม Subquery เข้าไปเพื่อเป็นเงื่อไขในการ filter ค่า gross จาก mainquery = MAX(gross)
ของ Subquery
ผลลัพท์จากคำสั่งข้างต้น
อีกวิธีที่ทำได้ คือเราสามารถนำไปใช้ร่วมกับคำสั่ง JOIN ได้ด้วยคำสั่ง
SELECT m.* FROM thai_boxoffice m JOIN ( SELECT studio, MAX(gross) AS studio_max_gross FROM thai_boxoffice GROUP BY studio ) mm ON m.studio = mm.studio WHEREE m.gross = mm.studio_max_gross ORDER BY studio
นี่เป็นเพียงส่วนหนึ่งของ Subquery เท่านั้น และในความเป็นจริงก็มีวิธีอื่นที่สามารถทำให้ได้ผลลัพธ์อยู่เหมือนกัน ความเร็วในการทำงานก็อาจจะแตกต่างกันออกไป เช่น การใช้คำสั่ง JOIN หากใครต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Subquery และคำสั่งอื่นๆ ที่จะช่วยให้คุณใช้งาน SQL ได้อย่างเต็มประสิทธิภาพมากยิ่งขึ้น สามารถทดลองเรียน ดูตัวอย่างบทเรียนพร้อมทดลองเขียนภาษา SQL ได้ที่ Advanced SQL for Data Analytics with BigQuery