#はじめに
この記事は、よく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 (列名1, 列名2, ・・・) -- 「*」を使うと全ての列を取得できる
FROM (テーブル名)
###データを更新したい(UPDATE)
UPDATE (テーブル名)
SET (列名) = (更新したいデータ)
-- 更新したい情報がVARCHAR型、DATE型などの場合 '' で囲む
-- INTEGERなどの基本データ型はそのままでOK
###データを削除したい(DELETE)
DELETE FROM (テーブル名)
WHERE (削除したいデータ)
-- WHEREのないDELETE文は、 「全データ削除」 になるので注意
###データを追加したい(INSERT)
INSERT INTO (テーブル名)
VALUES (列名1, 列名2, ・・・)
-- VARCHAR型、DATE型などは '' で囲む
-- INTEGERなどの基本データ型はそのままでOK
##行の絞り込み
###データを絞り込みたい
WHERE (条件式)
-- 条件式は、「YES」か「NO」で答えられるもの
-- つまり「真」か「偽」で判断出来なくてはならない
比較演算子 | 意味 |
---|---|
= | 左右の値が等しいか |
<> | 左右の値が等しくないか |
!= | <>の別の書き方で、これも左右の値が等しくないかを判断 |
< | 左辺の値は右辺の値より小さいか |
> | 左辺の値は右辺の値より大きか |
<= | 左辺の値は右辺の値以下か |
>= | 左辺の値は右辺の値以上か |
###NULLの判定をしたい
NULLは比較演算子を使うことが出来ません。
そのため、NULL専用の演算子が存在します。
(式) IS NULL -- NULLであることを判定する
(式) IS NOT NULL -- NULLでないことを判定する
例) WHERE 備考 IS NULL -- 備考がNULLのものを絞り込める
###文字列をざっくりと比較したい
LIKE '税' -- データの 中身 が「税」となっているものを絞り込める
LIKE '%税' -- データの 末尾 が「税」となっているものを絞り込める
LIKE '税%' -- データの 先頭 が「税」となっているものを絞り込める
LIKE '%税%' -- データに 「税」 と入っているものを絞り込める
例) WHERE 出費 LIKE '%税'
###範囲内に値が収まっているかを判定したい
BETWEEN (値1) AND (値2)
例) WHERE 値段 BETWEEN 3000 AND 5000
-- 値段が3000円以上5000円以下のものを絞り込める
ANDだけでも同じようなことが書けます。
値段 >= 3000 AND 値段 <= 5000
###複数の値で比較したい
比較演算子での比較は、一つの値しか比較出来ません。
ANDやORを使えば複数の値を比較出来ますが、
若干読みにくくなります。
IN/ANY/ALL演算子を使うと綺麗に見えます。
式 IN (値1, 値2, 値3 ・・・) -- 値に合致する行を検索
式 NOT IN (値1, 値2, 値3 ・・・) -- 値と合致しない行を検索
例) 出費 IN ('住民税', '交際費', '家賃') -- 出費列が'住民税', '交際費', '家賃'のもを検索
###複数の条件式を組み合わせたい
(条件式1) AND (条件式2) -- 条件式1と条件式2が 両方 真ならば真
(条件式1) OR (条件式2) -- 条件式1と条件式2の どちらか が真ならば真
例) WHERE 出費 LIKE '%税' AND 値段 >= 5000 -- 出費列の末尾に'税'がついていて、かつ、値段が5000円以上か
##検索結果の加工
###検索結果から重複した行を除外する
SELECT DISTINCT (列名)
FROM (テーブル名)
例) SELECT DISTINCT 出費 -- 内容が重複している行を取り除く
###検索結果を並び替える
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 (取得行数) (OFFSET 除外する行数) -- OFFSETで入力した数値分除外した行を取得
例) LIMIT 5 -- 先頭5行を取得
例) ORDER BY 値段 DESC
LIMIT 5 OFFSET 5 -- 値段TOP6から10を表示
###2つ以上の検索結果を繋げる
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」を使う
SELECT (列名1) FROM (テーブル名1)
EXCEPT (ALL)
SELECT (列名1と同じ型の列) FROM (テーブル名2)
-- UNIONが足し算だとしたら、EXCEPTは引き算
-- 条件が重なったものを除外する
例) SELECT 商品名, 値段 FROM A商店
EXCEPT
SELECT 商品名, 値段 FROM B商店
-- 2つ検索結果から重複行を除く
-- 同じ商品名でも値段が違えば重複と見られず、それぞれ表示される
###2つ以上の重複する検索結果のみを取り出す
EXCEPTで取り除かれるもの”のみ”取り出すと考えると分かりやすいかもしれません。
SELECT (列名1) FROM (テーブル名1)
INTERSECT
SELECT (列名1と同じ型の列) FROM (テーブル名2)
例) SELECT 商品名, 値段 FROM A商店
INTERSECT
SELECT 商品名, 値段 FROM B商店
-- A商店とB商店に存在する「商品名」も「値段」も同じもののみ取り出す
###列名の名前を変更したい
(列名) 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 商品名 || '(税込)' -- 商品名の横に(税込)文字列を追加する
##条件分岐
###条件を評価して、結果に応じた処理をしたい
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文は上から評価していくので、「安い」と「普通」を入れ替えると
-- 「安い」と表示されていたものが全て「普通」になる
##関数
##集計関数
#最後までお読みいただきありがとうございます
関数と集計関数はのちに追加します。
ありがとうございました。