Truy vấn con SUBQUERY TRONG SQL – Học SQL từ cơ bản đến nâng cao

By 3 năm ago

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.

1. SUBQUERY trong SQL là gì?

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é

2. MỆNH ĐỀ WHERE

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.

3. MỆNH ĐỀ FROM

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.

4. MỆNH ĐỀ SELECT

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.

5. Một vài ví dụ khác về Subquery trong SQL

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.

5.1 SUBQUERY sử dụng trong IN

1

2

SELECT * FROM NHANVIEN A

WHERE A.ID IN (SELECT NHANVIENID FROM NHANVIEN);

5.2 SUBQUERY sử dụng trong ANY

1

2

SELECT * FROM KHACHHANG C

WHERE C.ID =ANY (SELECT KHACHHANGID FROM KHACHHANG);

5.3 SUBQUERY sử dụng trong SOME

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

 

Share
Thảo Larskanis

Tốt nghiệp Graduated Windesheim 2020, top Đại học lớn nhất thế giới, tôi mở blog chia sẻ kiến thức, kinh nghiệm về SQL