MySQL必知必会十三:パケットデータ


13.1グループの作成
パケットは、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 BYORDER 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
    取得するローの数
    いいえ