Advanced SQL Queries

3171

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:

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:

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 SELECTbao 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:

Áp dụng đối với 2 bảng ở trên, ta có query tương tự:

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 UNIONUNION ALLUNION 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:

Áp dụng tương tự đối với 2 bảng ở trên, ta được query như sau:

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:

Tiếp tục sử dụng 2 bảng đã tạo ở trên, ta có câu query tương tự:

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:

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 NameAge như sau:

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:

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:

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:

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:

Á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;

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:

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:

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

  1. https://www.1keydata.com/sql/advanced.html
  2. https://technet.microsoft.com/en-us/library/aa213245(v=sql.80).aspx
 Techtalk via Viblo
CHIA SẺ