SQL振り返り【SELECT】
どうも。てちこまです。
気が狂いそうなぐらい久しぶりの投稿です。
引っ越し、就職、コロナと慌ただしい日々もようやく落ち着いてきました。
Index
はじめに
今日はSQLの研修で初めて知ったor忘れてたことをまとめます。
全部やると長いので今回はSELECT関係で。
WHERE句で列別名は使えない
誤り
1 2 3 |
SELECT 列名1,列名2,列名3*100 as 列別名 FROM テーブル名 WHERE 列別名 <= 500; |
みたいなのはエラーになるんですね。すっかり忘れてました。
正しい
1 2 3 |
SELECT 列名1,列名2,列名3*100 as 列別名 FROM テーブル名 WHERE 列名3*100 <= 500; |
CASE文
構文1
1 2 3 4 5 6 7 8 |
SELECT 列名1,列名2 CASE 列名3 WHEN 値1 THEN 表示する値1 WHEN 値2 THEN 表示する値2 WHEN 値3 THEN 表示する値3 [ELSE 表示する値4]任意 END FROM テーブル名; |
列名3の値をWHEN句の値と比較して一致すればTHEN句の値を表示。
構文2
※値は例です
1 2 3 4 5 6 7 8 |
SELECT 列名1,列名2 CASE WHEN 0 <= 列名3 AND 列名3 < 500 THEN 表示する値1 WHEN 500 <= 列名3 AND 列名3 <600 THEN 表示する値2 WHEN 600 <= 値3 THEN 表示する値3 [ELSE 表示する値4]任意 END FROM テーブル名; |
列名3の値を範囲ごとに結果を出す場合などに利用。
WHEN句に直接条件式を書けばいいのでこの場合はCASEの横に列名は不要。
LIKE演算子におけるESCAPEの仕様
1 2 3 |
SELECT 列名1,列名2,列名3 FROM テーブル名 WHERE 列名3 like '%@__' ESCAPE '@'; |
この場合任意の文字列+_(アンダーバー)が一文字+任意の文字が一文字の文字列を条件に抽出となります。
例)
abcd_1
abcd_3
testtest_4 など
エスケープ文字の直後一文字のワイルドカードのみ通常文字となるので都度エスケープ文字をいれる必要があります。
例
1 2 3 |
SELECT 列名1,列名2,列名3 FROM テーブル名 WHERE 列名3 like '%@_@%_' ESCAPE '@'; |
→ test%3,hogehoge%w など
INNER JOIN (内部結合)と OUTER JOIN(外部結合)の違い
INNER JOINは結合する表にそれぞれ結合相手がいない行は出力しない、
OUTER JOINは存在しない場合も表示。データが存在しない部分はNULLで出力。
INとANYとALLの違い
INはいずれかの値と一致するかどうか。
ANYはいずれかの値を比較して条件にあたれば真。
ALLは戻す値リストを比較して全ての条件を満たせば真。
IN
1 2 3 |
SELECT 列名1,列名2,列名3 FROM テーブル名 WHERE 列名3 IN(4,5,6) |
この場合列名3の値が4,5,6のいずれかである結果が抽出される。
ANY
1 2 3 |
SELECT 列名1,列名2,列名3 FROM テーブル名 WHERE 列名3 < ANY(4,5,6) |
この場合列名3の値をいずれかの値と比較して真であれば真なので6より小さい値である結果が抽出される。
ALL
1 2 3 |
SELECT 列名1,列名2,列名3 FROM テーブル名 WHERE 列名3 < ALL(4,5,6) |
この場合列名3の値と全ての値を比較して真である必要があるので4より小さい値である結果が抽出される。
NOT INで副問い合わせ結果にNULLが含まれると...
NULLで比較するとUNKNOWN(評価できない)となるので一行も返却されない。IS NOT NULLやNULL制約で回避。
まとめ
フレームワークばっか使ってORMに頼りきりになっていると忘れてしまいがちですがなんとか覚えていきたいですね。