ข้อเสนอ JOIN มีไว้เพื่อประโยชน์ของการเขียนโปรแกรมที่มีไหวพริบ Oracle รองรับประเภทการรวมใน SQL: JOIN และไวยากรณ์การรวม Sql อื่น ๆ

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

การเลือกข้อมูลจากตาราง

เมื่อพิจารณางานในการเลือกข้อมูลหรือเริ่มต้นการดำเนินการ คุณสามารถกำหนดระดับความซับซ้อนของการดำเนินการนี้ได้ ตามกฎแล้ว เมื่อทำงานกับฐานข้อมูลร้ายแรง (สำหรับข้อมูล) ซึ่งสร้างขึ้น เช่น ในร้านค้าออนไลน์หรือบริษัทขนาดใหญ่ การเลือกข้อมูลจะไม่ถูกแยกด้วยตารางเดียว ตามกฎแล้วการเลือกสามารถรวมถึงตารางที่เชื่อมต่อถึงกันจำนวนมากไม่เพียง แต่ยังมีแบบสอบถาม / แบบสอบถามย่อยที่โปรแกรมสร้างขึ้นเองตามงานที่ได้รับมอบหมาย หากต้องการเลือกจากตารางเดียว คุณสามารถใช้โครงสร้างที่ง่ายที่สุด:

เลือก * จากบุคคล

โดยที่ Person คือชื่อของตารางที่จำเป็นในการเลือกข้อมูล

หากคุณต้องการเลือกข้อมูลจากตารางสติกเกอร์ คุณสามารถใช้โครงสร้างมาตรฐานแบบใดแบบหนึ่งเพื่อรวมตารางสติกเกอร์ได้

วิธีการเชื่อมต่อตารางเพิ่มเติม

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

  1. ตัวดำเนินการเข้าร่วมภายใน
  2. Left Join หรือวิธีเขียนแบบอื่น Left Outer Join
  3. ข้ามเข้าร่วม
  4. เข้าร่วมเต็มรูปแบบ

ในทางปฏิบัติ สามารถรับตารางร่วมได้โดยดูที่คำสั่งของตัวดำเนินการ SQL - Inner Join ก้นของ vikoristan นี้จะมองเห็นได้ในลำดับต่อไปนี้:

เลือก * จากบุคคล

ภาษา SQL และตัวดำเนินการ Join Inner Join สามารถใช้ได้ไม่เพียงแต่ในการรวมสองตารางขึ้นไปเท่านั้น แต่ยังรวมถึงการเชื่อมต่อแอปพลิเคชันย่อยอื่น ๆ ซึ่งจะทำให้การทำงานของผู้ดูแลระบบฐานข้อมูลง่ายขึ้นมากและตามกฎแล้วสามารถเร่งความเร็วได้อย่างมาก ไปที่บทสวด vykonanny พับหลังโครงสร้างของตัวอักษร

การรวมข้อมูลในตารางผ่านผู้รับเหมา

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

การออกแบบโครงสร้างเหล่านี้จะขึ้นอยู่กับงานที่กำหนดไว้ก่อนที่ผู้ออกแบบและผลลัพธ์ที่เขาต้องการบรรลุผล

คำอธิบายของตัวดำเนินการ Inner Join

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

หากเราดูโรบ็อตดังกล่าวจากมุมมองของการตีความแบบกราฟิก เราจะเห็นโครงสร้างของตัวดำเนินการ SQL Inner Join ตัวอย่างที่สามารถแสดงไว้ด้านหลังไดอะแกรมต่อไปนี้:

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

ไวยากรณ์ตัวดำเนินการเข้าร่วมภายใน

ตามที่กล่าวไว้ก่อนหน้านี้ ตัวดำเนินการ Inner Join และไวยากรณ์ของตัวมันเองนั้นง่ายมาก ในการจัดระเบียบการเชื่อมต่อระหว่างตารางภายในการเลือกเดียว คุณจะต้องจดจำและใช้หลักการของโครงร่างตัวดำเนินการพร้อมท์ซึ่งเขียนด้วยโค้ดโปรแกรม SQL บรรทัดเดียวและตัวมันเอง:

  • Inner Join [ชื่อตาราง] บน [ฟิลด์คีย์จากตารางที่เชื่อมต่ออยู่] \u003d [ฟิลด์คีย์เชื่อมต่อกับตาราง]

หากต้องการลิงก์ในตัวดำเนินการนี้ จะใช้ตารางคีย์หลัก ตามกฎแล้ว ในตารางกลุ่มที่เก็บข้อมูลเกี่ยวกับชาวต่างชาติ บุคคลและแผนกย่อยที่อธิบายไว้ก่อนหน้านี้ อาจมีบันทึกที่คล้ายกันอย่างน้อยหนึ่งรายการ มาดูรายงาน Inner Join กันดีกว่า แต่มีตัวอย่างคำให้การบางส่วนเกิดขึ้นก่อนหน้านี้

ตัวอย่างและคำอธิบายการเชื่อมต่อก่อนเลือกหนึ่งตาราง

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

อีกตารางหนึ่ง แผนกย่อย จะจัดเก็บข้อมูลเกี่ยวกับแผนกย่อยที่ดาวเทียมทำงาน วอห์นเชื่อมต่อกับฟิลด์ Su_Person เพิ่มเติมด้วยตาราง Person ในแบบของตัวเอง เราควรพูดถึงเรื่องอะไร? จากรูปแบบข้อมูลอาจกล่าวได้ว่าในตารางยาสำหรับผิวหนังรายการจากตาราง "วิญญาณ" จะมีข้อมูลเกี่ยวกับยาที่ใช้งานอยู่ ตามการเชื่อมต่อนี้ ตัวดำเนินการ Inner Join จะถูกนำมาใช้

สำหรับภาพรวมที่ครอบคลุมมากขึ้น มาดูที่ตัวดำเนินการ SQL Inner Join (ใช้รายการนี้กับตารางหนึ่งหรือสองตาราง) หากคุณดูตัวอย่างสำหรับตารางเดียว ทุกอย่างก็ง่ายที่นี่:

เลือก * จากบุคคล

Inner join Subdivision บน Su_Person \u003d Pe_ID

การประยุกต์ใช้การเชื่อมต่อสองตารางและแหล่งจ่ายไฟ

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

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

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

ตัวอย่างการใช้ตัวดำเนินการ Inner Join สำหรับการเลือกตารางจำนวนมาก

