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


197

อะไรคือความแตกต่างระหว่างการเข้าร่วมแบบธรรมชาติและการเข้าร่วมแบบภายใน?


3
คำถามนี้ไม่เหมือนกันเนื่องจากเป็นเรื่องของ INNER vs NATURAL JOININ ซึ่งไม่ได้กล่าวถึงในที่อื่น

1
ในครั้งเดียวสิ่งนี้ถูกปิดเหมือนสำเนาของการรวมซ้าย, ขวา, ด้านนอกและด้านในคืออะไร แต่คำถามนั้นไม่ได้ระบุความแตกต่างระหว่างการรวมภายในและการรวมธรรมชาติ
Jonathan Leffler

คำตอบ:


250

ความแตกต่างที่สำคัญอย่างหนึ่งระหว่าง INNER JOIN และ NATURAL JOIN คือจำนวนคอลัมน์ที่ส่งคืน

พิจารณา:

TableA                           TableB
+------------+----------+        +--------------------+    
|Column1     | Column2  |        |Column1  |  Column3 |
+-----------------------+        +--------------------+
| 1          |  2       |        | 1       |   3      |
+------------+----------+        +---------+----------+

The INNER JOINของ TableA และ TableB บน Column1 จะกลับมา

SELECT * FROM TableA AS a INNER JOIN TableB AS b USING (Column1);
SELECT * FROM TableA AS a INNER JOIN TableB AS b ON a.Column1 = b.Column1;
+------------+-----------+---------------------+    
| a.Column1  | a.Column2 | b.Column1| b.Column3|
+------------------------+---------------------+
| 1          |  2        | 1        |   3      |
+------------+-----------+----------+----------+

The NATURAL JOINของ TableA และ TableB บน Column1 จะกลับมา:

SELECT * FROM TableA NATURAL JOIN TableB
+------------+----------+----------+    
|Column1     | Column2  | Column3  |
+-----------------------+----------+
| 1          |  2       |   3      |
+------------+----------+----------+

หลีกเลี่ยงคอลัมน์ซ้ำ ๆ

(AFAICT จากไวยากรณ์มาตรฐานคุณไม่สามารถระบุคอลัมน์การเข้าร่วมในการเข้าร่วมแบบธรรมชาติการเข้าร่วมเป็นไปตามชื่ออย่างเคร่งครัดดูเพิ่มเติมที่Wikipedia )

( มีการโกงในด้านเอาท์พุทเข้าร่วมนั้นa.และb.ชิ้นส่วนจะไม่อยู่ในชื่อคอลัมน์ที่คุณต้องการเพียงแค่มีcolumn1, column2, column1, column3เป็นหัว. )


2
ฉันมีสองตาราง TableA (Column1, Column2) และ TableB (Column2, Column3)
2 8

16
การยุบคอลัมน์ในเอาต์พุตเป็นสิ่งที่สำคัญน้อยที่สุดของการรวมแบบเป็นธรรมชาติ สิ่งที่คุณต้องรู้คือ (A) มันจะเข้าร่วมในฟิลด์ที่มีชื่อเดียวกันโดยอัตโนมัติและ (B) มันจะ f *** อัพ s *** ของคุณเมื่อคุณคาดหวังน้อยที่สุด ในโลกของฉันการใช้การเข้าร่วมที่เป็นธรรมชาตินั้นเป็นเหตุให้ถูกไล่ออก

8
@JonofAllTrades คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่NATURAL JOINจะทำลายว่าทำไมมันไม่คาดคิดและโลกที่คุณอยู่ใน?
Bryson

36
นี่คือคำตอบของ user166390 บ้าง สมมติว่าคุณมีความเป็นธรรมชาติเข้าร่วมระหว่างCustomersและเข้าร่วมใน Employees ยังมีเขตข้อมูล ทุกอย่างเรียบร้อยดี. จากนั้นสักวันมีคนเพิ่มเขตข้อมูลลงในตาราง การเข้าร่วมของคุณจะไม่แตก (นั่นคือความเมตตา) แต่จะรวมฟิลด์ที่สองและทำงานอย่างไม่ถูกต้องแทน ดังนั้นการเปลี่ยนแปลงที่ไม่เป็นอันตรายดูเหมือนจะทำลายบางสิ่งบางอย่างที่เกี่ยวข้องในระยะไกลเท่านั้น ที่เลวร้ายมาก. ข้อเสียของการเข้าร่วมที่เป็นธรรมชาติเพียงอย่างเดียวคือการประหยัดการพิมพ์เพียงเล็กน้อยและข้อเสียคือสิ่งสำคัญ EmployeeIDEmployeesManagerIDManagerIDCustomers

