SQLを少しでも軽く
1.SELECT句の「*」
「*」の部分はできるだけ必要なカラム名だけを取得する
2.WHERE句の条件指定順
条件指定の順番は結果が少なくなるような条件を先に記述する
3.テーブルに別名を付けてSQLを書く
「FROM テーブル名 A」の「A」みたいな別名を付けるようにする
4.COUNT関数
COUNT(カラム名)のように書くようにする
列にインデクスが張られている場合はそのほうがいい
5.IN句の引数リスト
IN句の引数リストには左から順に最もありそうなキーを書くようにする
下記の場合、パターン2のほうがいいみたい
パターン1:IN ('鳥取', '徳島', '東京', '大阪');
パターン2:IN ('東京', '大阪', '鳥取', '徳島');
6.左辺へ使用する関数
WHEREの条件では右側に関数を使用するようにする
INDEXの使用できなくなる
7.INDEXの利用
GROUP BY、ORDER BY句でキーをを指定して高速化できる
WHERE句の条件が完全一致の場合は高速化できる
LIKEのワイルドカードを使用した場合は無理
JOINでの結合条件にインデクスのある列を使用すると高速化できる
8.UNION
重複を気にしなくてもいい場合はUNIONではなくUNION ALLを使用する
UNIONは重複行を排除するためのソートが発生するため遅くなる
9.INDEXが使用できない場合
IS NULLを使用している
ORを使用している
否定形を使用している
複合INDEXの場合カラム順を間違えている
LIKEの記述で後方一致、中間一致を使用している
ちょくちょく使うSQL
LIKE
「%」は任意の0文字以上の文字列
SELECT カラム1 FROM テーブル1 WHERE カラム1 LIKE '%A%'
「_」は任意の1文字
SELECT カラム1 FROM テーブル1 WHERE カラム1 LIKE '_A_'
ANY
比較演算子の条件が副問い合わせの結果と比較し一つでも真になるとき真
SELECT カラム1 FROM テーブル1 WHERE カラム1 =< ANY (副問い合せ)
ALL
比較演算子の条件が副問い合わせの結果と比較し全てが真になるとき真
SELECT カラム1 FROM テーブル1 WHERE カラム1 =< ALL (副問い合せ)
MINUS
最初の検索結果から次の検索結果と重複する部分を取り除く
SELECT カラム1 FROM テーブル1
MINUS
SELECT カラム1 FROM テーブル2
INTERSECT
2つの検索結果で重複するもの
SELECT カラム1 FROM テーブル1
INTERSECT
SELECT カラム1 FROM テーブル2
CASE
データ抽出時の条件分岐
SELECT
CASE カラム1
WHEN カラム1 < 20 THEN '1'
ELSE '0'
END AS 区分
FROM テーブル1
LENGTH
文字数を取得
SELECT LENGTH(カラム1) FROM テーブル1
TRIM
文字列の空白を削除
SELECT TRIM(カラム1) FROM テーブル1
REPLACE
指定文字列を置換する
SELECT REPLACE(カラム1,'A','B') FROM テーブル1
SUBSTRING
文字列から切り取り
SELECT SUBSTRING(カラム1,1,3) FROM テーブル1
ROUND
四捨五入
SELECT ROUND(カラム1,1) FROM テーブル1
WITH
一時的にビューを作成
WITH テーブル1 as {
select カラム1 from テーブル2
)
select カラム1 from テーブル1
UPPER
大文字へ変換
SELECT UPPER('文字') FROM テーブル1
LOWER
小文字へ変換
SELECT LOWER('文字') FROM テーブル1
SYSDATE
システム日付を取得
SELECT SYSDATE FROM テーブル1
TO_CHAR
日付、数値を文字列へ変換
SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD') FROM テーブル1
TO_DATE
文字列を日付へ変換
SELECT TO_CHAR('2022/03/01','YYYY/MM/DD') FROM テーブル1
NVL
第1引数がNULLの場合、第2引数の値に置き換える
SELECT NVL(カラム1,'nullでした') FROM テーブル1
NVL2
第1引数がNULLでない場合、第2引数の値に、NULLの場合、第3引数の値に置き換える
SELECT NVL(カラム1,'nullじゃない','nullでした') FROM テーブル1
DECODE
指定したカラムの値によって返却する値を変える
カラム1の値が値1の場合、結果1を返却
値2の場合は結果2の値でそれ以外の場合は結果3を返却
SELECT DECODE(カラム1,'値1','結果1','値2','結果2','結果3') FROM テーブル1
DUAL
ダミーテーブル
ちょっとした関数の確認とかに便利
SELECT 'test' FROM DUAL
WHERE 1=1
テストする時に条件を変更するのが楽になる
以下のcodeの条件を削除かコメントアウトしても1=1があるからname前のANDを消さなくてもすむとか
SELECT カラム1 F
ROM テーブル1
WHERE 1=1
--AND code = 1
AND name = taro