ทําความเข้าใจแนวคิดการรวมและไวยากรณ์

เสร็จสมบูรณ์เมื่อ

วิธีพื้นฐานที่สุดและทั่วไปของการรวมข้อมูลจากหลายตารางคือการใช้การดําเนินการ JOIN บางคนคิดว่า JOIN เป็นส่วนคําสั่งแยกต่างหากในคําสั่ง SELECT แต่คนอื่นคิดว่าเป็นส่วนหนึ่งของส่วนคําสั่ง FROM โมดูลนี้ส่วนใหญ่จะพิจารณาว่าเป็นส่วนหนึ่งของส่วนคําสั่ง FROM ในโมดูลนี้ เราจะค้นพบวิธีที่ส่วนคําสั่ง FROM ในคําสั่ง T-SQL SELECT สร้างตารางเสมือนระดับกลางที่จะใช้โดยขั้นตอนต่อ ๆ ไปของคิวรี

คําสั่ง FROM และตารางเสมือน

ถ้าคุณได้เรียนรู้เกี่ยวกับลําดับตรรกะของการดําเนินการที่ดําเนินการเมื่อ SQL Server ประมวลผลคิวรี คุณจะเห็นว่าส่วนคําสั่ง FROM ของคําสั่ง SELECT เป็นส่วนคําสั่งแรกที่จะประมวลผล ส่วนคําสั่งนี้จะกําหนดว่าตารางหรือตารางใดที่จะเป็นแหล่งที่มาของแถวสําหรับคิวรี FROM สามารถอ้างอิงตารางเดียวหรือรวมหลายตารางเข้าด้วยกันเป็นแหล่งข้อมูลสําหรับคิวรีของคุณ คุณสามารถนึกภาพส่วนคําสั่ง FROM เป็นการสร้างและเติมข้อมูลในตารางเสมือน ตารางเสมือนนี้จะเก็บผลลัพธ์ของคําสั่ง FROM และใช้โดยส่วนคําสั่ง SELECT ที่จะใช้ในภายหลัง เช่น ส่วนคําสั่ง WHERE เมื่อคุณเพิ่มฟังก์ชันพิเศษ เช่น ตัวดําเนินการรวม ไปยังคําสั่ง FROM จะเป็นประโยชน์มากเมื่อคิดถึงวัตถุประสงค์ขององค์ประกอบ FROM ในส่วนคําสั่งเพื่อเพิ่มแถวหรือลบแถวออกจากตารางเสมือน

ตารางเสมือนที่สร้างขึ้นโดยส่วนคําสั่ง FROM เป็นเอนทิตีแบบลอจิคัลเท่านั้น ใน SQL Server จะไม่มีการสร้างตารางจริงไม่ว่าจะเป็นแบบคงอยู่หรือชั่วคราวเพื่อเก็บผลลัพธ์ของคําสั่ง FROM ตามที่ส่งผ่านไปยังส่วนคําสั่ง WHERE หรือส่วนอื่น ๆ ของคิวรี

ตารางเสมือนที่สร้างขึ้นโดยคําสั่ง FROM ประกอบด้วยข้อมูลจากตารางที่รวมทั้งหมด ซึ่งจะมีประโยชน์เมื่อต้องคิดว่าผลลัพธ์เป็น ชุด และสร้างแนวคิดผลลัพธ์การรวมเป็นแผนภาพเวนน์

ไดอะแกรมเวนน์ที่แสดงชุดของตารางพนักงานที่รวมเข้ากับตาราง SalesOrder

ในประวัติศาสตร์ภาษา T-SQL ได้ขยายตัวเพื่อสะท้อนการเปลี่ยนแปลงมาตรฐาน American National Standards Institute (ANSI) สําหรับภาษา SQL หนึ่งในตําแหน่งที่โดดเด่นที่สุดที่สามารถมองเห็นการเปลี่ยนแปลงเหล่านี้ได้อยู่ในไวยากรณ์สําหรับการรวมในคําสั่ง FROM ในมาตรฐาน ANSI SQL-89 มีการระบุการรวมโดยการรวมหลายตารางในคําสั่ง FROM ในรายการที่คั่นด้วยจุลภาค การกรองใด ๆ เพื่อกําหนดแถวที่จะรวมในคําสั่ง WHERE ดังนี้:

SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p, SalesLT.ProductModel AS m
WHERE p.ProductModelID = m.ProductModelID;