คุณจะต้องใช้ชุดการสืบค้นร่วมกันเพื่อเลือกข้อมูลจากตารางและแบบสอบถามย่อยจำนวนมากที่เกี่ยวข้องกัน คุณอาจพอใจกับไวยากรณ์ SQL Inner Join การประยุกต์ใช้งานของผู้ปฏิบัติงานในสถานการณ์นี้อาจมีความซับซ้อนไม่เพียงแต่จากการเลือกจากแหล่งที่มีข้อมูลมากมายสำหรับการบันทึกข้อมูล แต่ยังรวมถึงจากอินพุตจำนวนมากด้วย สำหรับแอปพลิเคชันเฉพาะ คุณสามารถเลือกข้อมูลจากตารางระบบได้ (ตัวดำเนินการ Inner Join SQL) ก้น - โต๊ะ 3 ตัว - ในกรณีนี้แม่จะสร้างโครงสร้างพับ

ส่วนนี้ประกอบด้วยข้อมูลเพิ่มเติมอีกสามรายการ (ก่อนตารางหลัก) และมีการป้อนข้อมูลจำนวนหนึ่งที่เลือกไว้

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

วิสโนวอก

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

พื้นฐานการทอผ้า Prodovzhuye SQLตอนนี้เป็นเวลาที่จะพูดคุยเกี่ยวกับข้อมูล JOIN แบบธรรมดา และวันนี้เราจะมาดูวิธีการรวบรวมข้อมูลเบื้องหลังต้นทุนของผู้ให้บริการกัน เข้าร่วมทางซ้าย, เข้าร่วมทางขวา, เข้าร่วมข้ามและเข้าร่วมภายในกล่าวอีกนัยหนึ่ง เรามาเรียนรู้ที่จะจดวิธีรวมข้อมูล และวิธีรวมทุกอย่างเข้าด้วยกัน

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

บันทึก!แอปพลิเคชันทั้งหมดจะถูกเขียนใน Management Studio SQL Server 2008

เราเรียนรู้พื้นฐานของ SQL มาเป็นเวลานาน และเราเริ่มต้นด้วยคำสั่ง select และมีเนื้อหามากมายในไซต์นี้เกี่ยวกับ SQL เช่น:

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

ให้เราเริ่มต้นด้วยทฤษฎีเล็กๆ

เข้าร่วม- นี่คือการรวมกันของวัตถุฐานข้อมูลตั้งแต่สองตัวขึ้นไปโดยใช้คีย์เดียวหรือคีย์เดียวหรือในเวลาที่มีการรวมข้ามหรือไม่มีคีย์เลย ด้านล่างของออบเจ็กต์จะมีตาราง มุมมอง ฟังก์ชันตารางต่างๆ หรือเพียงแค่โหลด sql ซึ่งเป็นทุกสิ่งที่หมุนเวียนข้อมูลแบบตาราง

การรวมกันของ SQL LEFT และ RIGHT JOIN

เข้าร่วมทางซ้าย- หากเรารวมข้อมูลด้วยปุ่มซ้าย จะได้รับอนุญาต เราจะรวมสองตารางด้วยการรวมซ้าย ซึ่งหมายความว่าข้อมูลทั้งหมดจากอีกตารางหนึ่งจะถูกดึงขึ้นไปที่ตารางแรก และขึ้นอยู่กับการมีอยู่ของคีย์ ค่า NULL จะแสดงขึ้น กล่าวคือ ข้อมูลทั้งหมดจะแสดงจากตารางด้านซ้ายและข้อมูลทั้งหมดบนคีย์จากตารางด้านขวา

เข้าร่วมอย่างถูกต้อง- เช่นเดียวกับ Left Join ข้อมูลทั้งหมดจากตารางด้านขวาจะปรากฏขึ้น และจะแสดงเฉพาะข้อมูลจากตารางด้านซ้ายเท่านั้นที่มีคีย์การรวม

ตอนนี้เรามาดูก้นกันก่อน และสำหรับผู้เริ่มต้น เราจะสร้างตารางขึ้นมา 2 ตาราง:

สร้างตาราง ((18, 0) NULL, (50) NULL) ต่อไป สร้างตาราง ((18, 0) NULL, (50) NULL) ต่อไป

นี่เป็นตารางง่ายๆ และเพื่อประโยชน์นี้ ฉันจึงกรอกข้อมูลต่อไปนี้:

ตอนนี้เรามาเขียนและสืบค้นตารางโดยใช้ปุ่มตัวเลข เป็นครั้งแรกโดยใช้ LEFT:

เลือก t1.number เป็น t1_number, t1.text เป็น t1_text, t2.number เป็น t2_number, t2.text เป็น t2_text จาก test_table t1 LEFT JOIN test_table_2 t2 ON t1.number \u003d t2.number

อย่างที่คุณเห็นข้อมูลทั้งหมดจากตาราง t1 แสดงที่นี่ แต่ไม่ใช่ข้อมูลทั้งหมดจากตาราง t2 เนื่องจากไม่มีแถวที่มีหมายเลข \u003d 4 ที่นั่นนั่นคือสาเหตุที่เพิ่มค่า NULL

จะเกิดอะไรขึ้นหากเราร่วมสามัคคีธรรมและจะเป็นดังนี้:

เลือก t1.number เป็น t1_number, t1.text เป็น t1_text, t2.number เป็น t2_number, t2.text เป็น t2_text จาก test_table t1 RIGHT JOIN test_table_2 t2 ON t1.number \u003d t2.number

กล่าวอีกนัยหนึ่ง แถวทั้งหมดจากตาราง t2 และบันทึกที่เกี่ยวข้องจากตาราง t1 จะถูกแสดง เนื่องจากคีย์ทั้งหมดที่อยู่ในตาราง t2 ก็อยู่ในตาราง t1 เช่นกัน ดังนั้นเราจึงไม่มีค่า NULL

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

เข้าร่วมภายใน- หากบันทึกทั้งหมดจากตารางหนึ่งและบันทึกที่คล้ายกันทั้งหมดจากตารางอื่นแสดงขึ้น และบันทึกเหล่านั้นที่ไม่อยู่ในตารางใดตารางหนึ่งจะไม่แสดงขึ้น จะแสดงเฉพาะบันทึกที่ตรงกับคีย์เท่านั้น ก่อนจะพูดผมจะบอกทันทีว่า Inner Join ก็เหมือนกับการ Join ที่ไม่มี Inner ก้น:

เลือก t1.number เป็น t1_number, t1.text เป็น t1_text, t2.number เป็น t2_number, t2.text เป็น t2_text จาก test_table t1 INNER JOIN test_table_2 t2 บน t1.number \u003d t2.number

ทีนี้ลองรวมตารางของเราโดยใช้สองคีย์ ซึ่งเราจะหาวิธีเพิ่มคอลัมน์ลงในตารางและวิธีอัปเดตข้อมูลผ่านการอัปเดต เนื่องจากตารางของเรามีเพียงสองคอลัมน์เท่านั้น และการรวมด้วยฟิลด์ข้อความอาจไม่ใช่ ดี. สำหรับคอลัมน์นี้:

แก้ไขตาราง test_table เพิ่มหมายเลข 2 INT แก้ไขตาราง test_table_2 เพิ่มหมายเลข 2 INT

