พฤติกรรมเริ่มต้นของ MySQL JOIN, INNER หรือ OUTER คืออะไร?


95

ชั่วโมงที่แล้วฉันจึงหาทางอินเทอร์เน็ตอ่านและมองหาคำตอบที่ชัดเจนสำหรับคำถามง่ายๆนี้

JOIN เริ่มต้นใน MySQL คืออะไร?

SELECT * FROM t1 JOIN t2

เป็นเช่นเดียวกับ

SELECT * FROM t1, t2

OR

SELECT * FROM t1 INNER JOIN t2

นอกจากนี้คำถามที่เกี่ยวข้องเมื่อคุณใช้ประโยค "WHERE" จะเหมือนกับ JOIN หรือ INNER JOIN

ตอนนี้ฉันคิดว่า JOIN แบบสแตนด์อะโลนนั้นเหมือนกับการใช้เครื่องหมายจุลภาคและ WHERE clauses

คำตอบ:


128

ใน MySQL การเขียนอย่างไม่มีเงื่อนไขหมายถึงJOIN INNER JOINกล่าวอีกนัยหนึ่งคือINNERin INNER JOINเป็นทางเลือก INNERและCROSSเป็นคำพ้องความหมายใน MySQL เพื่อความชัดเจนฉันเขียนJOINหรือINNER JOINถ้าฉันมีเงื่อนไขการเข้าร่วมและCROSS JOINถ้าฉันไม่มีเงื่อนไข

ไวยากรณ์ได้รับอนุญาตให้เข้าร่วมได้อธิบายไว้ในเอกสาร


ตอนนี้ฉันคิดว่า JOIN แบบสแตนด์อะโลนไม่มีอะไรมากไปกว่า (เหมือนกัน) โดยใช้เครื่องหมายจุลภาคและ WHERE clauses


เอฟเฟกต์เหมือนกัน แต่ประวัติเบื้องหลังแตกต่างกัน ไวยากรณ์ของลูกน้ำมาจากมาตรฐาน ANSI-89 อย่างไรก็ตามมีปัญหาหลายประการเกี่ยวกับไวยากรณ์นี้ดังนั้นในมาตรฐาน ANSI-92 จึงมีการนำคีย์เวิร์ด JOIN มาใช้

ฉันจะขอแนะนำว่าคุณมักจะใช้ไวยากรณ์ JOIN มากกว่าจุลภาค

  • T1 JOIN T2 ON ...T1, T2 WHERE ...สามารถอ่านได้มากกว่า
  • สามารถบำรุงรักษาได้มากกว่าเนื่องจากความสัมพันธ์ของตารางและตัวกรองถูกกำหนดไว้อย่างชัดเจนแทนที่จะผสมกัน
  • ไวยากรณ์ JOIN สามารถแปลงเป็น OUTER JOIN ได้ง่ายกว่าไวยากรณ์ลูกน้ำ
  • การผสมไวยากรณ์ของจุลภาคและ JOIN ในคำสั่งเดียวกันอาจทำให้เกิดข้อผิดพลาดที่น่าสงสัยเนื่องจากกฎลำดับความสำคัญ
  • มีโอกาสน้อยที่จะสร้างผลิตภัณฑ์คาร์ทีเซียนโดยไม่ได้ตั้งใจเมื่อใช้ไวยากรณ์ JOIN เนื่องจากคำสั่งการเข้าร่วมที่ถูกลืมเนื่องจากส่วนคำสั่งการเข้าร่วมถูกเขียนถัดจากการรวมและง่ายต่อการดูว่าขาดหายไปหรือไม่

น่ารักขอบคุณที่ชี้แจงคำถามง่ายๆนี้ให้ฉัน :) ที่ผ่านมาฉันมักจะใช้จุลภาค + โดยที่อนุประโยค ... แต่จะเปลี่ยนเป็นการใช้ JOIN ตามคำแนะนำของคุณ ขอบคุณ
Quang Van

เฮ้มาร์คคุณหมายถึงอะไรจากการผสมของ JOIN และลูกน้ำ ผสมคิวรีแบบนี้ SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)?
Quang Van

2
@Quang: ตัวอย่างนี้จะล้มเหลว:SELECT * FROM t1, t2 JOIN t3 ON t1.x=t3.y WHERE t1.a = t2.b
Mark Byers

0

สิ่งเหล่านี้เทียบเท่ากันทั้งหมดและเท่ากับCROSS JOINด้วย

มีความแตกต่างบางประการระหว่างการใช้ลูกน้ำและ[INNER | CROSS] JOINไวยากรณ์ซึ่งอาจมีความสำคัญเมื่อรวมตารางมากขึ้น สวยมากทุกสิ่งที่คุณจำเป็นต้องรู้อธิบายไว้ที่นี่ในMySQLJOINเอกสาร


1
^ --- คำตอบสำหรับคำถามคือ JOIN (แบบสแตนด์อโลน) โดยพื้นฐานแล้วเป็นสิ่งเดียวกันกับ INNER และลูกน้ำ + โดยที่ประโยค
Quang Van
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.