順番に読み進めながら学べます

SELECT — テーブルからデータを取り出す

SQL の SELECT 文を基礎から解説します。全列・特定列の取り出し、AS による列の別名、WHERE による行の絞り込み、比較演算子と AND / OR の組み合わせまで、ブラウザで実行しながら学べます。

本講座で学ぶ SQL について

本講座で扱うのは、MySQL / Oracle / PostgreSQL / SQL Server など主要な RDBMS で共通して使える普遍的な SQL 構文 です。CREATE TABLE / SELECT / WHERE / JOIN / GROUP BY といった基礎は、どの DB に移っても同じ書き方でそのまま通用します。

ブラウザのコンソールは技術的制約から SQLite を採用していますが、DB ごとに異なる箇所(型の長さ強制、テーブル一覧の確認方法など)が出てきたら、MySQL ではこう書く のように他 DB の書き方も並べて紹介します。

SELECT — 全列を取り出す

テーブルに入っているデータを取り出すには SELECT 文を使います。SELECT は SQL のなかでも最も使う構文で、レポート作成・画面表示・データ分析・バッチ処理など、データを「読む」場面のほぼすべてが SELECT から始まります。

まずはテーブルの すべての列 をそのまま取り出す書き方から見ていきます。SELECT **(アスタリスク)は「全列」を表す記号で、続く FROM 表名 で取り出す対象のテーブルを指定します。

-- user テーブルの全列・全行を取り出す
SELECT * FROM user;
SELECT 文の構造
SELECTFROMWHERE列リスト* / name, ageテーブル名user行の条件age >= 30列を選ぶ対象の表行を絞る
SELECT は「どの列を取るか」、FROM は「どのテーブルから取るか」、WHERE は「どの行に絞るか」を指定します。3 つの位置と役割をまず押さえます。

記事冒頭で用意されている user テーブルから、すべての列・すべての行を取り出してみましょう。(正しく実行できれば解説が表示されます)

SELECT * FROM user; を書いて実行してください。

② 結果が 5 行返り、id / name / age / city の 4 列が並ぶことを確認してください。

SQL エディタ

クエリを実行してください

特定の列だけ取り出す

SELECT * は便利ですが、実際のアプリでは 必要な列だけ を取り出すほうが望ましい場面が多くあります。送受信するデータ量が減り、画面に出したい列だけが結果として返るので、後段の処理がシンプルになります。

列を選ぶときは SELECT の直後に 列名をカンマ区切り で並べます。並べた順序がそのまま結果の列順になります。

全列 vs 列指定 — 取り出す列でデータ量が変わる
SELECT *SELECT name, age4 列(id / name / age / city)2 列(name / age)全列が結果に並ぶ必要列だけ並ぶ中身をざっと見たい時本番アプリ・レポート向き列数を絞る出力を絞る用途で使い分け
SELECT は全列を返すので調査向き、列リスト指定は必要な列だけ返すので本番向き。各段の矢印で「同じ観点で左 (SELECT ) と右 (SELECT name, age) を比較」していることを示しています。
-- name と age の 2 列だけ取り出す
SELECT name, age FROM user;

-- 順序を入れ替えて取り出すことも可能
SELECT city, name FROM user;

ユーザー一覧画面で「名前と年齢だけ」を表示したい、という場面を想定します。

user テーブルから nameage の 2 列だけを、その順序で取り出してください。

② 結果が 5 行 × 2 列になり、idcity が結果に含まれていないことを確認してください。

SQL エディタ

クエリを実行してください

AS — 列に別名をつける

SELECT した列の見出しは、デフォルトでは元の列名がそのまま結果に表示されます。列 AS 別名 の形で書くと、結果側の列名を任意の名前に変更 できます。元のテーブルの列名は変わりません — あくまで「この SELECT の結果としてどう呼びたいか」を指定する仕組みです。

別名は 式に対して名前を付けたいとき にもよく使います。age + 1 のような算術式や SUM(price) のような集計関数の戻り値には標準の列名がないため、AS を付けない場合は式そのままが結果のヘッダーになり、画面表示や後段のプログラムから扱いにくくなります。

AS の働き — 結果列のヘッダーを書き換える
SELECT 文結果ヘッダ値の例SELECT name FROM username(元の列名)Alice / Bob /...SELECT name AS user_name FROM useruser_name(別名)Alice / Bob /...(値は変わらず)SELECT age + 1 AS next_year FROM usernext_year(式に名前)31 / 26 /...(age + 1)ヘッダのみ別名に式に名前
AS は結果側のヘッダーだけを変える操作で、テーブル本体の列名は変わりません。算術式や集計関数の戻り値には標準名がないため、AS で名前を付けるのが定石です。
-- 列に別名をつける
SELECT name AS user_name, age AS user_age FROM user;

-- 式に別名をつける(翌年の年齢を計算)
SELECT name, age + 1 AS next_year_age FROM user;

AS は省略できる

SELECT name AS user_name FROM user;SELECT name user_name FROM user; のように AS を省略 しても同じ意味になります。ただし AS を書いた方が「ここから別名」と読み手にすぐ伝わるため、本講座では AS を明示する書き方で統一します。

別名にスペースや日本語を含めたい場合は、ダブルクオートで囲んで AS "翌年の年齢" のように書きます。

ユーザー一覧画面で「現在の年齢」と「来年の年齢」を並べて表示したい、という要件を想定します。

user テーブルから nameageage + 1 の 3 つを取り出してください。

② 3 列目の age + 1 には next_year_age という別名を AS で付けてください。