นี่คือข้อมูลของเรา เพียงใส่ค่า 1 ลงในคอลัมน์หมายเลข 2:

อัปเดต test_table SET หมายเลข 2 \u003d 1 UPDATE test_table_2 SET หมายเลข 2 \u003d 1

และลองเขียนสองคีย์รวมกัน:

เลือก t1.number เป็น t1_number, t1.text เป็น t1_text, t2.number เป็น t2_number, t2.text เป็น t2_text จาก test_table t1 เข้าร่วมภายใน test_table_2 t2 ON t1.number \u003d t2.number และ t1.number2 \u003d t2.number2

ผลลัพธ์จะเหมือนกับในตัวอย่างก่อนหน้า:

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

อัปเดต test_table_2 ตั้งหมายเลข 2 \u003d 2 โดยที่หมายเลข \u003d 1

ถามสิ่งเดียวกันและผลลัพธ์คือ:

คุณรู้ไหมว่าตามคีย์อื่นเราไม่เห็นแถวเดียว

เข้าร่วม SQL CROSS

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

เลือก t1.number เป็น t1_number, t1.text เป็น t1_text, t2.number เป็น t2_number, t2.text เป็น t2_text จาก test_table t1 CROSS JOIN test_table_2 t2

ที่นี่ แต่ละแถวในตาราง test_table จะคล้ายกับแถวในตาราง test_table_2 ดังนั้นในตาราง test_table เรามี 4 แถว และในตาราง test_table_2 มี 3 แถว 4 คูณ 3 และจะเป็น 12 เนื่องจากเรามี 12 แถว

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

เลือก t1.number เป็น t1_number, t1.text เป็น t1_text, t2.number เป็น t2_number, t2.text เป็น t2_text, t3.number เป็น t3_number, t3.text เป็น t3_text, t4.number เป็น t4_number, t4.text เป็น t4_text จาก test_table t1 LEFT JOIN test_table_2 t2 บน t1.number \u003d t2.number RIGHT JOIN test_table_2 t3 บน t1.number \u003d t3.number เข้าร่วมภายใน test_table_2 t4 บน t1.number \u003d t4.number

ดังที่คุณทราบ ฉันจะไปทางซ้าย ไปทางขวา และด้านในอย่างเรียบง่าย เพื่อให้มันทั่วทุกแห่ง

ฉันคิดว่าฉันจะทานอาหารให้เสร็จ ไม่มีอะไรซับซ้อนไปกว่านี้อีกแล้ว อย่างไรก็ตาม การเรียนรู้ SQL ยังไม่เสร็จสมบูรณ์ในบทความต่อๆ ไป แต่ในระหว่างนี้ ให้ฝึกฝนและเขียนคำสั่งของคุณ ขอให้โชคดี!

Oracle รองรับประเภทการเชื่อมต่อหลายประเภท ซึ่งแบ่งออกในลักษณะที่รวมแถวจากตารางหรือการประกาศตั้งแต่สองตารางขึ้นไป โพสต์ในบล็อกนี้จะอธิบายประเภทของการเชื่อมต่อที่เกิดขึ้นบ่อยที่สุดใน Oracle

การเชื่อมต่อที่เท่าเทียมกัน

ใน equi-join ตารางตั้งแต่ 2 ตารางขึ้นไปจะรวมกันบนพื้นฐานของความเท่าเทียมกันระหว่างคู่ค้า กล่าวอีกนัยหนึ่ง แนวคิดเดียวกันมีความหมายเหมือนกันในทุกตาราง ก้นของการเชื่อมต่อที่เท่ากันจะชี้ต่ำลง:

SQL\u003e SELECT e.last_name, d.dept จาก emp e, dept d WHERE e.emp_id \u003d d.emp_id;

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

SQL\u003e SELECT e.last_name, d.dept จาก emp e เข้าร่วม dept d การใช้ (emp_id);

หากคุณต้องการเชื่อมต่อกลุ่มซัพพลายเออร์ คุณสามารถจัดเรียงชื่อของพวกเขาใหม่ในมุมมองรายการที่คั่นด้วยโคม่า เช่น: USING (dept_id, emp_name)

สภาพแวดล้อมทางธรรมชาติ

การรวมแบบธรรมชาติเรียกว่า equi-joins และส่วนคำสั่งใดๆ ที่จำเป็นสำหรับการเชื่อมต่อไม่ได้ระบุไว้โดยเฉพาะ Oracle จะกำหนดคอลัมน์ที่รวมเข้ากับตารางของคอลัมน์ที่ตรงกันในสองตารางโดยอัตโนมัติ ก้นของการเชื่อมต่อตามธรรมชาติชี้ต่ำลง:

SQL\u003e SELECT e.last_name, d.dept จาก emp e NATURAL JOIN dept d;

ในกรณีนี้ แนวคิดที่ดีที่สุดสำหรับการเชื่อมต่อนี้คือการมีค่าที่เหมือนกันในคอลัมน์ Last_name ในตาราง emp และ dept

การเชื่อมต่อแบบสะท้อนกลับ

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

SQL\u003e ลบจากพนักงาน X WHERE ROWID\u003e 2 (เลือก MIN (แถว) จากพนักงาน Y 3 โดยที่ X.key_values ​​​​\u200b\u200b\u003d Y.key_values);

การเชื่อมต่อภายใน

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

SQL\u003e SELECT e.flast_name, d.dept จาก emp e, dept d WHERE e.emp_id \u003d d.emp_id;

ตอนนี้ Oracle อนุญาตให้คุณตั้งค่าเกณฑ์การเชื่อมต่อในรูปแบบการเชื่อมต่อภายใน (หรือแบบธรรมดา) โดยใช้โครงสร้าง ON หรือ USING ตัวอย่างเช่น:

SQL\u003e SELECT DISTINCT NVL (dname, "No Dept"), COUNT (empno) nbr_emps จาก emp เข้าร่วม DEPT ON emp.deptno \u003d dept.deptno WHERE emp.job IN ( "MANAGER", "SALESMAN", "ANALYST" ) จัดกลุ่มตามชื่อ;

การเชื่อมต่อภายนอก

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

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

  • สคีมาตารางผลลัพธ์จะรวมส่วนของตารางเอาต์พุตทั้งสองตาราง (ตารางตัวถูกดำเนินการ) ในขณะที่สคีมาผลลัพธ์จะรวม “ชิ้นส่วน” ของสคีมาตัวถูกดำเนินการ
  • แต่ละแถวของตารางผลลัพธ์ประกอบด้วยแถว “แบบกลุ่ม” จากตารางตัวถูกดำเนินการหนึ่งตารางพร้อมกับแถวจากตารางตัวถูกดำเนินการอื่น

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

