Truy vấn con trả về một bảng
Và cuối cùng, tùy chọn thứ ba là khi truy vấn con trả về toàn bộ bảng. Đây là tùy chọn phổ biến nhất.
Rất thường có những tình huống chúng ta muốn điều chỉnh một chút bảng nào đó. Và chỉ sau đó nối (sử dụng toán tử THAM GIA BẬT) bảng đã sửa với một bảng khác.
Hãy bắt đầu với trường hợp đơn giản nhất, nơi chúng tôi đã tham gia hai bảng bằng THAM GIA:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
Và như bạn có thể nhớ, có những nhiệm vụ trong bảng nhiệm vụ không được giao cho bất kỳ ai: employee_id là NULL .
Hãy tạo một bảng đã sửa , trong đó chúng tôi gán tất cả các nhiệm vụ treo cho giám đốc (ID của anh ấy = 4).
Để làm điều này, chúng ta sử dụng hàm IFNULL() :
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task
Và kết quả của truy vấn này:
nhận dạng | Mã hiệu công nhân | 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 | Mua cà phê | 2022-09-01 |
6 | 4 | 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Ị) |
Ô đã sửa được đánh dấu màu đỏ.
Bây giờ, hãy thay thế bảng đã sửa của chúng ta vào truy vấn:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
Thay vì bảng nhiệm vụ .
Một yêu cầu như vậy sẽ giống như thế này:
SELECT * FROM employee e JOIN (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline
FROM task
) t ON e.id = t.emploee_id
Thay vì từ nhiệm vụ , chúng tôi đã viết dấu ngoặc đơn và đặt nội dung yêu cầu trong đó.
Nhân tiện, bí danh t (bí danh) cho truy vấn lồng nhau rất hữu ích. Một truy vấn lồng nhau, không giống như một bảng, không có tên riêng của nó, vì vậy bí danh rất không phù hợp.
Và đây là kết quả của một truy vấn như vậy:
nhận dạng | tên | nghề nghiệp | lương | tuổi | ngày tham gia | nhận dạng | Mã hiệu công nhân | 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 | 6 | 4 | Dọn dẹp văn phòng |
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 | 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ê |
5 | kirienko anastasia | Quản lý văn phòng | 40000 | 25 | 2015-10-10 | 3 | 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 |
Giám đốc của chúng ta có nhiệm vụ “dọn dẹp văn phòng”, tôi nghĩ anh ấy sẽ nhanh chóng tìm được người để ủy thác :) Sử dụng toán tử WITH
Nhân tiện, bắt đầu với phiên bản 8 của MySQL, bạn không còn phải đặt tất cả các truy vấn con ngay bên trong truy vấn cuối cùng. Chúng có thể được thực hiện riêng biệt. Đối với điều này, câu lệnh VỚI được sử dụng .
Nó cho phép bạn tạo một bảng ảo (truy vấn có tên) và giao diện của nó được cung cấp bởi một mẫu:
WITH Name AS (request)
Đôi khi, truy vấn con của bạn có các cột chưa được đặt tên, chẳng hạn như COUNT(*), mà bạn chưa gán một tên duy nhất. Trong trường hợp này, câu lệnh VỚI có tùy chọn để chỉ định tên cột mới cho truy vấn con.
Hình thức thứ hai của nó được đưa ra bởi mẫu:
WITH Name(column1, column2, …) AS (request)
Bạn có thể sử dụng bao nhiêu bảng ảo (truy vấn có tên) tùy thích và tham chiếu lẫn nhau trong đó. Hình thức chung của yêu cầu của bạn sẽ có nội dung như sau:
WITH name1 AS (request1),
name2 AS (request2),
name3 AS (request3)
SELECT * FROM name1 JOIN name2 ON …
Bây giờ hãy thực hiện truy vấn đáng sợ của chúng tôi:
SELECT * FROM employee e JOIN (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline
FROM task
) t ON e.id = t.emploee_id
Và viết lại nó bằng câu lệnh VỚI:
WITH task2(id, employee_id, name, deadline)
AS (SELECT id, IFNULL(employee_id, 4), name, deadline FROM task)
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id
Hoặc bạn có thể thực hiện mà không cần tên cột, nhưng sau đó bạn sẽ phải chỉ định bí danh cho hàm IFNULL():
WITH task2 AS (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task
)
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id
GO TO FULL VERSION