MySQL – グループごとの最大値のレコード

概要

インラインビューグルーピングを使って、レコード中のある列の値が最大値/最小値となるレコードをグループごとに抽出できる。

以下、実行例に沿ってその方法を整理する。

実行例

以下のデータを使う。

ここでは各科目ごとの最高点をとった学生と教科を抽出する。

手順

グループごとの最大値

科目によってグルーピングし、各科目の最高得点を得る。

インラインビューによる最高得点列の追加

インラインビューに別名を定義し、元のテーブルと併記することで、全レコードに新たな最高スコアの列が追加される。

最高得点のレコードの追加

各学生・科目のレコードのうち、スコアが最高スコアに等しいレコードを抽出する。

 

MySQL – シェアの計算

概要

インラインビューを使って、各レコードのある列の値のシェアを計算できる。

以下、実行例に沿ってその方法を整理する。

実行例

以下のデータを使う。

ここでは各成分の量quantityのシェアを計算する。

手順

合計値の計算

合計値はSUM()関数で計算。

インラインビューによる合計列の追加

インラインビューに別名を定義し、元のテーブルと併記することで、全レコードに新たな合計値の列が追加される。

各レコードのシェアの計算

各レコードのquantityを合計値で割ってシェアを計算する。

 

MySQL – 最小値・最大値のレコードの抽出

概要

インラインビューを使って、レコード中のある列が最大値/最小値となるレコードを抽出できる。

以下、実行例に沿ってその方法を整理する。

実行例

以下のデータを使う。

ここでは、全学生・全教科のうち、最低得点とその得点を取った学生と科目を表示させる。

手順

最低得点の取得

まず、全体の最低得点は以下で得られる。

インラインビューによる最低得点列の追加

インラインビューに別名を定義し、元のテーブルと併記することで、全レコードに新たな最低スコアの列が追加される。

最低得点レコードの抽出

各学生のレコードのうち、スコアが最低スコアに等しいレコードを抽出する。

 

MySQL – インラインビュー

確認用データ

以下のデータを使う。

基本形

FROM句の中にSELECTクエリーを書いてエイリアスをつけると、それがテーブルとして参照される。

インラインビューにはエイリアスを付けないとエラーになる。

テーブルとインラインビューの併記

エイリアスによる修飾

テーブルとインラインビューを並べて使える。不明確さをなくすために、テーブル名またはエイリアスで列名を修飾する。

列名のエイリアス

インラインビューの列名にエイリアスを定義してもよい。

集約関数の利用

インラインビューで集約関数を使うと威力を発揮。以下の例では、全レコード中の最高得点と最低得点を各レコードに付加している。

このようにすると、最高得点や最低得点のレコードを抽出することができる。

 

MySQL – グループ化と集約~GROUP BY

概要

グループ化はGROUP BY文でグループ化する列を指定する。ほとんどの場合、以下のように集約関数を適用する。

SELECT FUNC(col) FROM table GROUP BY col;

上記の分では、table中の列colによってグループ化し、そのグループごとに集約関数FUNC()を適用した結果を返す。

実行例

以下のデータを使う。学生ごとの履修科目と得点のデータのイメージ。

COUNTの例

以下の例では、学生でグルーピングして科目数をカウントしている。これにより、各学生の履修科目数が得られる。

以下の例では、科目でグルーピングして科目数をカウントしている。これにより、各科目の被履修数が得られる。

MIN/MAXの例

以下の例では、科目でグルーピングして点数の最小値と最大値を表示させている。

SELECTsubjectも表示させている。上記の例ではsubjectでグルーピングしているので適切に表示されるが、subjectの値に使われるレコードは不定なので不適切に使うと以下のようになる。

SUM/AVGの例

以下の例では、学生ごとの合計点数と教科ごとの平均点数をグルーピングにより計算している。

HAVING

各科目が履修された数は以下のようだった。

ここで、履修数が2よりも多い科目だけを抽出したいとする。

WHERE句でできそうだがエラーになる。

集約結果によって抽出したい場合は、HAVING句を使う。

WHERE句との組み合わせの例。scoreが80以上の履修数を科目ごとにカウント。

さらに、scoreが80以上の数が1より大きい科目のみHAVING句で取り出す。

 

MySQL – 集約関数

概要

集約関数(aggregate functions)は、テーブルの全レコードまたはグループ化されたグループごとの集約値を返す。

