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

どこからどこまで処理するかを指定できる。

開始位置、終了位置で使える変数は以下

namedescription
CURRENT ROW現在行
UNBOUNDED PRECEDINGPARTITIONの最初
UNBOUNDED FOLLOWINGPARTITIONの最後
N(INT) PRECEDING現在行のN行前
N(INT) FOLLOWING現在行のN行後

この記事に関するIssueをGithubで作成する

Read Next