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


32

ในLearn SQL the Hard Way (แบบฝึกหัดที่หก)ผู้แต่งนำเสนอแบบสอบถามต่อไปนี้:

SELECT pet.id, pet.name, pet.age, pet.dead
    FROM pet, person_pet, person
    WHERE
    pet.id = person_pet.pet_id AND
    person_pet.person_id = person.id AND
    person.first_name = "Zed";

แล้วพูดต่อไปว่า:

จริงๆแล้วมีวิธีอื่น ๆ ในการรับข้อความค้นหาประเภทนี้เพื่อเรียกว่า "เข้าร่วม" ฉันกำลังหลีกเลี่ยงแนวคิดเหล่านี้ในตอนนี้เพราะพวกเขาสับสนอย่างบ้าคลั่ง เพียงแค่ใช้วิธีนี้ในการเข้าร่วมตารางในตอนนี้และไม่สนใจคนที่พยายามบอก [คุณ] ว่านี่ช้ากว่าหรือ "ชนชั้นต่ำ"

มันเป็นเรื่องจริงเหรอ? ทำไมหรือทำไมไม่?


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

6
ฉันต้องการชี้ให้เห็นสัญญาณที่ขัดแย้งกันของการทำงานกับ "The Hard Way" ในชื่อที่ข้ามแนวคิด "เพราะพวกเขาสับสนอย่างบ้าคลั่ง" แต่อาจเป็นเพียงแนวคิดของฉันในสิ่งที่ "วิธีที่ยาก" ควรจะผิด แต่อีกครั้งอาจจะไม่
Mindwin

7
เข้าร่วมส่งผ่านความตั้งใจ (การเข้าร่วมตาราง) เป็นอย่างดีซึ่งทำให้ส่วนของตำแหน่งที่ตัวกรองเกิดขึ้นจริงและทำให้อ่านง่ายขึ้น (นอกจาก maaany นัยอื่น ๆ )
Th 00 mÄ s

2
คุณกำลังเรียนรู้ SQL the Hard Way หากผู้เขียนไม่สามารถใส่ใจที่จะเขียนการเชื่อมต่อแบบง่าย ๆ ได้! ดังที่ ThomasS กล่าวโดยใช้การเข้าร่วมความตั้งใจนั้นชัดเจนยิ่งขึ้นและส่วนคำสั่ง WHERE นั้นเรียบง่ายกว่ามาก นอกจากนี้การใช้ JOIN ยังแสดงให้เห็นถึงทฤษฎีเซตซึ่งเป็นรากฐานของ SQL
Daniel Hollinrake

1
ไม่แน่ใจว่าฉันรู้สึกอย่างไรเกี่ยวกับบางสิ่งบางอย่างที่จะสอนคุณบางสิ่งบางอย่างในขณะที่พูดว่า "แต่เดี๋ยวก่อนเรากำลังจะข้ามแนวคิดพื้นฐานนี้เพราะมันเป็นกล้วย craaazzzyyyy" ฉันคิดว่าฉันจะมองหาแหล่งข้อมูลอื่นเพื่อเรียนรู้จาก ในบางจุดคุณจะต้องทำการรวมภายนอกและการรวมข้ามและควรทราบวิธีการทำ
Maurice Reeves

คำตอบ:


23

ด้วยวิธีการของผู้เขียนการสอน OUTER JOINs นั้นยากกว่ามาก ประโยค ON ของ INNER JOIN นั้นไม่เคยทำให้ฉันประหลาดใจเหมือนกับสิ่งอื่น ๆ มากมาย อาจเป็นเพราะฉันไม่เคยเรียนรู้แบบเก่า ฉันต้องการที่จะคิดว่ามีเหตุผลที่เรากำจัดมันออกไปและมันก็ไม่ควรที่จะทำให้สบายใจและเรียกวิธีนี้ว่าคนชั้นต่ำ

