เหตุผลในการเข้าร่วมภายนอก

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

หากคุณเรียกใช้แบบสอบถามเช่นนี้:

SELECT * FROM task

จากนั้นเราจะได้ผลลัพธ์นี้:

รหัส พนักงาน_id ชื่อ วันกำหนดส่ง
1 1 แก้ไขข้อบกพร่องในส่วนหน้า 2022-06-01
2 2 แก้ไขข้อบกพร่องในส่วนหลัง 2022-06-15
3 5 ซื้อกาแฟ 2022-07-01
4 5 ซื้อกาแฟ 2022-08-01
5 5 จะซื้อกาแฟ 2022-09-01
6 (โมฆะ) ทำความสะอาดสำนักงาน (โมฆะ)
7 4 ใช้ชีวิตให้สนุก (โมฆะ)
8 6 ใช้ชีวิตให้สนุก (โมฆะ)

งาน "Clear Office" จะหายไปหากเราพยายามรวมตารางงานกับตารางพนักงานโดย Employee_id

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

ฉันขอเตือนคุณถึงรูปแบบคลาสสิกของตัวดำเนินการ JOIN:

table 1 JOIN table 2 ON condition

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

table 1 LEFT JOIN table 2 ON condition

หากคุณต้องการให้ตารางที่เข้าร่วมมีแถวทั้งหมดจากตารางที่ถูกต้องคุณต้องเขียน:

table 1 RIGHT JOIN table 2 ON
 condition

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

SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id

และผลลัพธ์ของแบบสอบถามนี้:

รหัส ชื่อ อาชีพ เงินเดือน อายุ เข้าร่วม_วันที่ รหัส พนักงาน_id ชื่อ
1 อีวานอฟ อีวาน โปรแกรมเมอร์ 100,000 25 2555-06-30 1 1 แก้ไขข้อบกพร่องในส่วนหน้า
2 เปตรอฟ เปตรอฟ โปรแกรมเมอร์ 80000 23 2013-08-12 2 2 แก้ไขข้อบกพร่องในส่วนหลัง
4 ราบิโนวิช มอยชา ผู้อำนวยการ 200,000 35 2015-05-12 7 4 ใช้ชีวิตให้สนุก
5 คิเรียนโก อนาสตาเซีย ผู้จัดการสำนักงาน 40000 25 2015-10-10 3 5 ซื้อกาแฟ
5 คิเรียนโก อนาสตาเซีย ผู้จัดการสำนักงาน 40000 25 2015-10-10 4 5 ซื้อกาแฟ
5 คิเรียนโก อนาสตาเซีย ผู้จัดการสำนักงาน 40000 25 2015-10-10 5 5 ซื้อกาแฟ
6 วาสก้า แมว 1,000 3 2018-11-11 8 6 ใช้ชีวิตให้สนุก
(โมฆะ) (โมฆะ) (โมฆะ) (โมฆะ) (โมฆะ) (โมฆะ) 6 (โมฆะ) ทำความสะอาดสำนักงาน

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

เข้าร่วมประเภท

JOIN มีทั้งหมด 4 ประเภท แสดงในตารางด้านล่าง:

รายการสั้น ๆ รายการยาว คำอธิบาย
1 เข้าร่วม เข้าร่วมภายใน เฉพาะระเบียนที่อยู่ในตาราง A และ B
2 ซ้ายเข้าร่วม เข้าร่วมด้านนอกซ้าย แถวทั้งหมดที่ไม่มีคู่จากตาราง A จะต้องเป็น
3 เข้าร่วมขวา เข้าร่วมภายนอกขวา แถวทั้งหมดที่ไม่มีคู่จากตาราง B จะต้องเป็น
4 เข้าร่วมภายนอก เข้าร่วมภายนอกแบบเต็ม แถวของคู่ฐานทั้งหมดจากตาราง A และ B จะต้องเป็น

เพื่อความง่าย หากเราแสดงตารางเป็นชุด JOIN จะแสดงเป็นรูปภาพ:

ตั้งค่าจุดตัดหมายความว่าตารางหนึ่งมีบันทึกที่สอดคล้องกันจากอีกตารางหนึ่งซึ่งอ้างอิงถึง

คำถามจากการสัมภาษณ์

บางครั้งโปรแกรมเมอร์มือใหม่มักถูกถามคำถามง่ายๆ ในการสัมภาษณ์ จากตารางของเราสามารถกำหนดได้ดังนี้:

“เขียนแบบสอบถามที่จะแสดงรายชื่อพนักงานทั้งหมดที่ไม่มีงานให้ ” ขั้นแรก มาลองเรียบเรียงคำถามนี้ใหม่สักหน่อย: "เขียนแบบสอบถามที่จะแสดงรายชื่อพนักงานทั้งหมดจากตารางพนักงานที่ไม่มีงานในตารางงาน " เราต้องได้รับชุดนี้:

มีหลายวิธีในการแก้ปัญหานี้ แต่ฉันจะเริ่มต้นด้วยวิธีที่ง่ายที่สุด: ขั้นแรก คุณสามารถรวมตารางของเราด้วย LEFT JOIN จากนั้นใช้ WHERE เพื่อแยกแถวทั้งหมดที่ข้อมูลที่ขาดหายไปถูกเสริมด้วย NULL

SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

และผลลัพธ์ของแบบสอบถามนี้:

รหัส ชื่อ อาชีพ เงินเดือน อายุ เข้าร่วม_วันที่ รหัส พนักงาน_id ชื่อ
3 อีวานอฟ เซอร์เกย์ เทสเตอร์ 40000 สามสิบ 2014-01-01 (โมฆะ) (โมฆะ) (โมฆะ)

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

ในการทำเช่นนี้ คุณต้องแสดงรายการคอลัมน์ที่จำเป็นของตารางพนักงานใน SELECT หรือถ้าคุณต้องการแสดงคอลัมน์ทั้งหมด คุณสามารถเขียนโครงสร้างต่อไปนี้:

SELECT e.* FROM employee e, task t 

คำขอที่สมบูรณ์จะมีลักษณะดังนี้:

SELECT e.*  
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

ผลลัพธ์ของแบบสอบถามนี้:

รหัส ชื่อ อาชีพ เงินเดือน อายุ เข้าร่วม_วันที่
3 อีวานอฟ เซอร์เกย์ เทสเตอร์ 40000 สามสิบ 2014-01-01

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