1+
SQL文は関数だけでなく、式も使えます。
Contents
計算式
例えば、SELECT文では下記のような使い方ができます。
1 2 3 |
SELECT 出金額, 出金額 + 100 AS プラス百円の出金額 -- ASを使うことで列名を別の名前に言い換えることができる FROM 家計簿 |
UPDATE文だとこんな感じ。
1 2 |
UPDATE 家計簿 SET 出金額 = 出金額 + 100 |
演算子
算術演算子
よく使われるものを以下の通り。
使い方 | 役割 |
数値 + 数値 | 数値同士の足し算 |
日付 + 数値 | 日付を数値分だけ進める |
数値 – 数値 | 数値同士の引き算 |
日付 – 数値 | 日付を数値分だけ過去に戻す(過去の特定の日に遡って処理したいときなどに使う) |
日付 – 日付 | 日付の差の日数を取得(経過日数を知りたい時などに使う) |
数値 * 数値 | 数値同士の掛け算 |
数値 / 数値 | 数値同士の割り算 |
文字列 || 文字列 | 文字列を連結する(DBMSによっては「+」でもOK) |
CASE式
CASE式は、SQLで条件分岐をする上でとても便利な式。CASE式はあくまで式なので、CASE式は実行された時には評価されて、1つの値に定まる。よって、CASE式はSELECT文、WHERE句、GROUP BY句、HAVING句、ORDER BY句、CHECK制約中、等々様々な場面で記述することができる。
ENDとELSEの書き忘れには注意すること!ELSEを書かないとELSE NULLという扱いを受けるので、NULLが値として入ってしまう。
基本的なCASE式の書き方は2通り。
1 2 3 4 5 6 7 8 9 10 11 |
-- 単純CASE式 CASE gender WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE 'その他' END -- 検索CASE式 CASE WHEN gender = '1' THEN '男' -- gender = '1'を'男'として読み替えている WHEN gender = ’2’ THEN ’女’ -- gender = '2'を'女'として読み替えている ELSE 'その他' END |
検索CASE式を使った例文は下記の通り
1 2 3 4 5 6 7 |
SELECT 支出用途, 支出額, CASE 支出用途 WHEN '居住費' THEN '固定費' -- 居住費=固定費として定義している WHEN '水道光熱費' THEN '固定費' -- 居住費=固定費として定義している ELSE '変動費' END AS 支出の分類 FROM 家計簿 WHERE 出金額 > 0 |
このSQL文は下記のような表として返ってくる。
支出用途 | 支出額 | 支出の分類 |
食費 | 1000 | 変動費 |
居住費 | 80000 | 固定費 |
水道光熱費 | 7500 | 固定費 |
色々なCASE式
サンプル①
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
SELECT CASE pre_name WHEN '大阪’ THEN '関西' WHEN ’奈良' THEN '関西' WHEN '京都’ THEN '関西' WHEN ’滋賀’ THEN '関西' WHEN ’兵庫’ THEN '関西' WHEN ’和歌山’ THEN '関西' WHEN ’東京' THEN '関東' WHEN ’千葉' THEN '関東' ELSE 'その他' END AS district, SUM(population) FROM PopTbl GROUP BY CASE pre_name -- MySQLやPostgreSQLであれば、GROUP BY districtでもOK WHEN '大阪’ THEN '関西' WHEN ’奈良' THEN '関西' WHEN '京都’ THEN '関西' WHEN ’滋賀’ THEN '関西' WHEN ’兵庫’ THEN '関西' WHEN ’和歌山’ THEN '関西' WHEN ’東京' THEN '関東' WHEN ’千葉' THEN '関東' ELSE 'その他' END; |
上記のSQL文はざっくり言うとこんな感じで集計される。
サンプル②異なる条件の集計を1つのSQLでやる(集計関数内にCASE式)
1 2 3 4 5 6 7 |
SELECT pre_name, -- 男性の人口 SUM(CASE WHEN gender = '1' THEN population ELSE 0 END) AS 男, -- 女性の人口 SUM(CASE WHEN gender = '2' THNE population ELSE 0 END) AS 女 FROM PopTbl2 GROUP BY pre_name; |
上記のSQL文はざっくり言うとこんな感じで集計される。
サンプル③CASE式を使ったUPDATE文
1 2 3 4 5 6 |
UPDATE 割引テーブル SET price CASE WHEN price >=500 THEN price * 0.8 WHEN 300 <= price <= 400 THEN price * 0.9 ELSE price END; |
上記のSQL文はざっくり言うとこんな感じで集計される。
WHERE句を使ってUPDATE文を2回書いても良いが、今回のように2つの条件式を同時に処理したいときは不向き。また1回のSQL文で済むので便利。
サンプル④(テーブルのマッチング)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
SELECT lesson, CASE WHEN lesson_id IN (SELECT lesson_id FROM OpenLessons WHERE month = 2019-01) THEN '◯' ELSE '☓' END AS '1月', CASE WHEN lesson_id IN (SELECT lesson_id FROM OpenLessons WHERE month = 2019-02) THEN '◯' ELSE '☓' END AS '2月', CASE WHEN lesson_id IN (SELECT lesson_id FROM OpenLessons WHERE month = 2019-03) THEN '◯' ELSE '☓' END AS '3月', FROM Lessons; |
上記のSQL文はざっくり言うとこんな感じで集計される。
これはEXISTSを使ってこんなふうにも書ける
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
SELECT CM.lesson, CASE WHEN EXISTS (SELECT lesson_id FROM OpenLessons OL --このOLは省略されているが、AS OLと同じ意味 WHERE month = 2019-01 AND OL.lesson_id = CM.lesson_id) THEN '◯' ELSE '☓' END AS '1月', CASE WHEN EXISTS (SELECT lesson_id FROM OpenLessons OL WHERE month = 2019-02 AND OL.lesson_id = CM.lesson_id) THEN '◯' ELSE ’☓’ END AS '2月' CASE WHEN EXISTS (SELECT lesson_id FROM OpenLessons OL WHERE month = 2019-03 AND OL.lesson_id = CM.lesson_id) THEN '◯' ELSE '☓' END AS '3月' FROM Lessons CM; --このCMは省略されているが、AS CMと同じ意味 |
1+