SQL実行環境
- PostgreSQL 9.4
- A5:SQL
NULL値控えるために使っていたCOALESCE()。実は
-- 今まで使ってた感じ
-- A = NULLかどうかわからない値
SELECT COALESCE(A,0);
-- 結果:前の値がNULLだったら0をもらう, NULLではないのであればそのまま
-- 実はこういう意味だった。
-- 'A','B','C'は全部NULLではないとしたら
SELECT COALESCE('A','B','C'); --結果は'A'
SELECT COALESCE(NULL,'B','C'); --結果は'B'
SELECT COALESCE(NULL,'B',NULL); -- 結果は'B'
前からNULLか調べてNULLだったら、次の値を調べる。NULLではない物が出るまで続くらしい。
NULLかも知らない複数の値の中で、どある順番でNULLではないものが取りたい時使ってみる。
参考:https://qiita.com/ren0826jam/items/b442bb9120a4671f90b8
IN / NOT IN
select *
from m_kaihi -- 会費テーブル
where nyukin_kubun = 12 OR nyukin_kubun = 4 -- 入金区分
where nyukin_kubun IN (12, 4)
上と下のWHERE句は同じ意味。下の方を使いたい。とってもシンプルです。
NOT INも覚えたいです。
参考:https://qiita.com/ren0826jam/items/b442bb9120a4671f90b8
UNION
テーブルたちを結合する
SELECT
A
, B
, C
FROM table1
UNION
SELECT
A
, B
, C
FROM table2
UNION
SELECT
A
, B
, C
FROM table3
※注意点:UNION と UNION ALL の違い
UNION と UNION ALL の違いは、重複行の扱いです。
UNION は、重複行を除外します。UNION ALL は重複行も全部含みます。
参考:https://pontz-rw.hatenablog.jp/entry/2019/10/13/000000
WITH句
WITH T3 AS (
SELECT
id
, bula
FROM
some_table
)
, T4 AS (
SELECT
ST.id
, bulabula
FROM
some_table ST
LEFT JOIN T3
ON ST.id = T3.id
WHERE
ST.id = 1111 AND T3.bula = 0 -- WITH句中でT3を参照できる
)
SELECT
*
FROM
sometable T1
LEFT JOIN sometable T2
ON T2.id= T1.id
LEFT JOIN T3 -- JOINの後()中にSELECT文を書かなくて済む
ON T3.id= T1.id
LEFT JOIN T4
ON T4.id= T1.id
WITH句を教えられた後からは副問い合わせはほぼWITH句で書いています。
今までは JOIN の後( )中に書くのが当たり前だと思ったが、WITH句は読みやすいし書くのもシンプルです。副問い合わせのSELECT文の中にまたSELECT文を書こうとすると、わけわかんないですね。。
WITH句は中にSELECT文以外の物も書けるらしいがまだ次調べよう!
SQLを書く順番
あんまり意識してないが、下のとおりやってみる!
SELECT → FROM → JOIN(まず必要なテーブルを全部くっつける感じ) → WHERE → GROUP BY → HAVING → ORDER BYの順でSQL文を書く
参考:https://qiita.com/ren0826jam/items/b442bb9120a4671f90b8
SQLを高速化するコツ・テクニック
① SQLで暗黙の型変換は回避するよう考慮する
where句のカラム型をチェック!
② キーワードは大文字
SQLのキーワードはすべて大文字で書く!
③ IndexがかかってるカラムをWHERE句で指定した方が検索が早いらしい!
④ 行数を数えるときは「COUNT(カラム)」を使う。
カラムはインデックスが設定されているのを使う事で処理が速くなる!