เป็นจริงในสถานการณ์ที่แคบมากที่ผู้เขียนได้สร้าง:

  • รายการระดับของ SQL ที่ใช้ ON นั้นซับซ้อน
  • พิจารณาเฉพาะการเข้าร่วม / เข้าร่วมภายในเท่านั้นไม่ใช่เข้าร่วมนอก
  • coder แยกที่ไม่ต้องอ่านรหัสของผู้อื่นหรือไม่มีคนที่มีประสบการณ์กับการใช้งานการอ่าน / การใช้รหัสของพวกเขา
  • ไม่ต้องการการสืบค้นที่ซับซ้อนที่มีจำนวนมาก: ตาราง, หาก, แต่, และและหรือ

ในฐานะที่เป็นส่วนหนึ่งของความก้าวหน้าในการสอนฉันคิดว่ามันง่ายที่จะทำลายมันและมีความก้าวหน้าตามธรรมชาติ:

Select * from table
select this, something, that from table
select this from table where that = 'this'
select this from table join anothertable on this.id = that.thisid

แนวคิดของการเข้าร่วมและการกรองตารางไม่เหมือนกันจริงๆ การเรียนรู้ไวยากรณ์ที่ถูกต้องในขณะนี้จะมีมากขึ้นที่นำติดตัวมากกว่าเมื่อคุณเรียนรู้ที่เชื่อม outer เว้นแต่ผู้เขียนตั้งใจในสิ่งที่การเรียนการสอนที่ล้าสมัย / *= or =*เลิกชอบ


5
เหตุผลที่เพิ่มคำสั่ง JOIN เนื่องจากไม่มีมาตรฐานสำหรับการแสดงการรวมภายนอกดังนั้นผู้ผลิตฐานข้อมูลแต่ละรายจึงมีไวยากรณ์ "พิเศษ" (เข้ากันไม่ได้) ของตัวเอง IIRC Oracle มี*=หรือ=*ระบุการรวมภายนอกด้านซ้ายหรือขวาอีกอันที่ฉันใช้สนับสนุนการรวมภายนอกด้านซ้ายโดยใช้|=โอเปอเรเตอร์เท่านั้น
TMN

1
@TMN IIRC ออราเคิลใช้หรือบางทีมันอาจจะเป็น+= =+ฉันเชื่อว่า*=เป็น Transact-SQL (Sybase และต่อมา MS-SQL) ยังคงเป็นจุดที่ดี
David

1
จุดที่มันเริ่มซับซ้อน (IMHO) คือเมื่อคุณมีการรวมของการรวมภายในและภายนอก ในสถานการณ์แบบนั้นฉันจะสารภาพว่าบางครั้งฉันก็ถอยกลับไปที่เทคนิค "คนชั้นต่ำ" ในการแสดงการรวมตัวของฉันในWHEREข้อ (ฉันได้ยินสิ่งนี้เรียกว่าการเข้าร่วม thetaแต่ฉันไม่แน่ใจว่ามันถูกต้องหรือไม่)
David

ตัวดำเนินการ IIRC เช่น "มากกว่า" หรือ "เท่ากับ" บางครั้งเรียกว่า "ตัวดำเนินการ theta" แต่การค้นหา google นำไปสู่การดำเนินการบางอย่างในแคลคูลัส
Walter Mitty

12

ไม่ว่าจะช้ากว่านั้นขึ้นอยู่กับเครื่องมือเพิ่มประสิทธิภาพข้อความค้นหาและปรับปรุงการสืบค้น (สิ่งที่คุณเขียนไม่ใช่สิ่งที่ดำเนินการจริง) อย่างไรก็ตามปัญหาใหญ่ของการอ้างนี้คือมันไม่สนใจความจริงที่ว่ามีการเชื่อมประเภทต่าง ๆ ซึ่งทำงานแตกต่างกันโดยสิ้นเชิง ตัวอย่างเช่นสิ่งที่ถูกกล่าวถึงเป็นจริง (ในทางทฤษฎี) จริงinner joinsแต่มันไม่ถือเป็นจริงสำหรับouter joins( left joinsและright joins)


