Advanced SQL Queries
Bài đăng này đã không được cập nhật trong 3 năm
Sau đây, tôi sẽ giới thiệu cho bạn đọc một số câu lệnh SQL nâng cao mà có thể các bạn ít khi hoặc chưa dùng tới, nhưng sẽ rất là hữu ích ^^. Cùng tìm hiểu xem những câu lệnh đó như thế nào nha
SQL UNION
Mệnh đề/Toán tử UNION trong SQL được sử dụng để kết hợp kết quả của hai hoặc nhiều lệnh SELECT mà không trả về bất cứ bản sao nào của bản ghi. (tương tự nhiên lệnh JOIN kết hợp với SELECT DISTINCT)
Để sử dụng UNION, mỗi lệnh SELECT phải có cùng số cột đã chọn, cùng số biểu thức của các cột, cùng kiểu dữ liệu, và chúng có cùng thứ tự, nhưng chúng không cần phải có cùng độ dài.
Cú pháp của mệnh đề này như sau:
[SQL Statement 1]
UNION
[SQL Statement 2];
Một ví dụ sau đây, chúng ta có 2 bảng:
Bảng Store_Information
Store_Name | Sales | Date |
---|---|---|
Ha Noi | 500 | 15-04-2016 |
Vinh | 1000 | 15-04-2016 |
Hue | 700 | 21-04-2016 |
Da Nang | 600 | 22-04-2016 |
Bảng Internet_Sales
Date | Sales |
---|---|
16-04-2016 | 200 |
20-04-2016 | 300 |
21-04-2016 | 600 |
Để tìm kiếm tất cả những ngày giao dịch sản phẩm, ta sử dụng query sau:
SELECT Date from Store_Information
UNION
SELECT Date from Internet_Sales;
Kết quả sẽ như sau:
Date |
---|
15-04-2016 |
16-04-2016 |
20-04-2016 |
21-04-2016 |
22-04-2016 |
SQL UNION ALL
Toán tử UNION ALL được sử dụng để kết hợp nhiều kết quả của hai hoặc nhiều lệnh SELECT bao gồm cả các bản sao của các hàng.
Các qui tắc áp dụng cho UNION cũng áp dụng cho toán tử UNION ALL.
Cú pháp của mệnh đề này như sau:
[SQL Statement 1]
UNION ALL
[SQL Statement 2];
Áp dụng đối với 2 bảng ở trên, ta có query tương tự:
SELECT Date from Store_Information
UNION ALL
SELECT Date from Internet_Sales;
Khi đó, ta được kết quả như sau:
Date |
---|
15-04-2016 |
15-04-2016 |
21-04-2016 |
22-04-2016 |
16-04-2016 |
20-04-2016 |
21-04-2016 |
Điểm khác biệt duy nhất giữa UNION và UNION ALL là UNION chỉ lựa chọn những giá trị khác biệt nhau, còn UNION ALL thì lựa chọn tất cả các giá trị.
SQL INTERSECT
Tương tự như lệnh UNION, INTERSECT cũng hoạt động dựa trên 2 câu lệnh SQL. Có điều khác là trong khi UNION chủ yếu hoạt động như một OR operator (giá trị được chọn nếu xuất hiện trong câu lệnh 1 hoặc 2) thì INTERSECT hoạt động như một AND operator (giá trị chỉ được chọn nếu xuất hiện trong cả 2 câu lệnh).
Cú pháp của nó như sau:
[SQL Statement 1]
INTERSECT
[SQL Statement 2];
Áp dụng tương tự đối với 2 bảng ở trên, ta được query như sau:
SELECT Date from Store_Information
INTERSECT
SELECT Date from Internet_Sales;
Và kết quả sẽ được như sau:
Date |
---|
21-04-2016 |
Chú ý rằng, INTERSECT chỉ trả về những giá trị khác biệt nhau
SQL MINUS
Lệnh MINUS thực hiện trên 2 câu lệnh SQL. Nó sẽ lấy tất cả giá trị trả về từ câu SQL thứ nhất, sau đó loại trừ những kết quả xuất hiện trong câu SQL thứ 2 để trả về kết quả cuối cùng.
Cú pháp của nó như sau:
[SQL Statement 1]
MINUS
[SQL Statement 2];
Tiếp tục sử dụng 2 bảng đã tạo ở trên, ta có câu query tương tự:
SELECT Date from Store_Information
MINUS
SELECT Date from Internet_Sales;
Và kết quả trả về sẽ được như sau:
Date |
---|
15-04-2016 |
22-04-2016 |
Chú ý rằng, MINUS cũng sẽ chỉ trả về những giá trị khác biệt nhau
Một vài cơ sở dữ liệu có thể sử dụng EXCEPT thay cho MINUS. Hãy kiểm tra kĩ tài liệu về cơ sở dữ liệu của bạn để có thể sử dụng sao cho đúng
SQL VIEW
Một View là không gì khác ngoài môt lệnh SQL mà được lưu giữ trong Database với một tên liên kết. Một view có thể chứa tất cả các hàng của một bảng hoặc các hàng đã được chọn từ một bảng. Một view có thể được tạo từ một hoặc nhiều bảng, phụ thuộc vào truy vấn SQL đã viết để tạo một view.
View, về bản chất giống các Virtual Table (bảng ảo), cho phép người dùng thực hiện:
-
Cấu trúc dữ liệu theo cách mà người dùng tìm thấy tính tự nhiên hoặc tính trực quan.
-
Giới hạn truy cập tới dữ liệu để mà một người dùng có thể thấy và (đôi khi) sửa đổi một cách chính xác nhưng gì họ cần.
-
Tổng kết dữ liệu từ các bảng đa dạng để tạo các bản báo cáo.
Cú pháp để tạo một View như sau:
CREATE VIEW "VIEW_NAME" AS "SQL Statement";
Hãy nhìn vào một ví dụ sau đây để hiểu rõ hơn nhé. Ta có bảng Students sau đây:
|ID|NAME|AGE|ADDRESS|CLASS| |---|---|---|---| |1|Hung|22|Ha Noi|D10CN6| |2|Kien|23|Hai Phong|D09CN2| |3|Tung|21|Ha Noi|D11VT2| |4|Nam|22|Nghe An|D10KT1| |5|Quang|23|Phu Tho|D09VT3|
Bây giờ, chúng ta sẽ tạo một View của bảng đó bao gồm trường Name
và Age
như sau:
CREATE VIEW Students_View AS
SELECT NAME, AGE
FROM Students;
Bây giờ, bạn đã có thể truy vấn đến bảng Students_View như một bảng thực sự như sau:
SELECT * FROM Students_View;
Kết quả sẽ được như sau:
NAME | AGE |
---|---|
Hung | 22 |
Kien | 23 |
Tung | 21 |
Nam | 22 |
Quang | 23 |
SQL Subquery
Subquery (còn được gọi truy vấn phụ hay truy vấn lồng nhau) là một truy vấn bên trong truy vấn SQL khác và được nhúng bên trong mệnh đề WHERE.
Một truy vấn con được sử dụng để trả về dữ liệu mà sẽ được sử dụng trong truy vấn chính như là một điều kiện để thu hẹp dữ liệu được thu nhận.
Cú pháp của một Subquery như sau:
SELECT "column_name1"
FROM "table_name1"
WHERE "column_name2" [Comparison Operator]
(SELECT "column_name3"
FROM "table_name2"
WHERE "condition");
Hãy sử dụng 2 bảng sau đây để minh họa cho ý tưởng về Subquery:
Bảng Store_Information
Store_Name | Sales | Date |
---|---|---|
Ha Noi | 500 | 15-04-2016 |
Hai Phong | 1000 | 15-04-2016 |
Dong Thap | 700 | 21-04-2016 |
Can Tho | 600 | 22-04-2016 |
Bảng Geography
Region_Name | Store_Name |
---|---|
North | Ha Noi |
North | Hai Phong |
South | Dong Thap |
South | Can Tho |
Chúng ta muốn sử dụng Subquery để tính tổng doanh thu của tất cả các cửa hàng ở miền Bắc, hãy sử dụng câu lệnh sau:
SELECT SUM(Sales) FROM Store_Information
WHERE Store_Name IN
(SELECT Store_Name FROM Geography
WHERE Region_Name = 'North');
Khi đó, ta sẽ thu được kết quả như sau:
SUM(Sales) |
---|
1500 |
SQL CASE
CASE cung cấp câu truy vấn sử dụng điều kiện if-then-else cho SQL. Có hai kiểu:
- biểu thức Simple CASE - so sánh một biểu thức với một giá trị tĩnh
- biểu thức Searched CASE - so sánh một biểu thức với một hoặc nhiều điều kiện logic
Simple CASE
Cú pháp như sau:
SELECT CASE ("column_name")
WHEN "value1" THEN "result1"
WHEN "value2" THEN "result2"
...
[ELSE "resultN"]
END
FROM "table_name";
Áp dụng với bảng Store_Information sau đây:
Store_Name | Sales | Date |
---|---|---|
Ha Noi | 800 | 15-04-2016 |
Hai Phong | 1000 | 15-04-2016 |
Dong Thap | 400 | 21-04-2016 |
Can Tho | 450 | 22-04-2016 |
Ví dụ nếu chúng ta muốn nhân doanh thu của 'Ha Noi' lên 3, doanh thu của 'Hai Phong' lên 2, và giữ nguyên doanh thu của các nơi còn lại, chúng ta có thể sử dụng câu truy vấn sau;
SELECT Store_Name, CASE Store_Name
WHEN 'Ha Noi' THEN Sales * 3
WHEN 'Hai Phong' THEN Sales * 2
ELSE Sales
END
"New Sales",
Date
FROM Store_Information;
Ta sẽ thu được kết quả như sau:
Store_Name | New Sales | Date |
---|---|---|
Ha Noi | 2400 | 15-04-2016 |
Hai Phong | 2000 | 15-04-2016 |
Dong Thap | 400 | 21-04-2016 |
Can Tho | 450 | 22-04-2016 |
Searched CASE
Cú pháp như sau:
SELECT CASE
WHEN "condition1" THEN "result1"
WHEN "condition2" THEN "result2"
...
[ELSE "resultN"]
END
FROM "table_name";
Nếu bạn muốn định nghĩa trạng thái doanh thu của các cửa hàng dựa trên luật như sau:
- Nếu Sales >= 1,000, sẽ là "Good Day"
- Nếu Sales >= 500 and < 1,000, sẽ là "OK Day"
- Còn nếu Sales < 500, sẽ là "Bad Day"
Chúng ta có thể sử dụng câu lệnh như sau:
SELECT Store_Name, Date, CASE
WHEN Sales >= 1000 THEN 'Good Day'
WHEN Sales >= 500 THEN 'OK Day'
ELSE 'Bad Day'
END
"Sales Status"
FROM Store_Information;
Khi đó, ta sẽ thu được kết quả như sau:
Store_Name | Date | Sales Status |
---|---|---|
Ha Noi | 15-04-2016 | OK Day |
Hai Phong | 15-04-2016 | Good Day |
Dong Thap | 21-04-2016 | Bad Day |
Can Tho | 22-04-2016 | Bad Day |
Chú ý rằng, Simple CASE là một trường hợp đặc biệt của Searched CASE
Hi vọng, một số câu lệnh SQL nâng cao đã trình bày ở phía trên sẽ giúp ích cho bạn đọc ^_^
Tài liệu tham khảo
All rights reserved