Mệnh đề UNION trong SQL được sử dụng để kết hợp các kết quả của hai hoặc nhiều câu lệnh SELECT mà không cần trả về bất kỳ hàng trùng lặp nào.
Để sử dụng mệnh đề UNION này, mỗi câu lệnh SELECT cần phải có
- Cùng một số cột được chọn
- Cùng một số biểu thức cột
- Cùng kiểu dữ liệu
- Có chúng trong cùng một trật tự
Nhưng chúng không cần phải có cùng chiều dài.
Nội dung chính
Cú pháp
Cú pháp cơ bản của mệnh đề UNION trong SQL như sau:
SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]UNIONSELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]
Ở đây, điều kiện nhất định có thể là bất kỳ biểu hiện nào dựa trên yêu cầu của bạn.
Ví dụ
Xem xét hai bảng sau.
Bảng 1 - CUSTOMERS Bảng dưới đây.
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ha Anh | 32 | Da Nang | 2000.00 | | 2 | Van Ha | 25 | Ha Noi | 1500.00 | | 3 | Vu Bang | 23 | Vinh | 2000.00 | | 4 | Thu Minh | 25 | Ha Noi | 6500.00 | | 5 | Hai An | 27 | Ha Noi | 8500.00 | | 6 | Hoang | 22 | Ha Noi | 4500.00 | | 7 | Binh | 24 | Ha Noi | 10000.00 | +----+----------+-----+-----------+----------+
Bảng 2 - Bảng ORDERS như sau.
+-----+---------------------+-------------+--------+ |OID | DATE | CUSTOMER_ID | AMOUNT | +-----+---------------------+-------------+--------+ | 102 | 2009-10-08 00:00:00 | 3 | 3000 | | 100 | 2009-10-08 00:00:00 | 3 | 1500 | | 101 | 2009-11-20 00:00:00 | 2 | 1560 | | 103 | 2008-05-20 00:00:00 | 4 | 2060 | +-----+---------------------+-------------+--------+
Bây giờ, chúng ta hãy join hai bảng trong câu lệnh SELECT của chúng ta như sau:
SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID UNION SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS RIGHT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
Điều này sẽ tạo ra kết quả sau:
+------+----------+--------+---------------------+ | ID | NAME | AMOUNT | DATE | +------+----------+--------+---------------------+ | 1 | Ha Anh | NULL | NULL | | 2 | Van Ha | 1560 | 2009-11-20 00:00:00 | | 3 | Vu Bang | 3000 | 2009-10-08 00:00:00 | | 3 | Vu Bang | 1500 | 2009-10-08 00:00:00 | | 4 | Thu Minh | 2060 | 2008-05-20 00:00:00 | | 5 | Hai An | NULL | NULL | | 6 | Hoang | NULL | NULL | | 7 | Binh | NULL | NULL | +------+----------+--------+---------------------+
Mệnh đề UNION ALL
Toán tử UNION ALL được sử dụng để kết hợp các kết quả của hai câu lệnh SELECT bao gồm cả các hàng trùng lặp.
Các quy tắc tương tự áp dụng cho mệnh đề UNION sẽ áp dụng cho toán tử UNION ALL.
Cú pháp
Cú pháp cơ bản của UNION ALL như sau.
SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]UNION ALLSELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]
Ở đây, điều kiện có thể là bất kỳ dựa trên yêu cầu của bạn.
Ví dụ
Giả sử ta có hai bảng sau:
Bảng 1 - Bảng CUSTOMERS.
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ha Anh | 32 | Da Nang | 2000.00 | | 2 | Van Ha | 25 | Ha Noi | 1500.00 | | 3 | Vu Bang | 23 | Vinh | 2000.00 | | 4 | Thu Minh | 25 | Ha Noi | 6500.00 | | 5 | Hai An | 27 | Ha Noi | 8500.00 | | 6 | Hoang | 22 | Ha Noi | 4500.00 | | 7 | Binh | 24 | Ha Noi | 10000.00 | +----+----------+-----+-----------+----------+
Bảng 2 - Bảng ORDERS.
+-----+---------------------+-------------+--------+ |OID | DATE | CUSTOMER_ID | AMOUNT | +-----+---------------------+-------------+--------+ | 102 | 2009-10-08 00:00:00 | 3 | 3000 | | 100 | 2009-10-08 00:00:00 | 3 | 1500 | | 101 | 2009-11-20 00:00:00 | 2 | 1560 | | 103 | 2008-05-20 00:00:00 | 4 | 2060 | +-----+---------------------+-------------+--------+
Bây giờ, chúng ta hãy join hai bảng trong câu lệnh SELECT của chúng ta như sau:
SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID UNION ALL SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS RIGHT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
Điều này sẽ tạo ra kết quả sau:
+------+----------+--------+---------------------+ | ID | NAME | AMOUNT | DATE | +------+----------+--------+---------------------+ | 1 | Ha Anh | NULL | NULL | | 2 | Van Ha | 1560 | 2009-11-20 00:00:00 | | 3 | Vu Bang | 3000 | 2009-10-08 00:00:00 | | 3 | Vu Bang | 1500 | 2009-10-08 00:00:00 | | 4 | Thu Minh | 2060 | 2008-05-20 00:00:00 | | 5 | Hai An | NULL | NULL | | 6 | Hoang | NULL | NULL | | 7 | Binh | NULL | NULL | | 3 | Vu Bang | 3000 | 2009-10-08 00:00:00 | | 3 | Vu Bang | 1500 | 2009-10-08 00:00:00 | | 2 | Van Ha | 1560 | 2009-11-20 00:00:00 | | 4 | Thu Minh | 2060 | 2008-05-20 00:00:00 | +------+----------+--------+---------------------+
Có hai mệnh đề khác (tức là các toán tử), giống như mệnh đề UNION.
- Mệnh đề INTERSECT trong SQL - Mệnh đề này được sử dụng để kết hợp hai câu lệnh SELECT, nhưng trả về các hàng chỉ từ câu lệnh SELECT đầu tiên giống với một dòng trong câu lệnh SELECT thứ hai.
- SQL Mệnh đề EXCEPT trong SQL - Mệnh đề này kết hợp hai câu lệnh SELECT và trả về các hàng từ câu lệnh SELECT đầu tiên không được trả về bởi câu lệnh SELECT thứ hai.