9
+1 สำหรับการเข้าร่วมประเภทอื่น ส่วนใหญ่ของฉันมาร่วมเป็นส่วนหนึ่งหรือINNER JOIN LEFT OUTER JOINพวกเขาไม่ได้ "สับสนอย่างบ้าคลั่ง" SQL สามารถสร้างความสับสนได้อย่างบ้าคลั่ง แต่นี่ไม่ใช่ตัวอย่างของมัน
mgw854

ปิดหัวข้อ แต่คำสั่งที่ควรจะแตกต่างประเภทเข้าร่วมsหรือประเภทของการเข้าร่วม ?
user1451111

9

ผู้เขียนนำเสนอกรณีง่าย ๆ ที่สามารถใช้ไวยากรณ์เก่าหรือใหม่ ฉันไม่เห็นด้วยกับคำสั่งของเขา / เธอที่เข้าร่วมจะสับสนอย่างสับสนเพราะการเข้าร่วมตารางเป็นแนวคิดแบบสอบถาม SQL พื้นฐาน ดังนั้นผู้เขียนอาจใช้เวลาสักครู่ก่อนจะอธิบายว่า JOINS ทำงานอย่างไรก่อนที่จะประกาศข้อความที่มีความเห็นเช่นเดียวกับการทำตัวอย่างแบบสอบถามหลายตาราง

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

  • เลือกเกณฑ์
  • เข้าร่วมเกณฑ์
  • เกณฑ์การกรอง

เมื่อใช้รูปแบบเก่าเกณฑ์การเข้าร่วมและตัวกรองจะรวมกันซึ่งในกรณีที่ซับซ้อนมากขึ้นอาจนำไปสู่ความสับสน

นอกจากนี้หนึ่งสามารถรับผลิตภัณฑ์คาร์ทีเซียนโดยลืมเกณฑ์การเข้าร่วมในข้อกรอง:

 person_pet.person_id = person.id

ใช้ไวยากรณ์ที่เก่ากว่า

การใช้ไวยากรณ์ที่ใหม่กว่ายังระบุว่าการเข้าร่วมควรเกิดขึ้นซึ่งมีความสำคัญกับว่าคุณต้องการ INNER, LEFT OUTER ฯลฯ หรือไม่ดังนั้นจึงมีความชัดเจนมากขึ้นเกี่ยวกับไวยากรณ์ของ JOIN ซึ่ง IMHO เพิ่มการอ่านสำหรับผู้ที่ไม่คุ้นเคยกับตารางการเข้าร่วม


5

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


5

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

โดยการทำjoinไวยากรณ์มันขัดขวางกระบวนการคิดที่มีต่อความสัมพันธ์ที่แข็งแกร่งยิ่งขึ้น และโดยส่วนตัวแล้วฉันพบว่าโค้ดอ่านได้น้อยกว่ามากเมื่อเปรียบเทียบกับตารางและความสัมพันธ์ที่เชื่อมโยงกัน

อย่างน้อยใน MSSQL จะไม่มีความแตกต่างอย่างมีนัยสำคัญในประสิทธิภาพของการค้นหาโดยสมมติว่าคุณใช้การเข้าร่วมแบบเดียวกัน ที่กล่าวว่ามีปัญหาหนึ่งที่ชัดเจนและใหญ่โตกับการเรียนรู้ (และการใช้) SQL ด้วยวิธีนี้ หากคุณลืมความสัมพันธ์ของคุณคุณจะได้รับผลิตภัณฑ์ที่ไม่คาดคิด ซึ่งในฐานข้อมูลที่มีขนาดไม่สำคัญใด ๆ นั้นมีราคาแพง (และเป็นอันตรายสำหรับผู้ที่ไม่ได้เลือก!) มันยากมากที่จะลืมความสัมพันธ์เมื่อใช้joinไวยากรณ์สไตล์


