算術演算とエイリアス
取り出してから、アプリ側で掛け算している
注文明細を全行取り出し、アプリ側で単価と数量を掛けて金額を出す。動きはしますが、要らない行までネットワークに乗せることになりますし、その計算結果では並べ替えも絞り込みもできません。計算した後にもう一度データベースへ問い合わせる、という遠回りになりがちです。
計算は SELECT の中に書けます。
SQL クエリ
SELECT id, unit_price * quantity
FROM order_items;使えるのは + - * / と、余りを求める % です。優先順位は算数と同じで、変えたいときは括弧で囲みます。
税込み価格、割引後の金額、在庫の評価額。実務で取り出す値は、そのまま入っている列より、列から計算した値のほうが多いくらいです。
unit_price * quantity という列名は誰も読めない
上のクエリを実行すると、結果の列見出しが式のまま出ます。CSV に落としても画面に並べても、その見出しがそのまま相手に届きます。AS で名前を付けます。
SQL クエリ
SELECT
id,
unit_price * quantity AS line_total
FROM order_items
ORDER BY line_total DESC;ORDER BY には、付けた名前をそのまま書けます。長い式を 2 度書かずに済むので、計算が複雑なほど効きます。テーブル名にも AS で別名を付けられます。
AS は省略しても動きますが、書いておいたほうが「これは別名だ」と一目で分かります。
WHERE に付けた名前を書くと怒られる
同じ名前を WHERE に書くと、多くのデータベースでエラーになります。
SQL クエリ
-- エラーになる
WHERE line_total >= 10000
-- 式をもう一度書けば通る
WHERE unit_price * quantity >= 10000WHERE は行を絞り込む段階の指定で、そのときにはまだ SELECT の列が作られていないためです。同じ式を 2 度書くのが嫌なら、計算だけを内側のクエリでやって、外側で絞り込む形にします。
7 / 2 が 3 になる
整数どうしの割り算は、小数が切り捨てられます。
SQL クエリ
SELECT 7 / 2 AS a, 7 / 2.0 AS b, 7::numeric / 2 AS c;
-- a は 3、b と c は 3.5片方を小数にするか、::numeric で型を変えると小数のまま計算されます。手数料や税額をこれに気づかないまま本番へ出すと、1 件あたり数円のずれが件数分だけ積み上がります。割り算を書いたら、両辺の型を必ず見てください。
テーブル構造
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
category VARCHAR(30) NOT NULL,
price INT NOT NULL,
stock INT NOT NULL
);
INSERT INTO products (id, name, category, price, stock) VALUES
(1, 'ノートPC', '家電', 128000, 5),
(2, 'マウス', '家電', 2980, 30),
(3, 'キーボード', '家電', 6800, 12),
(4, '小説A', '書籍', 1800, 50),
(5, '小説B', '書籍', 2200, 20);期待される出力
| name | inventory_value |
|---|---|
| ノートPC | 640000 |
| 小説A | 90000 |
| マウス | 89400 |
| キーボード | 81600 |
| 小説B | 44000 |