ความแตกต่างระหว่างเข้าร่วมและเข้าร่วมภายใน


998

การเข้าร่วมทั้งสองนี้จะให้ผลลัพธ์แบบเดียวกันกับฉัน:

SELECT * FROM table JOIN otherTable ON table.ID = otherTable.FK

VS

SELECT * FROM table INNER JOIN otherTable ON table.ID = otherTable.FK

มีความแตกต่างระหว่างงบในการปฏิบัติงานหรืออื่น ๆ ?

มันแตกต่างกันระหว่างการใช้SQL ที่แตกต่างกันหรือไม่?


2
ดูคำถามนี้: < stackoverflow.com/questions/448023?sort=newest >
Joel Coehoorn

6
ในฐานะที่เป็นหมายเหตุด้าน: CROSS JOIN เป็นสิ่งที่ดีที่จะรู้ว่าประเภทการเข้าร่วม (แตกต่างจาก INNER JOIN)
Serge

คำตอบ:


1092

แต่INNER JOINสามารถอ่านได้ค่อนข้างชัดเจนโดยเฉพาะถ้าแบบสอบถามมีประเภทการรวมอื่น ๆ (เช่นLEFTหรือRIGHTหรือCROSS) รวมอยู่ในนั้น


11
สิ่งนี้เป็นจริงสำหรับฐานข้อมูลทั้งหมด (เช่น SQL, postgres หรือไม่) ไม่มีใครรู้ลิงค์ไปยังเอกสารอธิบายนี้
Chogg

4
เป็นมาตรฐาน ANSI SQL ดูเพิ่มเติม: contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ; en.wikipedia.org/wiki/SQL-92
ชาวอินเดีย

14
ข้อความค้นหานั้นชัดเจนเพียงพอโดยการเขียนเข้าร่วมภายในเป็นเพียงเสียงรบกวน
Ivanzinho

22
บางทีฉันอาจเป็นคนเจ้าระเบียบ แต่ฉันคิดว่ามันจะดีกว่าชัดเจนกว่าการเขียน SQL เข้าร่วมภายในอ่านได้ง่ายขึ้นโดยเฉพาะในข้อความค้นหาที่ซับซ้อน
bruceskyaus

3
@Ivanzinho: การกดแป้นพิมพ์ไม่ใช่ตัวชี้วัดของการสืบค้นหรือความซับซ้อนของโปรแกรม ความซับซ้อนในชีวิตจริงมาจากการบำรุงรักษาที่การอ่านมีบทบาทสำคัญ ความจริงที่ว่าเมื่อมีข้อความระบุว่า INNER JOIN คุณสามารถมั่นใจได้ในสิ่งที่มันทำและควรจะเป็นเช่นนั้นในขณะที่ JOIN ธรรมดาจะออกจากคุณหรือคนอื่นสงสัยว่ามาตรฐานพูดเกี่ยวกับการดำเนินการและเป็น INNER / OUTER / LEFT ปล่อยออกโดยอุบัติเหตุหรือโดยวัตถุประสงค์
Tuukka Haapaniemi

243

ไม่มีความแตกต่างไม่บริสุทธิ์น้ำตาลประโยค


22
ฉันจะไม่เรียกน้ำตาลประโยคนี้ ประเภทการเข้าร่วม "เริ่มต้น" "ชวเลข" หรือ "นามแฝง" อาจจะ
mk12

62
ในวิทยาการคอมพิวเตอร์น้ำตาลประโยคไวยากรณ์ภายในภาษาโปรแกรมที่ถูกออกแบบมาเพื่อทำให้สิ่งที่ง่ายต่อการอ่านหรือแสดง ฉันเชื่อว่าความสามารถในการละเว้นINNERอยู่ภายใต้คำจำกัดความนี้
Quassnoi

14
หากคุณใช้คำจำกัดความอย่างแท้จริงใช่ แต่ฉันเคยเห็นมันสงวนไว้สำหรับไวยากรณ์ประเภทที่น่าสนใจมากกว่าไม่ใช่แค่ชื่อทางเลือกสำหรับสิ่งต่าง ๆ
mk12

10
@Quassnoi เพียงความจริงที่ว่าคำถามนี้ถูกถามแสดงให้เห็นว่าINNERไม่มีตัวตนของแบบสอบถามไม่ได้ทำให้ง่ายต่อการอ่าน สำหรับสิ่งที่ฉันรู้JOINอาจหมายความได้LEFT JOINว่าคำตอบที่นี่ไม่ได้ถูกลบออก
martennis