2
@Jonathan เกี่ยวกับคำตอบของคุณคุณระบุว่ามีSELECT * FROM TableA INNER JOIN TableB USING (Column1)4 คอลัมน์ สิ่งนี้ไม่ถูกต้องเพราะSELECT * FROM TableA INNER JOIN TableB USING (Column1)และSELECT * FROM TableA NATURAL JOIN TableBเท่ากันพวกเขาทั้งสองให้ 3 คอลัมน์
Pacerier

81
  • การรวมภายในเป็นสิ่งที่แถวการจับคู่ในตารางเข้าร่วมจำเป็นสำหรับแถวจากตารางแรกที่จะส่งคืน
  • การรวมภายนอกคือการที่แถวที่ตรงกันในตารางเข้าร่วมไม่จำเป็นสำหรับแถวจากตารางแรกที่จะส่งคืน
  • การเข้าร่วมแบบธรรมชาติคือการเข้าร่วม (คุณสามารถมีอย่างใดอย่างหนึ่งnatural leftหรือnatural right) ที่ถือว่าเกณฑ์การเข้าร่วมเป็นคอลัมน์ที่มีชื่อเดียวกันในการจับคู่ทั้งสองตาราง

ฉันจะหลีกเลี่ยงการใช้การรวมธรรมชาติอย่างกาฬโรคเพราะการรวมธรรมชาติคือ:

  • ไม่ใช่ standard sql [SQL 92] ดังนั้นจึงไม่ใช่แบบพกพาไม่สามารถอ่านได้โดยเฉพาะ (โดยตัวแปลงรหัส SQL ส่วนใหญ่) และอาจไม่รองรับเครื่องมือ / ไลบรารีต่างๆ
  • ไม่ให้ข้อมูล คุณไม่สามารถบอกได้ว่าจะเข้าร่วมคอลัมน์ใดโดยไม่อ้างอิงถึงสคีมา
  • เงื่อนไขการเข้าร่วมของคุณมีความเสี่ยงที่จะเกิดการเปลี่ยนแปลงแบบแผน - หากมีคอลัมน์การเข้าร่วมแบบธรรมชาติหลายคอลัมน์และหนึ่งคอลัมน์ดังกล่าวจะถูกลบออกจากตารางแบบสอบถามจะยังคงทำงาน แต่อาจไม่ถูกต้องและพฤติกรรมการเปลี่ยนแปลงนี้จะเงียบ
  • แทบไม่คุ้มค่ากับความพยายาม คุณประหยัดการพิมพ์เพียง 10 วินาทีเท่านั้น

2
ฉันคิดว่าควรพูดถึงซ้าย / ขวาด้านนอก (เนื่องจากด้านนอกถูกกล่าวถึงเลย) แต่อย่างอื่นดีและรัดกุม: มันขาดไดอะแกรมตัวอย่างบันทึก SQL สวย ๆ เท่านั้น

2
ด้านซ้ายของธรรมชาติและสิทธิตามธรรมชาติยังมีอยู่ แต่ใช่ยังคงหลีกเลี่ยงพวกเขา
MatBailie

1
@ โบฮีเมียนเกี่ยวกับ "หลีกเลี่ยงพวกเขาเหมือนกับโรคระบาด" มีกรณีการใช้งานจริงสำหรับการเข้าร่วมธรรมชาติโดยที่พวกเขาเข้ามามีประโยชน์ mariadb.com/kb/en/sql-99/natural-join "... " Books NATURAL JOIN Checkouts"ที่ดูไม่เป็นทางการนั้นเป็นไปได้ก็ต่อเมื่อการตั้งชื่อฐานข้อมูลเป็นระเบียบและบังคับใช้อย่างเป็นทางการ .... "
Pacerier

2
@sqlvovel มีความคิดเห็นของคุณจำนวนมากผิดปกติโดยเฉพาะมันไม่ถูกต้อง คอลัมน์เข้าร่วมไม่สามารถ "ระบุในรายการที่เลือก" คำจำกัดความของการเข้าร่วมแบบธรรมชาติคือการเข้าร่วมใน *คอลัมน์ที่มีชื่อเหมือนกัน * จาก MySQL doc: NATURAL [LEFT] JOIN ของสองตารางถูกกำหนดให้มีความหมายเทียบเท่ากับ INNER JOIN หรือ LEFT JOIN ที่มีส่วนคำสั่ง USING ที่ใช้ชื่อคอลัมน์ทั้งหมดที่มีอยู่ในทั้งสองตาราง . และอีกสิ่งหนึ่ง - ในทางปฏิบัติมันไร้ประโยชน์เพราะidแพร่หลายและไร้ประโยชน์ในการเข้าร่วม tablename_idปกติชื่อคีย์ต่างประเทศ การรวมตามธรรมชาติเป็นความคิดที่เลวร้ายเลวและเลว
โบฮีเมียน

