PostgreSQL - UNIONS句

こんにちは、未来のデータベース魔術師たち!今日は、PostgreSQLの魔法の世界に飛び込み、その強力な魔法の一つであるUNION句を探求します。これまで一度もコードを書いたことがない人も心配しないでください - この冒険のなかであなたの親切なガイドになるでしょう。では、魔法の杖(キーボード)を手に取り、始めましょう!

PostgreSQL - Unions Clause

UNIONとは?

本題に入る前に、まずUNIONとは何かを理解しましょう。あなたが好きな本のリストが二つあるとします。其一はファンタジー小説で、もう一つはSFタイトルです。これらのリストを一つにまとめて、素晴らしい本のスーパーリストを作りたいと考えます。これがデータベースの世界でUNIONが行うことです!

PostgreSQLでは、UNIONは二つ以上のSELECT文の結果を一つの結果セットに結合するのに使用されます。これは、異なる色の絵の具を混ぜて新しい、興味深い色を作るのに似ています!

文法

では、UNIONの魔法の言葉(文法)を見てみましょう:

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

簡単に見えますよね?しかし、力には責任が伴います。以下の重要なルールを守る必要があります:

  1. 全てのSELECT文の列の数と順序は同じでなければなりません。
  2. 対応する列のデータタイプは互換性がある必要があります。
  3. デフォルトでは、UNIONは重複行を削除します(後ほどこれを変更する方法を見ます)。

さて、本のリストの類似を実際のコードで生き返らせましょう。fantasy_booksscifi_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」が二度現れます。まるで同じゲストをパーティーに二度招待し、彼に二度のケーキを提供するようなものです!

実用的な応用

「これはすごいけど、実際にどこで使うんだ?」と思うかもしれません。素晴らしい質問です!以下にいくつかのシナリオを挙げます:

  1. 同様の構造を持つ異なるテーブルからのデータを結合する(例えば、本のリスト)。
  2. 異なるクエリの結果を合わせて包括的なレポートを作成する。
  3. 異なる時間帯やカテゴリ間でデータを比較する。

例えば、書店を運営しているとします。在庫が少ないか、最後の売却日から一ヶ月以上経過している本を一覧にするために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';

このクエリは、どの本を再注文する必要があるか、またはセールにする必要があるかを迅速に特定するのに役立ちます。

共通の落とし穴と回避策

  1. 列の不一致:すべてのSELECT文の列の数と順序が一致する必要があります。不一致があると、PostgreSQLは即座にエラーを返します!

  2. データタイプの非互換性:対応する列のデータタイプは互換性がある必要があります。林檎と宇宙船を混ぜることはできません(除非、非常に興味深いSFを書いている場合)。

  3. ORDER BYの忘却:UNION操作は結果の順序に影響を与えることがあります。特定の順序が必要な場合は、常にクエリの最後にORDER BY句を追加します。

結論

そして、ここまでで亲爱的な学生たち!あなたたちはPostgreSQLの強力なUNION句を習得しました。良い魔法の言葉は練習によって熟成されます。ためらわずに異なるクエリを試し、結果を確認してください。

去る前に、小さな挑戦を用意しました:二つのテーブルを作成して(例えば、好きな映画と好きなテレビ番組)、UNIONとUNION ALLを使って結合してみてください。違いを観察してみてください。

ハッピーキュアリー、そしてあなたのデータベースは常に正規化され、ジョインは迅速であることを祈っています!

Credits: Image by storyset