7
มันเป็นฐานข้อมูลเชิงสัมพันธ์ดังนั้นความสัมพันธ์จึงค่อนข้างสำคัญสำหรับการสืบค้น ฉันเองพบว่ามันยากกว่ามากในการทำความเข้าใจกับแบบสอบถามที่ผสมผสานตัวกรองที่แท้จริง (foo.x = 5) เข้ากับความสัมพันธ์ (foo.x = bar.x) เอ็นจิ้นสามารถเพิ่มประสิทธิภาพสิ่งนี้ให้เป็นการเข้าร่วมได้ง่าย แต่มนุษย์เป็นหลักต้องให้เหตุผลเกี่ยวกับมันทีละแถวเมื่อเทียบกับชุดและชุดย่อย
Aaronaught

4

: มีสองด้านที่แตกต่างกันนี้จะต้องพิจารณา ผลการปฏิบัติงานและการบำรุงรักษา / การอ่าน

การบำรุงรักษา / การอ่าน

ฉันเลือกข้อความค้นหาอื่นเนื่องจากเป็นสิ่งที่ฉันคิดว่าเป็นตัวอย่างที่ดีกว่าหรือแย่กว่าแบบสอบถามต้นฉบับที่คุณโพสต์

อะไรที่ดูดีสำหรับคุณและอ่านง่ายขึ้น?

select
    e.LoginID,
    DepartmentName = d.Name
from HumanResources.Employee e
inner join HumanResources.EmployeeDepartmentHistory edh
on e.BusinessEntityID = edh.BusinessEntityID
inner join HumanResources.Department d
on edh.DepartmentID = d.DepartmentID
where d.Name = 'Engineering';

หรือ...

select
    e.LoginID,
    DepartmentName = d.Name
from HumanResources.Employee e, 
HumanResources.EmployeeDepartmentHistory edh,
HumanResources.Department d
where e.BusinessEntityID = edh.BusinessEntityID
and edh.DepartmentID = d.DepartmentID
and d.Name = 'Engineering';

สำหรับฉันเป็นการส่วนตัวคนแรกอ่านได้ค่อนข้างมาก คุณเห็นว่าเรากำลังเข้าร่วมตารางด้วยINNER JOINซึ่งหมายความว่าเรากำลังดึงแถวที่ตรงกับส่วนคำสั่งการรวมภายหลัง (เช่น "เข้าร่วมพนักงานกับ EmployeeDepartmentHistory บน BusinessEntityID และรวมแถวเหล่านั้น")

หลังเครื่องหมายจุลภาคไม่มีความหมายอะไรกับฉัน มันทำให้ฉันสงสัยว่าคุณกำลังทำอะไรกับWHEREประโยคทั้งหมดเหล่านี้

อดีตอ่านเพิ่มเติมเช่นสมองของฉันคิดว่า ฉันดู SQL ทุกวันทุกวันและเครื่องหมายจุลภาคสำหรับการเข้าร่วม ซึ่งนำฉันไปยังจุดต่อไปของฉัน ...

จริงๆแล้วมีวิธีอื่น ๆ ในการทำให้ข้อความค้นหาประเภทนี้ทำงานเรียกว่า "เข้าร่วม"

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

ประสิทธิภาพ

นี่จะขึ้นอยู่กับ RDBMS อย่างแน่นอนที่สุด ฉันสามารถพูดในนามของ Microsoft SQL Server เท่านั้น ประสิทธิภาพที่ชาญฉลาดเหล่านี้เทียบเท่า คุณรู้ได้อย่างไร? จับภาพแผนการดำเนินการหลังการขายและดูว่า SQL Server กำลังทำอะไรสำหรับแต่ละข้อความสั่งนี้:

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

ในภาพด้านบนฉันเน้นว่าฉันใช้ทั้งการสืบค้นข้างต้นแตกต่างกันเฉพาะในตัวอักษรที่ชัดเจนสำหรับการเข้าร่วม ( JOINvs ,) SQL Server ทำสิ่งเดียวกัน

สรุป

อย่าใช้เครื่องหมายจุลภาค ใช้JOINข้อความที่ชัดเจน


