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
Tóm Tắt
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 ^_^