เหตุผลในการเข้าร่วมภายนอก
คุณจำได้ไหมว่าเมื่อเรารวมสเปรดชีตและงานทำความสะอาดสำนักงานของเราหายไปเพราะยังไม่มีเครื่องมือทำความสะอาด
หากคุณเรียกใช้แบบสอบถามเช่นนี้:
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 จะแสดงเป็นรูปภาพ:
![](https://cdn.codegym.cc/images/article/66aba568-a02a-45e0-9939-6beebbb190ed/512.jpeg)
ตั้งค่าจุดตัดหมายความว่าตารางหนึ่งมีบันทึกที่สอดคล้องกันจากอีกตารางหนึ่งซึ่งอ้างอิงถึง
คำถามจากการสัมภาษณ์
บางครั้งโปรแกรมเมอร์มือใหม่มักถูกถามคำถามง่ายๆ ในการสัมภาษณ์ จากตารางของเราสามารถกำหนดได้ดังนี้:
“เขียนแบบสอบถามที่จะแสดงรายชื่อพนักงานทั้งหมดที่ไม่มีงานให้ ” ขั้นแรก มาลองเรียบเรียงคำถามนี้ใหม่สักหน่อย: "เขียนแบบสอบถามที่จะแสดงรายชื่อพนักงานทั้งหมดจากตารางพนักงานที่ไม่มีงานในตารางงาน " เราต้องได้รับชุดนี้:![](https://cdn.codegym.cc/images/article/d3cc4f4a-b340-4b3a-9ae0-3e38eca36bb2/512.jpeg)
มีหลายวิธีในการแก้ปัญหานี้ แต่ฉันจะเริ่มต้นด้วยวิธีที่ง่ายที่สุด: ขั้นแรก คุณสามารถรวมตารางของเราด้วย 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 |
วิธีการที่เหลือให้คุณทำการบ้าน ฉันไม่ต้องการที่จะกีดกันคุณจากความสุขในการค้นหาพวกเขาด้วยตัวคุณเอง
GO TO FULL VERSION