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_idNULL .

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