SELECT文の基本構文
一覧に出すのは 2 列なのに、全部の列を受け取っている
商品一覧の画面に出したいのは、商品名と価格の 2 列だけだとします。ところが SELECT * と書くと、在庫数も仕入先も登録日時も、テーブルにある列が全部返ってきます。行数が多いほど、使わないデータを運ぶ時間とメモリが積み上がります。
もっと厄介なのは、あとから列が 1 つ増えたときです。SELECT * と書いた場所は、こちらが何も直していないのに返ってくる列が変わります。誰かが商品テーブルに memo 列を足した翌日、毎朝送っている CSV の 3 列目が価格から在庫数に変わっていた、という壊れ方をします。エラーは出ません。受け取った側が数字の桁を見て気づくまで、そのまま流れ続けます。
本番のコードで * を使わないのは、この「勝手に変わる」を避けるためです。 列を書き並べておけば、テーブルに何が足されても、その SELECT が返すものは変わりません。
どの列を、どの表から。決めるのはこの 2 つだけ
SELECT 文の骨格は 2 行です。ほしい列を並べ、どの表から取るのかを書きます。
SQL クエリ
SELECT name, price
FROM products;書いた順が、そのまま結果の列順になります。price, name と書けば価格が左に来ます。テーブルを作ったときの列の並びは関係ありません。
列を並べて書くことには、もう 1 つ効き目があります。あとから読む人に「この画面は商品名と価格しか使っていない」と伝わることです。* のままだと、そのクエリが本当に必要としている列が誰にも分かりません。
このあと学ぶ条件の絞り込みも並べ替えも、すべてこの 2 行の後ろに足していく形になります。土台はいつも「どの列を」「どの表から」の 2 つです。
返ってくる列名は、その場で付け替えられる
列名をそのまま画面やファイルの見出しに使いたいことがあります。AS を使うと、結果の列名を指定できます。
SQL クエリ
SELECT name AS 商品名,
price AS 税抜価格
FROM products;元のテーブルの列名は変わりません。変わるのは、この 1 回の結果に付く見出しだけです。
AS は計算した列にも付けられます。テーブルに無い値でも、式を書けば列として返せます。
SQL クエリ
SELECT name,
price,
price * stock AS 在庫金額
FROM products;SELECT は表を受け取って表を返す仕組みなので、返す列を計算で作ってもかまいません。
演習では employees から、一覧に必要な 2 列だけを取り出します。
テーブル構造
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
department VARCHAR(50) NOT NULL,
salary INT NOT NULL
);
INSERT INTO employees (id, name, department, salary) VALUES
(1, '田中 一郎', '営業部', 350000),
(2, '佐藤 花子', '開発部', 420000),
(3, '鈴木 次郎', '人事部', 380000),
(4, '高橋 三郎', '開発部', 450000),
(5, '伊藤 四郎', '営業部', 360000);期待される出力
| name | department |
|---|---|
| 田中 一郎 | 営業部 |
| 佐藤 花子 | 開発部 |
| 鈴木 次郎 | 人事部 |
| 高橋 三郎 | 開発部 |
| 伊藤 四郎 | 営業部 |