メインコンテンツまでスキップ

DB SQL DML(Data Manipulation Language:データ操作言語)

Overview

データの追加・更新・削除・取得をするためのクエリをまとめているセクション

  • INSERT(データ追加)
  • UPDATE(データ更新)
  • DELETE(データ削除)
  • SELECT(データ取得)

SELECT

  • 取得した列の順番は明示的に設定しない限りは表作成時の順番
  • ORDER BY を指定しない場合は、ランダムに表示されるのがSQLの仕様

WHERE

WHERE句はソートの前に実行される。
そのためソート処理する行数が減り、処理時間が短くなる。

備考

WHERE: 集計する前に、元データをフィルタリングする HAVING: 集計した後に、その結果をフィルタリングする

テーブルを集約する関数

SQLでデータに対して何らかの操作や計算をするには関数を使う。
関数には大きく分けて2種類ある。

  1. 複数の行 or 行の値に対して集計をする関数
  2. 単一行の値に対して操作や計算をする関数

集計関数

集計用の関数を集計関数と呼ぶ。
代表的な5つを記載。

  • COUNT
    • テーブルの行数を数える関数
    • 利用できる箇所は以下のみ
      • SELECT
      • ORDER BY
      • HAVING
  • SUM
    • テーブルの数値列のデータを合計する関数
  • AVG
    • テーブルの数値列のデータを平均する関数
  • MAX
    • テーブルの任意列のデータの最大値を求める関数
  • MIN
    • テーブルの任意列のデータの最小値を求める関数
注意

集計関数は基本的に NULL を除外して集計する

GROUP BY

データをグループに切り分ける。
「〜ごとに」という言葉が出てきたらGROUP BYを使用する。

ヒント

集計関数の利用対象は、対象となるデータ全体を範囲として集約してきたが、対象となるデータをいくつかのグループに切り分けて集約することも可能。

HAVING

グループごとに集約した値を条件にして選択したい場合に使用。

ORDER BY

ORDER BY による並べ替えを行う場合に注意する点としては、行の順番を確実に同じにするには、行をソートキーで一意(Unique: ユニーク)に特定する必要がある。

注意

ソートキーが同じ値の行が複数ある場合には、その複数行への順番はランダムになる。
ランダムになる箇所をランダムにせず、一意にするには行が一意になるソートキーを指定する必要がある。

ORDER BYで起こること

ORDER BY 使うと全部並べ替えようとする。
ORDER BY使わずにSELECTするのは速いけど、実際の業務では現実的ではないため使用しない。
そのためインデックス使うのが一般的
インデックスはソートされているようなものなので、インデックスがあればORDER BYはインデックスを元に行われる。

LEFT JOIN では処理の工数が相対的に上がる

LEFT JOINする時、大抵はONでJOINの結合条件を設定する。
FROMに指定した テーブルA のレコードが10000件、JOINに指定したテーブルBのレコードが1000件あった場合、テーブルA のレコードの件数分、テーブルB の対象レコードを探す処理が必要になる。
これは、最悪の場合10_000_000レコード分の処理になる (10_000 * 1_000)

注記

一般的にJOIN遅いって言われているのは、JOINは掛け合わせなので元になる情報が大きければ大きいほど、その結果が膨れ上がることになるため