หากจำเป็นต้องรวมตารางไม่ใช่สองตารางแต่หลายตาราง การดำเนินการรวมจะเสร็จสิ้นหลายครั้ง (ติดต่อกัน)

คำอธิบายตัวดำเนินการ

เลือกฟิลด์ [... n] จาก Table1 (ภายใน | (ซ้าย | ขวา | เต็ม) ด้านนอก | CROSS) เข้าร่วม Table2 ON< condition>

ใน DBMS ส่วนใหญ่ เมื่อระบุคำว่า LEFT, RIGHT, FULL คำว่า OUTER สามารถละเว้นได้ คำว่า INNER สามารถละเว้นได้ใน DBMS ส่วนใหญ่

ในเวอร์ชันตามตัวอักษรของ DBMS เมื่อ vikonannya การเชื่อมต่อจะตรวจสอบจิตใจ (ภาคแสดง) เงื่อนไข- สำหรับ CROSS JOIN ไม่จำเป็นต้องมีสมอง

ในการดำเนินการ Cartesian CROSS JOIN การใช้งาน SQL บางอย่างจะใช้ตัวดำเนินการโคม่า ( , ):

เลือกฟิลด์ [... n] จาก Table1, Table2

ดูตัวดำเนินการ JOIN

เพื่อความชัดเจนเพิ่มเติม จะใช้ตารางต่อไปนี้:

ผู้ที่อาศัยอยู่ในชุมชน (ตารางบุคคล)

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

ตัวดำเนินการ ที่ได้รับจากภายใน INNER JOIN รวมสองตารางเข้าด้วยกัน ลำดับของตารางสำหรับตัวดำเนินการนั้นไม่สำคัญ เนื่องจากตัวดำเนินการมีความสมมาตร

หัวเรื่องการต่อข้อมูล

ร่างกายมันสมเหตุสมผลที่ผลลัพธ์จะออกมาในลักษณะนี้ แถวเดียวกันของตารางหนึ่งถูกวางไว้กับแถวเดียวกันของอีกตารางหนึ่ง หลังจากนั้นจะมีการตรวจสอบการเชื่อมต่อทางจิตสำหรับแถว "เข้าร่วม" ที่เลือก (คำนวณภาคแสดงการเชื่อมต่อ) เท่าที่ฉันสามารถบอกได้ ตารางผลลัพธ์จะเพิ่มแถว “ที่มีอยู่” ที่สอดคล้องกัน

คำอธิบายของอัลกอริธึมเป็นไปตามตรรกะอย่างเคร่งครัด ดังนั้นจึงอธิบายเฉพาะผลลัพธ์ที่ต้องยุติระหว่างการดำเนินการของการดำเนินการ แทนที่จะลงโทษ DBMS เฉพาะสำหรับการดำเนินการให้เสร็จสิ้นในลักษณะที่เหมาะสม ไม่มีวิธีใดที่จะใช้การดำเนินการรวมได้ เช่น ลูปแบบซ้อน ห่วงด้านในเข้าร่วม), เชื่อมต่อกับแฮช (ภาษาอังกฤษ) แฮชเข้าร่วม), Z'ednannya zlittyam (อังกฤษ. รวมเข้าร่วม- เป้าหมายเดียวคือการใช้งานใด ๆ จะให้ผลลัพธ์แบบลอจิคัลเหมือนกับว่ามีการใช้อัลกอริธึมที่อธิบายไว้

SELECT * จากบุคคล INNER JOIN เมืองต่อบุคคล CityId \u003d เมือง บัตรประจำตัวประชาชน

ผลลัพธ์:

บุคคล.ชื่อ Person.CityId เมืองรหัส เมือง.ชื่อ
อังเดร 1 1 มอสโก
ลีโอนิด 2 2 เซนต์ปีเตอร์สเบิร์ก
เซอร์กี้ 1 1 มอสโก

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

การรวมกันของสองตารางส่งผลให้แถวของตารางใดตารางหนึ่งหรือทั้งสองตารางถูกรวมไว้ในลำดับทางภาษา

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

ตัวดำเนินการ เหลือการเชื่อมต่อภายนอก LEFT OUTER JOIN รวมสองตารางเข้าด้วยกัน ลำดับของตารางสำหรับผู้ปฏิบัติงานมีความสำคัญ เนื่องจากตัวดำเนินการไม่สมมาตร

หัวเรื่องตารางผลลัพธ์และส่วนหัวที่รวมกัน (ต่อกัน) จะสร้างตาราง

ร่างกาย พี.

  1. พี.
  2. จากนั้น ผลลัพธ์จะถูกเพิ่มลงในบันทึกของตารางด้านซ้ายที่ไม่รวมอยู่ในการเชื่อมต่อภายในในขั้นตอนที่ 1 สำหรับบันทึกดังกล่าว เขตข้อมูลในตารางด้านขวาจะเต็มไปด้วยค่า โมฆะ.

เลือก * จากบุคคล ซ้าย เข้าร่วมเมืองด้วยตนเอง CityId \u003d เมือง บัตรประจำตัวประชาชน

ผลลัพธ์:

บุคคล.ชื่อ Person.CityId เมืองรหัส เมือง.ชื่อ
อังเดร 1 1 มอสโก
ลีโอนิด 2 2 เซนต์ปีเตอร์สเบิร์ก
เซอร์กี้ 1 1 มอสโก
เกรกอรี 4 โมฆะ โมฆะ

เข้าร่วมด้านนอกที่ถูกต้อง

ตัวดำเนินการ การเชื่อมต่อด้านนอกด้านขวา RIGHT OUTER JOIN รวมสองตาราง ลำดับของตารางสำหรับผู้ปฏิบัติงานมีความสำคัญ เนื่องจากตัวดำเนินการไม่สมมาตร

หัวเรื่องตารางผลลัพธ์และส่วนหัวที่รวมกัน (ต่อกัน) จะสร้างตาราง

ร่างกายมันสมเหตุสมผลที่ผลลัพธ์จะเป็นรูปเป็นร่างในลักษณะนี้ มาเชื่อมตารางซ้ายและขวาตามภาคแสดง (ทางจิต) พี.

  1. ผลลัพธ์รวมถึงการรวมภายใน (INNER JOIN) ของตารางด้านซ้ายและขวาตามเพรดิเคต พี.
  2. จากนั้นผลลัพธ์จะถูกเพิ่มลงในบันทึกเหล่านั้นในตารางด้านขวาซึ่งไม่ได้รวมอยู่ในการเชื่อมต่อภายในในขั้นตอนที่ 1 สำหรับบันทึกดังกล่าว เขตข้อมูลในตารางด้านซ้ายจะเต็มไปด้วยค่า โมฆะ.

เลือก * จากบุคคลด้านขวาเข้าร่วมเมืองด้วยตนเอง CityId \u003d เมือง บัตรประจำตัวประชาชน