ฉันเรียนรู้ INNER JOIN มานานก่อนที่ฉันจะรู้ว่าตัวแปรที่มีคำสั่ง WHERE นั้นเท่ากันและตัวอย่างทั้งสองของคุณนั้นอ่านได้ง่ายมาก ส่วนที่มี WHERE และเครื่องหมายจุลภาคอาจอ่านได้มากกว่า ฉันคิดว่ามันอยู่ที่ไหนในการค้นหาที่ซับซ้อนขนาดใหญ่ไม่ใช่สิ่งที่ค่อนข้างง่าย
Robert Harvey

ประเด็นก็คือการคิดว่ารูปแบบจุลภาคไม่ใช่การรวมเชิงสัมพันธ์ไม่ถูกต้องเลย
Thomas Stringer

ฉันคิดว่าคุณตีความเครื่องหมายจุลภาคไม่ถูกต้องเมื่อเข้าร่วม เครื่องหมายจุลภาคแยกตารางเท่านั้น มันเป็นเงื่อนไขที่สร้างการรวมไม่ใช่เครื่องหมายจุลภาค
Robert Harvey

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

1
ฉันจะบอกว่าคนแรกดีกว่าเพราะความตั้งใจของคุณชัดเจนขึ้น มีความกำกวมน้อยกว่ามาก
Daniel Hollinrake

4

ไม่มันไม่เป็นความจริงเลย ผู้เขียนกำลังตั้งค่าผู้อ่านของเขาสำหรับความสับสนและส่งเสริมการเขียนโปรแกรมสินค้าลัทธิที่หลีกเลี่ยงความแตกต่างของโครงสร้างที่ทรงพลังมากระหว่างไวยากรณ์มาตรฐานและตัวแปรที่เก่ากว่านี้ที่เขาชอบ โดยเฉพาะคำสั่ง WHERE ที่มีความยุ่งเหยิงทำให้ยากต่อการค้นหาสิ่งที่ทำให้การสืบค้นของเขาพิเศษ

ตัวอย่างของเขานำไปสู่ผู้อ่านในการสร้างแผนที่ทางจิตของความหมายของมันที่มีความยุ่งเหยิงจำนวนมาก

SELECT pet.id, pet.name, pet.age, pet.dead
    FROM pet, person_pet, person
    WHERE
    pet.id = person_pet.pet_id AND
    person_pet.person_id = person.id AND
    person.first_name = "Zed";

ประมาณข้างบนคือ:

รับ ID สัตว์เลี้ยง, NAME, AGE และ DEAD สำหรับสัตว์เลี้ยงทั้งหมด, person_pet และบุคคลที่รหัสสัตว์เลี้ยงตรงกับ pet_id ของ person_pet และ person_id ของบันทึกนั้นตรงกับ person_id ของบุคคลที่มี FIRST_NAME "Zed"

ด้วยแผนที่ทางจิตเช่นนั้นผู้อ่าน (ผู้ที่เขียน SQL ด้วยมือด้วยเหตุผลบางอย่าง) อาจทำผิดพลาดได้ง่ายมากโดยอาจข้ามตารางอย่างน้อยหนึ่งตาราง และผู้อ่านของโค้ดที่เขียนในลักษณะนี้จะต้องทำงานหนักขึ้นเพื่อคิดออกว่าผู้เขียน SQL พยายามทำอะไร ("ยากขึ้น" อยู่ในระดับการอ่าน SQL ที่มีหรือไม่มีการเน้นไวยากรณ์ แต่ก็ยังคงมีความแตกต่างมากกว่าศูนย์)

มีเหตุผลว่าทำไม JOIN ถึงเป็นเรื่องธรรมดาและเป็น "การแยกความกังวล" แบบคลาสสิกแบบเก่า โดยเฉพาะอย่างยิ่งสำหรับแบบสอบถาม SQL มีเหตุผลที่ดีที่จะแยกว่าโครงสร้างข้อมูลและวิธีการกรองข้อมูล

หากแบบสอบถามถูกเขียนให้สะอาดกว่าเช่น

