Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> SQL Server

เข้าร่วมใน SQL Server

ใน SQL Server (Transact-SQL) JOIN ใช้เพื่อดึงข้อมูลจากหลายตาราง ซึ่งเกิดขึ้นเมื่อสองตารางขึ้นไปเชื่อมต่อกันในคำสั่ง SQL เข้าร่วม 4 ประเภทใน SQL Server

  1. เข้าร่วมภายใน - เรียกอีกอย่างว่ารูปแบบการเชื่อมต่ออย่างง่าย
  2. ออกจากภายนอกเข้าร่วม - หรือ LEFT JOIN
  3. เข้าร่วมด้านนอกขวา - หรือเข้าร่วมทางขวา
  4. เข้าร่วมแบบเต็ม - หรือเข้าร่วมแบบเต็ม

ตอนนี้ มาดูไวยากรณ์ ภาพประกอบ และตัวอย่างเพื่อทำความเข้าใจ JOIN ใน SQL Server กันดีกว่า

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

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

ไวยากรณ์เข้าร่วมภายใน

  SELEC T cot 
FROM bang1
INNER JOIN bang2
ON bang1. cot = bang2.cot;

เข้าร่วมใน SQL Server
ภาพประกอบของ INNER JOIN

ผลลัพธ์ที่ได้คือเร็กคอร์ดทั่วไประหว่าง state1 และ bang2

ตัวอย่างการเข้าร่วมภายใน

  SELECT nhacung.nhacung _id, nhacung.nhacung_ten, donhang.donhang_ngay 
FROM nhacung
INNER JOIN donhang
ON nhacung.nhacung_id = d onhang.nhacung_id;

ผลลัพธ์ที่ส่งคืนในตัวอย่างข้างต้นคือแถวของข้อมูลในตาราง 'ซัพพลายเออร์' และตาราง 'คำสั่งซื้อ' เมื่อค่าของ nhacung_id เท่ากับ 2 ตาราง

พี>

มาดูตัวอย่างที่มีข้อมูลเฉพาะเพื่อให้เข้าใจมากขึ้น

ตาราง nhacung มี 2 ฟิลด์ข้อมูล:nhacung_id และ nhacung_ten

nhacung_id nhacung_ten 10000 IBM 10001 Hewlett Packard 10002 Microsoft 10003 NVIDIA

ตาราง donhang ประกอบด้วย 3 ฟิลด์ donhang_id, nhacung_id และ donhang_ngay

donhang_id nhacung_id donhang_ngay 500125 10000 2003/05/12 500126 10001 2003/05/13 500127 10004 2003/05/14

หากเรียกใช้คำสั่ง SELECT (โดยใช้ INNER JOIN) ด้านล่าง:

  SELECT nhacung. nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay 
FROM nhacung
INNER JOIN donhang
ON nhacung.nhacung_ id = donhang.nhacung_id;

นี่คือชุดผลลัพธ์ที่ส่งคืน:

nhacung_id สิบ IBM donhang_ngay 10000 2003/05/12 10001 Hewlett Packard 2003/05/13

ผลิตภัณฑ์ Microsoft และ NVIDIA จากตารางถูกละทิ้งเนื่องจาก nhacung_id (10002 และ 10003) มีอยู่ใน 1 ตารางเท่านั้น แถว 500127 (donhang_id) จากตาราง donhang จะถูกลบออกเนื่องจาก nhacung_id 10004 ไม่อยู่ในตาราง nhacung

ไวยากรณ์เก่าของ INNER JOIN

INNER JOIN สามารถเขียนใหม่ได้ด้วยไวยากรณ์เก่าดังนี้ (แต่แนะนำให้ใช้ไวยากรณ์ที่มีคีย์เวิร์ด INNER JOIN)

  SELECT music ung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay 
FROM donhang, nhacung
WHERE nhacung.n hacung_id = donhang.nhacung_id;

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

บางฐานข้อมูลใช้ LEFT JOIN แทน LEFT OUTER JOIN การเชื่อมต่อประเภทนี้จะส่งคืนแถวในแผงด้านซ้ายในเงื่อนไข ON และรับเฉพาะตารางที่เหลือที่ตรงตามเงื่อนไขที่ตั้งไว้

