Hướng dẫn và định nghĩa chính xác Subquery trong SQl. Cũng khá đơn giản thôi nếu như bạn follow theo các hướng dẫn và thực hành theo tôi đảm bảo chỉ vài lần bạn đã thành thạo. Tôi cũng sẽ hướng dẫn từ cơ bản đến nâng cao luôn nhé. Nào chiến thôi.
Mục lục[ẩn]
Truy vấn con hay Subquery là một cách viết câu lệnh trong SQL mà bạn có thể lồng thêm 1 hay nhiều các truy vấn nhỏ khác. Các lệnh thường được sử dụng khi viết là Insert, Select, Delete và Update. Cùng với đó là các toán tử ví dụ như =, <, >, >=, <=, IN, BETWEEN…
Ngoài ra truy vấn con cũng được gọi là INNER QUERY hay INNER SELECT. Các truy vấn chính mà chứa các truy vấn con thì được gọi là OUTER SELECT hoặc OUTER QUERY.
Ok định nghĩa là vậy nhưng trước khi đi vào chi tiết, chúng ta cũng tìm hiểu lại kiến thức đã nhé. Khi bạn viết một lệnh SELECT thì kết quả trả về sẽ là một table tạm, table này có số column và records dựa trên số lệnh SELECT. Do đó ta có truy vấn readonly dạng như sau:
1 2 | SELECT NV.MANHANVIEN, NV.TENNHANVIEN FROM (SELECT MANHANVIEN, TENNHANVIEN FROM NHANVIEN) AS NV |
Trong truy vấn này rõ ràng bạn thấy tôi đã thêm một SUBQUERY. Vì là table tạm nên tôi phải sử dụng keyword AS để đặt tên cho nó nên ở câu SELECT cha bên ngoài mới hiểu.
Ok đi vào chi tiết cách viết thôi nhé
Với mệnh đề WHERE thì các truy vấn con được gọi là các truy vấn lồng hoặc truy vấn phụ
SELECT s.sanpham_id, s.sanpham_ten
FROM sanpham s
WHERE s.sanpham_id IN
(SELECT htk.sanpham_id
FROM hangtonkho htk
WHERE htk.soluong > 10);
Từ đó bạn có thể thấy truy vấn con trong lệnh SELECT trên là
(SELECT htk.sanpham_id
FROM hangtonkho htk
WHERE htk.soluong > 5);
Với cách này, bạn có thể tìm thấy id của sản phẩm trong bảng hàng tồn kho có giá trị tồn lớn hơn 5. Sau truy vấn con này tôi dùng để lọc ra các kết quả từ điều kiện IN
Tôi có thể viết truy vấn con thành INNER JOIN như dưới đây.
SELECT s.sanpham_id, s.sanpham_ten
FROM sanpham s
INNER JOIN hangtonkho htk
ON s.sanpham_id = htk.sanpham_id
WHERE htk.soluong > 5;
INNER JOIN sẽ trả về hiệu quả hơn truy vấn con ban đầu. Tuy nhiên không hẳn truy vấn con nào bạn cũng có thể sử dụng lệnh JOIN được.
SELECT nhacung.nhacung_ten, truyvancon1.tong_sl
FROM nhacung,
(SELECT nhacung_id, SUM(donhang.soluong) AS tong_sl
FROM donhang
GROUP BY nhacung_id) truyvancon1
WHERE truyvancon1.nhacung_id = nhacung.nhacung_id;
Với lệnh WHERE tôi đã tạo truy vấn con trong mệnh đề FROM như sau:
(SELECT nhacung_id, SUM(donhang.soluong) AS tong_sl
FROM donhang
GROUP BY nhacung_id) truyvanconA-1
Truy vấn con này tôi gắn cho tên của nó là truyvanconA-1. Cách gán này để nó có thể tham chiếu tới truy vấn con này hoặc bất kỳ trường thông tin nào của truy vấn.
Với mệnh đề SELECT các truy vấn con này nhằm tính toán các hàm như SUM, MIN, MAX hoặc COUNT nhưng không muốn đụng đến truy vấn chính.
SELECT n1.ho, n1.ten,
(SELECT MAX(luong)
FROM nhanvien n2
WHERE n1.nhanvien_id = n2.nhanvien_id) truyvancon2
FROM nhanvien n1;
Truy vấn con được tạo từ truy vấn trên
(SELECT MAX(luong)
FROM nhanvien n2
WHERE n1.nhanvien_id = n2.nhanvien_id) truyvanconA-2
Tương tự như truy vấn con trên, tôi đặt tên cho nó là truyvanconA-2.
Khi sử dụng hàm SELECT thì các truy vấn con sẽ trả về các kết quả đơn. Do đó nó phù hợp để sử dụng cho các hàm trên.
Ngoài các lệnh thông dụng trên thì bạn cũng có thể sử dụng các lệnh khác để viết subquery như bên dưới.
1 2 | SELECT * FROM NHANVIEN A WHERE A.ID IN (SELECT NHANVIENID FROM NHANVIEN); |
1 2 | SELECT * FROM KHACHHANG C WHERE C.ID =ANY (SELECT KHACHHANGID FROM KHACHHANG); |
1 2 | SELECT * FROM NHANVIEN A WHERE A.ID = SOME (SELECT NHANVIENID FROM NHANVIEN); |
Trên là những cách viết và lệnh đơn giản, nâng cao thì các bạn cứ áp dụng những lệnh trên để viết. Hy vọng bài viết phần nào đem đến giá trị và kiến thức về SUB QUERY hay truy vấn lồng trong SQL cho bạn.
Đón đọc các bài viết tiếp theo về SQL của tôi nhé.