Advanced SQL
NỘI DUNG BÀI VIẾT
Trong bài viết này chúng ta hãy cùng nhau tìm hiểu về cách sử dụng những câu lệnh Advanced SQL nhé.
1. SQL UNION
- Mục đích của truy vấn SQL UNION là kết hợp các kết quả của hai truy vấn cùng lúc trong khi loại bỏ các bản sao.
- Nói cách khác, khi sử dụng UNION, chỉ các giá trị duy nhất được trả về (tương tự như SELECT DISTINCT).
- Cú Pháp
[SQL Statement 1]
UNION
[SQL Statement 2];
- Example: Để tìm tất cả các ngày mà có một giao dịch bán hàng, chúng tôi sử dụng câu lệnh SQL sau:
SELECT Txn_Date FROM Store_Information
UNION
SELECT Txn_Date FROM Internet_Sales;
- Result :
Txn_Date |
---|
Jan-05-1999 |
Jan-07-1999 |
Jan-08-1999 |
Jan-10-1999 |
Jan-11-1999 |
Jan-12-1999 |
2. SQL UNION ALL
- Mục đích của lệnh SQL UNION ALL là kết hợp kết quả của hai truy vấn cùng nhau mà không cần loại bỏ bất kỳ bản sao nào.
- Cú Pháp
[SQL Statement 1]
UNION ALL
[SQL Statement 2];
- Example: Để tìm ra tất cả các ngày tháng có giao dịch bán hàng tại cửa hàng cũng như tất cả các ngày có bán hàng qua internet, chúng tôi sử dụng câu lệnh SQL sau đây:
SELECT Txn_Date FROM Store_Information
UNION ALL
SELECT Txn_Date FROM Internet_Sales;
- Result :
Txn_Date |
---|
Jan-05-1999 |
Jan-07-1999 |
Jan-08-1999 |
Jan-08-1999 |
Jan-07-1999 |
Jan-10-1999 |
Jan-11-1999 |
Jan-12-1999 |
3. SQL INTERSECT
-
Lệnh INTERSECT trong SQL kết hợp các kết quả của hai câu lệnh SQL và chỉ trả về dữ liệu có trong cả hai câu lệnh SQL.
-
INTERSECT có thể được coi là toán tử AND.
-
Trong khi UNION và UNION ALL có thể được coi là toán tử OR .
-
Cú Pháp
[SQL Statement 1]
INTERSECT
[SQL Statement 2];
- Example : Để tìm ra tất cả các ngày mà có cả doanh số bán hàng và bán hàng qua mạng, chúng tôi sử dụng câu lệnh SQL sau:
SELECT Txn_Date FROM Store_Information
INTERSECT
SELECT Txn_Date FROM Internet_Sales;
- Result :
Txn_Date |
---|
Jan-07-1999 |
4. SQL MINUS
-
Toán tử MINUS sẽ lấy tất cả các bản ghi từ tập dữ liệu đầu tiên và sau đó loại bỏ khỏi kết quả tất cả các bản ghi từ tập dữ liệu thứ hai.
-
Cú Pháp
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
MINUS
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
- Example Để tìm tất cả các ngày mà có doanh số bán hàng nhưng không có doanh số internet, chúng tôi sử dụng câu lệnh SQL sau:
SELECT Txn_Date FROM Store_Information
MINUS
SELECT Txn_Date FROM Internet_Sales;
- Result
Txn_Date |
---|
Jan-05-1999 |
Jan-08-1999 |
5. SQL LIMIT
- Mệnh đề LIMIT trong SQLite được sử dụng để giới hạn lượng dữ liệu được trả về bởi lệnh SELECT.
- Cú pháp
[SQL Statement 1]
LIMIT [N];
- Example Để lấy hai số tiền bán hàng cao nhất trong Bảng Thông tin Store_Information, chúng ta sử dụng lệnh sau
SELECT Store_Name, Sales, Txn_Date
FROM Store_Information
ORDER BY Sales DESC
LIMIT 2;
- Result
Store_Name | Sales | Txn_Date |
---|---|---|
Los Angeles | 1500 | Jan-05-1999 |
Boston | 700 | Jan-08-1999 |
6. SQL TOP
- Mệnh đề TOP được sử dụng để lấy dữ liệu của TOP N số hoặc X phần trăm bản ghi từ một bảng.
- Cú pháp
SELECT TOP [TOP argument] "column_name"
FROM "table_name";
- Nơi [TOP argument] có thể là một trong hai loại sau:
-
[N]: Các bản ghi N đầu tiên được trả về.
-
[M] PERCENT: Số lượng bản ghi tương ứng với M% của tất cả các bản ghi đủ điều kiện được trả lại.
- Example 1 [TOP argument] là một số nguyên
- Để hiển thị hai số tiền bán hàng cao nhất trong Bảng thông tin Store_Information, chúng ta sử dụng lệnh sau
SELECT TOP 2 Store_Name, Sales, Txn_Date
FROM Store_Information
ORDER BY Sales DESC;
- Result
Store_Name | Sales | Txn_Date |
---|---|---|
Los Angeles | 1500 | Jan-05-1999 |
Boston | 700 | Jan-08-1999 |
- Example 2 [TOP argument] là một phần trăm
- Để hiển thị 25% doanh thu hàng đầu từ Table Store_Information, chúng ta sử dụng lệnh sau
SELECT TOP 25 PERCENT Store_Name, Sales, Txn_Date
FROM Store_Information
ORDER BY Sales DESC;
- Result
Store_Name | Sales | Txn_Date |
---|---|---|
Los Angeles | 1500 | Jan-05-1999 |
7. SUBQUERY
- Subquery là một câu lệnh SQL có chứa truy vấn SQL tích hợp vào trong mệnh đề WHERE hoặc HAVING
- Cú pháp
SELECT "column_name1"
FROM "table_name1"
WHERE "column_name2" [Toán tử so sánh]
(SELECT "column_name3"
FROM "table_name2"
WHERE "condition");
-
[Toán tử so sánh] có thể là các toán tử =, >, <, >=, <= hoặc “LIKE”. Phần trong ngoặc gọi là “inner query”, và phần còn lại là “outer query”
-
Example 1: Subquery đơn giản
-
Để sử dụng một subquery để tìm tất cả lượng hàng của tất cả cửa hàng trong West region, chúng ta sử dụng câu truy vấn SQL sau:
SELECT SUM (Sales) FROM Store_Information
WHERE Store_Name IN
(SELECT Store_Name FROM Geography
WHERE Region_Name = 'West');
- Result
SUM (Sales) |
---|
2050 |
-
Trong ví dụ này, việc kết hợp hai bảng trực tiếp và sau đó thêm chỉ lượng hàng của cửa hàng trong West region, chúng ta sử dụng subquery để tìm ra các cửa hàng trong West region, và tiếp theo chúng ta tổng tất cả lượng hàng của cửa hàng đó.
-
Chú ý trong ví dụ này, query lồng trong và query ngoài phụ thuộc vào nhau. Kiểu subquery này được gọi là subquery đơn giản
-
Example 2: Subquery liên quan
-
Nếu query lồng trong phụ thuộc vào query ngoài, chúng tôi sẽ có một subquery liên quan, Một ví dụ của query liên quan như sau:
SELECT SUM (a1.Sales) FROM Store_Information a1
WHERE a1.Store_Name IN
(SELECT Store_Name FROM Geography a2
WHERE a2.Store_Name = a1.Store_Name);
- Result
SUM (Sales) |
---|
2750 |
- Ở đây, trong query lồng được sử dụng cho SQL chỉ tổng lượng hàng từ cửa hàng xuất hiện ở cả bảng Store_Information và Geography
- Chú ý mệnh đề WHERE trong query lồng trong, trong đó điều kiện liên quan đến một bảng từ truy vấn bên ngoài.
8. EXISTS
-
EXISTS là một toán tử Boolean được sử dụng trong một subquery để kiểm tra xem truy vấn bên trong có trả về bất kỳ dữ liệu nào. Nếu có, thì truy vấn bên ngoài tiếp tục. Nếu không, truy vấn bên ngoài không thực thi, và toàn bộ câu lệnh SQL không trả về gì.
-
Cú pháp
SELECT "column_name1"
FROM "table_name1"
WHERE EXISTS
(SELECT *
FROM "table_name2"
WHERE "condition");
- Example Truy vấn SQL sau đây:
SELECT SUM(Sales) FROM Store_Information
WHERE EXISTS
(SELECT * FROM Geography
WHERE Region_Name = 'West');
- Kết quả như sau
SUM(Sales) |
---|
2750 |
- Ở lần đầu, chúng ta có thể bị vướng, bởi vì subquery bao gồm điều kiện [region_name = ‘West’], query tính tổng lượng hàng của cửa hàng trong tất cả các vùng. Sau khi xem kỹ hơn, chúng ta phát hiện ra rằng subquery trả về nhiều hơn hàng trống, điều kiện EXISTS là đúng, và những hàng trả về từ query “SELECT SUM(Sales) FROM Store_Information” trở thành kết quả cuối cùng.
9. CASE
- CASE được sử dụng để cung cấp logic if-then-else để SQL. Có hai định dạng : Đầu tiên là trường hợp đơn giản, chúng ta so sánh một biểu thức để giá trị tĩnh, Thứ hai là TRƯỜNG HỢP tìm kiếm, nơi mà chúng ta so sánh một biểu hiện với một hoặc nhiều điều kiện hợp lý.
- Cú pháp
SELECT CASE ("column_name")
WHEN "value1" THEN "result1"
WHEN "value2" THEN "result2"
...
[ELSE "resultN"]
END
FROM "table_name";
- Mệnh đề ELSE có thể có hoặc không
- Example : Để nhân số tiền bán hàng từ ‘Los Angeles’ với 2 và số tiền bán hàng từ ‘San Diego’ với 1,5 và giữ số tiền bán hàng cho các cửa hàng khác, chúng ta sẽ sử dụng câu lệnh SQL sau đây bằng cách sử dụng CASE:
SELECT Store_Name, CASE Store_Name
WHEN 'Los Angeles' THEN Sales * 2
WHEN 'San Diego' THEN Sales * 1.5
ELSE Sales
END
"New Sales",
Txn_Date
FROM Store_Information;
- “New Sales” là tên được đưa ra cho cột bằng CASE. Đây là một ví dụ về biểu thức CASE đơn giản, bởi vì các điều kiện được liệt kê là ‘Los Angeles’ và ‘San Diego’ là các giá trị tĩnh.
- Cú pháp Searched CASE
SELECT CASE
WHEN "condition1" THEN "result1"
WHEN "condition2" THEN "result2"
...
[ELSE "resultN"]
END
FROM "table_name";
- Mệnh đề ELSE là tùy chọn. “Điều kiện” có thể bao gồm một hoặc nhiều mệnh đề logic.
- Example Searched CASE
- Chúng ta sử dụng Store_Information giống như trên. Nếu chúng ta muốn xác định tình trạng bán hàng của một cửa hàng dựa trên các quy tắc sau: Nếu Sales> = 1.000, đó là một “Good Day” Nếu Sales> = 500 và <1.000, đó là một “OK Day” Nếu Sales <500, đó là một “Bad Day”
SELECT Store_Name, Txn_Date, CASE
WHEN Sales >= 1000 THEN 'Good Day'
WHEN Sales >= 500 THEN 'OK Day'
ELSE 'Bad Day'
END
"Sales Status"
FROM Store_Information;
- Kết quả
Store_Name | Txn_Date | Sales Status |
---|---|---|
Los Angeles | Jan-05-1999 | Good Day |
San Diego | Jan-07-1999 | Bad Day |
San Francisco | Jan-08-1999 | Bad Day |
Boston | Jan-08-1999 | OK Day |
- Lưu ý rằng một biểu thức CASE đơn giản là một trường hợp đặc biệt của một biểu thức CASE đã tìm kiếm. Ví dụ, hai biểu thức CASE sau đây giống hệt nhau:
- Case đơn giản
SELECT Store_Name, CASE Store_Name
WHEN 'Los Angeles' THEN Sales * 2
WHEN 'San Diego' THEN Sales * 1.5
ELSE Sales
END
"New Sales",
Txn_Date
FROM Store_Information;
- Searched CASE
SELECT Store_Name, CASE
WHEN Store_Name = 'Los Angeles' THEN Sales * 2
WHEN Store_Name = 'San Diego' THEN Sales * 1.5
ELSE Sales
END
"New Sales",
Txn_Date
FROM Store_Information;
10. AUTO_INCREMENT
- AUTO_INCREMENT được sử dụng trong MySQL để tạo một giá trị khóa chính tự động.
- Cú pháp
CREATE TABLE TABLE_NAME
(PRIMARY_KEY_COLUMN INT NOT NULL AUTO_INCREMENT
...
PRIMARY KEY (PRIMARY_KEY_COLUMN));
- Example Giả sử chúng ta muốn tạo một bảng bao gồm một khóa chính, họ và tên. Chúng ta chạy câu lệnh CREATE TABLE sau:
CREATE TABLE USER_TABLE
(Userid int NOT NULL AUTO_INCREMENT,
Last_Name varchar(50),
First_Name varchar(50),
PRIMARY KEY (Userid));
- Khi tạo, không có dữ liệu trong bảng
- Chúng ta chèn dữ liệu đầu tiên vào:
INSERT INTO USER_TABLE VALUES ('Perry', 'Jonathan');
- Result:
- Bảng USER_TABLE
Userid | Last_Name | First_Name |
---|---|---|
1 | Perry | Jonathan |
- Sau đó chúng ta chèn giá trị thứ hai:
INSERT INTO USER_TABLE VALUES ('Davis', 'Nancy');
- Bây giờ bảng có các giá trị sau:
- Bảng USER_TABLE
Userid | Last_Name | First_Name |
---|---|---|
1 | Perry | Jonathan |
2 | Davis | Nancy |
- Lưu ý khi chèn dòng đầu tiên, Userid được đặt là 1. Khi chúng ta chèn dòng thứ hai, Userid tăng lên 1 và trở thành 2.
- Mặc định, AUTO INCREMENT bắt đầu từ 1 và tăng 1 đơn vị. Để thay đổi giá trị mặc định, chúng ta có thể sử dụng lệnh ALTER TABLE như sau:
ALTER TABLE TABLE_NAME AUTO_INCREMENT = [New Number];
- Ở đây [New Number] là giá trị bắt đầu ta muốn sử dụng
- Giá trị bước nhảy AUTO INCREMENT được điều khiển bằng biến auto_increment_increment của máy chủ MySQL và áp dụng cả hệ thống. Để thay đổi giá trị mặc định là 1, hãy sử dụng lệnh sau đây trong MySQL:
mysql> SET @@auto_increment_increment = [interval number];
- Trong đó [interval number] là giá trị bước nhảy mà chúng ta muốn sử dụng. Vì vậy, nếu chúng ta muốn đặt là 5, chúng ta sẽ dùng lệnh sau:
mysql> SET @@auto_increment_increment = 5;
Nguồn: https://viblo.asia/p/cac-cau-lenh-trong-advanced-sql-phan-1-vyDZOQ9G5wj
Leave a Reply