ผลลัพธ์:

บุคคล.ชื่อ Person.CityId เมืองรหัส เมือง.ชื่อ
อังเดร 1 1 มอสโก
เซอร์กี้ 1 1 มอสโก
ลีโอนิด 2 2 เซนต์ปีเตอร์สเบิร์ก
โมฆะ โมฆะ 3 คาซาน

เข้าร่วมด้านนอกเต็มรูปแบบ

ตัวดำเนินการ การเชื่อมต่อภายนอกแบบถาวร FULL OUTER JOIN รวมสองตารางเข้าด้วยกัน ลำดับของตารางสำหรับตัวดำเนินการนั้นไม่สำคัญ เนื่องจากตัวดำเนินการมีความสมมาตร

หัวเรื่องตารางผลลัพธ์และส่วนหัวที่รวมกัน (ต่อกัน) จะสร้างตาราง

ร่างกายมันสมเหตุสมผลที่ผลลัพธ์จะเป็นรูปเป็นร่างในลักษณะนี้ ให้ตารางแรกและตารางอื่นต่อกันด้วยภาคแสดง (ในใจคุณ) พี- คำว่า "อันดับแรก" และ "อื่นๆ" ในที่นี้ไม่ได้ระบุลำดับในบันทึก (ซึ่งไม่สำคัญ) แต่ใช้เพื่อแยกตารางเท่านั้น

  1. เป็นผลให้การรวมภายใน (INNER JOIN) ของตารางแรกและตารางอื่น ๆ ถูกรวมไว้ตามเพรดิเคต พี.
  2. ด้วยเหตุนี้ เรกคอร์ดเหล่านั้นของตารางแรกจะถูกเพิ่มซึ่งไม่ได้รวมอยู่ในการเชื่อมต่อภายในในขั้นตอนที่ 1 สำหรับเรกคอร์ดดังกล่าว ฟิลด์ที่เกี่ยวข้องกับตารางอื่นจะถูกเติมด้วยค่า โมฆะ.
  3. ด้วยเหตุนี้ เรกคอร์ดเหล่านั้นจะถูกเพิ่มลงในตารางอื่นที่ไม่รวมอยู่ในการเชื่อมต่อภายในในขั้นตอนที่ 1 สำหรับเรกคอร์ดดังกล่าว ฟิลด์ที่สอดคล้องกับตารางแรกจะถูกเติมด้วยค่า โมฆะ.

SELECT * จากบุคคล เข้าร่วมด้านนอกแบบเต็มเมืองต่อบุคคล CityId \u003d เมือง บัตรประจำตัวประชาชน

ผลลัพธ์:

บุคคล.ชื่อ Person.CityId เมืองรหัส เมือง.ชื่อ
อังเดร 1 1 มอสโก
เซอร์กี้ 1 1 มอสโก
ลีโอนิด 2 2 เซนต์ปีเตอร์สเบิร์ก
โมฆะ โมฆะ 3 คาซาน
เกรกอรี 4 โมฆะ โมฆะ

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

ตัวดำเนินการ การเชื่อมต่อข้าม, หรือ สร้างคาร์ทีเซียน CROSS JOIN รวมสองตาราง ลำดับของตารางสำหรับตัวดำเนินการนั้นไม่สำคัญ เนื่องจากตัวดำเนินการมีความสมมาตร

หัวเรื่องตารางผลลัพธ์และส่วนหัวที่รวมกัน (ต่อกัน) จะสร้างตาราง

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

เลือก * จากบุคคล CROSS JOIN เมือง

SELECT * จากบุคคล, เมือง

ผลลัพธ์:

บุคคล.ชื่อ Person.CityId เมืองรหัส เมือง.ชื่อ
อังเดร 1 1 มอสโก
อังเดร 1 2 เซนต์ปีเตอร์สเบิร์ก
อังเดร 1 3 คาซาน
ลีโอนิด 2 1 มอสโก
ลีโอนิด 2 2 เซนต์ปีเตอร์สเบิร์ก
ลีโอนิด 2 3 คาซาน
เซอร์กี้ 1 1 มอสโก
เซอร์กี้ 1 2 เซนต์ปีเตอร์สเบิร์ก
เซอร์กี้ 1 3 คาซาน
เกรกอรี 4 1 มอสโก
เกรกอรี 4 2 เซนต์ปีเตอร์สเบิร์ก
เกรกอรี 4 3 คาซาน

หากในส่วนคำสั่ง WHERE คุณเพิ่มการรวมจิต จากนั้นเชื่อมต่อ tuples ผลลัพธ์จะเทียบเท่ากับการดำเนินการ INNER JOIN ด้วยแนวคิดเดียวกัน:

ดังนั้น CROSS JOIN + WHERE ( ภาคแสดง) ฉันเข้าร่วมภายใน ( ภาคแสดง) รูปแบบการบันทึกทางวากยสัมพันธ์และทางเลือกและการดำเนินการเชิงตรรกะเดียวกันสำหรับการรับภายใน ไวยากรณ์ CROSS JOIN + WHERE สำหรับการดำเนินการ JOIN เรียกว่าล้าสมัย เนื่องจากมาตรฐาน SQL ANSI ไม่แนะนำ

หมายเหตุ

โปซิลันยา

  • คำอธิบายของประเภทการรวมใน Oracle (ภาษารัสเซีย)
  • Jeff Atwood คำอธิบายภาพของการเข้าร่วม SQL

ตัวดำเนินการ SQL JOIN ใช้เพื่อรวมตารางฐานข้อมูลตั้งแต่ 2 ตารางขึ้นไป ตัวดำเนินการนี้ใช้ในฐานข้อมูลเชิงสัมพันธ์เท่านั้น ฐานข้อมูลเชิงสัมพันธ์ JOIN นั้นมีฟังก์ชันการทำงานในระดับสูง เนื่องจากไม่เพียงแต่อนุญาตให้จัดเก็บข้อมูลเท่านั้น แต่ยังรวมถึงการวิเคราะห์แบบสอบถามที่ง่ายที่สุดอีกด้วย มาดูความแตกต่างพื้นฐานของการเขียนคำสั่ง SQL ด้วยตัวดำเนินการ JOIN ซึ่งเป็นพื้นฐานของ DBMS (ระบบการจัดการฐานข้อมูล) ทั้งหมด ในการรวมสองตาราง ตัวดำเนินการ SQL JOIN จะใช้ไวยากรณ์ต่อไปนี้:

เลือก COLUMN_NAMES (1..N) จาก TABLE_NAME_1 เข้าร่วม TABLE_NAME_2 บนจิต