③ 結果が 5 行 × 3 列になり、3 列目のヘッダーが next_year_age になっていることを確認してください。

SQL エディタ

クエリを実行してください

WHERE — 行を条件で絞り込む

ここまでで「列を選ぶ」操作は学びました。次は 行を絞り込む 操作です。SELECT 列 FROM 表 のあとに WHERE 条件 を付けると、条件を満たした行だけが結果に残ります。

SELECT が 縦方向(列) を選ぶのに対して、WHERE は 横方向(行) を選ぶ、という対比でとらえると整理しやすくなります。

SELECT は列を、WHERE は行を絞る
SELECT name, age(縦に絞る)WHERE id = 2(横に絞る → 1 行だけ残る)idnameagecity1Alice30Tokyo2Bob25Osaka3Carol35Tokyo
SELECT name, age(緑の縦線)で 4 列から 2 列へ、WHERE id = 2(青の横線)で 3 行から 1 行へ絞り込みます。両者の交差部 — Bob の name と age — が最終結果として 1 行 × 2 列で返ります。

比較演算子

WHERE の中では 比較演算子(値を比べて真偽を返す記号)で条件を書きます。SQL の比較演算子は他のプログラミング言語とよく似ていますが、等しい== ではなく = 1 つで書く点だけ注意してください。

演算子意味
=等しいage = 30
<>等しくない(!= も可)city <> 'Tokyo'
<より小さいage < 30
>より大きいage > 30
<=以下age <= 30
>=以上age >= 30
-- 30 歳以上の利用者だけを取り出す
SELECT * FROM user WHERE age >= 30;

-- city が Tokyo の行だけを取り出す(文字列はシングルクオートで囲む)
SELECT * FROM user WHERE city = 'Tokyo';

-- city が Tokyo 以外の行だけを取り出す
SELECT * FROM user WHERE city <> 'Tokyo';

文字列の `=` 比較は大文字小文字を区別する

本講座のコンソールでは、文字列の `=` 比較は大文字小文字を区別 します。WHERE name = 'alice''Alice' と一致せず、結果は 0 行になります。MySQL では照合順序(collation)の設定によって大文字小文字を区別しない比較が既定になっていることが多く、同じ書き方でも 1 行返ることがあります。

`WHERE 列 = NULL` は意図通りに動かない

WHERE name = NULL のように書いても、想定する「name が NULL の行」は取り出せません。SQL では NULL は「不明値」扱いで、= NULL の評価結果は 常に NULL になり、WHERE で除外されてしまうためです。NULL 行を取り出すには専用の WHERE 列 IS NULL を使います。詳しくは後の WHERE 詳細編で扱いますが、ここでは「= NULL は使わない」とだけ覚えておいてください。

「30 歳以上のユーザーをすべて表示したい」という要件を想定します。

user テーブルから、age が 30 以上の行をすべて取り出してください。

② 結果が 3 行(Alice / Carol / Eve)になり、Bob と Dave が含まれないことを確認してください。

SQL エディタ

クエリを実行してください

AND / OR — 複数条件を組み合わせる

実務では「東京在住で 30 歳以上のユーザー」「会員ランクが gold か platinum」のように、複数の条件を組み合わせて 絞り込みたい場面がよくあります。SQL では条件同士を AND(両方満たす)と OR(どちらかを満たす)で結びます。

もう一つよく使うのが NOT(条件を否定する)で、NOT (city = 'Tokyo') は「東京ではない」という意味になります。<> でも同じことを書けるので、最初は AND と OR の 2 つを押さえます。

論理演算子意味
AND両方の条件を満たすage >= 30 AND city = 'Tokyo'
ORどちらかの条件を満たすcity = 'Tokyo' OR city = 'Osaka'
NOT条件を否定するNOT (city = 'Tokyo')
-- 東京在住で 30 歳以上のユーザー
SELECT name, age, city FROM user WHERE city = 'Tokyo' AND age >= 30;

-- 東京または大阪のユーザー
SELECT name, city FROM user WHERE city = 'Tokyo' OR city = 'Osaka';

AND と OR を混ぜるときは括弧を付ける

AND と OR を 1 つの WHERE で混ぜると、AND が OR より 優先して 評価されます。A OR B AND CA OR (B AND C) の意味になり、書いた順番どおりには評価されません。

意図とずれないように、AND と OR を混ぜるときは 括弧で評価順を明示 します。たとえば「(東京または大阪) かつ 30 歳以上」は WHERE (city = 'Tokyo' OR city = 'Osaka') AND age >= 30 のように書きます。括弧は読み手にも意図が伝わるので、迷ったら付けておくと安全です。

「東京または大阪に住んでいて、25 歳以上で、Carol を除いたユーザーの名前と居住地を一覧で出したい」という要件を想定します。AND・OR・NOT の 3 つを組み合わせる演習です。

user テーブルから namecity の 2 列を取り出してください。

`city` が `'Tokyo'` または `'Osaka'`、かつ `age` が 25 以上、かつ `name` が `'Carol'` ではない の 3 条件を AND で結んだ WHERE で絞り込んでください(OR の部分は 括弧で評価順を明示 してください)。

③ 結果が 3 行(Alice Tokyo / Bob Osaka / Eve Tokyo)になり、Carol(Tokyo / 35)と Dave(Kyoto / 28)が含まれないことを確認してください。

SQL エディタ

クエリを実行してください
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1SELECT * FROM user;* の意味として正しいものはどれですか。

Q2SELECT と WHERE の役割の説明として最も正しいものはどれですか。

Q3SQL の比較演算子 <> の意味として正しいものはどれですか。