skillup

技術ブログ

Database

CASE式のすすめ その2

投稿日:2016年11月3日 更新日:

本日も「達人に学ぶSQL徹底指南書」を地道に進めていきます。

CASE式の利用

私自身はCHECK制約を使ったことはないですが、正しいテーブル設計においてはこれがあると誤ったデータを入れることを防ぐことができます。

例 会計年度のはじめと終わりを定義したのに、終わりのほうが昔になっているなど。

またCASE式ではCHECK制約と相性がいいです。

使い方については本家を参考に。

CHECK制約はNOT NULLやUNIQUE同様正しい値のみを格納できるので積極的に使っていく必要ありかもです。

制約に関していろいろ↓

【初級編⑨】テーブルに設定するキーの種類や様々な制約(CONSTRAINT)
SQLの制約の種類とその指定方法

UPDATE文のCASE

CASE式は条件分岐にも使えます。

例えば下記のようなテーブルsalarytbがあるとします。

name | salary
——+———
相田 | 200000
田中 | 300000

ここで以下のような条件で更新するとします。

  • 30万以上の社員は15%アップ
  • 20万以上30万未満(299999以下)の社員は20%アップ

これも1行で以下のように書けます。

この場合、UPDATE文を2回すると290000の社員は2回昇給をしてしまいます。

テーブル同士のマッチング

CASE式の大きな利点は式を評価でき、bETWEENやLIKE、大小判定などが使えることです。

テーブル名 CourseMaster
course_id | course_name
———–+————-
1 | 経理入門
2 | 財務知識
3 | 簿記検定
4 | 税理士

テーブル名  OpenCourse
month | course_id
——–+———–
200706 | 1
200706 | 3
200706 | 4
200707 | 4
200708 | 2
200708 | 4

ここで下記のような表を作りたいとします。

course_name | 6月 | 7月 | 8月
————-+—–+—–+—–
経理入門 | ○ | × | ×
財務知識 | × | × | ○
簿記検定 | ○ | × | ×
税理士 | ○ | ○ | ○

この場合、下記のようにSQLを書けばOKです。

EXISTSを使っても似たようなものができますね。

コツとしてはまず骨組みとなるSQL(外の部分のSQL)を作ってから細かいもの(中の詳細な条件)を組み立てていくのがいいのかなと思っております。

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

HAVING句について NULL時の動き

HAVING句のNULLがあった時の挙動にたいしてメモリます。 COUNTの処理 対象上の列数を数えるのにCOUNTを使うと思いますが、COUNT(*)とCOUNT(列名)では動きが若干違っており、前 …

no image

Postgresの基礎(主にMySQLとの違いなど)

えー来月(2020年3月)より、postgresを使うかもしれないので、ちょっと復習を。 Contents1 以前のリンク2 基本コマンド比較2.1 超頻出系3 テーブル比較4 SELECT文5 do …

no image

データベースのインデックスについて

今回はデータベースのインデックスに関して。 検索条件を早くする場合、何よりも速度が速くなるのはインデックスを張ることでしょう。 インデックスを張ることは単語を索引順に並べることですので、劇的に速度が向 …

no image

mysqlデータのCSV出力

ガチンコ塾のブログでもかいたのですが、行動力が大切だなーと思う今日この頃。 社長が熟練のJavaエンジニアで基本的に聞けば、基本的に解決することが多いのですが、外部の勉強会などにも出て情報収集の必要性 …

no image

データベースのテスト環境作成

現在作っているシステムのリリースが近づいており、本番に近い環境を作成しお客様に見てもらうことに。 こういった手順はマニュアル化しておいたほうが楽だろうと思い、自分的にメモ 1 現状運用されているデータ …