2
ไม่มีคอลัมน์ที่ส่งคืนสองครั้งในแบบสอบถามของฉัน ข้อดีอย่างหนึ่งของซีแมนทิกส์ NJ คือคอลัมน์ที่ซ้ำกันจะไม่ถูกส่งคืน ข้อความค้นหาก่อนหน้าของคุณยัง "ปลอดภัยน้อยกว่า" เพราะจะล้มเหลวหากมีการเพิ่มคอลัมน์ชื่อ "a" ใน t2 (เนื่องจากเงื่อนไขการเข้าร่วมที่ไม่ใช่นามแฝงนั้นไม่ชัดเจน) ฉันสงสัยว่าอคติของคุณกับ NJ นั้นมาจากข้อเท็จจริงที่ว่าคุณไม่ได้ลองในผลิตภัณฑ์ที่รองรับ SQL มาตรฐานอย่างเหมาะสม คำถามนี้เกี่ยวกับ SQL ไม่ใช่ MySQL - เป็นสิ่งที่แตกต่างกันมาก คุณยังไม่ได้แก้ไขคำตอบของคุณว่าเป็นมาตรฐาน
nvogel

27

การเข้าร่วมแบบธรรมชาติเป็นเพียงทางลัดเพื่อหลีกเลี่ยงการพิมพ์โดยมีข้อสันนิษฐานว่าการเข้าร่วมนั้นง่ายและจับคู่ฟิลด์ที่มีชื่อเดียวกัน

SELECT
  *
FROM
  table1
NATURAL JOIN
  table2
    -- implicitly uses `room_number` to join

เหมือนกับ ...

SELECT
  *
FROM
  table1
INNER JOIN
  table2
    ON table1.room_number = table2.room_number

สิ่งที่คุณทำไม่ได้กับรูปแบบทางลัดมีความซับซ้อนมากกว่า ...

SELECT
  *
FROM
  table1
INNER JOIN
  table2
    ON (table1.room_number = table2.room_number)
    OR (table1.room_number IS NULL AND table2.room_number IS NULL)

2
@ JonathanLeffler - ใน MySQL แน่นอน
MatBailie

3
ตกลง - น่าสนใจ ฉันถามเพราะมาตรฐาน SQL ดูเหมือนจะไม่อนุญาต (แต่ส่วนขยายนั้นเป็นไปได้เสมอ)
Jonathan Leffler

DBMS ใดที่อนุญาตให้ใช้ไวยากรณ์ที่NATURAL JOIN ... USING ()ไม่ได้มาตรฐานนี้: มาตรฐานเป็นa NATURAL JOIN bหรือa JOIN b USING (c)
ypercubeᵀᴹ

1
"เพียงแค่ทางลัดเพื่อหลีกเลี่ยงการพิมพ์" คือการแสดงข้อมูลที่ผิด คุณลักษณะที่สำคัญที่สุดคือไม่ได้ส่งผลให้เกิดคอลัมน์ซ้ำกัน
onedaywhen

... ตัวอย่างเช่นผลมาจากการค้นหาของคุณที่ใช้ธรรมชาติเข้าร่วมจะมีเพียงหนึ่งคอลัมน์ชื่อในขณะที่ภายในของคุณเข้าร่วมจะมีสองชื่อคอลัมน์room_number room_number
oneday

13

SQL ไม่ซื่อสัตย์กับโมเดลเชิงสัมพันธ์ในหลาย ๆ ด้าน ผลลัพธ์ของการสืบค้น SQL ไม่ใช่ความสัมพันธ์เนื่องจากอาจมีคอลัมน์ที่มีชื่อซ้ำกัน, 'นิรนาม' (ไม่ระบุชื่อ) คอลัมน์, แถวซ้ำ, โมฆะ ฯลฯ SQL ไม่ถือว่าตารางเป็นความสัมพันธ์เนื่องจากอาศัยการเรียงลำดับคอลัมน์เป็นต้น

