特定のカラムの合計を出したい時
GROUP BY と SUM の組み合わせを利用する
例えばこんな場面で使える
・カテゴリごとに売上がいくらかを集計したい
・部門別に給与総額を知りたい
・日別にどれだけ売れたかを見る
SELECT カラム1, SUM(合計を出したいカラム) AS 合計を出したいカラムを命名する
FROM テーブル
GROUP BY カラム1;
SELECT category, SUM(sales) AS total_sales
FROM Products
GROUP BY category;
テーブルの行数を数えたい(集計)したい時
COUNT(*) を使う
例えばこんな場面で使える
・テーブルの全レコード件数を数える(※WHEREを付けなくても良い)
・20歳以上のユーザー人数が知りたいとき(条件に合うカラムの総数を知りたい)
・特定のカラムに絞って数えたいとき
SELECT COUNT(*) AS 集計したいカラムを命名する
FROM テーブル
WHERE 集計したい条件;
SELECT COUNT(*) AS adult_user
FROM Users
WHERE age >= 20;
2つのテーブルを内部結合(INNER JOIN)し、必要な列を取り出したい時
※データがない(NULL)のカラムは、抽出されない
注文と商品を結合
SELECT --出力したい列を指定
Orders.id,
Products.name,
Orders.quantity
FROM Orders --出力したいカラムが存在するテーブル
INNER JOIN Products
ON Orders.product_id = Products.id --両者のテーブルで一致しているもので結合する
ORDER BY Orders.id ASC; --昇順で並べたい列を指定
・Orders(注文)テーブルと Products(商品)テーブルを結合
・出力:注文ID・商品名・注文数
・利用シーン:注文ごとにどの商品が何個買われたかを一覧化したいとき
2つのテーブルを結合し、NULLも含めたカラムを抽出したいとき
LEFT JOINを使う
SELECT Employees.name, Items.item_name
FROM Employees
LEFT JOIN Items
ON Employees.id = Items.owner_id;
--出力結果
name | item_name
Suzuki | Laptop
Sato | Tablet
Tanaka | NULL
おまけ
※出力したい列名を命名したいとき、 "AS 命名したい列名"にする
SELECT
テーブル1.カラム1 AS 命名したい列名,
テーブル2.カラム1 AS 命名したい列名
※テーブルを結合し、特定の列を基準に昇順で出力したい場合
ORDER BY 基準にしたいカラム ASC; を最後に書く
※平均以上のデータを出力したい場合
WHERE テーブル1.カラム2 >= (SELECT AVG(テーブル1.カラム2) FROM テーブル1)
SQL豆知識
SQL には多数の 予約語(keywords) があり、これをカラム名やテーブル名に使うとエラーや混乱のもとになる
###💡 カラム名に避けたい代表的な単語
1. 集計・関数系
countsumavgminmax
👉 集計関数と同名なので誤認識されやすい
2. SQL の構文で使う単語
selectfromwhereordergroupbyas
👉 これらは文法に必須なので、カラム名にするとほぼ確実にエラー
3. データ型や制御に関する単語
intchardatetimeuserindexkeyconstraintcheck
👉 DB内部の型や制約で使われる単語
4. 特定DBでよくトラブルになる単語
-
limit(MySQL) -
offset(PostgreSQL, MySQL) -
rownum(Oracle) -
identity(SQL Server)