Vấn đề:
Bạn muốn hiển thị dữ liệu từ các cột nhất định (có kiểu dữ liệu tương tự) từ hai bảng trong SQL.
Ví dụ:
Có hai bảng trong cơ sở dữ liệu của chúng tôi:employee
và customer
.
employee
bảng chứa dữ liệu trong các cột sau: id , first_name , last_name và tuổi .
id | first_name | last_name | tuổi |
---|---|---|---|
1 | Tom | Miller | 22 |
2 | John | Smith | 26 |
3 | Lisa | Williams | 30 |
4 | Charles | Davis | 21 |
5 | James | Moore | 22 |
customer
bảng chứa dữ liệu trong các cột sau: id , first_name , last_name và tuổi .
id | first_name | last_name | tuổi |
---|---|---|---|
1 | Milan | Smith | 45 |
2 | Charles | Davis | 21 |
3 | Đánh dấu | Người ủng hộ | 19 |
Trong một tập hợp kết quả, hãy hiển thị tên, họ và tuổi cho tất cả mọi người trong cơ sở dữ liệu, cả nhân viên và khách hàng.
Giải pháp 1:
Chúng tôi sẽ sử dụng UNION ALL
để nối dữ liệu từ các cột trong hai bảng.
Đây là truy vấn bạn sẽ viết:
SELECT first_name, last_name, age FROM employee UNION ALL SELECT first_name, last_name, age FROM customer;
Đây là kết quả:
first_name | last_name | tuổi |
---|---|---|
Tom | Miller | 22 |
John | Smith | 26 |
Lisa | Williams | 30 |
Charles | Davis | 21 |
James | Moore | 28 |
Milan | Smith | 45 |
Charles | Davis | 21 |
Đánh dấu | Người ủng hộ | 19 |
Thảo luận:
Sử dụng mệnh đề UNION ALL để nối dữ liệu từ các cột trong hai hoặc nhiều bảng. Trong ví dụ của chúng tôi, chúng tôi kết hợp dữ liệu từ employee
và customer
những cái bàn. Ở bên trái của từ khóa UNION ALL, hãy đặt câu lệnh SELECT đầu tiên để lấy dữ liệu từ bảng đầu tiên (trong ví dụ của chúng tôi là bảng employee
). Ở bên phải, sử dụng một câu lệnh SELECT khác để lấy dữ liệu từ bảng thứ hai (trong ví dụ của chúng tôi là customer
).
Hãy nhớ rằng dữ liệu đã chọn trong cả hai bảng phải có cùng kiểu dữ liệu trong mỗi cột. Ví dụ:nếu cột đầu tiên trong SELECT đầu tiên là kiểu dữ liệu chuỗi, thì cột đầu tiên trong SELECT thứ hai cũng phải là kiểu dữ liệu chuỗi. Nếu cột thứ hai trong câu lệnh SELECT đầu tiên là một số nguyên thì cột thứ hai trong bảng thứ hai cũng phải là một kiểu số nguyên.
Trong truy vấn đầu tiên, chúng tôi đã chọn tuổi (tuổi của nhân viên, là một kiểu dữ liệu số nguyên) cho cột thứ ba. Do đó, cột thứ ba trong SELECT thứ hai cũng là một giá trị nguyên; đó là tuổi của khách hàng.
Các cột thứ hai trong cả hai câu lệnh SELECT có cùng kiểu dữ liệu. Tuy nhiên, nếu các giá trị giống nhau trong cả hai bảng, chúng sẽ được hiển thị nhiều lần; ví dụ:‘Charles Davis 21’ được hiển thị hai lần trong tập kết quả.
Điều gì xảy ra nếu bạn không muốn có nhiều bản ghi giống nhau trong bảng kết quả? Trong trường hợp này, hãy sử dụng UNION
. Nó tương tự như UNION ALL
, nhưng nó loại bỏ các bản ghi trùng lặp. Hãy xem ví dụ sau.
Giải pháp 2:
Đây là truy vấn tránh các bản ghi trùng lặp:
SELECT first_name, last_name FROM employee UNION SELECT first_name, last_name FROM customer;
Đây là kết quả của truy vấn trên:
first_name | last_name |
---|---|
Đánh dấu | Người ủng hộ |
James | Moore |
John | Smith |
Charles | Davis |
Milan | Smith |
Tom | Miller |
Lisa | Williams |
Lưu ý:
UNION ALL
nhanh hơn UNION
, nhưng UNION
loại bỏ các hàng trùng lặp. Sự lựa chọn phụ thuộc vào dữ liệu kết quả mà chúng ta cần.