Mysql เหลือตัวอย่างการเข้าร่วม MySQL JOIN: คำอธิบาย ตัวอย่างการใช้คำสั่งและคำแนะนำ

ในเรื่องนี้ หนังสือเรียนคุณจะได้เรียนรู้วิธีใช้ JOINS (INNER และ OUTER) ใน MySQL พร้อมด้วยไวยากรณ์ รูปภาพ และตัวอย่าง

คำอธิบาย

MySQL JOINS ใช้เพื่อดึงข้อมูลจากหลายตาราง JOIN จะดำเนินการเมื่อใดก็ตามที่มีตารางตั้งแต่สองตารางขึ้นไปเข้าร่วมในคำสั่ง SQL

มี ประเภทต่างๆการเชื่อมต่อ MySQL:

มาดูไวยากรณ์ MySQL JOIN และศึกษาตัวอย่าง MySQL JOIN กัน

เข้าร่วมภายใน (เข้าร่วมอย่างง่าย)

เป็นไปได้มากว่าคุณได้เขียนแบบสอบถามที่ใช้ MySQL INNER JOIN แล้ว นี่คือประเภทการเชื่อมต่อที่พบบ่อยที่สุด MySQL INNER JOINS ส่งคืนแถวทั้งหมดจากหลายตารางที่ตรงตามเงื่อนไขการรวม

ไวยากรณ์

ไวยากรณ์เข้าร่วมภายในใน MySQL:

เลือกคอลัมน์
จากตารางที่ 1
เข้าร่วมภายในตารางที่ 2

ในรูปนี้ MySQL INNER JOIN ส่งคืนขอบเขตที่แรเงา:

MySQL INNER JOIN จะส่งกลับบันทึกที่ table1 และ table2 ตัดกัน

ตัวอย่าง

ด้านล่างนี้เป็นตัวอย่างของ MySQL INNER JOIN:

MySQL

เรามีตารางคำสั่งซื้ออื่นที่มีสามฟิลด์ (order_id, vendor_id และ order_date) ประกอบด้วยข้อมูลต่อไปนี้:

order_id ซัพพลายเออร์_id order_date
500125 10000 05.05.2015
500126 10001 08.02.2016
500127 10004 06.01.2017

หากเรารันคำสั่ง MySQL SELECT (ซึ่งมี INNER JOIN) ด้านล่าง:

MySQL

เลือกซัพพลายเออร์.supplier_id, ซัพพลายเออร์.supplier_name, orders.order_date จากซัพพลายเออร์ เข้าร่วมภายใน คำสั่งซื้อบนซัพพลายเออร์.supplier_id = orders.supplier_id;

แถวสำหรับ Microsoft และ NVIDIA จากตารางซัพพลายเออร์จะถูกละเว้นเนื่องจากไม่มีค่า vendor_id 10002 และ 10003 ในทั้งสองตาราง แถว order_id 500127 จากตาราง orders จะถูกละเว้น เนื่องจากไม่มี vendor_id 10004 ในตารางซัพพลายเออร์

ไวยากรณ์เก่า

ตามหมายเหตุสุดท้าย เป็นที่น่าสังเกตว่าตัวอย่าง MySQL INNER JOIN ด้านบนสามารถเขียนใหม่ได้โดยใช้ไวยากรณ์โดยนัยแบบเก่าดังต่อไปนี้ (แต่แนะนำให้ใช้ไวยากรณ์ INNER JOIN):

การเข้าร่วมอีกประเภทหนึ่งเรียกว่า MySQL LEFT OUTER JOIN การรวมประเภทนี้จะส่งคืนแถวทั้งหมดจากตารางที่มีการรวมด้านซ้ายที่ระบุในส่วนคำสั่ง ON และเฉพาะแถวเหล่านั้นจากตารางอื่นที่ฟิลด์ที่จะรวมเท่ากัน

ไวยากรณ์

ไวยากรณ์สำหรับ LEFT OUTER JOIN ใน MySQL:

เลือกคอลัมน์
จากตารางที่ 1
เข้าร่วมตารางซ้าย2
บน table1.column = table2.column;

ในบางฐานข้อมูล LEFT OUTER JOIN จะถูกแทนที่ด้วย LEFT JOIN

