情弱エンジニアのなかのblog

一人前のエンジニアになる為のブログです

MySQL HAVING句とORDER BY句についてまとめてみました!

条件指定と並び替え

HAVING句とORDER BY句の使い方等の説明を書いていきます。

HAVING句

まずSQL文にはGROUP BY句というものがあります、簡単に説明しますとGROUP BY句とはあるフィールドを選択してそのフィールドごとに出力するという意味があります。

GROUP BY句を使ったときに当然、条件検索(WHELE句)も使えるのですがWHELE句はレコードに対する条件指定しかできません。 集約関数を使った検索などを行いたいときにHAVING句を使います。

レコードに対する条件指定が WHELE句

グループに対する条件指定が HAVING句

と覚えるといいかと思います。

HAVING句の使い方の説明としまして以下のようなテーブルがあるとします。

mysql> SELECT * FROM items;
+----+-----------+---------+-------+
| id | category  | name    | price |
+----+-----------+---------+-------+
|  1 | food      | salad   | 200   |
|  2 | food      | meat    | 1400  |
|  3 | book      | novel   | 600   |
|  4 | book      | comic   | 420   |
|  5 | clothes   | coat    | 20000 |
|  6 | clothes   | jacket  | 7000  |
|  7 | clothes   | bottoms | 6000  |
+----+-----------+---------+-------+

まず商品のカテゴリーごとの合計金額を求めたいときはGROUP BYを使います。

mysql> SELECT category,sum(price) FROM items GROUP BY category;

+-----------+-------+
| category  | price |
+-----------+-------+
| food      | 1600  |
| book      | 1020  |
| clothes   | 33000 |
+-----------+-------+

続いて合計金額が1500円以上のカテゴリーを求めたいときはHAVING句を使います。

mysql> SELECT category,sum(price) FROM items GROUP BY category HAVING sum(price) >= 1500;

+-----------+-------+
| category  | price |
+-----------+-------+
| food      | 1600  |
| clothes   | 33000 |
+-----------+-------+

お分かりの通りbookのレコードが消えます。

このようにグループに対しての条件指定をしたいときに使うのがHAVING句になります。

ORDER BY句

こちらは使い方としてはシンプルで表示の並び替えをするものになります。 WHERE句、GROUP BY句、HAVING句とは違い検索には関わらないので、まずは自分が視覚的に見やすくするものと思ってください。 先ほどのテーブルを使って説明していきます。

商品の金額の降順に並び替えてテーブルを見たいと思ったときは以下のようにします。

mysql> SELECT * FROM items ORDER BY price desc;
+----+-----------+---------+-------+
| id | category  | name    | price |
+----+-----------+---------+-------+
|  5 | clothes   | coat    | 20000 |
|  6 | clothes   | jacket  | 7000  |
|  7 | clothes   | bottoms | 6000  |
|  2 | food      | meat    | 1400  |
|  3 | book      | novel   | 600   |
|  4 | book      | comic   | 420   |
|  1 | food      | salad   | 200   |
+----+-----------+---------+-------+

重要なのは 「desc」とつけると降順 「asc」とつける、もしくは何もつけないと昇順で表示されます

GROUP BY句などと組み合わせて使うこともできます。

mysql> SELECT category,sum(price) FROM items GROUP BY category ORDER BY price desc;

+-----------+-------+
| category  | price |
+-----------+-------+
| clothes   | 33000 |
| food      | 1600  |
| book      | 1020  |
+-----------+-------+

このように「category」ごとの合計金額(price)の降順で表示されます。

今回の記事を書くにあたり「ゼロから始めるデータベース操作 SQL」という本を参考にさせて頂きました。 www.shoeisha.co.jp

以上になります。