แนวคิดเบื้องหลังNATURAL JOINใน SQL คือการทำให้ซื่อสัตย์ต่อโมเดลเชิงสัมพันธ์ได้ง่ายขึ้น ผลลัพธ์ของNATURAL JOINทั้งสองตารางจะมีการทำซ้ำคอลัมน์ตามชื่อจึงไม่มีคอลัมน์ที่ไม่ระบุชื่อ ในทำนองเดียวกันUNION CORRESPONDINGและEXCEPT CORRESPONDINGมีไว้เพื่อจัดการกับการพึ่งพาของ SQL ในการเรียงลำดับคอลัมน์ในUNIONไวยากรณ์ดั้งเดิม

อย่างไรก็ตามเช่นเดียวกับเทคนิคการเขียนโปรแกรมทั้งหมดมันต้องมีระเบียบวินัยที่จะเป็นประโยชน์ ข้อกำหนดหนึ่งสำหรับการประสบความสำเร็จNATURAL JOINคือการตั้งชื่อคอลัมน์อย่างสม่ำเสมอเนื่องจากการรวมจะบอกเป็นนัยในคอลัมน์ที่มีชื่อเดียวกัน (มันเป็นความอัปยศที่ไวยากรณ์สำหรับการเปลี่ยนชื่อคอลัมน์ใน SQL นั้นเป็น verbose แต่ผลข้างเคียงคือการส่งเสริมวินัยเมื่อตั้งชื่อคอลัมน์ในตารางฐานและVIEWs :)

หมายเหตุ SQL NATURAL JOINคือการเข้าร่วม equi แต่นี่ไม่ใช่บาร์สำหรับประโยชน์ พิจารณาว่าหากNATURAL JOINเป็นชนิดการรวมเท่านั้นที่ได้รับการสนับสนุนใน SQL มันจะยังคงสมบูรณ์แบบสัมพันธ์กัน

ในขณะที่มันเป็นความจริงที่ใด ๆ ที่NATURAL JOINอาจถูกเขียนโดยใช้INNER JOINและประมาณการ ( SELECT) มันก็เป็นความจริงที่ใด ๆ ที่INNER JOINอาจถูกเขียนโดยใช้ผลิตภัณฑ์ ( CROSS JOIN) และข้อ จำกัด ( WHERE); ทราบเพิ่มเติมว่าระหว่างตารางที่ไม่มีชื่อคอลัมน์ในการร่วมกันจะให้ผลเช่นเดียวกับNATURAL JOIN CROSS JOINดังนั้นหากคุณสนใจเฉพาะผลลัพธ์ที่มีความสัมพันธ์ (และทำไมไม่เคย?!) ดังนั้นจึงNATURAL JOINเป็นประเภทการเข้าร่วมเพียงอย่างเดียวที่คุณต้องการ แน่นอนว่ามันเป็นความจริงที่มาจากมุมมองการออกแบบภาษาเช่นINNER JOINและCROSS JOINมีค่าของพวกเขา แต่ยังพิจารณาว่าเกือบทุกแบบสอบถาม SQL สามารถเขียนใน 10 syntactically แตกต่างกัน แต่วิธีที่เท่าเทียมกันทางความหมายและนี่คือสิ่งที่ทำให้เพิ่มประสิทธิภาพ SQL ยากมาก เพื่อพัฒนา.

ต่อไปนี้เป็นตัวอย่างแบบสอบถาม (ใช้ชิ้นส่วนปกติและฐานข้อมูลผู้จัดหา ) ที่เทียบเท่ากับความหมาย:

SELECT *
  FROM S NATURAL JOIN SP;

-- Must disambiguate and 'project away' duplicate SNO attribute
SELECT S.SNO, SNAME, STATUS, CITY, PNO, QTY
  FROM S INNER JOIN SP 
          USING (SNO);                        

-- Alternative projection
SELECT S.*, PNO, QTY
  FROM S INNER JOIN SP 
          ON S.SNO = SP.SNO;

-- Same columns, different order == equivalent?!
SELECT SP.*, S.SNAME, S.STATUS, S.CITY
  FROM S INNER JOIN SP 
      ON S.SNO = SP.SNO;

-- 'Old school'
SELECT S.*, PNO, QTY
  FROM S, SP 
 WHERE S.SNO = SP.SNO;

** การรวมเข้าด้วยกันแบบสัมพันธ์นั้นไม่ได้เป็น equijoin แต่เป็นการคาดการณ์หนึ่ง - ฟิลิปซี่