ในรูปนี้ MySQL LEFT OUTER JOIN ส่งคืนขอบเขตที่แรเงา:

MySQL LEFT OUTER JOIN จะส่งคืนระเบียนทั้งหมดจาก table1 และเฉพาะระเบียนจาก table2 ที่ตัดกับ table1

ตัวอย่าง

MySQL

เลือกซัพพลายเออร์.supplier_id,ซัพพลายเออร์.supplier_name, orders.order_dateจากซัพพลายเออร์ซ้ายเข้าร่วมคำสั่งซื้อบนซัพพลายเออร์.supplier_id = orders.supplier_id;

เลือกซัพพลายเออร์.supplier_id,suppliers.supplier_name,orders.order_date

จากซัพพลายเออร์

ซ้ายเข้าร่วมคำสั่ง

บนซัพพลายเออร์.supplier_id=orders.supplier_id;

ตัวอย่าง LEFT OUTER JOIN นี้จะส่งคืนแถวทั้งหมดจากตารางซัพพลายเออร์ และเฉพาะแถวเหล่านั้นจากตารางคำสั่งซื้อที่ฟิลด์ที่เข้าร่วมเท่ากัน

หากไม่มีค่า vendor_id ในตารางซัพพลายเออร์ในตารางคำสั่งซื้อ ฟิลด์ทั้งหมดในตารางคำสั่งซื้อจะปรากฏเป็น NULL ในชุดผลลัพธ์

มาดูข้อมูลบางส่วนเพื่อทำความเข้าใจว่า LEFT OUTER JOIN ทำงานอย่างไร:

เรามีตารางซัพพลายเออร์ที่มีสองฟิลด์ (supplier_id และ vendor_name) ซึ่งมีข้อมูลต่อไปนี้:

หากเราดำเนินการคำสั่ง MySQL SELECT (ซึ่งมี LEFT OUTER JOIN) ด้านล่าง:

MySQL

เลือกซัพพลายเออร์.supplier_id,ซัพพลายเออร์.supplier_name, orders.order_dateจากซัพพลายเออร์ซ้าย OUTER JOIN สั่งซื้อบนซัพพลายเออร์.supplier_id = orders.supplier_id;

แถวสำหรับ Microsoft และ NVIDIA จะถูกรวมไว้เนื่องจากใช้ LEFT OUTER JOIN อย่างไรก็ตาม คุณจะสังเกตเห็นว่าฟิลด์ order_date สำหรับระเบียนเหล่านี้เป็น NULL

การเข้าร่วมอีกประเภทหนึ่งเรียกว่า MySQL RIGHT OUTER JOIN การรวมประเภทนี้จะส่งคืนแถวทั้งหมดจากตารางที่มีการรวมทางขวาที่ระบุไว้ในส่วนคำสั่ง ON และเฉพาะแถวเหล่านั้นจากตารางอื่นที่ฟิลด์ที่จะรวมเท่ากัน

ไวยากรณ์

ไวยากรณ์สำหรับ RIGHT OUTER JOIN ใน MySQL:

เลือกคอลัมน์
จากตารางที่ 1
เข้าร่วมขวาตารางที่ 2
บน table1.column = table2.column;

ในบางฐานข้อมูล RIGHT OUTER JOIN จะถูกแทนที่ด้วย RIGHT JOIN

ในรูปนี้ MySQL RIGHT OUTER JOIN ส่งคืนพื้นที่ที่แรเงา:

MySQL RIGHT OUTER JOIN จะส่งคืนระเบียนทั้งหมดจาก table2 และเฉพาะระเบียนจาก table1 ที่ตัดกับ table2 เท่านั้น

ตัวอย่าง

ด้านล่างนี้เป็นตัวอย่างของ MySQL RIGHT OUTER JOIN:

MySQL

เลือก orders.order_id, orders.order_date, ซัพพลายเออร์.supplier_name จากซัพพลายเออร์ เข้าร่วมขวา คำสั่งซื้อบนซัพพลายเออร์.supplier_id = orders.supplier_id;

