Lý do OUTER THAM GIA

Nhân tiện, bạn có nhớ khi chúng tôi hợp nhất các bảng tính của mình và nhiệm vụ dọn dẹp văn phòng của chúng tôi biến mất vì chưa có trình dọn dẹp nào không?

Nếu bạn chạy một truy vấn như thế này:

SELECT * FROM task

Sau đó, chúng tôi nhận được kết quả này:

nhận dạng nhân viên_id tên thời hạn
1 1 Sửa lỗi ở frontend 2022-06-01
2 2 Sửa lỗi trên backend 2022-06-15
3 5 Mua cà phê 2022-07-01
4 5 Mua cà phê 2022-08-01
5 5 Sẽ mua cà phê 2022-09-01
6 (VÔ GIÁ TRỊ) Dọn dẹp văn phòng (VÔ GIÁ TRỊ)
7 4 Tận hưởng cuộc sống (VÔ GIÁ TRỊ)
số 8 6 Tận hưởng cuộc sống (VÔ GIÁ TRỊ)

Tác vụ “Clear Office” sẽ biến mất nếu chúng ta cố gắng nối bảng tác vụ với bảng nhân viên theo employee_id.

Để giải quyết vấn đề này, nhiều công cụ sửa đổi khác nhau đã được thêm vào toán tử THAM GIA cho phép các hàng mồ côi như vậy được lưu trữ mà không cần một cặp trong bảng khác.

Để tôi nhắc bạn về dạng cổ điển của toán tử THAM GIA:

table 1 JOIN table 2 ON condition

Chúng ta có thể yêu cầu SQL Server đảm bảo rằng tất cả dữ liệu từ bảng bên trái (bảng 1) đều có trong bảng đã nối. Ngay cả khi không có cặp cho họ trong bảng bên phải. Để làm điều này, bạn chỉ cần viết:

table 1 LEFT JOIN table 2 ON condition

Nếu bạn muốn bảng đã nối có tất cả các hàng từ bảng bên phải , thì bạn cần viết:

table 1 RIGHT JOIN table 2 ON
 condition

Hãy viết một truy vấn sẽ kết hợp tất cả các nhiệm vụ và nhân viên để các nhiệm vụ không có người thi hành không bị mất. Để làm điều này, hãy viết một truy vấn:

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

Và kết quả của truy vấn này:

nhận dạng tên nghề nghiệp lương tuổi ngày tham gia nhận dạng nhân viên_id tên
1 Ivanov Ivan lập trình viên 100000 25 30-06-2012 1 1 Sửa lỗi ở frontend
2 Petrov Petr lập trình viên 80000 23 2013-08-12 2 2 Sửa lỗi trên backend
4 Rabinovich Moisha Giám đốc 200000 35 2015-05-12 7 4 Tận hưởng cuộc sống
5 kirienko anastasia Quản lý văn phòng 40000 25 2015-10-10 3 5 Mua cà phê
5 kirienko anastasia Quản lý văn phòng 40000 25 2015-10-10 4 5 Mua cà phê
5 kirienko anastasia Quản lý văn phòng 40000 25 2015-10-10 5 5 Mua cà phê
6 Vaska con mèo 1000 3 2018-11-11 số 8 6 Tận hưởng cuộc sống
(VÔ GIÁ TRỊ) (VÔ GIÁ TRỊ) (VÔ GIÁ TRỊ) (VÔ GIÁ TRỊ) (VÔ GIÁ TRỊ) (VÔ GIÁ TRỊ) 6 (VÔ GIÁ TRỊ) Dọn dẹp văn phòng

Một hàng khác đã được thêm vào bảng của chúng ta, và thật thú vị, có rất nhiều giá trị NULL trong đó. Tất cả dữ liệu được lấy từ bảng nhân viên được hiển thị dưới dạng NULL, vì không có người thực thi nào từ bảng nhân viên cho nhiệm vụ "Làm sạch văn phòng".

THAM GIA các loại

Tổng cộng có 4 loại THAM GIA. Chúng được trình bày trong bảng dưới đây:

nhập ngắn gọn nhập cảnh dài Giải trình
1 THAM GIA THAM GIA BÊN TRONG Chỉ các bản ghi trong bảng A và B
2 CHỖ NỐI BÊN TRÁI TRÁI NGOÀI THAM GIA Tất cả các hàng không có cặp từ bảng A phải là
3 QUYỀN THAM GIA RIGHT NGOÀI THAM GIA Tất cả các hàng không có cặp từ bảng B phải là
4 THAM GIA BÊN NGOÀI THAM GIA NGOÀI ĐẦY ĐỦ Tất cả các hàng của các cặp cơ sở từ bảng A và B phải được

Để đơn giản, nếu chúng ta biểu diễn các bảng dưới dạng tập hợp, thì JOIN có thể được hiển thị dưới dạng hình ảnh:

Đặt giao điểm có nghĩa là đối với một bảng, có một bản ghi tương ứng từ một bảng khác mà nó đề cập đến.

Câu hỏi từ cuộc phỏng vấn

Đôi khi các lập trình viên mới làm quen bị tấn công dồn dập với một câu hỏi rất đơn giản tại một cuộc phỏng vấn. Với các bảng của chúng tôi, nó có thể được xây dựng như sau:

“Viết một truy vấn sẽ hiển thị danh sách tất cả nhân viên không có nhiệm vụ .” Trước tiên, chúng ta hãy thử diễn đạt lại câu hỏi này một chút: "Viết một truy vấn sẽ hiển thị danh sách tất cả nhân viên từ bảng nhân viên mà không có nhiệm vụ nào trong bảng nhiệm vụ ." Chúng ta cần lấy bộ này:

Có nhiều cách để giải quyết vấn đề này, nhưng tôi sẽ bắt đầu với cách đơn giản nhất: Đầu tiên, bạn có thể nối các bảng của chúng tôi bằng THAM GIA TRÁI, sau đó sử dụng WHERE để loại trừ tất cả các hàng có dữ liệu bị thiếu được đệm bằng NULL.

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

Và kết quả của truy vấn này:

nhận dạng tên nghề nghiệp lương tuổi ngày tham gia nhận dạng nhân viên_id tên
3 Ivanov Serge Kiểm thử 40000 ba mươi 2014-01-01 (VÔ GIÁ TRỊ) (VÔ GIÁ TRỊ) (VÔ GIÁ TRỊ)

Nhược điểm duy nhất của giải pháp này là ở đây các hàng trong bảng chứa NULL và với điều kiện chúng tôi cần hiển thị danh sách nhân viên.

Để làm điều này, bạn cần liệt kê các cột bắt buộc của bảng nhân viên trong CHỌN hoặc nếu bạn cần hiển thị tất cả chúng, bạn có thể viết cấu trúc sau:

SELECT e.* FROM employee e, task t 

Yêu cầu hoàn chỉnh sẽ trông như thế này:

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

kết quả của truy vấn này:

nhận dạng tên nghề nghiệp lương tuổi ngày tham gia
3 Ivanov Serge Kiểm thử 40000 ba mươi 2014-01-01

Phần còn lại của các phương pháp là để lại cho bạn để làm bài tập về nhà. Tôi không muốn tước đi niềm vui của bạn khi tự mình tìm thấy chúng.