0
1

More than 1 year has passed since last update.

SQLメモ

Posted at

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
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1