PostgreSQL - UNIONS句
こんにちは、未来のデータベース魔術師たち!今日は、PostgreSQLの魔法の世界に飛び込み、その強力な魔法の一つであるUNION句を探求します。これまで一度もコードを書いたことがない人も心配しないでください - この冒険のなかであなたの親切なガイドになるでしょう。では、魔法の杖(キーボード)を手に取り、始めましょう!
UNIONとは?
本題に入る前に、まずUNIONとは何かを理解しましょう。あなたが好きな本のリストが二つあるとします。其一はファンタジー小説で、もう一つはSFタイトルです。これらのリストを一つにまとめて、素晴らしい本のスーパーリストを作りたいと考えます。これがデータベースの世界でUNIONが行うことです!
PostgreSQLでは、UNIONは二つ以上のSELECT文の結果を一つの結果セットに結合するのに使用されます。これは、異なる色の絵の具を混ぜて新しい、興味深い色を作るのに似ています!
文法
では、UNIONの魔法の言葉(文法)を見てみましょう:
SELECT column1, column2, ... FROM table1
UNION
SELECT column1, column2, ... FROM table2;
簡単に見えますよね?しかし、力には責任が伴います。以下の重要なルールを守る必要があります:
- 全てのSELECT文の列の数と順序は同じでなければなりません。
- 対応する列のデータタイプは互換性がある必要があります。
- デフォルトでは、UNIONは重複行を削除します(後ほどこれを変更する方法を見ます)。
例
さて、本のリストの類似を実際のコードで生き返らせましょう。fantasy_books
とscifi_books
という二つのテーブルがあるとします。
-- fantasy_booksテーブルの作成
CREATE TABLE fantasy_books (
id SERIAL PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(100)
);
-- ファンタジー小説の挿入
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');
-- scifi_booksテーブルの作成
CREATE TABLE scifi_books (
id SERIAL PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(100)
);
-- SF小説の挿入
INSERT INTO scifi_books (title, author) VALUES
('Dune', 'Frank Herbert'),
('The Hitchhiker''s Guide to the Galaxy', 'Douglas Adams'),
('1984', 'George Orwell');
さて、UNIONを使ってスーパーリストを作成しましょう:
SELECT title, author FROM fantasy_books
UNION
SELECT title, author FROM scifi_books;
このクエリは、二つのテーブルから重複しない全ての本のリストを返します。これは、二つのカードデッキを一緒にするようなもので、重複したカードがないことを確認します!
結果の理解
このクエリを実行すると、以下のような結果が表示されます:
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 |
この美しい、結合されたリストを見てください!まるでファンタジーとSFの作者たちが集まるパーティーのようです。トールキンとヘ伯特が世界創造について興味深い会話をしている姿が almost 想像できます!
UNION ALL句
では、重複行を含むすべての行を保持したい場合どうなるでしょうか?その場合はUNION ALLが便利です。まるでデータベースに「すべての本を欲しい、重複でも構わない」と言っているようなものです!
前の例を少し修正してみましょう:
-- 重複の本をscifi_booksに挿入
INSERT INTO scifi_books (title, author) VALUES
('The Hobbit', 'J.R.R. Tolkien');
-- UNION ALLを使ってみる
SELECT title, author FROM fantasy_books
UNION ALL
SELECT title, author FROM scifi_books;
このクエリは以下のような結果を返します:
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 |
見てください、「The Hobbit」が二度現れます。まるで同じゲストをパーティーに二度招待し、彼に二度のケーキを提供するようなものです!
実用的な応用
「これはすごいけど、実際にどこで使うんだ?」と思うかもしれません。素晴らしい質問です!以下にいくつかのシナリオを挙げます:
- 同様の構造を持つ異なるテーブルからのデータを結合する(例えば、本のリスト)。
- 異なるクエリの結果を合わせて包括的なレポートを作成する。
- 異なる時間帯やカテゴリ間でデータを比較する。
例えば、書店を運営しているとします。在庫が少ないか、最後の売却日から一ヶ月以上経過している本を一覧にするためにUNIONを使うことができます:
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';
このクエリは、どの本を再注文する必要があるか、またはセールにする必要があるかを迅速に特定するのに役立ちます。
共通の落とし穴と回避策
-
列の不一致:すべてのSELECT文の列の数と順序が一致する必要があります。不一致があると、PostgreSQLは即座にエラーを返します!
-
データタイプの非互換性:対応する列のデータタイプは互換性がある必要があります。林檎と宇宙船を混ぜることはできません(除非、非常に興味深いSFを書いている場合)。
-
ORDER BYの忘却:UNION操作は結果の順序に影響を与えることがあります。特定の順序が必要な場合は、常にクエリの最後にORDER BY句を追加します。
結論
そして、ここまでで亲爱的な学生たち!あなたたちはPostgreSQLの強力なUNION句を習得しました。良い魔法の言葉は練習によって熟成されます。ためらわずに異なるクエリを試し、結果を確認してください。
去る前に、小さな挑戦を用意しました:二つのテーブルを作成して(例えば、好きな映画と好きなテレビ番組)、UNIONとUNION ALLを使って結合してみてください。違いを観察してみてください。
ハッピーキュアリー、そしてあなたのデータベースは常に正規化され、ジョインは迅速であることを祈っています!
Credits: Image by storyset