ไวยากรณ์ LEFT JOIN

  SELE CT cot 
FROM bang1
LEFT [OUTER] JOIN bang2
ON bang1.co t = bang2.cot;

เข้าร่วมใน SQL Server
แสดงภาพประกอบ LEFT JOIN อันเป็นผลมาจากพื้นที่สีน้ำเงิน

ผลลัพธ์ที่ส่งคืนประกอบด้วย state1 และระเบียนที่อยู่ใน bang2 ที่กำหนดให้กับ state1 (พื้นที่สีน้ำเงินในภาพ)

ตัวอย่าง LEFT JOIN

  SELECT nh acung.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay 
FROM nhacung
LEFT OUTER JOIN donhang
ON nhacung.nhac ung_id = donhang.nhacung_id;

ตัวอย่างด้านบนจะส่งคืนแถวทั้งหมดจากตารางและเฉพาะแถวที่ตรงตามข้อกำหนดในตาราง donhang หากไม่มีค่า nhacung_id ในตารางในตาราง donhang เขตข้อมูลทั้งหมดใน donhang จะแสดงผลลัพธ์ในตารางผลลัพธ์

ด้านล่างนี้คือตัวอย่างเฉพาะ ตารางประกอบด้วย nhacung_id และ nhacung_ten

nhacung_id nhacung_ten 10000 IBM 10001 Hewlett Packard 10002 Microsoft 10003 NVIDIA

ตาราง Donhang ประกอบด้วย donhang_id, nhacung_id และ donhang_ngay

donhang_id nhacung_id donhang_ngay 500125 10000 2003/05/12 500126 10001 2003/05/13

หากเรียกใช้คำสั่ง SELECT ด้านล่าง:

  SELECT nhacu ng.nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay 
FROM nhacung
LEFT OUTER JOIN donhang
ON nhacung.nhacun g_id = donhang.nhacung_id;

ผลลัพธ์จะเป็นดังนี้:

nhacung_id nhacung_ten 10000 IBM donhang_ngay 2003/05/12 10001 Hewlett Packard 2003/05/13 10002 Microsoft 10003 NVIDIA

แถวของ Microsoft และ NVIDIA ยังคงอยู่ในชุดผลลัพธ์เนื่องจากใช้ LEFT OUTER JOIN (รับตารางทั้งหมดทางด้านซ้าย) . ในขณะเดียวกัน donhang_ngay ของบันทึกเหล่านี้จะถูกต้อง

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

บางฐานข้อมูลใช้ RIGHT JOIN แทน RIGHT OUTER JOIN การเชื่อมต่อประเภทนี้จะส่งกลับแถวในตารางด้านขวาในเงื่อนไข ON และรับเฉพาะตารางที่เหลือที่ตรงตามเงื่อนไขที่ตั้งไว้

รวมไวยากรณ์ที่ถูกต้อง

  SELECT c ot 
FROM bang1
RIGHT [OUTER] JOIN bang2
ON bang1.cot = bang2.cot;

เข้าร่วมใน SQL Server
ภาพประกอบขวาเข้าร่วม

ผลลัพธ์ที่ส่งคืนมี bang2 และเรคคอร์ดอยู่ในสถานะ 1 ที่กำหนดให้กับ bang2 (พื้นที่สีน้ำเงินในภาพ)

ตัวอย่าง RIGHT JOIN

  SELECT don hang.donhang_id, donhang.donhang_ngay, nhacung.nhacung_ten 
FROM nhacung
RIGHT OUTER JOIN donhang
ON nhacung.nha cung_id = donhang.nhacung_id;

ผลลัพธ์ที่ได้คือแถวทั้งหมดในตาราง donhang และเฉพาะแถวที่ตรงตามข้อกำหนดในตาราง nhacung

หากไม่มีค่าของ nhacung_id ในตาราง donhang ในตาราง ฟิลด์ทั้งหมดในรายการจะแสดงขึ้นในตารางผลลัพธ์

ด้านล่างนี้คือตัวอย่างเฉพาะ ตารางประกอบด้วย nhacung_id และ nhacung_ten