การรวมเข้าด้วยกันตามธรรมชาตินั้นไม่ได้เป็น equijoin แต่เป็นการคาดการณ์หนึ่ง SQL natural join เป็น SQL equijoin (ซ้ำกันได้) - มันถูกกำหนดในแง่ของการเข้าร่วมโดยใช้
philipxy

@philipxy: ขอบคุณฉันได้ทำการแก้ไข โปรดแก้ไข - นี่หรือคำตอบใด ๆ ของฉัน - สำหรับการแสดงข้อมูลที่ผิดและการเข้าใจผิด ฉันยังคงเรียนรู้จากคุณ :)
เมื่อ

9

การNATURALเข้าร่วมเป็นเพียงไวยากรณ์สั้น ๆ สำหรับการเข้าร่วมที่เฉพาะเจาะจง INNER - หรือ "การเข้าร่วม equi" - และเมื่อไวยากรณ์ไม่ได้เปิดใช้แล้วทั้งคู่จะเป็นตัวแทนของการดำเนินงานพีชคณิตเชิงสัมพันธ์แบบเดียวกัน มันไม่ใช่ "การเข้าร่วมที่แตกต่าง" เช่นเดียวกับกรณีของOUTER( LEFT/ RIGHT) หรือการCROSSเข้าร่วม

ดูส่วนequi-joinใน Wikipedia:

การเข้าร่วมที่เป็นธรรมชาติมอบความเชี่ยวชาญเพิ่มเติมให้กับ equi-joins เข้าร่วมกริยาเกิดขึ้นโดยปริยายโดยการเปรียบเทียบคอลัมน์ทั้งหมดในตารางทั้งสองที่มีชื่อคอลัมน์เดียวกันในตารางที่เข้าร่วม ตารางการรวมผลลัพธ์มีเพียงหนึ่งคอลัมน์สำหรับแต่ละคอลัมน์ที่มีชื่อเท่ากัน

ผู้เชี่ยวชาญส่วนใหญ่เห็นพ้องกันว่าการเข้าร่วมตามธรรมชาตินั้นมีอันตรายและไม่สนับสนุนการใช้งานของพวกเขาอย่างยิ่ง อันตรายมาจากการเพิ่มคอลัมน์ใหม่โดยไม่ได้ตั้งใจตั้งชื่อเหมือนกับคอลัมน์อื่น ...

นั่นคือการรวมทั้งหมดNATURALอาจถูกเขียนเป็นตัวINNERเชื่อม (แต่การสนทนาไม่เป็นความจริง) ในการทำเช่นนั้นเพียงสร้างภาคแสดงอย่างชัดเจน - USINGหรือON- และตามที่ Jonathan Leffler ชี้ให้เลือกคอลัมน์ชุดผลลัพธ์ที่ต้องการเพื่อหลีกเลี่ยง "ซ้ำ" หากต้องการ

การเข้ารหัสที่มีความสุข


( NATURALคำหลักสามารถนำไปใช้กับLEFTและRIGHTรวมได้เช่นเดียวกันการNATURAL LEFT/RIGHTเข้าร่วมเป็นเพียงไวยากรณ์สั้น ๆ สำหรับการเข้าร่วมที่เฉพาะเจาะจง LEFT/RIGHT )


2
"NATURAL join เป็นเพียงไวยากรณ์สั้น ๆ สำหรับ [snipped]" equi-join "- และเมื่อไวยากรณ์ไม่ได้เปิดออกทั้งคู่จะเป็นตัวแทนของพีชคณิตเชิงสัมพันธ์เดียวกัน" - คุณถูกต้อง: นั่นเป็นเรื่องจริงของพีชคณิตเชิงสัมพันธ์ แต่คำตอบของคุณพังลง หลังจากนั้นเช่น "ผู้เชี่ยวชาญส่วนใหญ่เห็นพ้องกันว่าการเข้าร่วมที่เป็นอันตรายและไม่สนับสนุนการใช้" - ผู้เชี่ยวชาญในพีชคณิตเชิงสัมพันธ์กล่าวว่าอย่างไร?
onedaywhen

2

เข้าร่วมธรรมชาติ: มันคือการรวมหรือผลรวมของคอลัมน์ทั้งหมดในสองตาราง มันจะส่งคืนแถวทั้งหมดของตารางแรกที่เกี่ยวกับตารางที่สอง

Inner Join: การเข้าร่วมนี้จะใช้งานได้หากไม่มีชื่อคอลัมน์ใด ๆ จะเป็น sxame ในสองตาราง


