SELECTコマンドで要求するレコードは、共通するフィールド値で グループ化できます。この処理はGROUP BY句を指定して実行します。 GROUP BY句には、フィールド名を指定し、出力はグループ化された フィールドによってソートされます。
GROUP BY句に、複数フィールドを指定してグループ化の処理をネストでき ます。最初のグループ化は、最初に指定したフィールドによって行なわれます。 その後2番目に指定したフィールドでグループ化します。この処理は指定された フィールド数回行なわれます。
GROUP BY句は、集計関数(COUNT、MAX、AVGなど)と併用する場合が多く なります。集計関数は全レコードではなく、特定のグループにに適用できます。 グループに関数を適用すると、検索データを表示するフォーマットを変更できます。 関数の処理結果(例4)は、グループで表示されます。表示フォーマットの 規定値(カラム幅と精度)には適用されません。 それは、表示される値に対して適用されるからです。
例
loansテーブルの、nameフィールドでグループ化します。
SELECT name, date, amount FROM loans GROUP BY name;
以下を表示します。
name date amount Jones 7 February 1990 $33.95 3 April 1990 $25.00 12 August 1990 $300.00 Kilroy 16 February 1990 $250.00 Mosca 2 February 1990 $150.00 4 May 1990 $200.00 Peterson 6 June 1990 $50.00 Scarlatti 9 September 1990 $150.00 14 October 1990 $125.00 Wladislaw 27 February 1990 $55.00 12 May 1990 $55.00 25 June 1990 $75.00
nameフィールドでソートされていることに、注意してください。 またグループ内で重複されているnameフィールド値は、省略されています。 重複名を表示したい場合には、システム変数MSQLSELKEEPDUPLICAATEをセット してください。
Jonesの3番目のデータを更新します。
UPDATE loans SET amount = 25 WHERE name = "Jones" AND amount = 300;
以下のコマンドで検索します。
SELECT name, date, amount FROM loans GROUP BY name, amount;
以下のような表示が行なわれます。
name date amount Jones 3 April 1990 $25.00 12 August 1990 7 February 1990 $33.95 Kilroy 16 February 1990 $250.00 Mosca 2 February 1990 $150.00 4 May 1990 $200.00 Peterson 6 June 1990 $50.00 Scarlatti 14 October 1990 $125.00 9 September 1990 $150.00 Wladislaw 27 February 1990 $55.00 12 May 1990 25 June 1990 $75.00
nameフィールドと、amountフィールドでソートされていること に注意してください。
COUNT関数を使用して、グループ内のレコードをカウントできます。 nameフィールドでグループ化してレコードをカウントするには、以下の コマンドを実行します。
SELECT name, COUNT FROM loans GROUP BY name;
以下の表示を行います。
name COUNT(*) Jones 3 Kilroy 1 Mosca 2 Peterson 1 Scarlatti 2 Wladislaw 3
COUNT関数の表示結果は、nameフィールド検索結果の横に表示 されます。
GROUP BYに指定していないフィールドに、COUNT関数を使用 した場合、この関数の処理結果はカラムではなく、各グループの下に出力されます。
SELECT name, amount, COUNT FROM loans GROUP BY name;
以下を表示します。
name amount Jones $33.95 $25.00 $300.00 COUNT(*) = 3 Kilroy $250.00 COUNT(*) = 1 Mosca $150.00 $200.00 COUNT(*) = 2 Peterson $50.00 COUNT(*) = 1 Scarlatti $150.00 $125.00 COUNT (*) = 2 Wladislaw $55.00 $25.00 $75.00 COUNT(*) = 3
集計関数を使用して、グループ内での合計、平均、最大値、最小値を表示でき ます。nameフィールドでグループ化して、各グループの合計を表示します。
SELECT name, SUM (amount) FROM loans GROUP BY name;
以下のように表示されます。
name SUM (amount) Jones 358.95 Kilroy 250.00 Mosca 150.00 Peterson 50.00 Scarlatti 275.00 Wladislaw 155.00
関数名は、フィールド名の横に表示されます。また関数の処理結果は、フィールド値の横のカラムに表示されます。
GROUP BY句に、指定されていないフィールドと共に、集計関数を使用 した場合には、関数の処理結果はカラムではなく、各グループの下に出力されます。
SELECT name, amount, SUM (amount) FROM loans GROUP BY name;
以下のように表示されます。
name amount Jones $33.95 $25.00 $300.00 SUM(amount) = 358.95 Kilroy $250.00 SUM(amount) = 250.00 Mosca $150.00 $200.00 SUM(amount) = 350.00 Peterson $50.00 SUM(amount) = 50.00 Scarlatti $150.00 $125.00 SUM(amount) = 275.00 Wladislaw $55.00 $25.00 $75.00 SUM(amount) = 155.00