ไวยากรณ์นี้ยังคงได้รับการสนับสนุนโดย SQL Server แต่เนื่องจากความซับซ้อนของการแสดงตัวกรองสําหรับการรวมที่ซับซ้อน ไม่แนะนํา นอกจากนี้ ถ้ามีการละเว้นส่วนคําสั่ง WHERE ไว้โดยไม่ได้ตั้งใจ การรวมสไตล์ SQL-89 ของ ANSI สามารถกลายเป็นผลิตภัณฑ์คาร์ทีเซียนได้อย่างง่ายดาย และส่งกลับจํานวนแถวผลลัพธ์ที่มากเกินไป ทําให้เกิดปัญหาด้านประสิทธิภาพการทํางาน และอาจส่งผลให้เกิดผลลัพธ์ที่ไม่ถูกต้อง

เมื่อเรียนรู้เกี่ยวกับการเขียนคิวรีแบบหลายตารางใน T-SQL สิ่งสําคัญคือต้องเข้าใจแนวคิดของผลิตภัณฑ์คาร์ทีเซียน ในทางคณิตศาสตร์ ผลิตภัณฑ์คาร์ทีเซียนคือผลิตภัณฑ์ของสองชุด ผลิตภัณฑ์ของชุดสององค์ประกอบและชุดขององค์ประกอบหกรายการคือชุดขององค์ประกอบ 12 หรือ 6 x 2 ทุกองค์ประกอบในหนึ่งชุดจะรวมกับทุกองค์ประกอบในชุดอื่น ในตัวอย่างด้านล่าง เรามีชุดของชื่อที่มีสององค์ประกอบและชุดผลิตภัณฑ์ที่มีสามองค์ประกอบ ผลิตภัณฑ์คาร์ทีเซียนรวมทุกชื่อกับทุกผลิตภัณฑ์ที่ให้ผลลัพธ์เป็นหกองค์ประกอบ

ผลิตภัณฑ์คาร์ทีเซียน

ในฐานข้อมูล ผลิตภัณฑ์คาร์ทีเซียนเป็นผลลัพธ์ของการรวมทุกแถวในตารางหนึ่งกับทุกแถวของอีกตารางหนึ่ง ผลิตภัณฑ์ของตารางที่มี 10 แถวและตารางที่มี 100 แถวเป็นชุดผลลัพธ์ที่มี 1,000 แถว ผลลัพธ์พื้นฐานของการดําเนินการ JOIN คือผลิตภัณฑ์คาร์ทีเซียน แต่สําหรับคิวรี T-SQL ส่วนใหญ่ ผลิตภัณฑ์คาร์ทีเซียนไม่ใช่ผลลัพธ์ที่ต้องการ ใน T-SQL ผลิตภัณฑ์คาร์ทีเซียนเกิดขึ้นเมื่อมีการรวมตารางอินพุตสองตารางเข้าด้วยกันโดยไม่ต้องพิจารณาความสัมพันธ์ใด ๆ ระหว่างกัน โดยไม่มีข้อมูลเกี่ยวกับความสัมพันธ์ ตัวประมวลผลคิวรี SQL Server จะส่งกลับชุดของแถวที่เป็นไปได้ทั้งหมด แม้ว่าผลลัพธ์นี้จะมีแอปพลิเคชันที่ใช้ได้จริงบางอย่าง เช่น การสร้างข้อมูลการทดสอบ แต่โดยทั่วไปแล้วจะไม่มีประโยชน์และอาจมีผลกระทบต่อประสิทธิภาพการทํางานที่รุนแรง

ด้วยการถือกําเนิดของมาตรฐาน ANSI SQL-92 ได้มีการเพิ่มการสนับสนุนคําสําคัญ JOIN และ ON ส่วนคําสั่ง T-SQL ยังสนับสนุนไวยากรณ์นี้ด้วย การรวมจะแสดงอยู่ในส่วนคําสั่ง FROM โดยใช้ตัวดําเนินการ JOIN ที่เหมาะสม ความสัมพันธ์เชิงตรรกะระหว่างตารางซึ่งจะกลายเป็นเพรดิเคตตัวกรอง จะถูกระบุไว้ในส่วนคําสั่ง ON

ตัวอย่างต่อไปนี้กล่าวย้ําคิวรีก่อนหน้านี้ด้วยไวยากรณ์ที่ใหม่กว่า:

SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p
JOIN SalesLT.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID;

หมายเหตุ

ไวยากรณ์ ANSI SQL-92 ทําให้ยากขึ้นในการสร้างผลิตภัณฑ์คาร์ทีเซียนโดยไม่ตั้งใจ เมื่อมีการเพิ่มคําสําคัญ JOIN ข้อผิดพลาดทางไวยากรณ์จะเกิดขึ้นถ้าส่วนคําสั่ง ON หายไป เว้นแต่ว่าจะมีการระบุ JOIN เป็น CROSS JOIN