MySQL必知必会十三:パケットデータ
13.1グループの作成
パケットは、分析:上記の
13.2フィルタグループ分析:この
HAVINGとWHEREの違い:ここではもう一つの理解方法があり、WHEREはデータパケットの前にフィルタリングを行い、HAVINGはデータパケットの後にフィルタリングを行う.
2つ(含む)以上、価格が10(含む)以上の製品を持つ仕入先をリストします.解析:この文では、最初の行は集約関数を使用した基本
13.3グループ化とソート
ORDER BYを忘れないでください:一般的に
合計受注価格で出力をソートするには、次のようにORDER BY句を追加する必要があります.分析:この例では、
13.4 SELECT句順
SELECT文で使用するときに必ず従う順序で、これまで学んだ句をリストします.
サブステートメント
説明
使用する必要があるかどうか
SELECT
戻る列または式
はい
FROM
データを取得するテーブル
テーブルからデータを選択する場合のみ使用
WHERE
行レベルフィルタ
いいえ
GROUP BY
グループの説明
グループ別集計の場合のみ使用
HAVING
グループレベルフィルタ
いいえ
ORDER BY
出力ソート順
いいえ
LIMIT
取得するローの数
いいえ
パケットは、
SELECT
文のGROUP BY
句で確立される.グループを理解する最善の方法は、例を見ることです.mysql> SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| 1001 | 3 |
| 1002 | 2 |
| 1003 | 7 |
| 1005 | 2 |
+---------+-----------+
SELECT
文は2つの列を指定し、vend_id
は製品ベンダーのIDを含み、num_prods
は計算フィールド(COUNT(*)
関数で作成)である.GROUP BY
句は、MySQLがvend_id
で並べ替えてデータをグループ化することを示す.これにより、vend_id
は、テーブル全体ではなくnum_prods
に対して1回計算される.出力から分かるように、仕入先1001には3つの製品があり、仕入先1002には2つの製品があり、仕入先1003には7つの製品があり、仕入先1005には2つの製品がある.GROUP BY
を使用しているので、計算および評価する各グループを指定する必要はありません.システムは自動的に完了します.GROUP BY
句は、MySQLパケットデータを示し、結果セット全体ではなく各グループを集約します.13.2フィルタグループ
mysql> SELECT cust_id, COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >= 2;
+---------+--------+
| cust_id | orders |
+---------+--------+
| 10001 | 2 |
+---------+--------+
SELECT
文の最初の3行は、上記の文に似ています.最後の行には、HAVING
句が追加され、COUNT(*) >=2
(2つ以上の注文)のパケットがフィルタされます.HAVINGとWHEREの違い:ここではもう一つの理解方法があり、WHEREはデータパケットの前にフィルタリングを行い、HAVINGはデータパケットの後にフィルタリングを行う.
2つ(含む)以上、価格が10(含む)以上の製品を持つ仕入先をリストします.
mysql> SELECT vend_id, COUNT(*) AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT(*) >= 2;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| 1003 | 4 |
| 1005 | 2 |
+---------+-----------+
SELECT
であり、前の例とよく似ています.WHERE
句は、prod_price
の少なくとも10のすべての行をフィルタリングする.次いで、vend_id
でデータをパケット化し、HAVING
句でカウント2以上のパケットをフィルタリングする.WHERE
句がない場合、2行多く検索されます(仕入先1002、販売されているすべての製品の価格は10以下です;仕入先1001、3つの製品を販売していますが、1つの製品の価格は10以上です):mysql> SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id HAVING COUNT(*) >= 2;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
| 1001 | 3 |
| 1002 | 2 |
| 1003 | 7 |
| 1005 | 2 |
+---------+-----------+
13.3グループ化とソート
ORDER BYを忘れないでください:一般的に
GROUP BY
句を使用する場合、ORDER BY
句も与えられるはずです.これは、データの正確なソートを保証する唯一の方法です.GROUP BY
のソートデータだけに依存してGROUP BY
とORDER BY
の使用方法を説明しないでください.一例を見てください.次のSELECT
文は、前の例と同様です.合計受注価格が50以上の受注番号と合計受注価格を取得します.mysql> SELECT order_num, SUM(quantity*item_price) AS ordertotal FROM orderitems GROUP BY order_num HAVING SUM(quantity*item_price) >= 50;
+-----------+------------+
| order_num | ordertotal |
+-----------+------------+
| 20005 | 149.87 |
| 20006 | 55.00 |
| 20007 | 1000.00 |
| 20008 | 125.00 |
+-----------+------------+
合計受注価格で出力をソートするには、次のようにORDER BY句を追加する必要があります.
mysql> SELECT order_num, SUM(quantity*item_price) AS ordertotal FROM orderitems GROUP BY order_num HAVING SUM(quantity*item_price) >= 50 ORDER BY ordertotal;
+-----------+------------+
| order_num | ordertotal |
+-----------+------------+
| 20006 | 55.00 |
| 20008 | 125.00 |
| 20005 | 149.87 |
| 20007 | 1000.00 |
+-----------+------------+
GROUP BY
句は、SUM(*)
関数が合計受注価格を返すことができるように、受注番号(order_num列)でデータをグループ化するために使用される.HAVING
句は、合計受注価格が50以上の受注のみを返すようにデータをフィルタします.最後に、出力をORDER BY
句で並べ替えます.13.4 SELECT句順
SELECT文で使用するときに必ず従う順序で、これまで学んだ句をリストします.
サブステートメント
説明
使用する必要があるかどうか
SELECT
戻る列または式
はい
FROM
データを取得するテーブル
テーブルからデータを選択する場合のみ使用
WHERE
行レベルフィルタ
いいえ
GROUP BY
グループの説明
グループ別集計の場合のみ使用
HAVING
グループレベルフィルタ
いいえ
ORDER BY
出力ソート順
いいえ
LIMIT
取得するローの数
いいえ