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:
![](https://cdn.codegym.cc/images/article/66aba568-a02a-45e0-9939-6beebbb190ed/512.jpeg)
Đặ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:![](https://cdn.codegym.cc/images/article/d3cc4f4a-b340-4b3a-9ae0-3e38eca36bb2/512.jpeg)
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.
GO TO FULL VERSION