นอกจากการสอบถามง่ายๆ ตามปกติแล้วด้วย เงื่อนไขง่ายๆภาษา SQL ช่วยให้คุณสามารถเขียนนิพจน์ที่ค่อนข้างซับซ้อน ซึ่งบางครั้งก็ดูน่ากลัว แต่ก็ดูเข้าใจยากมาก อย่างไรก็ตาม ข้อความค้นหาดังกล่าวไม่ได้เกิดขึ้นบ่อยนัก และระดับความซับซ้อนถัดไปหลังจาก SELECT ปกติในความคิดของฉันก็คือคำสั่ง JOIN เรามาดูวิธีการทำงานกับมันกันดีกว่า

ขั้นแรก มาดูข้อความค้นหาที่ใช้บ่อยที่สุดที่ง่ายที่สุด

เลือก COUNT(*) จากตาราง; //นับจำนวนบันทึก SELECT * FROM table จำกัด 5,10; //เริ่มจากรายการที่ 5 จะเลือก 10 แถว มักใช้สำหรับการนำทางหน้า SELECT * FROM table ORDER BY num; //เรียงลำดับบันทึกทั้งหมดจากตารางตามฟิลด์ num SELECT * FROM table WHERE year="1990"; //เลือกบันทึก/บันทึกโดยมีค่าปี 1990 SELECT * FROM table WHERE name LIKE "%ova%"; //ค้นหาชื่อตารางที่มีลำดับ "ova" เลือกชื่อที่แตกต่างจากตาราง; //หากมีช่องซ้ำกัน จะนับเพียงครั้งเดียว SELECT * FROM name WHERE age IN (12,15,18); // จะแสดงชื่อที่ตรงกับเขตข้อมูลที่มีอายุ 12,15,18 SELECT MAX(age) FROM table; //MAX/MIN - เลือกรายการที่มีค่าอายุสูงสุดหรือต่ำสุด

ตอนนี้เรามาดูตัวอย่างโดยตรงของ JOIN:

งานที่ได้รับความนิยมมากที่ใช้คำสั่ง JOIN คือการเข้าร่วมหลายตารางที่มีบางประเภท คุณสมบัติทั่วไป- ลองดูตัวอย่าง สมมติว่าเรามีโต๊ะสองโต๊ะ ส่วนแรกเก็บข้อมูลเกี่ยวกับชื่อและที่อยู่ของผู้ใช้และยังมีคอลัมน์ user_id ในคอลัมน์ที่สอง เรายังมีคอลัมน์ user_id และคอลัมน์ที่มีดัชนีโฮมของผู้ใช้

เลือกชื่อ ที่อยู่จาก table1 LEFT JOIN table2 บน table1.user_id=table2.user_id;

เพื่อให้ชัดเจนยิ่งขึ้น คุณสามารถเขียนแบบสอบถามนี้ใหม่ด้วยวิธีคลาสสิกได้:

เลือก table1.name, table1.addres, table2.index จาก table1, table2 โดยที่ table1.user_id = table2.user_id;

วิธีนี้จะทำให้คุณสามารถรับข้อมูลจากหลายตารางได้ และหากมีเงื่อนไขเพิ่มเติม เราจะเพิ่มเงื่อนไขนั้นด้วย:

เลือกชื่อ ที่อยู่ จาก table1 LEFT JOIN table2 ON table1.user_id=table2.user_id WHERE name = "Vasya";

หากเราเจาะลึกทฤษฎี เราจะเพิ่มว่ามีตัวเลือกเข้าร่วมดังต่อไปนี้:

เหมาะสมที่จะวาดวงกลมที่มีชื่อเสียงที่นี่:

เข้าร่วมภายใน

ส่งคืนจุดตัดของสองชุด

เลือก t1.name, t2.city จาก Table1 t1 INNER JOIN Table2 t2 ON t1.key2 = t2.key2;

ภาพสะท้อนของ INNER JOIN คือ OUTER JOIN เรามี OUTER JOIN ให้เลือกสามประเภท - เต็ม, ซ้าย และขวา ไม่จำเป็นต้องใช้คำว่า OUTER

เข้าร่วมเต็มรูปแบบ

รวมสองชุด

FULL JOIN จะส่งคืนระเบียนทั้งหมดจากตาราง table และ table2 โดยไม่มีข้อมูลที่ซ้ำกัน ในกรณีที่ไม่มีข้อมูล NULL จะถูกแทนที่