SELECT pet.id, pet.name, pet.age
FROM pet
  JOIN person_pet ON pet.id = person_pet.pet_id
  JOIN person ON person.id = person_pet.person_id
WHERE 
  person.first_name = "Zed";

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


แน่นอนระบบฐานข้อมูลที่ทันสมัยใด ๆ ไม่ควรเห็นความแตกต่างที่มีความหมายระหว่างสองสไตล์ แต่ถ้าประสิทธิภาพของฐานข้อมูลเป็นเพียงการพิจารณาแบบสอบถาม SQL จะไม่มีพื้นที่สีขาวหรือตัวพิมพ์ใหญ่


2
เนื่องจากฉันได้ยินสิ่งนี้มาหลายครั้งแล้วให้ฉันเล่นผู้สนับสนุนของปีศาจ เรียนรู้ X วิธีที่ยากคือการมีความลึกด้านเทคนิค ทุกคนที่มีความเข้าใจที่ดีเกี่ยวกับ SQL ควรรู้ว่าทั้งสองวิธีนั้นมีความเท่าเทียมกันในแง่ของผลลัพธ์ที่พวกเขาผลิต
Robert Harvey

1
ฉันเห็นได้ว่า แต่ผู้เขียนไม่เพียง แต่ยืนยันว่ามันเป็นงบที่เทียบเท่ากับเซิร์ฟเวอร์ SQL ที่เหมาะสม พวกเขายืนยันว่าการใช้ JOIN นั้น "สับสน" ซึ่งเป็นเส้นทางที่รหัสสกปรกกำลังรออยู่ ("ไม่ไม่ใช้ LINQ เพียงแค่เขียนคำสั่ง FOR ด้วยมือ" "คอมไพเลอร์ไม่สนใจสิ่งที่ฉันเรียกวิธีนี้ดังนั้นจึงไม่มีเหตุผลที่จะไม่ตั้งชื่อ FN1")
DougM

3

Guy กำลังทำผิดพลาดแบบคลาสสิก เขาพยายามสอนแนวคิดที่เป็นนามธรรมด้วยการใช้งานที่เฉพาะเจาะจง ทันทีที่คุณทำเช่นนั้นคุณจะได้รับความยุ่งเหยิงนี้

ควรสอนแนวคิดเกี่ยวกับฐานข้อมูลพื้นฐานก่อนแล้วจึงแสดง SQL เป็นวิธีหนึ่งในการอธิบาย

การรวมซ้ายและขวาอาจถูกโต้แย้งว่าพวกเขาไม่สำคัญมากนัก ด้านนอกเข้าร่วมดีคุณสามารถใช้เก่า*=และ=*ไวยากรณ์

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


3
"Learn X the Hard Way" เป็นวิธีการเรียนรู้ที่แตกต่างกัน คุณเขียนรหัสแล้วเข้าใจในภายหลัง
Robert Harvey

7
@RobertHarvey นั่นไม่ใช่วิธีการเรียนรู้ที่แตกต่าง แต่เป็นมาตรฐาน ต่อมาจะเกิดขึ้นก็ต่อเมื่อคุณยังคงอยู่ในตำแหน่งเมื่อล้อหลุดออกมา วิธีที่คนจำนวนมากเขียน SQL ที่คิดว่าตารางเป็นอาร์เรย์ของเซลล์รูปสี่เหลี่ยมที่มีความมั่นใจในวิธีการนี้
Tony Hopkinson

2

ตัวอย่างนี้เทียบเท่ากับการปฏิรูปอย่างง่ายกับ JOIN ภายใน ความแตกต่างอยู่ที่ความเป็นไปได้เพิ่มเติมที่ไวยากรณ์ JOIN อนุญาตเท่านั้น ตัวอย่างเช่นคุณสามารถระบุลำดับที่ประมวลผลคอลัมน์ของทั้งสองตารางที่เกี่ยวข้อง เห็นเช่นhttps://stackoverflow.com/a/1018825/259310

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


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

