記事のディレクトリ
前提に、上記:参考図書「MySQLが知っている必要がありますになります」
10.3概要データ
私たちはしばしば、実際に、オフィスの特殊機能MySQLを提供することを目的とし、それらを取得しなくてデータを集計する必要があります。これらの機能を使用して、MySQLのクエリは、分析やレポート作成のためのデータを取得するために使用することができます。検索のこのタイプの例は以下の通りです。
- テーブル内の行の数を決定する(またはいくつかの条件または特定の値を含む行の数を満たします)。
- テーブルとセット内の行を取得します。
- 最大の表の列の値(又は行またはすべての行の特定)、最小値及び平均値を見つけます。
データのテーブル(というより、実際のデータ自体)における上記の必要性の例は、要約されています。そのため、実際の戻り値のデータテーブルには、時間と処理リソースの無駄(の帯域幅はもちろんのこと)です。
MySQLの申し出5つの集約関数。
集計行グループで実行されている機能(集合関数)、及び計算機能は、単一の値を返します。
機能 | 説明 |
---|---|
AVG() | 列の平均値を返します。 |
カウント() | 列の行数を返します。 |
MAX() | 列の最大値を返します。 |
MIN() | 列の最小値を返します。 |
和() | 戻り値カラムの値と |
これらの機能の簡単な説明を以下に示します
次の表を作成します。
CREATE TABLE student(
sid INT PRIMARY KEY,
sname VARCHAR(20),
ssex CAHR(1)
);
CREATE TABLE score(
sid INT PRIMARY KEY,
sname VARCHAR(20),
smath INT,
senglish INT
);
10.3.1 AVG()関数
テーブルの行数をカウントし、特定の列の和を計算することによりAVG()は、列平均値を求めました。AVGは、()カラムは、特定の平均値を返すために使用することができ、すべての列の平均値を返すために使用されます。
AVG()は、特定の列の平均値を決定するために使用することができ、列名は、関数のパラメータとして与えられなければなりません。複数列の平均値を得るためには、AVG()関数の複数を使用しなければなりません。
AVG()関数は、行の列の値がNULLである無視します。
(自分のプラスいくつかのランダムな番号)の数学の成績表での平均スコアを照会するAVG()関数を使用するには:
SELECT AVG(smath) AS avg_smath FROM score;
AVGは()もWHERE句で、特定の列の平均値を決定するために使用することができます。
10.3.2 COUNT()関数
COUNT()関数は、行の数を決定する満たす特定の基準、または表の行。
COUNT()関数を使用するには、2つの方法があります。
- 表の列に関係なく、テーブルの行数をカウントするための使用COUNT(*)はヌル値(NULL)または非ヌル値を含みます。
- 特定の列の値のカウントのNULL値の列を有する使用カウント(列)は無視されます。
例:生徒の総数を返します:
SELECT COUNT(*) FROM student;
合計数(特定の列)女の子を返します。
SELECT COUNT(ssex) FROM student WHERE ssex='女';
あなたは、列名を指定した場合は指定した列が空の行は、COUNT()関数が無視されているが、COUNT()は、アスタリスクを持つ関数である場合(*)、無視できません。
10.3.3 MAX()関数
MAX()は、指定された列内の最大値を返します。MAXは()カラム名を指定する必要があります。
たとえば、次の結果テーブルに戻る数学の成績で最高得点:
SELECT MAX(smath) FROM score;
MAX()は、一般的に最大値または日付値を見つけるために使用されるが、MySQLにそれを可能にしているが、テキスト列が最大値を返すなど、任意の列内の最大値を返します。データは、対応する列に従ってソートされている場合と、テキストデータは、MAX()は最後の行を返します。MIN()関数があるが、逆に、前列のリターン。
MAX()、MIN()は無視される行の列の値はNULLです。
10.3.4 MIN()関数
MIN()は、指定された列の最小値を返します。MIN()は、列名を指定する必要があります。
たとえば:リターンは数学の達成に最低のスコアを転写産物:
SELECT MIN(smath) FROM score;
10.3.5 SUM()関数
SUM()は、指定された列と、(合計)の値を返すために使用されます。
このような中、数学の授業で合計スコアのリターンとして:
SELECT SUM(smath) FROM score;
標準的な算術演算子を使用して、集計関数は、すべての複数の列に計算を実行するために使用することができます。
SUM()関数無視行列の値はNULLです。
10.3.6は、異なる値を収集します
次のように5つの以上の集計関数を使用することができます。
- すべての行、またはパラメータ(MAXおよびMIN)に指定されたパラメータの算出を行います。
- 唯一異なる値が含まれています、DISTINCTパラメータを指定します。(デエンファシス)
たとえば、DISTINCTパラメータは、次の使用を指定します。例えば、平均的な数学のスコア、異なる点のみを考慮した平均スコアの表に結果:
SELECT AVG(DISTINCT smath) AS avg_smath FROM score;
あなたが指定した場合は、列名にのみ使用COUNT(*)、したがって、COUNT(DISTINCT)を許可しない、またはエラーではないDISTINCT COUNT()、DISTINCT缶を使用することができます。同様に、DISTINCT列名が使用され、または計算式に使用されていないする必要があります。
DISTINCTは、MAX()およびMIN()を使用することができますが、意味がありません。
10.3.7合成集約関数
必要に応じて実際にSELECT文が複数の集計関数を含めることができます。
集約関数を使用して、それがエイリアスを使用するのが最適です。
概要:集計データに集約関数、これらの機能を効率的に設計されている、彼らははるかに高速なアプリケーションを計算する独自のクライアントよりも一般的に結果を返します。
10.4データパケット
既にとして、我々は、データを要約するSQL集計関数を学びました。しかし、このようなは:多くの人が男の子と女の子を持っているか、学生のテーブルが必要です。利用可能な使用の二つの文を印刷しました。パケット:ここでは別の方法です。
パケット:集約を可能にするように論理的な複数のグループにデータは、各群について計算しました。
10.4.1グループの作成
SELECT文のGROUP BY句に設立されたグループ化する場合。上記の例によると、男子と女子学生のためのグループを見ます:
SELECT ssex, COUNT(ssex) AS total FROM student GROUP BY ssex;
出力:
+---------+----------------+
| stu_sex | total |
+---------+----------------+
| 女 | 6 |
| 男 | 11 |
+---------+----------------+
3 rows in set (0.05 sec)
しかし、それはまた、このように使用することができます。
SELECT ssex, COUNT(*) AS total FROM student GROUP BY ssex;
上記の出力。
なぜこのようにですか??GROUP BYを使用するので、あなたがた各グループの計算および評価を指定する必要はありません。自動的にシステム。GROUP BYのMySQLデータパケットを示す句し、各グループではなく、結果セット全体のために集約。
GROUP BY句の特定の使用の前に、いくつかの重要な規定を知っておく必要があります。
- GROUP BY句は、任意の数の列を含むことができます。これは、より詳細な制御データパケットを提供するために、パケットのネストができます。
- パケットがGROUP BY節にネストされている場合、データパケットは、所定の最後に集約されます。言い換えれば、パケットの確立は、すべての列を計算して指定された場合(あなたは個々の列からデータを取得することはできません)。
- BY句の各列グループは、列に表示されているか、有効な式を取得する(ただし、集計関数ではない)しなければなりません。あなたがSELECTで式を使用する場合は、GROUP BY句で同じ式を指定する必要があります。エイリアスを使用することはできません。
- 集計文に加えて、各列のSELECT文では、GROUP BY句で指定されなければなりません。
- NULLパケットが返されるように、パケットは、カラム内のNULL値である場合。行A列の複数のNULL値場合、それらは1つのグループに分割されます。
- 後GROUP BY句は、前BY句、WHERE句、ORDERに現れなければなりません。
WITH ROLLUPキーワードを使用して、各パケットの概要と(各グループの)各パケットレベル値は得ることができます
例えば:
SELECT ssex, COUNT(*) AS total
FROM student
GROUP BY ssex WITH ROLLUP;
出力:
+---------+-------+
| stu_sex | total |
+---------+-------+
| 女 | 10 |
| 男 | 16 |
| NULL | 26 |
+---------+-------+
3 rows in set (0.05 sec)
関数を導入:IFNULL(式、alt_value):それがNULLでない場合には、第2パラメータは、NULL値が戻されている場合、最初の式は、NULLであるか否かを決定するためのIFNULL()関数は、最初のパラメータによって戻され値。
SELECT IFNULL(ssex,'总计') AS ssex, COUNT(*) AS total
FROM student
GROUP BY ssex WITH ROLLUP;
出力:
+---------+-------+
| stu_sex | total |
+---------+-------+
| 女 | 10 |
| 男 | 16 |
| 总计 | 26 |
+---------+-------+
3 rows in set (0.05 sec)
10.4.2パケットフィルタ
MySQLは、パケットを除外したパケットが所定含まれたパケットを、フィルタリングできます。しかし、WHERE句は、グループ化するのではなく、フィルタラインを指定されています。だから、MySQLは、WHEREに似HAVING句、HAVING句を提供し、これまでにWHERE句HAVING句を代わりに使用することができますWHEREのすべてのタイプ。唯一の違いは、WHERE句のラインフィルタであり、フィルタパケットHAVING節(すなわち、最初のパケットは、その後、濾過します)。
例えば:女の子や男の子の数は、テーブルが15以上である学生を示しています。
SELECT ssex, COUNT(*) AS total
FROM student
GROUP BY ssex HAVING COUNT(*)>=15;
注:これは、パケットフィルタの結果であるため、GROUP BYの後HAVING句。WHERE句には、それがGROUP BYの前にする必要があり、行がフィルタリングされます。だから、WHERE句フィルタ行は、グループ化、GROUP BYの結果に影響を与える可能性があります。
あなたは使用することができ、両方のWHEREとHAVING句はありますか??答えはイエスです。
10.4.3グループ化と並べ替え
並べ替え(ORDER BY)とグループ化(GROUP BY)の違いについてのトーク:
シーケンス | パケット |
---|---|
生成される出力をソート | 出力パケットの順序はないかもしれません |
いずれかのカラムを使用することができる(たとえ非選択カラムを使用することもできます) | 列または式の列を選択し、選択した列式のそれぞれを使用する必要がありますのみ使用します |
必ずしも必要ではありません | あなたは集約関数(または式)を持つ列を一緒に使用する場合は、使用する必要があります。 |
上記の表の最初の行は、データはしばしば見つけることができ、実際にGROUP BYパケット出力パケットの順序であるが、これは必ずしもそうではない、それは、SQLの仕様を必要としません。さらに、ユーザーはパケットのシーケンシャル順序が異なる必要な場合があります。あなたが特定の方法でデータをパケットという理由だけで、それはあなたが道出力のと同じ種類である必要が意味するものではありません。それは、その効果がGROUP BY句の出力に相当していても、BY句明確BRDERを提供する必要があります。
これは、BY句句のORDER BY GROUPに追いつくために、一般的に最善です。
それでは、どのような場所に位置で:ORDER BY句は、SQLの最後の文でなければなりません。
したがって、上記のステートメントを変更:例は非常に良好ではなかった引用、書き方を見てみましょう。
SELECT ssex, COUNT(*) AS total
FROM student
GROUP BY ssex
HAVING COUNT(*)>=15
ORDER BY ssex;
概要:SQL集計関数を使用して計算されたデータを結合する方法を学びます。GROUP UPはまた、各グループの結果を返す、データセットにこれらの集約された金の句酸を使用する方法について説明します。GROUP BYを持つことによってフィルタリングHAVING句の特定のグループ、およびORDERとの差の何も言わないし、