📖 テーマ設定
🔊 音声設定
1.2
1.0
1.0
▶️ 再生コントロール
🎵 BGM設定
0.3
🔔 効果音設定
0.3

psqlでサンドボックスのデータを覗いてみる

概要

  • 日程: Day 1 / セッション 4
  • 時間: 10:55-11:40
  • 形式: 実習
  • ゴール: psqlの基本コマンド(\dt \d \l \q)と簡単なSELECT文で、サンドボックス内の7テーブルそれぞれの構造とデータ件数を確認できる
  • 学習形式: ハンズオン実習(AIサポートあり)

導入(5分)

前のセッションでは、テーブル・主キー・外部キーという「概念」を学びました。今度はその概念が、サンドボックスの中で本当にそうなっているかを、自分の目で確かめます。

ここで少し考えてみてください。料理本でレシピを読むのと、実際に冷蔵庫を開けて材料を見るのとでは、印象がだいぶ違いますよね。座学が「レシピを読む」だとすれば、これからの45分は「冷蔵庫を開ける」時間です。

このセッションで友達になるのが、psqlのメタコマンド(バックスラッシュで始まる便利コマンド)と、最小限のSELECT文です。

本編(40分)

1. メタコマンドとSQL——2種類の話し方

psqlに向かって話しかける方法は、実は2種類あります。

  • メタコマンド\dt\d\l など。バックスラッシュで始まる psql 独自の便利コマンド。「テーブル一覧を見せて」「DB一覧を見せて」のような、psqlへの指示
  • SQLSELECT * FROM employees; のような、データベースそのものへの問い合わせ。最後にセミコロン ; が必須

これは、いわばコンビニのレジでの会話に似ています。「袋ください」(メタコマンド=psqlへの依頼)と、「ホットコーヒーをLでください」(SQL=中身の注文)の違いです。

ここがポイント

  • メタコマンドにはセミコロン不要、SQL文には必須
  • 困ったら \? でメタコマンドのヘルプ、\h でSQLのヘルプ

2. まずは接続から

念のため、もう一度接続から始めます。前のセッションで使った呪文です。

コード例・実例

docker exec -it postgres-sandbox psql -U postgres -d sandbox

プロンプトが sandbox=# になればOK。ならない場合は docker compose up -d でコンテナを起動してから再度試してください。

3. 主役のメタコマンド5つ

ここから、psqlを「触って覚える」時間です。まずは5つのメタコマンドを順番に打ってみましょう。

コード例・実例

sandbox=# \l
sandbox=# \dt
sandbox=# \dn
sandbox=# \d employees
sandbox=# \?

それぞれの意味は次の通りです。

コマンド 意味
\l データベース一覧(list databases)
\dt 現在のDBのテーブル一覧
\dn スキーマ一覧(PostgreSQLではテーブルをまとめる「フォルダ」のような概念)
\d テーブル名 そのテーブルのカラム定義・型・制約まで詳細表示
\? メタコマンド一覧(迷ったらこれ)