เข้าร่วมทางซ้าย

ส่งกลับข้อมูลจากตารางด้านซ้าย รวมถึงข้อมูลจากด้านขวาที่ตัดกับด้านซ้าย

หากมีข้อมูลจากตารางที่ถูกต้องไม่เพียงพอ ค่า NULL จะถูกแทนที่

RIGHT JOIN – ตามที่คุณอาจเข้าใจ จะส่งกลับค่าทั้งหมดจากตารางด้านขวาและตัดข้อมูลจากด้านซ้าย

ข้อยกเว้น

หากเราต้องการข้อมูลจากตารางแรกซึ่งไม่มีข้อมูลอยู่ในตารางที่ถูกต้อง เราก็ต้องเพิ่ม WHERE clause

เลือก t1.name, t2.city จาก Table1 t1 LEFT JOIN Table2 t2 ON t1.key2 = t2.key2 โดยที่ t2.key2 เป็นโมฆะ;

เข้าร่วมหลายรายการ

การใช้ JOIN ช่วยให้คุณสามารถเข้าร่วมได้ไม่เพียงแค่ 2 ตาราง แต่สามารถเข้าร่วมได้มากเท่าที่จำเป็น หากคุณต้องการรวม 2 ตาราง คุณจะต้องมี 2 คำสั่ง JOIN แต่คุณไม่ควรไปสุดโต่งและเข้าร่วมตารางจำนวนมาก ทั้งหมดนี้จะส่งผลกระทบอย่างมีนัยสำคัญต่อประสิทธิภาพ ดังนั้นบางครั้งการเรียกใช้แบบสอบถามย่อยหลายรายการจะดีกว่า ตัวอย่างการรวมสามตาราง:

เลือก t1.Name, t2.City, t3.Profession จาก Table1 t1 INNER JOIN Table2 t2 ON t1.key2 = t2.key2 INNER JOIN Table3 t3 ON t1.key3 = t3.key3;

ฉันหวังว่ารายการเหล่านั้น ตัวอย่างง่ายๆเข้าร่วมช่วยให้คุณเข้าใจโอเปอเรเตอร์นี้

MySQL รองรับไวยากรณ์คำสั่ง JOIN ต่อไปนี้เมื่อใช้ในคำสั่ง SELECT:

Table_reference, table_reference table_reference JOIN table_reference table_reference INNER JOIN table_reference join_condition table_reference STRAIGHT_JOIN table_reference table_reference LEFT JOIN table_reference join_condition table_reference LEFT JOIN table_reference table_reference NATURAL ] JOIN table_reference ( oj table_reference LEFT OUTER JOIN table_reference ON Conditional_ expr ) table_reference เข้าร่วมขวา table_reference join_condition table_reference RIGHT JOIN table_reference table_reference NATURAL ] เข้าร่วม table_reference

โดยที่ table_reference ถูกกำหนดเป็น:

Table_name[นามแฝง]

และ join_condition ถูกกำหนดเป็น:

เปิดเงื่อนไข_expr | การใช้ (รายการคอลัมน์)

คุณไม่ควรระบุเงื่อนไขใดๆ ในส่วนคำสั่ง ON ที่กำหนดข้อจำกัดในแถวในชุดผลลัพธ์ หากคุณต้องการระบุว่าควรแสดงแถวใดในผลลัพธ์ คุณควรระบุในส่วนคำสั่ง WHERE

โปรดทราบว่าในเวอร์ชันก่อน 3.23.17 ตัวดำเนินการ INNER JOIN ไม่ยอมรับพารามิเตอร์ join_condition!