2
@Quassnoi ความคิดเห็นของคุณที่มีการอ้างอิงคำสั่ง wiki นั้นเป็นจริงของน้ำตาล syntactic แต่มันไม่เพียงพอตามคำจำกัดความ ไวยากรณ์ sugaring เป็นเรื่องเกี่ยวกับไวยากรณ์ที่ง่ายขึ้นสำหรับกรณีพิเศษของไวยากรณ์ที่ซับซ้อน เป็นการเหมาะสมกว่าที่จะกล่าวว่า INNER เป็น "คำรบกวน"
philipxy

143

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

INNER JOIN เป็นค่าเริ่มต้นหากคุณไม่ได้ระบุประเภทเมื่อคุณใช้คำว่า JOIN

นอกจากนี้คุณยังสามารถใช้ LEU OUTER JOIN หรือ RIGHT OUTER JOIN ในกรณีนี้คำว่า OUTER นั้นเป็นทางเลือกหรือคุณสามารถระบุ CROSS JOIN

หรือ

สำหรับการรวมภายในไวยากรณ์คือ:

เลือก ...
จาก TableA
[ภายใน] เข้าร่วม TableB

(กล่าวอีกนัยหนึ่งคำหลัก "ภายใน" เป็นตัวเลือก - ผลลัพธ์จะเหมือนกันไม่ว่าจะมีหรือไม่มี)



54

ในทำนองเดียวกันOUTER JOINsคำว่า"OUTER"จะเป็นตัวเลือก มันเป็นLEFTหรือRIGHTคำหลักที่ทำให้JOIN"OUTER" JOIN

อย่างไรก็ตามด้วยเหตุผลบางอย่างฉันมักจะใช้"OUTER"เป็นในLEFT OUTER JOINและไม่เคยLEFT JOINแต่ฉันไม่เคยใช้INNER JOINแต่ฉันแค่ใช้"JOIN":

SELECT ColA, ColB, ...
FROM MyTable AS T1
     JOIN MyOtherTable AS T2
         ON T2.ID = T1.ID
     LEFT OUTER JOIN MyOptionalTable AS T3
         ON T3.ID = T1.ID

23
ฉันเป็นคนตรงข้ามกับคุณ: ฉันมักจะพูดว่า "เข้าร่วมภายใน" แต่ฉันไม่เคยใช้นอก; ดังนั้น "LEFT JOIN" และ "RIGHT JOIN" เดาฉันแค่รักษาตัวละครของฉันให้คงที่!
สตีเฟ่นโฮลต์

10
@ Jonathan.There ไม่มีแนวคิดของทิศทางในการเข้าร่วมภายใน การรวมภายนอกสามารถสร้างชุดผลลัพธ์ที่ไม่ตรงกันและสิ่งเหล่านั้นอาจแตกต่างกันไปตามทิศทาง ด้านในจำเป็นต้องมีการจับคู่ดังนั้นทิศทางจึงไม่สำคัญ
Karl Kieninger

32

ดังที่คำตอบอื่น ๆ ระบุไว้แล้วจึงไม่มีความแตกต่างในตัวอย่างของคุณ

บิตของไวยากรณ์ที่เกี่ยวข้องมีการบันทึกไว้ที่นี่

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

แสดงว่าทั้งหมดเป็นตัวเลือก หน้าต่อไปชี้แจงว่า

INNERระบุคู่ของแถวที่ตรงกันทั้งหมดจะถูกส่งคืน ละเว้นแถวที่ไม่ตรงกันจากทั้งสองตาราง เมื่อไม่มีการเข้าร่วมประเภทมีการระบุเป็นค่าเริ่มต้น

ไวยากรณ์ไม่นอกจากนี้ยังระบุว่ามีครั้งหนึ่งที่INNER ถูกต้องแม้ว่า เมื่อระบุคำใบ้เข้าร่วม

ดูตัวอย่างด้านล่าง

CREATE TABLE T1(X INT);
CREATE TABLE T2(Y INT);

SELECT *
FROM   T1
       LOOP JOIN T2
         ON X = Y;

SELECT *
FROM   T1
       INNER LOOP JOIN T2
         ON X = Y;

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.