FresherKỹ thuậtSQL
UNION và UNION ALL khác nhau như thế nào?
Thử trả lời trước
Đáp án mẫu
Cả hai đều xếp chồng kết quả của hai query thành một. UNION loại các dòng trùng khỏi kết quả gộp. UNION ALL giữ mọi dòng, kể cả dòng trùng.
SELECT city FROM customers
UNION
SELECT city FROM suppliers; -- each city once
SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers; -- every row from both
Loại dòng trùng nghĩa là database phải sort hoặc hash toàn bộ kết quả, tốn thời gian và bộ nhớ. UNION ALL chỉ nối thêm nên nhanh hơn. Mặc định hãy dùng UNION ALL, và chỉ dùng UNION khi cần dòng phân biệt và biết có thể có trùng.
Cả hai đều yêu cầu mỗi query có cùng số cột với kiểu dữ liệu tương thích, và tên cột lấy từ query đầu. ORDER BY chỉ đặt một lần ở cuối.
Các toán tử tập hợp liên quan là INTERSECT (dòng có ở cả hai) và EXCEPT (dòng có ở query đầu mà không có ở query sau; Oracle dùng MINUS). MySQL hỗ trợ chúng từ 8.0.31.
Hãy nhớ: UNION ngầm có một DISTINCT.
Ý chính
- UNION loại dòng trùng, UNION ALL giữ lại
- UNION ALL nhanh hơn vì bỏ bước khử trùng
- Các query cần cùng số cột và kiểu tương thích
- INTERSECT và EXCEPT là các toán tử tập hợp còn lại
Câu hỏi nối tiếp thường gặp
- Làm sao tìm các dòng có ở bảng này mà không có ở bảng kia?
Lỗi thường gặp
- Dùng UNION khi không thể trùng và trả giá cho bước khử trùng
- Đặt ORDER BY trong từng nhánh và mong có thứ tự toàn cục