การมีอยู่ของโครงสร้างสุดท้ายข้างต้นของนิพจน์ LEFT OUTER JOIN เกิดจากข้อกำหนดความเข้ากันได้ของ ODBC เท่านั้น:

  • แทนที่จะใช้การอ้างอิงตาราง คุณสามารถใช้นามแฝงได้ ซึ่งกำหนดโดยใช้นิพจน์ tbl_name AS alias_name หรือ tbl_name alias_name: mysql> SELECT t1.name, t2.salary จากพนักงาน AS t1, info AS t2 WHERE t1.name = t2 ชื่อ;
  • คำสั่งแบบมีเงื่อนไข ON คือเงื่อนไขในรูปแบบใดๆ ที่สามารถใช้ใน WHERE clause ได้
  • หากไม่พบรายการสำหรับตารางที่ถูกต้องในส่วน ON หรือ USING ของ LEFT JOIN ระบบจะใช้แถวที่มีคอลัมน์ทั้งหมดที่ตั้งค่าเป็น NULL สำหรับตารางนั้น คุณลักษณะนี้สามารถใช้เพื่อค้นหาผลลัพธ์ในตารางที่ไม่เทียบเท่าในตารางอื่น: mysql> SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL; ตัวอย่างนี้ค้นหาแถวทั้งหมดใน table1 ที่มีค่ารหัสที่ไม่ปรากฏใน table2 (นั่นคือ แถวทั้งหมดใน table1 ซึ่งไม่มีแถวที่สอดคล้องกันใน table2) แน่นอนว่าสิ่งนี้ถือว่า table2.id ถูกประกาศเป็น NOT NULL ดูหัวข้อ 5.2.6 วิธีที่ MySQL ปรับการเข้าร่วมด้านซ้ายและด้านขวาให้เหมาะสม
  • USING(column_list) ใช้เพื่อระบุรายการคอลัมน์ที่ต้องมีอยู่ในทั้งสองตาราง นิพจน์ USING เช่น: A LEFT JOIN B USING (C1,C2,C3,...) มีความหมายเหมือนกันกับนิพจน์ ON ตัวอย่างเช่น: A.C1=B.C1 AND A.C2=B.C2 AND A .C3=บี .C3,...
  • NATURAL JOIN ระหว่างสองตารางถูกกำหนดให้มีความหมายเทียบเท่ากับ INNER JOIN หรือ LEFT JOIN พร้อมด้วยส่วนคำสั่ง USING ที่ระบุคอลัมน์ทั้งหมดที่มีอยู่ในทั้งสองตาราง
  • INNER JOIN และ (ลูกน้ำ) มีความหมายเทียบเท่ากัน ทั้งสองทำการรวมแบบเต็มบนโต๊ะที่ใช้ วิธีการเชื่อมโยงตารางมักจะระบุไว้ในส่วนคำสั่ง WHERE
  • RIGHT JOIN ทำงานคล้ายกับ LEFT JOIN เพื่อรักษาความสามารถในการพกพาโค้ดระหว่างฐานข้อมูลต่างๆ ขอแนะนำให้ใช้ LEFT JOIN แทน RIGHT JOIN
  • STRAIGHT_JOIN เหมือนกับ JOIN ยกเว้นว่าตารางด้านซ้ายจะถูกอ่านก่อนตารางด้านขวาเสมอ นิพจน์นี้สามารถใช้สำหรับกรณีที่ (ไม่กี่) ที่เครื่องมือเพิ่มประสิทธิภาพการรวมทำให้ตารางอยู่ในลำดับที่ไม่ถูกต้อง
  • ตั้งแต่ MySQL เวอร์ชัน 3.23.12 คุณสามารถสั่ง MySQL เกี่ยวกับดัชนีที่จะใช้เมื่อดึงข้อมูลจากตารางได้ คุณลักษณะนี้มีประโยชน์หากคำสั่ง EXPLAIN (ซึ่งแสดงข้อมูลเกี่ยวกับโครงสร้างและลำดับของการสืบค้น SELECT) ระบุว่า MySQL ใช้ดัชนีที่ไม่ถูกต้อง ด้วยการระบุค่าดัชนีใน USE INDEX (key_list) คุณสามารถบังคับให้ MySQL ใช้ดัชนีที่ระบุเพียงรายการเดียวเพื่อค้นหาบันทึก นิพจน์ทางเลือก IGNORE INDEX (key_list) ป้องกันไม่ให้ MySQL ใช้ดัชนีนั้น นิพจน์ USE/IGNORE KEY เป็นคำพ้องสำหรับ USE/IGNORE INDEX

ตัวอย่างบางส่วน:

Mysql> SELECT * จาก table1,table2 โดยที่ table1.id=table2.id; mysql> SELECT * จาก table1 ซ้ายเข้าร่วม table2 บน table1.id=table2.id; mysql> SELECT * จาก table1 ซ้ายเข้าร่วม table2 โดยใช้ (id); mysql> SELECT * จาก table1 LEFT JOIN table2 บน table1.id=table2.id LEFT JOIN table3 บน table2.id=table3.id; mysql> SELECT * จาก table1 ใช้ INDEX (key1,key2) โดยที่ key1=1 และ key2=2 และ key3=3; mysql> SELECT * จาก table1 ละเว้นดัชนี (key3) โดยที่ key1=1 และ key2=2 และ key3=3;

ในช่วงเริ่มต้นอาชีพของฉันในฐานะนักพัฒนาเว็บ ฉันทำงานกับฐานข้อมูลนี้อย่างดีที่สุดเท่าที่จะทำได้ แต่ฉันก็ไม่รู้อะไรมากนัก เขาแต่งข้อความค้นหาแบบดั้งเดิมที่เรียบง่าย และบางครั้งก็แทรกข้อความค้นหาลงในลูปด้วย น่าเสียดาย ในเวลานั้น ฉันยังไม่ได้หนังสือที่ถูกต้องเกี่ยวกับ MySQL และต้องเรียนรู้จากการลองผิดลองถูก บทความมากมายบนอินเทอร์เน็ตไม่ได้ถ่ายทอดคำถาม MySQL ที่ยอดเยี่ยมให้ฉันในทันที - เข้าร่วม
ในเอกสารนี้ฉันจะพูดถึงตัวเลือกที่เป็นไปได้ทั้งหมดสำหรับการทำงานกับ JOIN และยิ่งกว่านั้นฉันจะนำเสนอหลักการทำงานของแต่ละคำสั่งด้วยสายตา

