・はじめに
今回使う表はこちらです。商品テーブル
商品ID | 商品名 | 商品分類 | 販売単価 | 仕入単価 | 登録日 |
---|---|---|---|---|---|
1 | Tシャツ | 衣服 | 1000 | 500 | 2009-09-20 |
2 | 穴あけパンチ | 事務用品 | 500 | 320 | 2009-09-11 |
3 | カッターシャツ | 衣服 | 4000 | 2800 | |
4 | 包丁 | キッチン用品 | 3000 | 2800 | 2009-09-20 |
5 | 圧力鍋 | キッチン用品 | 6800 | 5000 | 2009-01-15 |
6 | フォーク | キッチン用品 | 500 | 2009-09-20 | |
7 | おろしがね | キッチン用品 | 880 | 790 | 2008-04-28 |
8 | ボールペン | 事務用品 | 100 | 2009-11-11 |
・GROUP BY句とは
GROUP BY句はSELECT文と集約関数と組み合わせて使い、検索結果をグループ分けするものです。先にGROUP BYを使わない検索結果を見ていきます。
SELECT COUNT(商品分類) FROM 商品
結果=>
COUNT(商品分類) |
---|
8 |
となります。
次にGROUP BYを使ってみます。
SELECT 商品分類, COUNT(*) FROM 商品 GROUP BY 商品分類
とすると
結果=>
商品分類 | COUNT |
---|---|
衣服 | 2 |
事務用品 | 2 |
キッチン用品 | 4 |
という結果が出ます。
このようにGROUP BY句は検索結果を分類してくれます。
・検索結果にNULLがある場合
通常、COUNTの引数にカラムを指定するとNULLは排除されます。SELECT COUNT(仕入単価) FROM 商品;
結果=>
COUNT(仕入単価) |
---|
6 |
GROUP BY句を使うと分類に加えてNULLが指定されているのが何件あるか見ることができます。
SELECT 仕入単価, COUNT(*) FROM 商品 GROUP BY 仕入単価;
結果=>
仕入単価 | COUNT |
---|---|
2 | |
320 | 1 |
500 | 1 |
5000 | 1 |
2800 | 2 |
790 | 1 |
・Having句とは
Having句とはGROUP BY句でグループ分けしたものを条件指定するものです。まずHaving句を使わないものを見ます。
SELECT 商品分類, COUNT(*) FROM 商品 GROUP BY 商品分類
結果=>
商品分類 | COUNT |
---|---|
衣服 | 2 |
事務用品 | 2 |
キッチン用品 | 4 |
この表をさらに条件指定する際にHAVING句を使います。例えばCOUNTが2を選択する場合
SELECT 商品分類, COUNT(*) FROM 商品 GROUP BY 商品分類 HAVING COUNT(*) = 2;
結果=>
商品分類 | COUNT |
---|---|
衣服 | 2 |
事務用品 | 2 |
このようにCOUNTが2のものを選択できます。
・HAVING句とWHERE句の使い分け
HAVING句は2つ以上の行に渡って条件指定をする際に、WHERE句は1つの行に対して条件指定をする際に使います。・ORDER BY句とは
ORDER BY句とはカラムの並び順を昇順または降順に変えるものです。
先にORDER BY句なしの文を打ってみます。例えば
SELECT 商品ID, 商品名, 販売単価 FROM 商品;
商品ID | 商品名 | 販売単価 |
---|---|---|
1 | Tシャツ | 1000 |
2 | 穴あけパンチ | 500 |
3 | カッターシャツ | 4000 |
4 | 包丁 | 3000 |
5 | 圧力鍋 | 6800 |
6 | フォーク | 500 |
7 | おろしがね | 880 |
8 | ボールペン | 100 |
この文では並び順はランダムになります。(作った順?)
そこでORDER BY句を使って販売単価の並び方を変えてみます。
SELECT 商品ID, 商品名, 販売単価 FROM 商品 ORDER BY 販売単価
すると、販売単価の低い順(昇順)に並びます。
商品ID | 商品名 | 販売単価 |
---|---|---|
8 | ボールペン | 100 |
2 | 穴あけパンチ | 500 |
6 | フォーク | 500 |
7 | おろしがね | 880 |
1 | Tシャツ | 1000 |
4 | 包丁 | 3000 |
3 | カッターシャツ | 4000 |
5 | 圧力鍋 | 6800 |
もし表にNULLがある場合はNULLは先頭もしくは一番後ろにまとめられる。
NULLがある表
商品ID | 商品名 | 仕入単価 |
---|---|---|
1 | Tシャツ | 500 |
2 | 穴あけパンチ | 320 |
3 | カッターシャツ | 2800 |
4 | 包丁 | 2800 |
5 | 圧力鍋 | 5000 |
6 | フォーク | |
7 | おろしがね | 790 |
8 | ボールペン |
仕入単価の並びを降順に並べると
SELECT 商品ID, 商品名, 仕入単価 FROM 商品 ORDER BY 仕入単価 DESC;
商品ID | 商品名 | 仕入単価 |
---|---|---|
5 | 圧力鍋 | 5000 |
3 | カッターシャツ | 2800 |
4 | 包丁 | 2800 |
7 | おろしがね | 790 |
1 | Tシャツ | 500 |
2 | 穴あけパンチ | 320 |
6 | フォーク | |
8 | ボールペン |
・昇順と降順
`ORDER BY カラム DESC`とうつと降順(値の大きい順)になります。ASCを打つと昇順になりますが、省略すると自動的に昇順になるので実際に打つことは少ないかもしれません。・ORDER BY句テクニック
ORDER BY句は別名を付けることのできるASを使うことができます。WHERE句ではASを使った別名を条件指定に使うことができませんが、ORDER BY句では使用することができます。
また、ORDER BY句には集約関数を使うことができます。
SELECT 商品分類, COUNT(*) FROM 商品 GROUP BY 商品分類
とすると
結果=>
商品分類 | COUNT(*) |
---|---|
衣服 | 2 |
事務用品 | 2 |
キッチン用品 | 4 |
こうなります。
ここでORDER BYを使って並べ替えます。
SELECT 商品分類, COUNT(*) FROM 商品 GROUP BY 商品分類 ORDER BY COUNT(*) DESC;
結果=>
商品分類 | COUNT(*) |
---|---|
キッチン用品 | 4 |
衣服 | 2 |
事務用品 | 2 |
このようにORDER BY句は集約関数を使って降順に並べ替えることができます。