🔩 ねじき教室 Go と Web の教室

SELECT でデータを取り出す

読了目安 約3分

手元に MySQL を用意し、SELECT、WHERE、ORDER BY、LIMIT でデータを取り出せるようになります。

この章の目次

練習環境を用意する

MySQL を手元で動かします。 Docker というツールを使いますが、中身の説明は割愛します(動けば OK です)。 Docker Desktop を Windows に入れて WSL 連携を有効にすると、WSL のターミナルで docker コマンドが使えるようになります。 次のコマンドで、MySQL サーバーの起動と、SQL を打ち込む対話画面(mysql クライアント)への接続を順に行います。

シェル
docker run --name neziki-mysql -e MYSQL_ROOT_PASSWORD=neziki -p 3306:3306 -d mysql:8.4
docker exec -it neziki-mysql mysql -uroot -pneziki

接続エラーになるときは、初期化が終わるまで 30 秒ほど待って再実行してください。 パスワードに関する警告(Warning)は気にしなくてかまいません。

プロンプトが mysql> に変わったら準備完了で、以降の章の SQL はすべてこの画面に打ち込みます。

サンプルデータを入れる

まず遊ぶためのデータを、次のブロックを丸ごと貼り付けて入れます。 文法は次章で説明するので、いまは読めなくてかまいません。

SQL
CREATE DATABASE neziki;
USE neziki;

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  email VARCHAR(100) NOT NULL,
  created_at DATETIME NOT NULL
);

INSERT INTO users (name, email, created_at) VALUES
  ('alice', '[email protected]', '2026-01-05 10:00:00'),
  ('bob',   '[email protected]',   '2026-01-06 12:30:00'),
  ('carol', '[email protected]', '2026-02-01 09:15:00'),
  ('dave',  '[email protected]',  '2026-02-14 18:45:00'),
  ('eve',   '[email protected]',   '2026-03-03 08:00:00');

掲示板のユーザー 5 人が登録済みの状態で、Part 5 でもこの users テーブルを使います。

SELECT ですべての行を見る

まず全部見てみます。

SQL
SELECT * FROM users;
テキスト
+----+-------+-------------------+---------------------+
| id | name  | email             | created_at          |
+----+-------+-------------------+---------------------+
|  1 | alice | [email protected] | 2026-01-05 10:00:00 |
|  2 | bob   | [email protected]   | 2026-01-06 12:30:00 |
|  3 | carol | [email protected] | 2026-02-01 09:15:00 |
|  4 | dave  | [email protected]  | 2026-02-14 18:45:00 |
|  5 | eve   | [email protected]   | 2026-03-03 08:00:00 |
+----+-------+-------------------+---------------------+

読み方は後ろからです。 FROM users が「users テーブルから」、SELECT * が「すべての列を取り出す」を意味し、文の終わりにはセミコロンを付けます。 このような、DB への問い合わせの文をクエリと呼びます。

列を指定する

* の代わりに列名を書くと、その列だけが返ります。

SQL
SELECT name, email FROM users;
テキスト
+-------+-------------------+
| name  | email             |
+-------+-------------------+
| alice | [email protected] |
| bob   | [email protected]   |
| carol | [email protected] |
| dave  | [email protected]  |
| eve   | [email protected]   |
+-------+-------------------+

手打ちの確認では * が手軽ですが、使わない列まで転送するのは無駄なので、アプリのコードでは必要な列だけを指定します。

WHERE で行を絞る

条件に合う行だけが欲しいときは WHERE を付けます。

SQL
SELECT * FROM users WHERE id >= 4;
テキスト
+----+------+------------------+---------------------+
| id | name | email            | created_at          |
+----+------+------------------+---------------------+
|  4 | dave | [email protected] | 2026-02-14 18:45:00 |
|  5 | eve  | [email protected]  | 2026-03-03 08:00:00 |
+----+------+------------------+---------------------+

比較には = != < <= > >= が使えます。 文字列はシングルクォートで囲みます(WHERE name = 'alice')。

文字列を部分一致で探すときは LIKE を使います。 パターン中の % は「任意の 0 文字以上」を表します。

SQL
SELECT * FROM users WHERE email LIKE '%@example.com';
テキスト
+----+-------+-------------------+---------------------+
| id | name  | email             | created_at          |
+----+-------+-------------------+---------------------+
|  1 | alice | [email protected] | 2026-01-05 10:00:00 |
|  3 | carol | [email protected] | 2026-02-01 09:15:00 |
|  4 | dave  | [email protected]  | 2026-02-14 18:45:00 |
+----+-------+-------------------+---------------------+

'a%' なら「a で始まる」の前方一致です。

条件は ANDOR でつなげます。

SQL
SELECT * FROM users WHERE id >= 3 AND email LIKE '%@example.com';
テキスト
+----+-------+-------------------+---------------------+
| id | name  | email             | created_at          |
+----+-------+-------------------+---------------------+
|  3 | carol | [email protected] | 2026-02-01 09:15:00 |
|  4 | dave  | [email protected]  | 2026-02-14 18:45:00 |
+----+-------+-------------------+---------------------+

条件をいろいろ変えて打ってみてください。 SELECT はデータを読むだけで、何回打ってもテーブルは変わりません。

ORDER BY で並べ替える

行の順番を指定したいときは ORDER BY を付けます。 DESC が降順、ASC が昇順で、省略すると昇順です。

SQL
SELECT * FROM users ORDER BY created_at DESC;
テキスト
+----+-------+-------------------+---------------------+
| id | name  | email             | created_at          |
+----+-------+-------------------+---------------------+
|  5 | eve   | [email protected]   | 2026-03-03 08:00:00 |
|  4 | dave  | [email protected]  | 2026-02-14 18:45:00 |
|  3 | carol | [email protected] | 2026-02-01 09:15:00 |
|  2 | bob   | [email protected]   | 2026-01-06 12:30:00 |
|  1 | alice | [email protected] | 2026-01-05 10:00:00 |
+----+-------+-------------------+---------------------+

逆に言うと、ORDER BY を書かないときの順番に保証はないので、順番が要るなら必ず書きます。

LIMIT で件数を絞る

先頭から決まった件数だけ欲しいときは LIMIT を付けます。

SQL
SELECT * FROM users ORDER BY created_at DESC LIMIT 2;
テキスト
+----+------+------------------+---------------------+
| id | name | email            | created_at          |
+----+------+------------------+---------------------+
|  5 | eve  | [email protected]  | 2026-03-03 08:00:00 |
|  4 | dave | [email protected] | 2026-02-14 18:45:00 |
+----+------+------------------+---------------------+

競プロの言葉で言えば、WHERE はフィルタ、ORDER BY はソート、LIMIT は先頭 k 件の取り出しです。