การสอบถามข้อมูลแบบซ้อนกัน CHARPTER 8 การสอบถามข้อมูลแบบซ้อนกัน SELECT … SELECT
สาระการเรียนรู้ เพื่อศึกษาการใช้ Query ซ้อน Query เพื่อให้สะดวกต่อการสอบถาม เงื่อนไขแบบซับซ้อน
สอบถามข้อมูลแบบซ้อนกัน SQL มีโครงสร้างที่ทำหน้าให้ผู้ใช้สามารถสอบถามข้อมูลได้ละเอียด มากขึ้น โดยสามารถสอบถามข้อมูลซ้อนคำสั่งสอบถามได้ เรียกว่า การสอบถาม แบบซ้อนกัน หรือ “Subquery” หลักการของการสอบถามข้อมูลแบบซ้อนกัน คือ ผลลัพธ์จากการสอบถามย่อย (subquery) จะส่งต่อไปยังคำสั่งสอบถามหลักซึ่งอยู่ในระดับถัดขึ้นไป (main query)
รูปแบบของคำสั่ง รูปแบบทั่วไปของ Query และ Subquery แสดงได้ดังนี้ SELECT <column-name(s)> (main Query) การสอบถามระดับแม่ FROM <table-name>; Where <condition> (SELECT <column-name> …(Subquery) การสอบถามระดับลูก FROM <table-name> [WHERE <condition>]);
นักษาที่มีจำนวนสมาชิกเท่ากับ 3 คน และอยู่ชมรมอะไรบ้าง ตัวอย่าง 7-1 จงทำการสอบถามข้อมูลจาก Database School เพื่อต้องการทราบข้อมูล นักษาที่มีจำนวนสมาชิกเท่ากับ 3 คน และอยู่ชมรมอะไรบ้าง ใช้ความรู้พื้นฐานในการสอบถามข้อมูล ต้องทำการสอบถามข้อมูล 2 ขั้นตอนคือ ขั้นตอนที่ 1 ทำการแสดงชื่อชมรมที่มีจำนวนสมาชิกเท่ากับ 3 SELECT club from club group by club having count(*)=3; ผลลัพธ์
ขั้นตอนที่ 2 นำผลลัพธ์ที่ได้จากขั้นตอนที่ 1 ทราบว่ามีทั้งหมด 3 ชมได้แก่ นิทรรศการ, แนะแนวการศึกษา, ลีลาศ จากนั้นอยากทราบว่า นศ. รหัสไหน สังกัดชมรมอะไรบ้าง โดย SELECT studentid,club from club where club='ลีลาศ'; ผลลัพธ์
ขั้นตอนที่ 3 ทำการ Subquery ซ้อนกันโดย SELECT studentid,club from club where club in (select club group by club having count(*)=3); ผลลัพธ์
ตัวอย่างการใช้ ANY =ANY หมายถึง เท่ากับค่าใดค่าหนึ่งในกลุ่มข้อมูลที่กำหนด (ความหมายเดียวกับการใช้ IN) > ANY หมายถึง มากกว่าค่าใดค่าหนึ่งในกลุ่มข้อมูลที่กำหนด < ANY หมายถึง น้อยกว่าค่าใดค่าหนึ่งในกลุ่มข้อมูลที่กำหนด < >ALL หมายถึง ไม่เท่ากับค่าทุกค่าในกลุ่มข้อมูลที่กำหนด (ความหมายเดียวกับการใช้ NOT IN) >=ALL หมายถึง มากกว่าหรือเท่ากับทุกค่าในกลุ่มข้อมูลที่กำหนด <=ALL หมายถึง น้อยกว่าหรือเท่ากับค่าทุกค่าในกลุ่มข้อมูลที่กำหนด
รายวิชากับอาจารย์ที่สอนแต่ละวิชาเป็นใครบ้าง ตัวอย่าง 7-2 จงทำการสอบถามข้อมูลจาก Database School เพื่อต้องการทราบข้อมูล รายวิชากับอาจารย์ที่สอนแต่ละวิชาเป็นใครบ้าง ขั้นตอนที่ 1 ทำการแสดงรายวิชาในรายวิชาชื่ออาจารย์สอนเช่นอ.สิริ select subjectid from teacher where teacher = 'สิริ ศรีสมร'; ผลลัพธ์
จากนั้นแสดงชื่ออาจารย์และรายวิชาที่อาจารย์สอน ขั้นตอนที่ 2 นำผลลัพธ์ที่ได้จากขั้นตอนที่ 1 ทราบว่ามีทรายวิชาไหนบ้างจากจากนั้น จากนั้นแสดงชื่ออาจารย์และรายวิชาที่อาจารย์สอน select subjectid, teacher from teacher where subjectid ผลลัพธ์
ขั้นตอนที่ 3 ทำการ Subquery ซ้อนกันโดย select subjectid, teacher from teacher where subjectid = any (select subjectid where teacher='สิริ ศรีสมร'); ผลลัพธ์
หาชั้นเรียนที่มีจำนวนนักศึกษามากที่สุด ตัวอย่าง 7-3 จงทำการสอบถามข้อมูลจาก Database School เพื่อต้องการทราบข้อมูล หาชั้นเรียนที่มีจำนวนนักศึกษามากที่สุด ขั้นตอนที่ 1 ทำการนับจำนวนนักศึกษาทั้งหมดในแต่ละ Class select count(*) from student group by class; ผลลัพธ์
ขั้นตอนที่ 2 ทำการนับจำนวน class ทั้งหมด select class,count(*) from student group by class ผลลัพธ์
ขั้นตอนที่ 3 ทำการ Subquery ซ้อนกันโดย select class,count(*) from student group by class having count(*) >=ALL (select count(*) group by class); ผลลัพธ์
นักศึกษาที่ได้คะแนนวิชา I001 เป็นอันดับ 2 ตัวอย่าง 7-4 จงทำการสอบถามข้อมูลจาก Database School เพื่อต้องการทราบข้อมูล นักศึกษาที่ได้คะแนนวิชา I001 เป็นอันดับ 2 ขั้นตอนที่ 1 ทำการหาค่าคะแนนสูงสุด ในรายวิชา I001 select max(score) from student_subject where subjectid='I001' ผลลัพธ์
ขั้นตอนที่ 2 ทำการตัดแถวคะแนนนักศึกษาที่มีค่าสูงสุดออก ขั้นตอนที่ 2 ทำการตัดแถวคะแนนนักศึกษาที่มีค่าสูงสุดออก select max(score) from student_subject where subjectid='I001' and score < ขั้นตอนที่ 3 แสดงรหัสนักศึกษาและคะแนนนักศึกษาได้คะแนนในวิชา I001 select studentid,score from student_subject where subjectid='I001'
ขั้นตอนที่ 3 ทำการ Subquery ซ้อนกันโดย select studentid,score from student_subject where subjectid='I001' and score= (select max(score) where subjectid='I001' and score < where subjectid='I001')); ผลลัพธ์
Subquery ที่อ้างถึงคอลัมน์ของ Main Query ตัวอย่าง 7-5 จงทำการสอบถามข้อมูลจาก Database School เพื่อต้องการทราบข้อมูล นักศึกษาคนใดได้คะแนนในวิชา P001 เท่ากันบ้าง SELECT studentid, subjectid, score from student_subject as s1 where subjectid='P001' and score=ANY (select score from student_subject as s2 where subjectid='P001' and s1.studentid<>s2.studentid) order by score; ผลลัพธ์
ตัวอย่าง 7-6 นักศึกษาคนใดบ้างที่ไม่มีชมรมสังกัด ตัวอย่าง 7-6 นักศึกษาคนใดบ้างที่ไม่มีชมรมสังกัด select * from student as s where NOT EXISTS (SELECT studentid from club AS c where s.studentid=c.studentid); ผลลัพธ์
การ UNION Club_TBL Club_TBL ผลลัพธ์จากการ UNION
การ UNION
ตัวอย่าง 7-7 นักศึกษาสังกัดชมรม ตัวอย่าง 7-7 นักศึกษาสังกัดชมรม SELECT studentid,club from club where club='คอมพิวเตอร์' union where club='ภาษาอังกฤษ'; ผลลัพธ์
สรุปท้ายบทเรียน คำสั่ง SELECT มีรูปแบบการใช้งานที่หลากหลาย ในการค้นหาข้อมูลที่ต้องการแต่ละครั้งอาจจะใช้คำสั่ง SELECT ที่มีประโยคคำสั่งต่าง ๆ เพื่อทำความเข้าใจกับลำดับการทำงานจริงเมื่อมีการคิวรีเกิดขึ้นด้วย สรุปรูปแบบคำสั่ง SELECT Syntax select [build-in function] column_list FROM table_name [WHERE row_condition] [GROUP BY column_list] [HAVING group_condition] [ORDER BY column_list];
ลำดับที่ 1 : ทำงานตามประโยค FROM FROM student_subject WHERE score IS NOT NULL GROUP BY subjectid HAVING AVG(score)>50 SELECT subjectid, AVG(score) ORDER BY 2
THE END