COUNT 指定したカラムがNULL以外の行数
MIN 指定したカラムの最小値(NULLの行は含めない)
MAX 指定したカラムの最大値(NULLの行は含めない)
SUM 指定したカラムの合計値(NULLの行は含めない)
AVG 指定したカラムの平均値(NULLの行は含めない)

実行例

以下のテーブルを使う。

COUNT~個数

CONT()は引数に指定した列のうちNULL以外の個数を数える。

以下の例ではCOUNT(subject)はレコード数と同じ6となるが、COUNT(score)NULLが対象とならないため5となっている。

MIN/MAX~最小値・最大値

MIN()は引数にした列のうち最小の値を返し、MAX()は最大の値を返す。NULLは対象に含まれない。

以下の例では列としてscoreを指定し、最小値と最大値が得られている。

なおMIN()/MAX()sucjectを渡すと、文字列の照合順序に従って大小関係が判定される。

SUM~合計

SUM()は引数の合計を返す。NULLは無視される。

以下の例では6つのレコードのscoreのうちNULLを除いた5つの合計が得られている。

なお文字列データの列を引数に与えるとSUM()は0を返す。

AVG~平均値

AVG()は引数の列データの平均値を返す。NULLは無視されるため、割る数からものぞかれる。

以下の例では6つのscoreのうち1つがNULLのため、平均値は410/5で計算される。

文字列型の列を引数に指定すると、結果は0となる。

 

 

MySQL – 初期値の設定

列の初期値を設定するには、対象の列でDEFAULT VALUEを定義する。

 

MySQL – 主キーの設定

列の設定で宣言する方法

書式

CREATE TABLEの列の定義の中で以下を設定する。

  • NOT NULL
  • PRIMARY KEY
  • AUTO INCREMENT(必要な場合)

実行例

PRIMARY KEYを別に宣言する方法

書式

列の宣言の最後で以下を設定する。複合キーの場合はキーを並べる。

  • PRIMARY KEY(key1 [, key2, ...]);

実行例

 

MySQL – 複数レコードの一括登録

記法

複数レコードを登録するには、VALUESの値をカンマで区切って並べる。

INSERT INTO table (columns) VALUES (values), (values), ... (values);

実行例

 

MySQL – COLLATE~照合順序

概要

  • COLLATE文は文字の照合順序を指定する
  • 照合順序は文字の大小比較をする際の基準
  • 検索時のWHEREや並べ替えORDER BYなどで適用される

書き方

WHERE

WHERE colname COLLATE collateion = 'expression';

WHERE colname COLLATE collateion LIKE 'expression';

ORDER BY

ORDER BY colname COLLATE collateion;

Collation

  • utf8mb4_unicode_ci
  • utf8mb4_general_ci
  • utf8mb4_bin
  • utf8mb4_0900-ai_ci(デフォルト)

デフォルトの照合順序

UTF-8のデフォルトはutf8_general_ciだが、utf8mb4の場合utf8mb4_0900-ai_ciと照合順序が異なる。

確認

以下のテーブルを使う。

区別

utf8mb4_0900_ai_ci

  • 大文字と小文字は区別される
  • 全角と半角は区別される
  • 平仮名と片仮名は区別される
  • 濁点の有無は区別される

utf8mb4_general_ci

  • 大文字と小文字は区別されない
  • 全角と半角は区別される
  • 平仮名と片仮名は区別される
  • 濁点の有無は区別される

utf8mb4_unicode_ci

  • 大文字と小文字は区別されない
  • 全角と半角は区別されない
  • 平仮名と片仮名は区別されない
  • 濁点の有無は区別されない

utf8mb4_bin

  • 大文字と小文字は区別される
  • 全角と半角は区別される
  • 平仮名と片仮名は区別される
  • 濁点の有無は区別される

順序

utf8mb4_0900_ai_ci

utf8mb4_unicode_ciと同じ。

  • アルファベットは小文字・大文字順→アルファベット順
  • 仮名は平仮名・片仮名・半角が優先→清音・濁点・半濁点の順

utf8mb4_general_ci

  • アルファベットは小文字・大文字順→アルファベット順
  • 仮名はユニコード文字順

utf8mb4_unicode_ci

Unicodeの文字順と異なる。

  • アルファベットは小文字・大文字順→アルファベット順
  • 仮名は平仮名・片仮名・半角が優先→清音・濁点・半濁点の順

utf8mb4_bin

  • アルファベット・仮名ともUnicode文字順