※本記事はSQLの入門を一通り勉強し終えた方向けとなります。
環境
Windows10 64bit
PostgreSQL 10.6
※環境はPostgresql/Redshiftを想定しているため、BigQuery 等では使用できないかもしれません。
知っていると役に立つかもしれない SQL - Tips集
## そうは言っても基本編
#####■SQLの評価順序
・FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY > LIMIT
#####■countでnullも含めて数を数えたいとき(通常、countのみだとnullの数はカウントされません)
SELECT
COUNT(*)
FROM
(SELECT * FROM テーブル名 )as q
WHERE
カラム名 is null
#####■SQLでは、「NOT IN」はnullがあると使えない
#####■検索時に「__(アンダーバー)」で文字数を指定できる。(ex.「_ _ご」という綴りのものを検索したい)
SELECT
*
FROM
テーブル名
WHERE
item LIKE '__ご'
#####■「ORDER BY カラム名 DESC」で高い順に並び替え
#####■「RANK() OVER (ORDER BY カラム名 DESC)」:上から順位をつける(順位を飛ばす)
#####■「DENSE_RANK() OVER (ORDER BY カラム名 DESC)」:上から順位をつける(順位を飛ばさない)
#####■「RANK() OVER(PARTITION BY グループ分けしたいカラム名 ORDER BY カラム名)」:グループ化したものを上から順位をつける(順位を飛ばす)
#####■感覚的に知っておきたいサブクエリの使用場所
-SELECT句でサブクエリを使う時=特定の列の集計を行ったり、集計関数を使ったり、一件だけ呼び出したいとき
-FROM句でサブクエリを使う時=名前を付けて改めてSELECT句で使いたい場合。テーブルをどんどん絞っていくとき、もしくはカラム名を作成し、そのコード内で使用したいとき
-WHERE句でサブクエリを使う時=検索条件を補完したい時や、他の更新可能性のあるテーブルを引っ張ってきたい時(=他所のテーブルに合わせて都度更新したくない時)、JOINが使えないとき
## チョイと便利なお役立ち構文編
#####■FIRST_VALUE(カラム名)OVER():ランキング最上位を抽出
#####■LAST_VALUE(カラム名)OVER():ランキング最下位を抽出
#####■ROWS BETWEEN 開始値 and 終了値
:
内の条件で、連番を振る
-CURRENT ROW(現在の行)
-n RECEDING(n行前)
-n FOLLOWING(n行後)
-UNBOUNDED PRECEDING(前の行すべて)
-UNBOUNDED FOLLOWING(後の行すべて)
rows between unbounded preceding and current row
unbounded preceding = 「グループの最初の行をウィンドウの開始点とする」
current_row = 「ウィンドウの終了点を常にカレント行とする」
#####■動的疑似テーブル作成
-WITH 疑似テーブル名(疑似カラム名、疑似カラム名) as (
VALUES
('単語'、'単語')
('単語'、'単語')
('単語'、'単語')
) select * from 疑似テーブル名
#####■ROLLUP(カラム名1、カラム名2):カラム別(カテゴリ別)での小計を抽出
## チョイと便利な分析構文編
#####■ntile(数字):任意の間隔にグルーピング
ex.デシル分析にて:ntile(10) over(partition by カラム名 order by カラム名2 desc)・・・全体を10分割して各行に1~10の値をつける
#####■random() < 0.001 :ランダムサンプリング。「どの行でも良いからランダムに0.1%(=1000分の1)くらいの量が欲しい」
#####■var_pop(column)=columnの母分散
#####■var_samp(column)=columnの標本分散
#####■stddev_pop(column)=columnの#####標準偏差
#####■stddev_samp(column)=columnの標本標準偏差
Tipsというよりただの構文集になってしまった感は否めませんが、どこかでお役立て頂ければ幸いです。