SQLに関するメモ書き
TL;DR
SQLに関するメモ。入門レベルです。
基本構文
SELECT
見たい列名を指定できる。すべての基本。
SELECT id, name FROM A
DISTINCT
DISTINCTをつければ重複を排除できる。SELECT以外でも使える。
SELECT DISTINCT id, name FROM A
WHERE
条件指定できる。
SELECT id, name FROM A
WHERE id = 1
ORDER BE
条件でソート。降順ならDESCが必要
SELECT id FROM A ORDER BY A DESC
JOIN
内部結合 (INNER JOIN) と外部結合 (LEFT OUTER JOIN) がある。pandasと同じ感じ。
SELECT * FROM A
INNER JOIN B
ON A.id = B.id
IFNULL, COACESCE
IFNULL: NULLをとったときのデフォルト値を指定できる。COALESCE: 複数列を調べて、NULLだったらデフォルト値を返す。
SELECT id, IFNULL(
(SELECT name FROM A), "UnKnown"
) as name, COALESCE(id, name, "?")
LIMIT
持ってくるレコードの数の制限。
SELECT id FROM A LIMIT 1
OFFSET
何番目からレコードを取得するか。ソートと組み合わせて使うことが多そう。
SELECT id FROM A ORDER BY id OFFSET 1
変数定義
DECLAREが必要?
DECLARE N INT;
SET N = 0;
判定
NULLかどうか
N IS NULL --or
N IS NOT NULL
大小比較などは普通の記号は使える。同一判定は==ではなく=を使う。
Window関数
GROUP BYだとまとめられてしまうけど、まとめずに新しい列を作成する。PARTITION BYを使ってどの列を対象とするかを決定する。通常の集計関数と、Window関数専用の関数がある。
基本
-- GROUP BY
SELECT gid, SUM(val) FROM t GROUP BY gid
-- WINDOW
SELECT gid, SUM(val) OVER (PARTITION BY gid) FROM t
ORDER BY
window関数内でのORDER BYはwindow関数が処理する順序を指定する。SUMを使うと、その行までの和が得られる。
SELECT gid, SUM(val) OVER (PARTITION BY gid ORDER BY val) FROM t
ROW
どこからどこまで処理するかを指定できる。
開始位置、終了位置で使える変数は以下
| name | description |
|---|---|
| CURRENT ROW | 現在行 |
| UNBOUNDED PRECEDING | PARTITIONの最初 |
| UNBOUNDED FOLLOWING | PARTITIONの最後 |
| N(INT) PRECEDING | 現在行のN行前 |
| N(INT) FOLLOWING | 現在行のN行後 |