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への指示 - SQL:
SELECT * 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つ表示された。何を意味してる?」
実習・演習
課題
- 7つのテーブルそれぞれに対して
\d テーブル名を実行し、構造を確認する - 7つのテーブルそれぞれに対して
SELECT * FROM テーブル名 LIMIT 5;を実行し、データを確認する - 7つのテーブルそれぞれに対して
SELECT COUNT(*) FROM テーブル名;を実行し、件数をメモする - 「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テーブルのうち、件数が一番多いのはどれでしたか?
補足資料
- 参考リンク: PostgreSQL公式: psqlリファレンス
- 発展課題:
\timingを使ってクエリの実行時間を表示し、SELECT * FROM order_items;とSELECT * FROM order_items LIMIT 5;の所要時間の違いを観察する
学習ガイド
想定される質問と回答例
| 質問 | ヒント |
|---|---|
SELECT * の * って何? |
「全部の列」を意味するワイルドカード。実務では列名を指定するのが推奨される(理由は次回) |
| psqlの結果表示で改行が乱れる | \x でExpand表示(縦に並ぶ)に切替できる。\x をもう一度打つと戻る |
| 大文字小文字どっちがいい? | SQLの予約語(SELECT, FROMなど)は大文字、テーブル名・列名は小文字、が一般的な慣習 |
\d と DESCRIBE どっち? |
DESCRIBE は MySQL のコマンド。PostgreSQL は \d を使う |
つまずきやすいポイント
| つまずきポイント | ヒント |
|---|---|
| セミコロン忘れで入力待ちになる | プロンプトが sandbox=# から sandbox-# に変わる。; を打って Enter で実行される |
| 文字化けして読めない | \encoding で文字コード確認。多くの場合 UTF8 で動いている。ターミナル側の設定を確認 |
\d で表示が縦に長く流れる |
結果が多いときは psql がページャ(less)に流す。q で抜けて元のプロンプトに戻れる |
| メタコマンドの末尾にセミコロンを付けてしまう | エラーにはならないが、たまに変な挙動になる。「メタにはセミコロン不要」を覚える |