BYの基本と効率的に集計する便利な方法zukucode主にWEB関連の情報を技術メモとして発信しています。BYを使った分析関数を使いこなせれば複雑な集計でもシンプルなSQLで実装できます。以下のサンプルはOracleの構文で紹介していますが、他のデータベースでも基本的には考え方は同じです。以下のテーブルがあるとします。155以下のように、first_nameと取得したレコード数を同時に取得したいとき、以下のようなSQLではエラーになってしまいます。単一グループのグループ関数ではありません。BYを使うやり方ではうまくいきません。以下のように分析関数を使用すれば集計方法が異なる集計結果を1度に取得できます。分析関数を使用するにはOVER句を使います。表示順)のように指定します。BYのイメージで、集計したい列を指定します。省略した場合は取得対象全体の集計になります。BYは表示順を指定します。ROW_NUMBER(行番号)など、集計に並び替えが必要な場合は指定します。COUNTやSUMのような集計は並び替えが不要なので省略できます。文章での説明ではイメージがわかないと思うので具体的な使用例を紹介します。BYでdepartment_idを指定したらdepartment_idが集計単位となるため、department_idが同じレコードは全て取得結果が同じになっていることが確認できます。BYが未指定時は全体の集計なので全てのレコードが同じ値になっています。WITH句で同じSQLを1つのSQLに共通化する同じようなSQLはWITH句を使用して共通化すればパフォーマンスが改善されることが多いです。WITH句を使用すれば1つの副問い合わせをいろいろな場所で使いまわすことができます。重複しているレコードを一括でUPDATEするある列の値が同じレコードが複数ある場合に、そのレコードを全てUPDATEする方法を紹介します。テーブルと列(カラム)にコメントを設定する方法SQLでテーブルと列(カラム)にコメントを設定する方法を紹介します。SELECT句での副問合せの基本的な考え方と注意点SELECT句での副問合せをうまく利用すれば、集計単位の異なる値を同時に取得できます。取得した結果に対してもう一度SQLを実行するようなイメージで値を取得できます。SELECT句でテーブルから指定した列のデータを取得するSELECT句はFROM句で指定されたテーブルから、どの列を取得するかを指定するための構文です。別テーブルをSELECTした結果が存在すればその値を使用してUPDATEする方法SELECTした結果がすでに存在していればその値でUPDATEしたい場合があります。上記SQLだと、テーブルBの存在の有無にかかわらず、テーブルAの全てのデータが更新されてしまいます。UPDATE文で副問い合わせで取得した値を複数列に設定する方法UPDATE文で、副問い合わせで取得した値を複数列に設定する方法を紹介します。SETで指定する列を()で囲い、副問い合わせのSQLで()で囲った列に対応するようにSELECTで取得します。INTOのあとのVALUESの代わりに、SELECT文をそのまま使用します。SELECTで取得する列の順番と、INSERTするテーブルの列の順番が一致するようにします。rowspanを使用してテーブル表示するときに必要な情報を分析関数で取得するSQLではなくプログラム側で表示するときに複雑な処理を実装してしまいがちですが、SQLでrowspanに必要な情報を一緒に取得しておけばプログラム側での実装はかなりシンプルになります。ある列の値が最大もしくは最小の値のレコードを取得する例えば以下のテーブルがあるとき、身長が一番大きい社員のレコードを取得したい場合があります。業務でもよくありがちな仕様ですが、一見簡単そうで難しい問題です。システム日付をYYYYMMDD形式などの文字列型に変換する当ホームページに記載されている会社名・製品名・システム名などは、各社の登録商標、もしくは商標です。