ประสบการณ์ของฉันที่มีผลกระทบต่อประสิทธิภาพคือ: การเข้าร่วมโดยนัยจะช่วยให้ตัวเลือกการเพิ่มประสิทธิภาพการสืบค้นเพิ่มประสิทธิภาพการค้นหาซึ่งอาจดูเหมือนเป็นเรื่องที่ดี แต่อาจเป็นปัญหาได้ โดยเฉพาะอย่างยิ่งเครื่องมือเพิ่มประสิทธิภาพแบบสอบถามอาจปรับแบบสอบถามหนึ่งวิธีในการพัฒนาและอื่น ๆ ในการผลิต เครื่องมือเพิ่มประสิทธิภาพอาจถูกหลอกให้ปรับแต่งซึ่งจะลดประสิทธิภาพ คำแนะนำของฉันคือการใช้ไวยากรณ์การเข้าร่วมที่ชัดเจนและยืนยันว่าการเข้าร่วมนั้นใช้คอลัมน์ที่มีดัชนีซึ่งคาดการณ์ประสิทธิภาพได้
Michael Potter

2

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

มันเป็นความจริงที่ว่าสำหรับ INNER JOIN ทุกครั้งการใช้เครื่องหมายจุลภาคที่เทียบเท่ากับเงื่อนไขการรวมใน WHERE clause สามารถเขียนได้ ฉันใช้เวลาสักครู่ในการย้ายจากการชอบแบบฟอร์มเก่าเพื่อเลือกรูปแบบใหม่ เห็นได้ชัดว่าผู้เขียนการเรียนรู้ SQL the Hard Way ยังคงคิดว่าวิธีเดิมนั้นง่ายกว่า

มีความแตกต่างหรือไม่? ก็ใช่ ประการแรกคือการเข้าร่วมภายในที่มีอนุประโยค ON เผยให้เห็นเจตนาของผู้เขียนชัดเจนกว่าการเข้าร่วมแบบเก่า ความจริงที่ว่าประโยค ON เป็นจริงเงื่อนไขการเข้าร่วมและไม่ จำกัด ชนิดอื่น ๆ จะชัดเจนมากขึ้น สิ่งนี้ทำให้โค้ดที่ใช้ INNER JOIN ง่ายต่อการเรียนรู้เมื่ออ่านมากกว่าแบบเก่า สิ่งนี้สำคัญเมื่อรักษารหัสของบุคคลอื่น

ข้อแตกต่างที่สองคือสไตล์ใหม่ทำให้ง่ายขึ้นเล็กน้อยสำหรับเครื่องมือเพิ่มประสิทธิภาพการสืบค้นเพื่อค้นหากลยุทธ์ที่ชนะ นี่เป็นเอฟเฟกต์เล็ก ๆ น้อย ๆ แต่มันเป็นเรื่องจริง

ข้อแตกต่างที่สามคือเมื่อคุณเรียนรู้การใช้ INNER JOIN (หรือเพียงแค่ JOIN ธรรมดา) มันทำให้การเรียนรู้ LEFT JOIN ง่ายขึ้น ฯลฯ

นอกเหนือจากนั้นไม่มีความแตกต่างที่สำคัญเลย


0

ขึ้นอยู่กับว่าคุณคิดในแง่ของเซตและตรรกะอย่างเป็นทางการ .....

หากคุณไม่ใช้คำหลัก "เข้าร่วม" จะทำให้การดำเนินการง่ายขึ้นจากตรรกะที่เป็นทางการไปยัง SQL

แต่ถ้าชอบ 99% ของผู้คนคุณไม่สนุกกับตรรกะอย่างเป็นทางการในระดับคณิตศาสตร์ของคุณคำหลักเข้าร่วมจะช่วยให้เรียนรู้ได้ง่ายขึ้น SQL เคยถูกนำเสนอที่มหาวิทยาลัยเป็นเพียงวิธีการเขียนคำถามเชิงตรรกะอย่างเป็นทางการ

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