เราจะพิจารณา:
  • เข้าร่วมภายใน
  • เข้าร่วมทางซ้าย
  • เข้าร่วมอย่างถูกต้อง
  • เข้าร่วมภายนอก
  • เข้าร่วมด้านซ้ายไม่รวมเข้าร่วมภายใน
  • เข้าร่วมทางขวาไม่รวมเข้าร่วมภายใน
  • เข้าร่วมภายนอกยกเว้นเข้าร่วมภายใน
  • แยกกันเป็นมูลค่า noting จุดที่ 5, 6 และ 7 ในความเป็นจริงแบบสอบถามเหล่านี้ไม่ได้เชื่อมโยงสองตาราง แต่แยกคอลัมน์จากตารางหนึ่งที่มีอยู่ในอีกตารางหนึ่ง อันที่จริงสิ่งนี้มีประโยชน์มาก

    เข้าร่วมภายใน

    หนึ่งในคำขอที่พบบ่อยที่สุด เกิดขึ้นบ่อยมาก แบบสอบถามนี้จะส่งกลับระเบียนทั้งหมดจากตารางด้านซ้าย (ตาราง A) และระเบียนจาก (ตาราง B) แต่จะส่งกลับเฉพาะคอลัมน์ที่ตรงกันเท่านั้น

    คำขอตัวอย่าง:

    ดูโค้ด SQL

    เลือก< select_list>จาก Table_A A เข้าร่วมภายใน Table_B B ON A. คีย์ = B. คีย์

    ซ้ายเข้าร่วม

    แบบสอบถามนี้จะส่งกลับคอลัมน์ทั้งหมดจากตารางด้านซ้าย (ตาราง A) รวมถึงคอลัมน์ทั้งหมดจากตารางด้านขวา (ตาราง B) แต่จะแสดงผลเฉพาะคอลัมน์ที่ตรงกับคอลัมน์จากตารางด้านซ้ายเท่านั้น

    คำขอตัวอย่าง:

    ดูโค้ด SQL

    เลือก< select_list>FROM Table_A A LEFT JOIN Table_B B ON A. คีย์ = B. คีย์

    ถูกต้อง เข้าร่วม

    คล้ายกับแบบสอบถามก่อนหน้า แต่จะส่งกลับคอลัมน์ทั้งหมดจากตารางด้านขวา (ตาราง B) รวมถึงคอลัมน์ทั้งหมดจากตารางด้านซ้าย (ตาราง A) ที่ตรงกับคอลัมน์จากตารางด้านขวา

    คำขอตัวอย่าง:

    ดูโค้ด SQL

    เลือก< select_list>จาก Table_A A ขวาเข้าร่วม Table_B B ON A. คีย์ = B. คีย์

    เข้าร่วมภายนอก

    บ่อยครั้งที่แบบสอบถามนี้เขียนเป็น FULL OUTER JOIN หรือ FULL JOIN รูปแบบทั้งหมดจะดำเนินการอย่างใดอย่างหนึ่ง กล่าวคือ ส่งคืนคอลัมน์ทั้งหมดจากทั้งสองตาราง ในขณะที่คอลัมน์ที่ตรงกันจะทับซ้อนกันด้วยคอลัมน์จากตารางด้านซ้าย

    คำขอตัวอย่าง:

    ดูโค้ด SQL

    เลือก< select_list>FROM Table_A A เต็ม OUTER JOIN Table_B B ON A. คีย์ = B. คีย์

    ซ้าย ไม่รวม JOIN

    แบบสอบถามนี้จะส่งคืนคอลัมน์ทั้งหมดจากตารางด้านซ้าย (ตาราง A) ที่ไม่ตรงกับคอลัมน์จากตารางด้านขวา (ตาราง B)

    คำขอตัวอย่าง:

    ดูโค้ด SQL

    9.5K

    ในบทความนี้ เราจะกล่าวถึงตัวดำเนินการ MySQL LEFT JOIN และวิธีใช้ตัวดำเนินการดังกล่าวเพื่อสืบค้นข้อมูลจากตารางฐานข้อมูลตั้งแต่สองตารางขึ้นไป

    รู้เบื้องต้นเกี่ยวกับ LEFT JOIN MySQL

    ตัวดำเนินการ MySQL LEFT JOIN ช่วยให้คุณสามารถสืบค้นข้อมูลจากตารางฐานข้อมูลตั้งแต่สองตารางขึ้นไป เป็นส่วนเพิ่มเติมของคำสั่ง SELECT ที่ปรากฏต่อจาก FROM

    สมมติว่าคุณกำลังจะสืบค้นข้อมูลจากตาราง t1 และ t2 โดยใช้ตัวอย่างแบบสอบถามด้านล่าง เราจะแสดงไวยากรณ์ LEFT JOIN โดยการรวมสองตารางเข้าด้วยกัน:

    เลือก t1.c1, t1.c2, t2.c1, t2.c2 จาก t1 ซ้ายเข้าร่วม t2 ON t1.c1 = t2.c1;

    เมื่อคุณรวมเข้ากับตาราง t1 และ t2 โดยใช้ตัวดำเนินการ LEFT JOIN หากแถวจากตารางด้านซ้าย t1 ตรงกับแถวจากตารางด้านขวา t2 ตามเงื่อนไขการรวม (t1.c1 = t2.c1) แถวนั้นจะถูกรวมไว้ด้วย ในชุดผลลัพธ์

    หากค่าในตารางด้านซ้ายไม่ตรงกับค่าในตารางด้านขวา แถวในตารางด้านซ้ายจะถูกเลือกและรวมกับแถว "แบบมีเงื่อนไข" จากตารางด้านขวาด้วย แถว "แบบมีเงื่อนไข" มี NULL สำหรับคอลัมน์ที่เกี่ยวข้องทั้งหมดในคำสั่ง SELECT

    กล่าวอีกนัยหนึ่ง เงื่อนไข MySQL LEFT JOIN ช่วยให้คุณสามารถเลือกแถวจากทั้งสองตารางที่ตรงกัน บวกกับแถวทั้งหมดจากตารางด้านซ้าย (t1) แม้ว่าจะไม่มีแถวที่ตรงกันจากตารางด้านขวา (t2) ก็ตาม

    แผนภาพต่อไปนี้จะช่วยให้คุณเข้าใจว่าเงื่อนไข LEFT JOIN ทำงานอย่างไร จุดตัดของวงกลมทั้งสองคือแถวที่ตรงกันในทั้งสองตาราง และส่วนที่เหลือของวงกลมด้านซ้ายคือแถวในตาราง t1 ที่ไม่มีแถวที่สอดคล้องกันในตาราง t2 ดังนั้น แถวทั้งหมดในตารางด้านซ้ายจะรวมอยู่ในชุดผลลัพธ์


    โปรดทราบว่าค่าที่ส่งคืนจะต้องตรงกับเงื่อนไขในส่วนคำสั่ง WHERE และ HAVING ด้วย หากส่วนคำสั่งเหล่านั้นมีอยู่ในแบบสอบถาม ตัวอย่างการใช้ LEFT JOIN การใช้ตัวดำเนินการ MySQL LEFT JOIN เพื่อรวมสองตาราง

    ลองใช้ลูกค้าสองตารางและคำสั่งซื้อจากฐานข้อมูลสาธิต:


    ในฐานข้อมูลที่อธิบายไว้ในแผนภาพ:
    • คำสั่งซื้อแต่ละรายการในตารางคำสั่งซื้อต้องเป็นของลูกค้าในตารางลูกค้า
    • ลูกค้าแต่ละรายในตารางลูกค้าสามารถมีคำสั่งซื้อเป็นศูนย์หรือมากกว่าในตารางคำสั่งซื้อได้

    หากต้องการค้นหาคำสั่งซื้อของลูกค้าแต่ละราย คุณสามารถใช้ตัวอย่าง MySQL LEFT JOIN:

    เลือก c.customerNumber, c.customerName, orderNumber, o.status จากลูกค้า c LEFT JOIN คำสั่งซื้อ o ON c.customerNumber = o.customerNumber

    ดูตัวอย่าง


    ตารางด้านซ้ายคือไคลเอนต์ ดังนั้นไคลเอนต์ทั้งหมดจึงรวมอยู่ในชุดผลลัพธ์ แต่มีแถวที่มีข้อมูลลูกค้าแต่ไม่มีข้อมูลคำสั่งซื้อ เป็นต้น 168, 169 ฯลฯ ข้อมูลลำดับในแถวเหล่านี้เป็น NULL ซึ่งหมายความว่าลูกค้าเหล่านี้ไม่มีคำสั่งซื้อในตารางที่เกี่ยวข้อง

    เนื่องจากเราใช้ชื่อคอลัมน์เดียวกัน (orderNumber) เพื่อรวมทั้งสองตารางเข้าด้วยกัน เราจึงสามารถทำให้แบบสอบถามสั้นลงได้โดยใช้ไวยากรณ์ด้านล่าง:

    เลือก c.customerNumber, customerName, orderNumber, สถานะจากลูกค้า c LEFT JOIN สั่งซื้อโดยใช้ (customerNumber);

    หากคุณแทนที่คำสั่ง MySQL SELECT LEFT JOIN ด้วยคำสั่ง INNER JOIN คุณจะได้รับเฉพาะลูกค้าที่ได้ส่งคำสั่งซื้ออย่างน้อยหนึ่งรายการเท่านั้น

    การใช้ตัวดำเนินการ MySQL LEFT JOIN เพื่อค้นหาแถวที่ไม่ตรงกัน

    ตัวดำเนินการ LEFT JOIN จะมีประโยชน์หากคุณต้องการค้นหาแถวในตารางด้านซ้ายที่ไม่ตรงกับแถวทางด้านขวา หากต้องการค้นหาแถวที่ไม่ตรงกันระหว่างสองตาราง คุณต้องเพิ่มส่วนคำสั่ง WHERE ลงใน SELECT เพื่อสอบถามเฉพาะแถวที่มีค่าคอลัมน์ในตารางด้านขวามี NULL

    ตัวอย่างเช่น หากต้องการค้นหาลูกค้าทั้งหมดที่ยังไม่ได้สั่งซื้อ ให้ใช้แบบสอบถามต่อไปนี้:

    ดูตัวอย่าง

    เงื่อนไขในส่วนคำสั่ง WHERE หรือเงื่อนไขในส่วนคำสั่ง ON

    พิจารณาตัวอย่างต่อไปนี้โดยใช้ MySQL LEFT JOIN WHERE :

    ในตัวอย่างนี้ เราใช้ตัวดำเนินการ LEFT JOIN เพื่อสืบค้นข้อมูลจากตาราง orders และ orderDetails คำขอส่งคืนคำสั่งซื้อและรายละเอียด (ถ้ามี) สำหรับคำสั่งซื้อ 10123



  • ส่วนของเว็บไซต์