Đôi khi bạn có thể cần so sánh hai bảng trong MySQL để tìm các bản ghi phù hợp hoặc các bản ghi chưa khớp. Đây là truy vấn SQL để so sánh hai bảng trong MySQL.
Cách so sánh hai bảng trong MySQL
Dưới đây là các bước để so sánh hai bảng trong MySQL. Có các trường hợp sử dụng khác nhau để so sánh hai bảng trong SQL. Chúng ta sẽ xem xét từng người một. Giả sử bạn có 2 bảng sau đơn đặt hàng (id, order_date, amount) và order2 (id, order_date, số lượng) có 2 bản ghi giống nhau.
mysql> create table orders(id int, order_date date, amount int); mysql> insert into orders(id, order_date, amount) values(1,'2020-07-25',250), (2,'2020-07-26',350), (3,'2020-07-27',200), (4,'2020-07-28',150); mysql> select * from orders; +------+------------+--------+ | id | order_date | amount | +------+------------+--------+ | 1 | 2020-07-25 | 250 | | 2 | 2020-07-26 | 350 | | 3 | 2020-07-27 | 200 | | 4 | 2020-07-28 | 150 | +------+------------+--------+ mysql> create table orders2(id int, order_date date, amount int); mysql> insert into orders2(id, order_date, amount) values(3,'2020-07-27',200), (4,'2020-07-28',150), (5,'2020-07-29',250), (6,'2020-07-30',300); mysql> select * from orders2; +------+------------+--------+ | id | order_date | amount | +------+------------+--------+ | 3 | 2020-07-27 | 200 | | 4 | 2020-07-28 | 150 | | 5 | 2020-07-29 | 250 | | 6 | 2020-07-30 | 300 | +------+------------+--------+
Phần thưởng đọc:Cách nhận dữ liệu một tháng trước trong MySQL
MySQL So sánh hai cột từ các bảng khác nhau
Giả sử bạn chỉ muốn so sánh hai cột (ví dụ:id) từ hai bảng đơn đặt hàng khác nhau và đơn đặt hàng2. Đây là truy vấn SQL để so sánh hai cột từ các bảng khác nhau và chọn các bản ghi phù hợp.
mysql> select * from orders where id in (select id from orders2); +------+------------+--------+ | id | order_date | amount | +------+------------+--------+ | 3 | 2020-07-27 | 200 | | 4 | 2020-07-28 | 150 | +------+------------+--------+
Trong truy vấn trên, chúng tôi chọn các bản ghi từ các đơn đặt hàng có id giá trị cột có trong danh sách id giá trị cột thu được từ đơn hàng 2 bằng truy vấn con.
Tương tự, nếu bạn muốn so sánh hai cột và chọn bản ghi không khớp, hãy cập nhật truy vấn ở trên bằng cách thêm từ khóa NOT trước IN, như được hiển thị bên dưới.
mysql> select * from orders where id NOT in (select id from orders2); +------+------------+--------+ | id | order_date | amount | +------+------------+--------+ | 1 | 2020-07-25 | 250 | | 2 | 2020-07-26 | 350 | +------+------------+--------+
Phần thưởng đọc:Cách sao chép bảng trong MySQL
MySQL So sánh hai bảng để tìm các bản ghi phù hợp
Nếu bạn đang muốn so sánh hai bảng và tìm các bản ghi phù hợp dựa trên nhiều cột, thì đây là truy vấn SQL. Giả sử bạn muốn tìm các bản ghi giống hệt nhau bằng cách so sánh nhiều cột id, order_date, số lượng
Đầu tiên, chúng tôi thực hiện LIÊN KẾT TẤT CẢ hai bảng để giữ lại các hàng trùng lặp.
mysql> select id, order_date, amount from orders union all select id, order_date, amount from orders2; +------+------------+--------+ | id | order_date | amount | +------+------------+--------+ | 1 | 2020-07-25 | 250 | | 2 | 2020-07-26 | 350 | | 3 | 2020-07-27 | 200 | | 4 | 2020-07-28 | 150 | | 3 | 2020-07-27 | 200 | | 4 | 2020-07-28 | 150 | | 5 | 2020-07-29 | 250 | | 6 | 2020-07-30 | 300 | +------+------------+--------+
Tiếp theo, chúng tôi thực hiện GROUP BY để đếm các bản ghi theo id, order_date và số lượng cột để tìm các bản ghi có số lượng> 1, đó là các bản ghi xuất hiện nhiều hơn một lần. Chúng tôi sử dụng truy vấn trên làm truy vấn con.
mysql> select id, order_date, amount from ( select id, order_date, amount from orders union all select id, order_date, amount from orders2) temp group by id, order_date, amount having count(*)>1; +------+------------+--------+ | id | order_date | amount | +------+------------+--------+ | 3 | 2020-07-27 | 200 | | 4 | 2020-07-28 | 150 | +------+------------+--------+
Phần thưởng Đọc:Cách thêm ràng buộc NOT NULL trong MySQL
MySQL So sánh hai bảng để tìm các bản ghi chưa khớp
Tương tự, đây là cách so sánh hai bảng để tìm các cột chưa khớp trong MySQL. Trong truy vấn trên, thay vì sử dụng count (*)> 1, chúng tôi sử dụng điều kiện count (*) =1, đó là các bản ghi chỉ xảy ra một lần.
Đây là SQL để so sánh hai bảng và tìm các bản ghi không trùng khớp.
mysql> select id, order_date, amount from ( select id, order_date, amount from orders union all select id, order_date, amount from orders2) temp group by id, order_date, amount having count(*)=1; +------+------------+--------+ | id | order_date | amount | +------+------------+--------+ | 1 | 2020-07-25 | 250 | | 2 | 2020-07-26 | 350 | | 5 | 2020-07-29 | 250 | | 6 | 2020-07-30 | 300 | +------+------------+--------+
Phần thưởng Đọc:Cách thêm Ràng buộc Mặc định trong MySQL
MySQL so sánh hai bảng từ các cơ sở dữ liệu khác nhau
Tương tự, nếu bạn muốn so sánh hai bảng thứ tự và thứ tự2 từ các cơ sở dữ liệu khác nhau lần lượt là db1 và db2, chỉ cần đặt tiền tố tên cơ sở dữ liệu trước tên bảng bằng dấu chấm (.)
Đây là truy vấn SQL để so sánh hai bảng từ các cơ sở dữ liệu khác nhau và nhận các bản ghi phù hợp.
mysql> select id, order_date, amount from ( select id, order_date, amount from db1.orders union all select id, order_date, amount from db2.orders2) temp group by id, order_date, amount having count(*)>1;
Và đây là truy vấn SQL để so sánh hai bảng từ các cơ sở dữ liệu khác nhau và nhận các bản ghi chưa trùng khớp.
mysql> select id, order_date, amount from ( select id, order_date, amount from db1.orders union all select id, order_date, amount from db2.orders2) temp group by id, order_date, amount having count(*)>1;
Hy vọng rằng bây giờ bạn có thể so sánh hai bảng trong MySQL
Ubiq giúp dễ dàng trực quan hóa dữ liệu trong vài phút và theo dõi trong trang tổng quan thời gian thực. Thử nó ngay hôm nay!