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 はすべてこの画面に打ち込みます。
サンプルデータを入れる
まず遊ぶためのデータを、次のブロックを丸ごと貼り付けて入れます。 文法は次章で説明するので、いまは読めなくてかまいません。
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 ですべての行を見る
まず全部見てみます。
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 への問い合わせの文をクエリと呼びます。
列を指定する
* の代わりに列名を書くと、その列だけが返ります。
SELECT name, email FROM users;+-------+-------------------+
| name | email |
+-------+-------------------+
| alice | [email protected] |
| bob | [email protected] |
| carol | [email protected] |
| dave | [email protected] |
| eve | [email protected] |
+-------+-------------------+手打ちの確認では * が手軽ですが、使わない列まで転送するのは無駄なので、アプリのコードでは必要な列だけを指定します。
WHERE で行を絞る
条件に合う行だけが欲しいときは WHERE を付けます。
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 文字以上」を表します。
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 で始まる」の前方一致です。
条件は AND と OR でつなげます。
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 が昇順で、省略すると昇順です。
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 を付けます。
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 件の取り出しです。