3
ฉันไม่คิดว่าคำตอบของคุณจะชัดเจนเพียงพอและจะเขียนใหม่ขนาดใหญ่เพื่อแก้ไข
เมื่อ

0

การเข้าร่วมแบบธรรมชาติคือตำแหน่งที่มีการรวมตาราง 2 ตารางบนพื้นฐานของคอลัมน์ทั่วไปทั้งหมด

common column: เป็นคอลัมน์ที่มีชื่อเหมือนกันในทั้งสองตาราง + มีประเภทข้อมูลที่เข้ากันได้ในทั้งสองตาราง คุณสามารถใช้ตัวดำเนินการ = เท่านั้น

การรวมภายในคือที่ 2 ตารางจะถูกรวมเข้าด้วยกันบนพื้นฐานของคอลัมน์ทั่วไปที่กล่าวถึงในส่วนคำสั่ง ON

common column: เป็นคอลัมน์ที่มีประเภทข้อมูลที่เข้ากันได้ในทั้งสองตาราง แต่ไม่จำเป็นต้องมีชื่อเดียวกัน คุณสามารถใช้เฉพาะผู้ประกอบการเปรียบเทียบใด ๆ เช่น=, <=, >=, <, >,<>


-2

ความแตกต่างคือการเข้าร่วม int (equi / default) และการเข้าร่วมแบบธรรมชาติที่อยู่ในการเข้าร่วม natuarl คอลัมน์ทั่วไปที่ชนะจะแสดงในครั้งเดียว แต่การเข้าร่วมภายใน / equi / default / ง่ายคอลัมน์ทั่วไปจะแสดงสองครั้ง


-2

การรวมภายในและการเข้าร่วมแบบธรรมชาติเกือบจะเหมือนกัน แต่มีความแตกต่างเล็กน้อยระหว่างพวกเขา ความแตกต่างอยู่ในการเข้าร่วมที่เป็นธรรมชาติไม่จำเป็นต้องระบุเงื่อนไข แต่ในเงื่อนไขการรวมภายในเป็นข้อบังคับ หากเราระบุเงื่อนไขในการรวมภายในตารางผลลัพธ์จะเหมือนกับผลิตภัณฑ์คาร์ทีเซียน


ทำไมไม่จำเป็นต้องระบุเงื่อนไขการเข้าร่วม? ภายใต้สถานการณ์ใดที่จะระบุเงื่อนไขในการเข้าร่วมวงในทำให้เกิดอะไรบางอย่างเช่นผลิตภัณฑ์คาร์ทีเซียน?
onedaywhen

การโทรเข้าร่วมทั้งภายนอกและภายใน "เกือบจะเหมือนกัน" เป็นสิ่งที่พูดน้อยไปหน่อย .. บางทีคุณอาจอธิบายรายละเอียดการประเมินของคุณได้ไหม?
TMOTTM

-3
mysql> SELECT  * FROM tb1 ;
+----+------+
| id | num  |
+----+------+
|  6 |   60 |
|  7 |   70 |
|  8 |   80 |
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
+----+------+
6 rows in set (0.00 sec)

mysql> SELECT  * FROM tb2 ;
+----+------+
| id | num  |
+----+------+
|  4 |   40 |
|  5 |   50 |
|  9 |   90 |
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
+----+------+
6 rows in set (0.00 sec)

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

mysql> SELECT  * FROM tb1 JOIN tb2 ; 
+----+------+----+------+
| id | num  | id | num  |
+----+------+----+------+
|  6 |   60 |  4 |   40 |
|  7 |   70 |  4 |   40 |
|  8 |   80 |  4 |   40 |
|  1 |    1 |  4 |   40 |
|  2 |    2 |  4 |   40 |
|  3 |    3 |  4 |   40 |
|  6 |   60 |  5 |   50 |
|  7 |   70 |  5 |   50 |
|  8 |   80 |  5 |   50 |
.......more......
return 36 rows in set (0.01 sec) 
AND NATURAL JOIN :

    mysql> SELECT  * FROM tb1 NATURAL JOIN tb2 ;
    +----+------+
    | id | num  |
    +----+------+
    |  1 |    1 |
    |  2 |    2 |
    |  3 |    3 |
    +----+------+
    3 rows in set (0.01 sec)

-4

Inner join, เข้าร่วมสองตารางที่ชื่อคอลัมน์เหมือนกัน

การเข้าร่วมแบบธรรมชาติเข้าร่วมสองตารางที่ชื่อคอลัมน์และชนิดข้อมูลเหมือนกัน


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