PostgreSQL - UNIONS Clauses

Xin chào các nhà pháp sư cơ sở dữ liệu tương lai! Hôm nay, chúng ta sẽ lặn sâu vào thế giới kỳ diệu của PostgreSQL và khám phá một trong những pháp thuật mạnh mẽ của nó: clauses UNION. Đừng lo lắng nếu bạn chưa bao giờ viết một dòng mã trước đây - tôi sẽ là người bạn thân thiện dẫn đường cho bạn trong cuộc phiêu lưu này. Vậy, hãy lấy cây phép (bàn phím) của bạn và bắt đầu nào!

PostgreSQL - Unions Clause

What is a UNION? (UNION là gì?)

Trước khi chúng ta nhảy vào chi tiết, hãy hiểu UNION là gì. Hãy tưởng tượng bạn có hai danh sách riêng biệt về những cuốn sách yêu thích của bạn. Một danh sách chứa các tiểu thuyết giả tưởng, và danh sách còn lại có các tựa sách khoa học viễn tưởng. Bây giờ, nếu bạn muốn kết hợp hai danh sách này thành một danh sách siêu phẩm của những cuốn sách tuyệt vời? Đó chính xác là điều UNION làm trong thế giới cơ sở dữ liệu!

Trong PostgreSQL, UNION cho phép chúng ta kết hợp kết quả của hai hoặc nhiều câu lệnh SELECT thành một tập kết quả duy nhất. Nó giống như trộn các màu sơn khác nhau để tạo ra một màu mới, thú vị!

Cú pháp (Syntax)

Bây giờ, hãy xem các từ phép (cú pháp) chúng ta cần để casting pháp thuật UNION của mình:

SELECT column1, column2, ... FROM table1
UNION
SELECT column1, column2, ... FROM table2;

Nó có vẻ đơn giản phải không? Nhưng hãy nhớ, với quyền lực lớn đi kèm với trách nhiệm lớn. Dưới đây là một số quy tắc quan trọng cần tuân theo:

  1. Số lượng và thứ tự các cột trong tất cả các câu lệnh SELECT phải giống nhau.
  2. Các loại dữ liệu của các cột tương ứng phải tương thích.
  3. Mặc định, UNION loại bỏ các hàng trùng lặp (chúng ta sẽ thấy cách thay đổi điều này sau).

Ví dụ (Example)

Hãy đưa ví dụ về danh sách sách của chúng ta vào cuộc sống với một số mã thực tế. Hãy tưởng tượng chúng ta có hai bảng: fantasy_booksscifi_books.

-- Tạo bảng fantasy_books
CREATE TABLE fantasy_books (
id SERIAL PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(100)
);

-- Chèn một số sách giả tưởng
INSERT INTO fantasy_books (title, author) VALUES
('The Hobbit', 'J.R.R. Tolkien'),
('Harry Potter and the Sorcerer''s Stone', 'J.K. Rowling'),
('A Game of Thrones', 'George R.R. Martin');

-- Tạo bảng scifi_books
CREATE TABLE scifi_books (
id SERIAL PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(100)
);

-- Chèn một số sách khoa học viễn tưởng
INSERT INTO scifi_books (title, author) VALUES
('Dune', 'Frank Herbert'),
('The Hitchhiker''s Guide to the Galaxy', 'Douglas Adams'),
('1984', 'George Orwell');

Bây giờ, hãy sử dụng UNION để tạo danh sách siêu phẩm của sách:

SELECT title, author FROM fantasy_books
UNION
SELECT title, author FROM scifi_books;

Câu truy vấn này sẽ cho chúng ta một danh sách kết hợp tất cả các sách từ cả hai bảng, không có bất kỳ hàng trùng lặp nào. Nó giống như trộn hai bộ bài lại với nhau, nhưng đảm bảo không có bất kỳ lá bài trùng lặp nào!

Hiểu kết quả (Understanding the Result)

Khi bạn chạy câu truy vấn này, bạn sẽ thấy điều gì đó như thế này:

title author
The Hobbit J.R.R. Tolkien
Harry Potter and the Sorcerer's Stone J.K. Rowling
A Game of Thrones George R.R. Martin
Dune Frank Herbert
The Hitchhiker's Guide to the Galaxy Douglas Adams
1984 George Orwell

Hãy nhìn danh sách kết hợp tuyệt đẹp này! Nó giống như tổ chức một buổi tiệc nơi cả hai thể loại giả tưởng và khoa học viễn tưởng có thể giao tiếp. Tôi几乎可以想象Tolkien và Herbert có một cuộc trò chuyện thú vị về việc xây dựng thế giới!

