Q1SELECT * FROM user; の * の意味として正しいものはどれですか。
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 * は便利ですが、実際のアプリでは 必要な列だけ を取り出すほうが望ましい場面が多くあります。送受信するデータ量が減り、画面に出したい列だけが結果として返るので、後段の処理がシンプルになります。
列を選ぶときは SELECT の直後に 列名をカンマ区切り で並べます。並べた順序がそのまま結果の列順になります。
-- name と age の 2 列だけ取り出す
SELECT name, age FROM user;
-- 順序を入れ替えて取り出すことも可能
SELECT city, name FROM user;
AS — 列に別名をつける
SELECT した列の見出しは、デフォルトでは元の列名がそのまま結果に表示されます。列 AS 別名 の形で書くと、結果側の列名を任意の名前に変更 できます。元のテーブルの列名は変わりません — あくまで「この SELECT の結果としてどう呼びたいか」を指定する仕組みです。
別名は 式に対して名前を付けたいとき にもよく使います。age + 1 のような算術式や SUM(price) のような集計関数の戻り値には標準の列名がないため、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 "翌年の年齢" のように書きます。
WHERE — 行を条件で絞り込む
ここまでで「列を選ぶ」操作は学びました。次は 行を絞り込む 操作です。SELECT 列 FROM 表 のあとに WHERE 条件 を付けると、条件を満たした行だけが結果に残ります。
SELECT が 縦方向(列) を選ぶのに対して、WHERE は 横方向(行) を選ぶ、という対比でとらえると整理しやすくなります。
比較演算子
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 は使わない」とだけ覚えておいてください。
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 C は A OR (B AND C) の意味になり、書いた順番どおりには評価されません。
意図とずれないように、AND と OR を混ぜるときは 括弧で評価順を明示 します。たとえば「(東京または大阪) かつ 30 歳以上」は WHERE (city = 'Tokyo' OR city = 'Osaka') AND age >= 30 のように書きます。括弧は読み手にも意図が伝わるので、迷ったら付けておくと安全です。
理解度チェック
まずは1問ずつ答えてみましょう。
Q2SELECT と WHERE の役割の説明として最も正しいものはどれですか。
Q3SQL の比較演算子 <> の意味として正しいものはどれですか。