หลังจากคำสั่งตั้งแต่หนึ่งคำสั่งขึ้นไป ตัวดำเนินการ JOIN สามารถตามหลังด้วยคำสั่งย่อย WHERE หรือ HAVING ที่ไม่บังคับ ซึ่งเหมือนกับคำสั่ง SELECT ทั่วไป ที่จะระบุจุดประสงค์ในการเลือก มาตรฐานสำหรับ DBMS ทั้งหมดคือสิ่งที่ในการออกแบบนี้ การแทนที่ JOIN สามารถกำหนดให้ INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN, CROSS JOIN (หรือเป็นตัวเลือก โคม่า)

INNER JOIN (การเชื่อมต่อภายใน)

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

ทำเช่นเดียวกันและเพียงแค่เข้าร่วม ในลักษณะนี้ คำว่า INNER ไม่ใช่ obov'yazkova

ก้น 1.ฐานข้อมูลของพอร์ทัลนั้นน่าทึ่งมาก โดยมีหมวดหมู่ของตาราง (หมวดหมู่โดยทั่วไป) และส่วนต่างๆ (ส่วนต่างๆ หรืออย่างอื่น - ส่วนหัวที่เกี่ยวข้องกับหมวดหมู่) ตัวอย่างเช่น ชิ้นส่วนอพาร์ทเมนท์และกระท่อมจะรวมอยู่ในหมวดหมู่การขัดขืนไม่ได้ และชิ้นส่วนรถยนต์และรถจักรยานยนต์จะรวมอยู่ในหมวดหมู่การขนส่ง ตารางที่มีการกรอกข้อมูลเหล่านี้มีลักษณะเช่นนี้

ตารางชิ้นส่วน:

โปรดทราบว่าในตารางอะไหล่หนังสือมี Cat - ข้อความสำหรับหมวดหมู่ซึ่งไม่ได้อยู่ในตารางหมวดหมู่และในตารางหมวดหมู่อุปกรณ์มี Cat_ID - คีย์หลักซึ่งเป็นข้อความที่ไม่ได้อยู่ในตารางชิ้นส่วน . จำเป็นต้องรวมข้อมูลจากทั้งสองตารางนี้เพื่อให้ฟิลด์ส่วน (ส่วนหนึ่ง), แมว (หมวดหมู่) และราคา (ราคาส่ง) ในตารางผลลัพธ์อยู่ในตารางผลลัพธ์ และเพื่อให้ข้อมูลไหลอยู่เบื้องหลังอย่างสมบูรณ์ . Umova - เลี่ยงรหัสหมวดหมู่ในตารางหมวดหมู่ และส่งไปยังหมวดหมู่ในตารางชิ้นส่วน เราเขียนวลีที่ไม่เหมาะสมเพื่อใคร:

เลือก PARTS.Part, CATEGORIES.Cat_ID AS Cat, CATEGORIES.Price จากชิ้นส่วนภายในเข้าร่วมหมวดหมู่บน PARTS.Cat \u003d CATEGORIES.Cat_ID

ส่วนหนึ่งแมวราคา
อพาร์ทเมน505 210,00
ยานยนต์205 160,00
บอร์ด10 105,00
ชาฟี30 77,00

ตารางผลลัพธ์ไม่มีหนังสือ เนื่องจากเรกคอร์ดนี้ถูกกำหนดให้กับหมวดหมู่ซึ่งไม่รวมอยู่ในตารางหมวดหมู่ และเทคนิค เนื่องจากเรกคอร์ดนี้ถูกกำหนดให้กับคีย์ต่างประเทศในตารางหมวดหมู่ ซึ่งไม่รวมอยู่ในส่วนต่างๆ โต๊ะ.

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

Є ฐานข้อมูล "โรงละคร" ตารางการเล่นมีข้อมูลเกี่ยวกับการผลิต ตารางทีมเป็นเรื่องเกี่ยวกับบทบาทของนักแสดง ตารางนักแสดงเป็นเรื่องเกี่ยวกับนักแสดง โต๊ะผู้กำกับ - เกี่ยวกับกรรมการ ช่องตาราง คีย์หลักและคีย์รองสามารถเลื่อนให้ต่ำลงได้เล็กน้อย (หากต้องการแรงกดมากขึ้น ให้กดปุ่มซ้ายของเมาส์)


ก้น 3.กรอกรายชื่อนักแสดงที่เล่นมากกว่าหนึ่งบทบาทในนิทรรศการเดียว และหลายบทบาท

ตัวดำเนินการ JOIN vikoristuvati 1 ครั้ง vikorystuvati มี, จัดกลุ่มตาม .

คำใบ้. คำสั่ง HAVING ถูกจำกัดจำนวนบทบาทที่ครอบคลุมโดยฟังก์ชันรวม COUNT

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

ค้นหาด้วยตัวดำเนินการ LEFT OUTER JOIN ค่าสำหรับตารางที่รวมและแสดงตารางผลลัพธ์ซึ่งข้อมูลเป็นไปตามที่ระบุหลังจากเปิดโดยสมบูรณ์และเสริมด้วยบันทึกจากตารางแรกตามลำดับ (ซ้าย) เนื่องจาก กลิ่นเหม็นไม่สะท้อนถึงจิตใจ สำหรับรายการในตารางด้านซ้ายที่ไม่สะท้อนถึงความฉลาด ค่าในตารางด้านขวาจะเป็น NULL (ไม่มีนัยสำคัญ)

ก้น 4.ฐานข้อมูลและตารางเหมือนกับในแอปพลิเคชัน 1

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

เลือก PARTS.Part, CATEGORIES.Cat_ID AS Cat, CATEGORIES.Price จากส่วนซ้าย OUTER เข้าร่วมหมวดหมู่บน PARTS.Cat \u003d CATEGORIES.Cat_ID

ผลลัพธ์จะเป็นตารางต่อไปนี้:

ส่วนหนึ่งแมวราคา
อพาร์ทเมน505 210,00
ยานยนต์205 160,00
บอร์ด10 105,00
ชาฟี30 77,00
หนังสือ160 โมฆะ

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

เข้าร่วมด้านนอกที่ถูกต้อง

ค้นหาด้วยตัวดำเนินการ RIGHT OUTER JOIN ค่าสำหรับตารางที่รวมและแสดงตารางผลลัพธ์ซึ่งข้อมูลจะตามมาด้วยข้อมูลที่ระบุหลังจาก ON และเสริมด้วยบันทึกจากตารางอื่นตามลำดับ (ขวา) กลิ่นเหม็น ไม่ได้บันทึกอยู่ในใจ สำหรับรายการในตารางด้านขวาซึ่งไม่ได้แสดงถึงความคิด ค่าในตารางด้านซ้ายจะเป็น NULL (ไม่มีนัยสำคัญ)

ก้น 5.

หากต้องการแยกตารางผลลัพธ์ ซึ่งข้อมูลจากสองตารางถูกย้ายไปด้านหลังส่วนหัวอย่างสมบูรณ์ และเสริมด้วยข้อมูลจากตารางหมวดหมู่ซึ่งไม่ตรงกับความคิด ให้เขียนแบบสอบถามต่อไปนี้:

เลือก PARTS.Part, CATEGORIES.Cat_ID AS Cat, CATEGORIES.Price จากชิ้นส่วนด้านขวาเข้าร่วมหมวดหมู่ด้านนอกบน PARTS.Cat \u003d CATEGORIES.Cat_ID

ผลลัพธ์จะเป็นตารางต่อไปนี้:

ส่วนหนึ่งแมวราคา
อพาร์ทเมน505 210,00
ยานยนต์205 160,00
บอร์ด10 105,00
ชาฟี30 77,00
โมฆะ45 65,00

ในตารางผลลัพธ์ ดังที่เห็นในตารางจากเอกสารแนบ 1 มีบันทึกที่มีหมวดหมู่ 45 และราคา 65.00 และค่าชิ้นส่วนเป็น NULL เนื่องจากบันทึกนี้มีตัวระบุหมวดหมู่ จึงไม่มีข้อความใน ตารางอะไหล่.

เข้าร่วมภายนอกแบบเต็ม (การเชื่อมต่อภายนอก)

ค้นหาด้วยตัวดำเนินการ FULL OUTER JOIN ค่าสำหรับตารางที่รวมและแสดงตารางผลลัพธ์ซึ่งข้อมูลเป็นไปตามบรรทัดที่ระบุหลังจากเปิดโดยสมบูรณ์และเสริมด้วยบันทึกจากตารางแรก (ซ้าย) และตารางอื่น ๆ (ขวา) โอ้ มันเป็นเพราะกลิ่นเหม็นไม่ตรงกับใจ บันทึกที่ไม่ตรงกับความคิดจะมีค่าคอลัมน์ในตารางอื่นที่เป็นโมฆะ

ก้น 6.ฐานข้อมูลและตารางเหมือนกับในแอปพลิเคชันก่อนหน้า

หากต้องการแยกตารางผลลัพธ์ ซึ่งทั้งสองตารางถูกย้ายไปด้านหลังศีรษะอย่างสมบูรณ์ และเสริมด้วยข้อมูลจากทั้งตารางส่วนและตารางหมวดหมู่ ซึ่งไม่สอดคล้องกับความคิด ให้เขียนแบบสอบถามต่อไปนี้:

เลือก PARTS.Part, CATEGORIES.Cat_ID AS Cat, CATEGORIES.Price จากส่วนเต็ม OUTER JOIN CATEGORIES บน PARTS.Cat \u003d CATEGORIES.Cat_ID

ผลลัพธ์จะเป็นตารางต่อไปนี้:

ส่วนหนึ่งแมวราคา
อพาร์ทเมน505 210,00
ยานยนต์205 160,00
บอร์ด10 105,00
ชาฟี30 77,00
หนังสือ160 โมฆะ
โมฆะ45 65,00

ตารางผลลัพธ์มีรายการหนังสือ (จากตารางด้านซ้าย) และหมวดหมู่ 45 (จากตารางด้านขวา) และรายการแรกมีราคาที่ไม่ทราบ (ในตารางด้านขวา) และอีกรายการมีส่วนที่ไม่รู้จัก (ในตารางด้านซ้าย) ).

ตารางจะเข้าร่วมด้วยนามแฝง

ในคำถามหน้า เราระบุชื่อประเภทอนุประโยคจากตารางต่างๆ และชื่อของตารางเหล่านี้ ข้อความดังกล่าวดูยุ่งยาก: คำเดียวกันซ้ำหลายครั้ง เป็นไปได้ไหมที่จะให้อภัยการออกแบบ? ปรากฏว่าเป็นไปได้ เพื่อจุดประสงค์นี้ ให้ใช้นามแฝงในตาราง - ชื่อย่อ ชื่อของ koristuvach สามารถเกิดขึ้นได้จากตัวอักษรตัวเดียว เป็นไปได้ที่จะมีตัวอักษรหลายตัวในนามแฝงชื่อแบรนด์เพื่อว่าหลังจากนั้นไม่นานคุณก็จะเข้าใจได้ชัดเจน กฎต่อไปนี้: ในส่วนรายการเริ่มต้น ถัดจากคำว่า JOIN คุณต้องป้อนชื่อตารางเพิ่มเติม และแต่ละชื่อจะต้องตามด้วยนามแฝงของตาราง

ก้น 7.เขียนคำขอใหม่จากก้น 1 ด้วยนามแฝง vikoristanny ที่เชื่อมต่อตาราง

ลองถาม:

เลือก P.Part, C.Cat_ID AS Cat, C.ราคาจากส่วน P เข้าร่วมหมวดหมู่ C ON P.Cat \u003d C.Cat_ID

คำแนะนำเหมือนกับในแอปพลิเคชัน 1 แต่มีขนาดกะทัดรัดกว่ามาก

เข้าร่วมและเข้าร่วมมากกว่าสองตาราง

ฐานข้อมูลเชิงสัมพันธ์ขับเคลื่อนโดยความสมบูรณ์และความอุดมสมบูรณ์ของข้อมูลเป็นหลัก เนื่องจากข้อมูลในกระบวนการทางธุรกิจเดียวอาจไม่พอดีกับตารางเดียว สอง หรือแม้แต่สามตารางขึ้นไป ในกรณีเหล่านี้ เพื่อวิเคราะห์ข้อมูล ตารางจะเชื่อมโยงถึงกัน: ตัวอย่างเช่นในตารางหนึ่ง (ตารางแรก) มีตัวบ่งชี้จำนวนหนึ่ง ในอีกตารางหนึ่งตารางที่หนึ่งและสามจะเชื่อมโยงกับคีย์ภายนอก - ข้อมูลจะถูกสับเปลี่ยน , แต่มีเพียงโต๊ะที่สามเท่านั้นที่จะแก้แค้นจิตใจในความจืดชืดจากโต๊ะแรกจะทำได้แบบไหน? โต๊ะอาจมีขนาดใหญ่กว่านี้ก็ได้ ด้วยความช่วยเหลือของตัวดำเนินการ SQL JOIN คุณสามารถรวมตารางจำนวนมากในคำสั่งเดียวได้ ในการสืบค้นดังกล่าว ส่วนหนึ่งจะเชื่อมต่อกับแทร็กอื่น และ JOIN ถัดไปจะรวมตารางเข้ากับตารางถัดไป เช่นเดียวกับอีกส่วนหนึ่งที่ส่วนหน้าของคันธนู ดังนั้นไวยากรณ์ SQL จึงถูกใช้เพื่อเชื่อมต่อตารางการโจมตีมากกว่าสองตาราง:

เลือก COLUMN_NAMES (1..N) จาก TABLE_NAME_1 เข้าร่วม TABLE_NAME_2 ในใจ เข้าร่วม TABLE_NAME_3 ในใจ ... เข้าร่วม TABLE_NAME_M ในใจ

