LoginSignup
3
11

More than 5 years have passed since last update.

SQL逆引きリファレンス

Last updated at Posted at 2019-01-24

はじめに

この記事は、よくSQLを書いてる時に
「あれどうやるんだっけ?」
となるものを個人的にまとめたものです。

また、出来るだけ横文字を使わないようにしています。

書籍や、公式ドキュメントを参考にしていますが、
DBMSなどの違いによってエラーになることもありますので
あらかじめご了承ください。

また記述ミス等ありましたら、教えていただけるとありがたいです。

SQLとは

ざっくり言うと、データベースを操作する言語です。
SQLは大きく3つの種類に別れます。

テーブルの中のデータを操作するDML 

例)検索、更新、削除、挿入など

テーブル自体を操作するDDL

例)テーブル作成、テーブル削除など

DMLやDDLの使用許可などを割り振ったりするDCL

例)権限の付与など

この記事では特にDMLについて記述していきます。

逆引きリファレンス

SQLの基本ルール

基本ルール
-- ハイフンを二つ入力したらコメントになる
     -- 行の先頭や    行の途中に空白を入れることができる

/*
「/* 〜〜 */」この範囲が
コメントになる
*/

SELECT * FROM XXX -- 1行で書くこともできるし、

SELECT *
FROM XXX -- 改行を入れて書くこともできる

-- SQLの予約語は、
select -- 小文字でも書けるし
SeLeCt -- 大文字と混ぜても書ける
SELECT -- 一般的には全てを大文字にすることが多い

SELECT (SELECT)   -- 列名やテーブル名に、
FROM (SELECTテーブル) -- 予約語を利用することはできない

四大命令

データを検索したい(SELECT)

SELECT文
SELECT (列名1, 列名2, ・・・) -- 「*」を使うと全ての列を取得できる
FROM (テーブル名)

データを更新したい(UPDATE)

UPDATE文
UPDATE (テーブル名)
SET (列名) = (更新したいデータ)
-- 更新したい情報がVARCHAR型、DATE型などの場合 '' で囲む
-- INTEGERなどの基本データ型はそのままでOK

データを削除したい(DELETE)

DELETE文
DELETE FROM (テーブル名)
WHERE (削除したいデータ)
-- WHEREのないDELETE文は、 「全データ削除」 になるので注意

データを追加したい(INSERT)

INSERT文
INSERT INTO (テーブル名)
VALUES (列名1, 列名2, ・・・)
-- VARCHAR型、DATE型などは '' で囲む
-- INTEGERなどの基本データ型はそのままでOK

行の絞り込み

データを絞り込みたい

WHERE (条件式)
-- 条件式は、「YES」か「NO」で答えられるもの
-- つまり「真」か「偽」で判断出来なくてはならない
比較演算子 意味
= 左右の値が等しいか
<> 左右の値が等しくないか
!= <>の別の書き方で、これも左右の値が等しくないかを判断
< 左辺の値は右辺の値より小さいか
> 左辺の値は右辺の値より大きか
<= 左辺の値は右辺の値以下か
>= 左辺の値は右辺の値以上か

NULLの判定をしたい

NULLは比較演算子を使うことが出来ません。
そのため、NULL専用の演算子が存在します。

IS NULL文
() IS NULL     -- NULLであることを判定する
(式) IS NOT NULL -- NULLでないことを判定する

例) WHERE 備考 IS NULL -- 備考がNULLのものを絞り込める

文字列をざっくりと比較したい

LIKE文
LIKE '税'   -- データの 中身 が「税」となっているものを絞り込める
LIKE '%税'  -- データの 末尾 が「税」となっているものを絞り込める
LIKE '税%'  -- データの 先頭 が「税」となっているものを絞り込める
LIKE '%税%' -- データに 「税」 と入っているものを絞り込める

例) WHERE 出費 LIKE '%税'

範囲内に値が収まっているかを判定したい

BETWEEN文
BETWEEN (値1) AND (値2)

例) WHERE 値段 BETWEEN 3000 AND 5000
-- 値段が3000円以上5000円以下のものを絞り込める

ANDだけでも同じようなことが書けます。

AND文
値段 >= 3000 AND 値段 <= 5000

複数の値で比較したい

比較演算子での比較は、一つの値しか比較出来ません。
ANDやORを使えば複数の値を比較出来ますが、
若干読みにくくなります。

IN/ANY/ALL演算子を使うと綺麗に見えます。

IN文
 IN (1, 2, 3 ・・・)     -- 値に合致する行を検索
 NOT IN (1, 2, 3 ・・・) -- 値と合致しない行を検索

) 出費 IN ('住民税', '交際費', '家賃') -- 出費列が'住民税', '交際費', '家賃'のもを検索

複数の条件式を組み合わせたい

AND/OR文
(条件式1) AND (条件式2) -- 条件式1と条件式2が 両方 真ならば真
(条件式1) OR (条件式2)  -- 条件式1と条件式2の どちらか が真ならば真

) WHERE 出費 LIKE '%税' AND 値段 >= 5000 -- 出費列の末尾に'税'がついていて、かつ、値段が5000円以上か