特に \d employees は強力です。実行すると次のような情報が一気に見えます:

  • 各カラムの名前と型(VARCHAR(50)、NUMERIC(10,2)、DATE など)
  • どのカラムが主キーか
  • どのカラムが外部キーか(Foreign-key constraints
  • インデックスが張られている列

前のセッションで学んだ「主キー」「外部キー」が、ここで実物として見えるはずです。employeesの department_id が departments(department_id) を参照していることが、\d employees の出力に書かれています。

ここがポイント

  • \d だけだと「全部のオブジェクト一覧」、\dt で「テーブルだけ」になる
  • バックスラッシュは日本語キーボードでは「¥」キーで入力できることが多い

4. SELECT文で「中身」を覗く

メタコマンドはテーブルの「骨格」を見せてくれますが、中身(実データ)を見るには SQL が必要です。

最も基本のSELECT文は次の形です。

コード例・実例

SELECT * FROM departments;
  • SELECT *:すべての列を選ぶ(* はワイルドカード)
  • FROM departments:departmentsテーブルから取る
  • ;:これでSQL文の終わり

departmentsは5行しかないので、これでも問題ありません。でも employees や products は10件以上あります。10件くらいなら平気ですが、本物のDBは100万件入っていることもあります。そんなときは LIMIT で先頭だけ表示します。

SELECT * FROM employees LIMIT 5;

これで先頭5件だけが表示されます。本物のDBに対して SELECT * だけで叩くと、ターミナルが流れて止まらない事故が起きるので、LIMITは早めに身につけたい癖です。

行数だけ知りたいときは、COUNT を使います(詳しくは集約関数のセッションで扱います)。

SELECT COUNT(*) FROM employees;

これで「何件あるか」が一発で分かります。

ここがポイント

  • SQL文は必ず末尾に ; が必要。打ち忘れると改行されて入力待ちになる(その場合は ; だけ打てばOK)
  • SELECT * FROM テーブル LIMIT 5; は最強の「のぞき見コマンド」

5. 7テーブルを順に覗いてみる

ここからが実習の本番です。サンドボックスの7テーブルを、\d と SELECT で順番に確認します。

コード例・実例

departments から順に、次のパターンを繰り返します。

\d departments
SELECT * FROM departments LIMIT 5;
SELECT COUNT(*) FROM departments;

これを以下のテーブルでも繰り返します:

  • employees(10件)
  • customers(8件)
  • categories(5件)
  • products(16件)
  • orders(10件)
  • order_items(19件)

それぞれのテーブルで「どんな列があるか」「主キー・外部キーはどれか」「ざっとどんなデータか」を眺めてください。

コラム

psqlは1986年にPostgreSQLの前身「POSTGRES」のクライアントツールとして誕生しました。それから40年近く、見た目はほぼ変わっていません。最新のGUIツールが次々と現れる中で、なぜpsqlがいまだに現役なのかというと、「軽い・確実に動く・スクリプトと相性が良い」の3つが理由です。新人エンジニアが現場で「ベテランの先輩が GUI ではなく真っ黒い画面で SQL を叩いている」のを見て驚くことがありますが、あれは伊達ではなく、最短距離で答えにたどり着くための合理的選択なのです。

6. リレーションを実データで確かめる

最後に、前のセッションで学んだ「線でつながる」を実データで確かめます。

employees の 太郎・山田 は department_id = 1 でした。これが departments のどこを指しているか、目視で確認してみましょう。

SELECT employee_id, first_name, last_name, department_id FROM employees LIMIT 3;
SELECT * FROM departments;

employees の department_id = 1 の人と、departments の department_id = 1 の行(営業部)が結ばれている、というのが「リレーション」の実体です。これを SQL で1発でつなぐ方法(JOIN)は Day2 で学びます。今は「目で線をつなぐ」だけで十分です。

💬 AIに聞いてみよう

  • \d\dt\dn の使い分けを表にまとめて」
  • 「LIMITをつけずに巨大なテーブルを SELECT * してしまった。どう止める?」
  • 「order_items の \d を実行したら、外部キー制約が2つ表示された。何を意味してる?」

実習・演習

課題

  1. 7つのテーブルそれぞれに対して \d テーブル名 を実行し、構造を確認する
  2. 7つのテーブルそれぞれに対して SELECT * FROM テーブル名 LIMIT 5; を実行し、データを確認する
  3. 7つのテーブルそれぞれに対して SELECT COUNT(*) FROM テーブル名; を実行し、件数をメモする
  4. 「order_items が他のどのテーブルとつながっているか」を、\d order_items の出力から答える

成果物

  • 7テーブルの件数メモ(例:departments=5, employees=10, ...)
  • 「サンドボックスのテーブル間関係図」を自分の手で1枚(紙でもメモアプリでも可)

ヒント

  • ↑キーで直前のコマンドを呼び出せる。テーブル名だけ書き換えれば効率的に試せる
  • 結果が長くて見にくい時は \x で縦表示モードに切り替えられる
  • 困ったらAIに「\d order_items の出力を貼るので、外部キー制約の部分を解説して」と頼む

まとめ(5分)

今回学んだことを一言でまとめると「\dt \d で骨格を、SELECT * FROM テーブル LIMIT 5; で中身を見る。これだけで未知のDBを覗ける」ということです。これは皆さんが現場に出てからも、まず使うようになる「最初の手」です。

メタコマンド(psqlへの指示)と SQL(DBへの問い合わせ)の違いも、もう手に馴染んだはずです。

次のセッションでは、いったん画面から離れて「データ型」を学びます。\d employees で見た VARCHAR(50)NUMERIC(10, 2) という呪文の意味が、次の20分でクリアになります。

🔄 振り返りチェック

  • メタコマンドとSQLの違いを「セミコロン」「先頭の記号」の2点で説明できますか?
  • \d employees を実行すると、何が分かりますか(3つ以上挙げる)?
  • 7テーブルのうち、件数が一番多いのはどれでしたか?

補足資料

  • 発展課題: \timing を使ってクエリの実行時間を表示し、SELECT * FROM order_items;SELECT * FROM order_items LIMIT 5; の所要時間の違いを観察する

学習ガイド

想定される質問と回答例

質問 ヒント
SELECT ** って何? 「全部の列」を意味するワイルドカード。実務では列名を指定するのが推奨される(理由は次回)
psqlの結果表示で改行が乱れる \x でExpand表示(縦に並ぶ)に切替できる。\x をもう一度打つと戻る
大文字小文字どっちがいい? SQLの予約語(SELECT, FROMなど)は大文字、テーブル名・列名は小文字、が一般的な慣習
\dDESCRIBE どっち? DESCRIBE は MySQL のコマンド。PostgreSQL は \d を使う

つまずきやすいポイント

つまずきポイント ヒント
セミコロン忘れで入力待ちになる プロンプトが sandbox=# から sandbox-# に変わる。; を打って Enter で実行される
文字化けして読めない \encoding で文字コード確認。多くの場合 UTF8 で動いている。ターミナル側の設定を確認
\d で表示が縦に長く流れる 結果が多いときは psql がページャ(less)に流す。q で抜けて元のプロンプトに戻れる
メタコマンドの末尾にセミコロンを付けてしまう エラーにはならないが、たまに変な挙動になる。「メタにはセミコロン不要」を覚える
読み上げを開始します...

AIに質問する