ก้น 8.ฐานข้อมูลเหมือนกับในก้นด้านหน้า ก่อนตารางหมวดหมู่และชิ้นส่วนในแอปพลิเคชันนี้ คุณจะพบตารางโฆษณาซึ่งมีข้อมูลเกี่ยวกับสิ่งพิมพ์บนพอร์ทัลประชาสัมพันธ์ มาดูส่วนของตารางโฆษณาซึ่งมีบันทึกเกี่ยวกับการโหวตเหล่านี้ ซึ่งระยะเวลาเผยแพร่จะสิ้นสุดในวันที่ 04/02/2018

A_รหัสส่วน_IDวันที่_เริ่มต้นวันที่_สิ้นสุดข้อความ
21 1 "2018-02-11" "2018-04-20" “ฉันขาย...”
22 1 "2018-02-11" "2018-05-12" “ฉันขาย...”
... ... ... ... ...
27 1 "2018-02-11" "2018-04-02" “ฉันขาย...”
28 2 "2018-02-11" "2018-04-21" “ฉันขาย...”
29 2 "2018-02-11" "2018-04-02" “ฉันขาย...”
30 3 "2018-02-11" "2018-04-22" “ฉันขาย...”
31 4 "2018-02-11" "2018-05-02" “ฉันขาย...”
32 4 "2018-02-11" "2018-04-13" “ฉันขาย...”
33 3 "2018-02-11" "2018-04-12" “ฉันขาย...”
34 4 "2018-02-11" "2018-04-23" “ฉันขาย...”

เป็นที่ชัดเจนว่า "2018-04-02" ของวันนี้ใช้ความหมายนี้ ฟังก์ชัน CURDATE() - วันที่แน่นอน- จำเป็นต้องรู้ว่าหมวดหมู่ใดที่สับสนซึ่งเงื่อนไขการตีพิมพ์จะสิ้นสุดในวันนี้ ชื่อหมวดหมู่จะอยู่ในตาราง CATEGORIES เท่านั้น และวันที่สิ้นสุดการเผยแพร่จะอยู่ในตาราง ADS เท่านั้น ตาราง PARTS ประกอบด้วยหมวดหมู่ต่างๆ (หรือมากกว่านั้นคือหมวดหมู่ย่อย) ของบทความที่ตีพิมพ์ นอกจากนี้ ด้วยคีย์ภายนอก Cat_ID ตาราง PARTS จะเชื่อมโยงกับตาราง CATEGORIES และตาราง ADS จะเชื่อมโยงด้วยคีย์ภายนอก Part_ID ไปยังตาราง PARTS ดังนั้นเราจึงรวมสามตารางไว้ในแบบสอบถามเดียว และแบบสอบถามนี้สามารถเรียกว่าเชือกเส้นเล็กได้ด้วยความถูกต้องสูงสุด

ลองถาม:

ผลลัพธ์ของแบบสอบถามคือตารางที่แสดงชื่อของสองหมวดหมู่ - "ความไม่สะดวก" และ "การขนส่ง":

แมว_ชื่อ
เนอรูโฮมิสต์
ขนส่ง

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

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

ก้น 9.ฐานข้อมูลยังคงเหมือนเดิม ตารางเป็น Category และ Parts ใช้การดำเนินการคาร์ทีเซียนและสร้างตารางสองตาราง

ลองถาม:

เลือก (*) หมวดหมู่ CROSS JOIN ส่วน

หรือไม่มีคำสั่งที่ชัดเจน CROSS JOIN - โดยใคร:

เลือก (*) หมวดหมู่, ชิ้นส่วน

เติมตารางด้วย 5 * 5 \u003d 25 แถวซึ่งมีส่วนแสดงอยู่ด้านล่าง:

แคท_ไอดีแมว_ชื่อราคาส่วน_IDส่วนหนึ่งแมว
10 วัสดุตา105,00 1 อพาร์ทเมน505
10 วัสดุตา105,00 2 ยานยนต์205
10 วัสดุตา105,00 3 บอร์ด10
10 วัสดุตา105,00 4 ชาฟี30
10 วัสดุตา105,00 5 หนังสือ160
... ... ... ... ... ...
45 เทคโนโลยี65,00 1 อพาร์ทเมน505
45 เทคโนโลยี65,00 2 ยานยนต์205
45 เทคโนโลยี65,00 3 บอร์ด10
45 เทคโนโลยี65,00 4 ชาฟี30
45 เทคโนโลยี65,00 5 หนังสือ160

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

Ale for CROSS JOIN คุณสามารถตั้งค่าการเชื่อมต่อจิตใจได้! ผลลัพธ์จะแตกต่างไปจากเดิมอย่างสิ้นเชิง เมื่อใช้ตัวดำเนินการ "com" แทนที่จะเป็นคำสั่ง CROSS JOIN ที่ชัดเจน การเชื่อมต่อทางจิตไม่ได้ระบุด้วยคำว่า ON แต่ระบุด้วยคำว่า WHERE

ก้น 10.ฐานข้อมูลเดียวกันของพอร์ทัลนั้นสวยงามมาก หมวดหมู่ตารางและชิ้นส่วน Vikorista และการเชื่อมต่อแบบข้ามเชื่อมต่อตารางเพื่อให้ข้อมูลไหลไปด้านหลังสมองโดยสมบูรณ์ Umova - เลี่ยงรหัสหมวดหมู่ในตารางหมวดหมู่ และส่งไปยังหมวดหมู่ในตารางชิ้นส่วน

ลองถาม:

รายการเหมือนกับในแอปพลิเคชัน 1:

ส่วนหนึ่งแมวราคา
อพาร์ทเมน505 210,00
ยานยนต์205 160,00
บอร์ด10 105,00
ชาฟี30 77,00

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

ดังนั้นฉันจะขอตัวเลือกใดสำหรับ vikorystuvati - รูปแบบโภชนาการหรือนำทาง zvichki fakhіvtsaบนหุ่นยนต์ที่มีฐานข้อมูล บางที ในรูปแบบของการเชื่อมโยงข้ามกันด้วยความคิดสำหรับสองคน โต๊ะอาจดูกะทัดรัดมากขึ้น แต่ข้อดีของการเชื่อมต่อข้ามตารางมากกว่าสองตาราง (ก็เป็นไปได้เช่นกัน) ก็สมเหตุสมผลมากกว่า ในสถานการณ์นี้ WHERE คุณต้องเล่นอย่างปลอดภัยโดยใช้คำว่า AND การออกแบบนี้อาจยุ่งยากและอ่านยาก เนื่องจากส่วน WHERE ลงเอยด้วยการเลือก

ฐานข้อมูลเชิงสัมพันธ์และภาษา SQL