PostgreSQL配列型(Array)入門ガイド!初心者でもわかるデータベースの便利な使い方
生徒
「先生、データベースの表の中に『複数のデータ』をひとまとめにして入れたいときはどうすればいいんですか?例えば、一人の人が持っている趣味を全部一つの項目に入れたいんです。」
先生
「それは面白い視点ですね。PostgreSQLには『配列型(Array)』という非常に便利な機能があります。これを使えば、一つの枠の中に複数の値を詰め込むことができるんですよ。」
生徒
「配列って、何だか難しそうな名前ですね。パソコンに詳しくなくても使いこなせますか?」
先生
「もちろんです。お弁当箱の仕切りの中に、おかずをいくつか入れるようなイメージだと思ってください。基本的な書き方さえ覚えれば、データの整理がぐっと楽になりますよ。」
1. PostgreSQLの配列型(Array)とは?
データベース(情報を整理して保管する仕組み)の世界では、通常「一つの枠には一つのデータ」を入れるのが基本のルールです。これを専門用語で「正規化」と呼んだりしますが、初心者の方は「一つのマス目には一つの言葉しか書かない」というルールだと思ってください。
しかし、世界的に人気の高いデータベース管理システムである「PostgreSQL(ポストグレスキューエル)」では、その基本ルールを一歩進めた便利な機能が使えます。それが「配列型(Array)」です。
配列型とは、一つの列(カラム)の中に、同じ種類のデータを複数まとめて保存できる形式のことです。例えば、「好きな食べ物」という項目に「リンゴ、バナナ、イチゴ」と複数を一度に入れることができます。
プログラミング未経験の方にとって、配列は「仕切りのある引き出し」のようなものです。一つの引き出しの中に、複数の靴下を並べて入れておくことができるように、データベースのひとつのセル(マス目)の中に、複数の値を並べて保管できるのです。
2. 配列型のメリットと使いどころ
なぜ、わざわざ配列型を使うのでしょうか?それは「データをシンプルに管理できる」場合があるからです。
例えば、スマートフォンの連絡先アプリを想像してみてください。一人の友人が複数の電話番号(自宅、携帯、仕事用)を持っている場合、それらをバラバラの場所に保存するよりも、「電話番号リスト」としてまとめて管理できたほうが、画面が見やすくなりますよね。
主なメリットは以下の通りです:
- データの構造が直感的でわかりやすくなる
- 関連するデータを一気に取り出すことができる
- 複雑なテーブル結合(複数の表を合体させる操作)を減らせる場合がある
ただし、何でもかんでも配列にすれば良いわけではありません。データが膨大になる場合や、後から細かい検索を頻繁に行う場合は、従来の「一つのマスに一つのデータ」という形式の方が有利なこともあります。適材適所で使い分けるのが、データベースマスターへの第一歩です。
3. 配列型の基本的な定義とデータの追加
それでは、実際に配列型を使ったテーブルを作ってみましょう。今回は「部活動のメンバーリスト」を作成します。一人の生徒が複数の「得意なスポーツ」を登録できるようにしてみます。
SQLで配列を指定するときは、データの種類の後ろに「[](角括弧)」を付けます。例えば、文字を入れるなら text[] と書きます。
-- テーブル(表)を作成します
CREATE TABLE students (
id serial PRIMARY KEY,
name text,
sports text[] -- ここが配列型!文字列の集まりを保存できます
);
-- データを追加します
INSERT INTO students (name, sports) VALUES
('田中太郎', ARRAY['野球', 'テニス']),
('佐藤花子', ARRAY['水泳', 'バレーボール', '卓球']),
('鈴木一郎', ARRAY['サッカー']),
('高橋美咲', ARRAY['バスケットボール', 'バドミントン']),
('伊藤健太', ARRAY['剣道', '柔道', '空手']),
('渡辺真衣', ARRAY['陸上', '駅伝']);
実行後のテーブルの中身は、以下のようになります。
id | name | sports
---+----------+------------------------------------
1 | 田中太郎 | {野球,テニス}
2 | 佐藤花子 | {水泳,バレーボール,卓球}
3 | 鈴木一郎 | {サッカー}
4 | 高橋美咲 | {バスケットボール,バドミントン}
5 | 伊藤健太 | {剣道,柔道,空手}
6 | 渡辺真衣 | {陸上,駅伝}
データを入れるときは ARRAY['値1', '値2'] という書き方をします。これで、一つの項目に複数のスポーツが保存されました。中身を見ると「{}(波括弧)」で囲まれて表示されているのがわかりますね。これがPostgreSQLでの配列の表現方法です。
4. 配列の中から特定のデータを取り出す方法
保存した配列の中から、特定の要素だけを取り出したり、特定の条件で検索したりすることも可能です。
例えば、「一番得意なスポーツ(配列の1番目のデータ)」だけを表示したい場合は、インデックス(添字)を使います。PostgreSQLの配列は、1番目から数え始めるのが特徴です。
-- 1番目のスポーツだけを取り出す
SELECT name, sports[1] AS primary_sport
FROM students;
実行結果は以下のようになります。
name | primary_sport
----------+---------------
田中太郎 | 野球
佐藤花子 | 水泳
鈴木一郎 | サッカー
高橋美咲 | バスケットボール
伊藤健太 | 剣道
渡辺真衣 | 陸上
このように、sports[1] と指定することで、複数のデータの中から最初の一つだけを抜き出すことができました。これは、名簿の中から「第一志望」だけを抽出するような操作と同じですね。
5. 配列を使ったデータの検索(ANY関数の活用)
次に、「特定のスポーツが含まれている人を全員探す」という操作をしてみましょう。配列の中身を一つずつチェックするのは大変そうに見えますが、SQLなら簡単です。
ANY という言葉を使うと、「配列の中のどれかに当てはまるなら」という条件を作ることができます。
-- 「バレーボール」が含まれている人を検索する
SELECT name, sports
FROM students
WHERE 'バレーボール' = ANY(sports);
実行前のテーブル状態(再掲):
id | name | sports
---+----------+------------------------------------
1 | 田中太郎 | {野球,テニス}
2 | 佐藤花子 | {水泳,バレーボール,卓球}
3 | 鈴木一郎 | {サッカー}
4 | 高橋美咲 | {バスケットボール,バドミントン}
5 | 伊藤健太 | {剣道,柔道,空手}
6 | 渡辺真衣 | {陸上,駅伝}
実行後の結果:
name | sports
----------+-------------------------
佐藤花子 | {水泳,バレーボール,卓球}
「佐藤花子さん」のスポーツリストの中に「バレーボール」が含まれていたので、正しく抽出されました。もし、名簿の中に「テニス」をしている人を検索すれば、田中太郎さんがヒットすることになります。
6. 配列データをバラバラにする(unnest関数)
最後に、配列として保存したデータを、普通の表のように「一行ずつ」に分解する方法を紹介します。これには unnest(アンネスト)という関数を使います。
「ネスト」とは入れ子構造のこと。それを「アン(打ち消し)」にするので、中身を外に放り出す、という意味になります。
-- 配列をバラバラの行に展開する
SELECT name, unnest(sports) AS sport_item
FROM students
WHERE id <= 2; -- わかりやすくするために最初の2人だけ表示
実行結果:
name | sport_item
----------+------------
田中太郎 | 野球
田中太郎 | テニス
佐藤花子 | 水泳
佐藤花子 | バレーボール
佐藤花子 | 卓球
見てください!一人の名前に対して、スポーツが一つずつ対応するような形に広がりました。配列型でまとめて保存しておきながら、必要に応じてこのようにバラバラにして集計したり分析したりすることもできるのです。
このようにPostgreSQLの配列型は、柔軟にデータを扱うための強力な武器になります。プログラミングの経験がなくても、「複数の値を一つのセットとして扱う」という感覚さえ掴めれば、あなたのデータ管理の幅は大きく広がることでしょう。