DB SQL DML(Data Manipulation Language:データ操作言語)
Overview
データの追加・更新・削除・取得をするためのクエリをまとめているセクション
- INSERT(データ追加)
- UPDATE(データ更新)
- DELETE(データ削除)
- SELECT(データ取得)
SELECT
- 取得した列の順番は明示的に設定しない限りは表作成時の順番
ORDER BYを指定しない場合は、ランダムに表示されるのがSQLの仕様
WHERE
WHERE句はソートの前に実行される。
そのためソート処理する行数が減り、処理時間が短くなる。
WHERE: 集計する前に、元データをフィルタリングする HAVING: 集計した後に、その結果をフィルタリングする
テーブルを集約する関数
SQLでデータに対して何らかの操作や計算をするには関数を使う。
関数には大きく分けて2種類ある。
- 複数の行 or 行の値に対して集計をする関数
- 単一行の値に対して操作や計算をする関数
集計関数
集計用の関数を集計関数と呼ぶ。
代表的な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は掛け合わせなので元になる情報が大きければ大きいほど、その結果が膨れ上がることになるため