The UNION ALL Clause (Câu lệnh UNION ALL)

Bây giờ, nếu chúng ta muốn giữ lại tất cả các hàng, ngay cả khi có trùng lặp, UNION ALL sẽ rất hữu ích. Nó giống như nói với cơ sở dữ liệu của bạn, "Tôi muốn ALL các sách, ngay cả khi một số tựa sách xuất hiện nhiều lần!"

Hãy thay đổi ví dụ trước của chúng ta một chút:

-- Chèn một cuốn sách trùng lặp vào scifi_books
INSERT INTO scifi_books (title, author) VALUES
('The Hobbit', 'J.R.R. Tolkien');

-- Bây giờ hãy sử dụng UNION ALL
SELECT title, author FROM fantasy_books
UNION ALL
SELECT title, author FROM scifi_books;

Câu truy vấn này sẽ cho chúng ta:

title author
The Hobbit J.R.R. Tolkien
Harry Potter and the Sorcerer's Stone J.K. Rowling
A Game of Thrones George R.R. Martin
Dune Frank Herbert
The Hitchhiker's Guide to the Galaxy Douglas Adams
1984 George Orwell
The Hobbit J.R.R. Tolkien

Chú ý rằng "The Hobbit" xuất hiện hai lần bây giờ? Nó giống như mời cùng một khách đến tiệc hai lần - họ sẽ được hai phần bánh!

Ứng dụng thực tế (Practical Applications)

Bạn có thể đang tự hỏi, "Điều này rất hay, nhưng tôi sẽ thực sự sử dụng nó khi nào trong cuộc sống thực?" Câu hỏi tuyệt vời! Dưới đây là một vài tình huống:

  1. Kết hợp dữ liệu từ các bảng khác nhau có cấu trúc tương tự (như ví dụ về sách của chúng ta).
  2. Kết hợp kết quả từ các câu truy vấn khác nhau để tạo báo cáo toàn diện.
  3. So sánh dữ liệu giữa các thời kỳ hoặc danh mục khác nhau.

Ví dụ, hãy tưởng tượng bạn đang quản lý một hiệu sách. Bạn có thể sử dụng UNION để tạo một danh sách duy nhất các sách hoặc đang thiếu hàng hoặc không được bán trong tháng trước:

SELECT title, 'Low Stock' AS reason
FROM inventory
WHERE quantity < 5
UNION
SELECT title, 'No Recent Sales' AS reason
FROM sales
WHERE last_sale_date < CURRENT_DATE - INTERVAL '30 days';

Câu truy vấn này sẽ giúp bạn nhanh chóng xác định哪些 sách cần đặt lại hoặc giảm giá.

Common Pitfalls and How to Avoid Them (Mối đe dọa phổ biến và cách tránh chúng)

  1. Mismatched Columns: Nhớ rằng, số lượng và thứ tự các cột trong tất cả các câu lệnh SELECT phải khớp. Nếu không, PostgreSQL sẽ nhanh chóng throw một lỗi hơn bạn có thể nói "Expelliarmus!"

  2. Incompatible Data Types: Đảm bảo các loại dữ liệu trong các cột tương ứng phải tương thích. Bạn không thể trộn lẫn táo vàspaceships (trừ khi bạn đang viết một cuốn sách khoa học viễn tưởng rất thú vị).

  3. Forgetting ORDER BY: Các hoạt động UNION có thể ảnh hưởng đến thứ tự kết quả của bạn. Nếu bạn cần một thứ tự cụ thể, hãy luôn thêm một câu lệnh ORDER BY ở cuối câu truy vấn UNION của bạn.

Kết luận (Conclusion)

Và thế là bạn đã có nó, các học sinh yêu quý của tôi! Bạn vừa học cách sử dụng clauses UNION mạnh mẽ trong PostgreSQL. Nhớ rằng, như bất kỳ pháp thuật nào, nó cần sự luyện tập để thành thạo. Đừng ngại thử nghiệm với các câu truy vấn khác nhau và xem bạn sẽ nhận được kết quả gì.

Trước khi để bạn đi, hãy thử một thử thách nhỏ: Tạo hai bảng của riêng bạn (có thể là một bảng cho các bộ phim yêu thích và một bảng cho các chương trình truyền hình yêu thích) và sử dụng UNION để kết hợp chúng. Thử nghiệm với UNION và UNION ALL để thấy sự khác biệt.

Chúc các bạn thành công trong việc truy vấn, và mong rằng cơ sở dữ liệu của bạn luôn được chuẩn hóa và các kết nối của bạn luôn nhanh chóng!

Credits: Image by storyset