nhacung_id nhacung_ten 10000 Apple 10001 Google

Donhang table มี donhang_id, nhacung_id และ donhang_ngay

donhang_id nhcung_id donhang_ngay 500125 10000 2003/08/12 500126 10001 2003/08/13 500127 10002 2003/08/14

หากรันคำสั่ง SELECT ด้านล่าง:

  SELECT donhang.don hang_id, donhang.donhang_ngay, nhacung.nhacung_ten 
FROM nhacung
RIGHT OUTER JOIN donhang
ON nhacung.nhacung_id = donhang.nhacung_id;

ผลลัพธ์จะเป็นดังนี้:

donhang_id donhang_ngay nhacung_id 500125 2003/08/12 Apple 500126 2003/08/13 Google 500127 2003/08/14

Row 500127 (donhang_id) ยังคงอยู่ในตารางผลลัพธ์เนื่องจาก RIGHT OUTER JOIN คือ ในการใช้งาน โปรดทราบว่า nhacung_ten สำหรับบันทึกนั้นมีค่า

เข้าร่วมแบบเต็ม

บางฐานข้อมูลใช้ FULL JOIN แทน FULL OUTER JOIN ประเภทการเชื่อมต่อนี้ส่งคืนแถวทั้งหมดในตารางด้านซ้ายและขวา และค่า NULL ที่กำหนดในเงื่อนไขที่ไม่ตรงตามเงื่อนไข

syntax FULL JOIN

  SELE CT cot 
FROM bang1
FULL [OUTER] JOIN bang2
ON bang1.c ot = bang2.cot;

เข้าร่วมใน SQL Server
แสดงภาพประกอบแบบเต็มพร้อมผลลัพธ์ของพื้นที่สีเขียว

ผลลัพธ์ที่ได้รวมเร็กคอร์ดทั้งหมดจาก bang1 และ bang2

ตัวอย่างการเข้าร่วมแบบเต็ม

  SELECT nhacung. nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay 
FROM nhacung
FULL OUTER JOIN donhang
ON nhacung.nhacung_i d = donhang.nhacung_id;

ตัวอย่างด้านบนจะคืนค่าแถวทั้งหมดจากตารางและ donhang แต่เมื่อไม่ตรงตามเงื่อนไข ค่าจะถูกตั้งค่าเป็นตารางผลลัพธ์

หาก nhacung_id ในแผงเพลงไม่อยู่ในตาราง donhang หรือค่า nhacung_id ในตาราง donhang ไม่อยู่ในแผงเพลง ฟิลด์ข้อมูลจะปรากฏขึ้น

พี>

ด้านล่างนี้คือตัวอย่างเฉพาะของ FULL OUTER JOIN ตารางประกอบด้วย nhacung_id และ nhacung_ten

nhacung_id nhacung_ten 10000 IBM 10001 Hewlett Packard 10002 Microsoft 10003 NVIDIA

ตาราง Donhang ประกอบด้วย donhang_id, nhacung_id และ donhang_ngay

donhang_id nhacung_id donhang_ngay 500125 10000 2003/08/12 500126 10001 2003/08/13 500127 10004 2003/08/14

หากรันคำสั่ง SELECT ด้านล่าง:

  SELECT nhacung .nhacung_id, nhacung.nhacung_ten, donhang.donhang_ngay 
FROM nhacung
FULL OUTER JOIN donhang
ON nhacung.nhacung_i d = donhang.nhacung_id;

ผลลัพธ์จะเป็นดังนี้:

nhacung_id nhacung_ten 10,000 donhang_ngay IBM 2003/08/12 10001 Hewlett Packard 2003/08/13 10002 Microsoft 10003 NVIDIA 2003/08/14

ผลิตภัณฑ์ Microsoft และ NVIDIA ยังคงอยู่ในชุดผลลัพธ์เนื่องจากกำลังใช้งาน เข้าร่วมเต็มนอก donhang_ngay ของบันทึกเหล่านี้มีค่า แถวสำหรับ nhacung_id คือ 10004 ซึ่งอยู่ในตารางผลลัพธ์ด้วย แต่ nhacung_id และ nhacung_ten ของเร็กคอร์ดเหล่านี้มีค่า