検索結果の加工

検索結果から重複した行を除外する

DISTINCT文
SELECT DISTINCT (列名)
FROM (テーブル名)

例) SELECT DISTINCT 出費 -- 内容が重複している行を取り除く

検索結果を並び替える

ORDER_BY文
SELECT (列名1, 列名2, 列名3・・・) FROM テーブル名
ORDER BY 列名 並び順
-- 並び順は、ASCまたはDESCの2つ
-- ASCは昇順、DESC降順
-- 何も書かなかった場合ASCになる

) ORDER BY 値段 DESC -- 値段が降順、つまり高い順に並ぶ
例) ORDER BY 1, 2, 3 DESC -- 列1と2は昇順、3は降順で並び替えする

検索結果から件数を限定して取得

LIMIT文
LIMIT (取得行数)                     -- 入力した数値分の行を取得
LIMIT (取得行数) OFFSET 除外する行数)  -- OFFSETで入力した数値分除外した行を取得

) LIMIT 5 -- 先頭5行を取得
) ORDER BY 値段 DESC
    LIMIT 5 OFFSET 5 -- 値段TOP6から10を表示

2つ以上の検索結果を繋げる

UNION文
SELECT (列名1) FROM (テーブル名1)
UNION (ALL) -- ALLをつけると重複行も表示される
SELECT (列名1と同じ型の列) FROM (テーブル名2)

) SELECT 商品名, 値段 FROM A商店
    UNION
    SELECT 商品名, 値段 FROM B商店
-- 2つの検索結果の表を合体させて表示する
-- UNIONする時は、列のデータ型と順番を一致させなければならない

2つ以上の重複する検索結果を取り除く

OracleDBやMySQLでは
「EXCEPT」の代わりに「MINUS」を使う

EXCEPT文
SELECT (列名1) FROM (テーブル名1)
EXCEPT (ALL)
SELECT (列名1と同じ型の列) FROM (テーブル名2)
-- UNIONが足し算だとしたら、EXCEPTは引き算
-- 条件が重なったものを除外する

例) SELECT 商品名, 値段 FROM A商店
    EXCEPT
    SELECT 商品名, 値段 FROM B商店
-- 2つ検索結果から重複行を除く
-- 同じ商品名でも値段が違えば重複と見られず、それぞれ表示される

2つ以上の重複する検索結果のみを取り出す

EXCEPTで取り除かれるもの”のみ”取り出すと考えると分かりやすいかもしれません。

INTERSECT文
SELECT (列名1) FROM (テーブル名1)
INTERSECT
SELECT (列名1と同じ型の列) FROM (テーブル名2)

例) SELECT 商品名, 値段 FROM A商店
    INTERSECT
    SELECT 商品名, 値段 FROM B商店
-- A商店とB商店に存在する「商品名」も「値段」も同じもののみ取り出す

列名の名前を変更したい

AS文
(列名) AS (変更したい名前) -- 「列名」が「変更したい名前」に置き換わる

) SELECT 値段 AS A商店の商品の値段
-- 検索結果の列名が「値段」から「A商店の商品の値段」に変更される

取得した列データに、数値や文字列追加などの加工したい

計算式文
例)
SELECT 値段 + 1000 FROM 商品 -- 値段列の結果に1000円足す
SELECT 取引日 + 5 FROM 取引  -- 取引日を5日進める

SELECT 値段 - 1000 FROM 商品 -- 値段列の結果から1000円引く
SELECT 取引日 - 5 FROM 取引  -- 取引日を5戻す
SELECT '2018-12-10' - '2018-12-1' FROM 取引 
-- 取引日の差をを求める この場合9が返ってくる
-- ただ、西暦や月が一致していない場合、返す数値がおかしくなるので、
-- その場合は、DATE型を計算する関数を呼び出す

SELECT 値段 * 1.08 FROM 商品 -- 商品の値段を1.08倍、つまり消費税込みで表示する
SELECT 値段 / 2 FROM 商品    -- 商品の値段を半分にする

-- 文字列同士は「+」で結合できない
SELECT 商品名 || '(税込)'    -- 商品名の横に(税込)文字列を追加する

条件分岐

条件を評価して、結果に応じた処理をしたい

CASE文
SELECT 
CASE (評価する列、式) 
    WHEN (値1 THEN (1の時に返す値)
    WHEN (値2 THEN (2の時に返す値)
    ELSE (デフォルトの値)
END

例) SELECT 値段,
    CASE
        WHEN 値段 <= 5000 THEN '安い'
        WHEN 値段 <= 30000 THEN '普通'
        WHEN 値段 > 30000 THEN '高い'
    END AS 値段評価
-- 値段が5000円以下のものを安い
-- 値段が5000円以上、30000円以下のものを普通
-- 値段が30000円より上のものを高いと評価するCASE文
-- CASE文は上から評価していくので、「安い」と「普通」を入れ替えると
-- 「安い」と表示されていたものが全て「普通」になる

関数

集計関数

最後までお読みいただきありがとうございます

関数と集計関数はのちに追加します。
ありがとうございました。

3
11
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
3
11