第 1 章 条件分岐 この章では 条件に応じて処理を分岐する方法について説明します 1. CASE 式で複雑な条件分岐を実現 2. 関数を使用した条件分岐 3. MERGE 文による条件に応じた DML の実行

Similar documents
第 2 章 問合せの基本操作 この章では データベースから情報を検索する際に使用する SELECT コマンド および SELECT コマンドと 同時に使用する句について説明します 1. 問合せとは 2. 基本的な問合せ 3. 列の別名 4. 重複行を一意にする 5. 検索行の絞込み 6. 文字パター

第 5 章 結合 結合のパフォーマンスに影響を与える結合の種類と 表の結合順序について内部動作を交えて 説明します 1. 結合処理のチューニング概要 2. 結合の種類 3. 結合順序 4. 結合処理のチューニングポイント 5. 結合関連のヒント

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

はじめに コースの概要と目的 Oracle をより効率的に使用するための SQL のチューニング方法について説明します また 索引の有無 SQL の 記述方法がパフォーマンスにどのように影響するのかを実習を通して理解します 受講対象者 アプリケーション開発者 / データベース管理者の方 前提条件 S

第 3 章 メディア障害とバックアップ リカバリ この章では メディア障害の発生に備えたバックアップ方法と 障害時の基本的なリカバリ方法につい て説明します 1. メディア リカバリ概要 2. ファイルの多重化 3. アーカイブ モードの設定 4. バックアップ概要 5. 一貫性バックアップ ( オ

第 7 章 ユーザー データ用表領域の管理 この章では 表や索引を格納するユーザー データ用表領域の作成や 作成後のメンテナンスに ついて解説します 1. ユーザー データ用表領域の管理概要 2. ユーザー データ用表領域作成時の考慮事項 3. ユーザー データ用表領域の作成 4. ユーザー データ

Microsoft PowerPoint - 講義補助資料2017.pptx

プレポスト【問題】

アジェンダ ORACLE MASTER Oracle Database 11g 概要 11g SQL 基礎 Ⅰ 試験紹介 ポイント解説 Copyright 2011 Oracle. All rights reserved. 2

1000 Copyright(C)2009 All Rights Reserved - 2 -

Oracle Application Expressの機能の最大活用-インタラクティブ・レポート

Microsoft PowerPoint - KeySQL50_10g_vlo2.ppt

基本サンプル

基本サンプル

Microsoft PowerPoint - db03-5.ppt

目次 1 集計関数 / 分析関数とは 2 集計関数 / 分析関数のパフォーマンス効果 3 ケーススタディグループ小計やクロス集計を計算するランキングを表示する前月比較を表示する累計を計算する移動平均を計算する構成比を計算する Oracle8i SQL Oracle8i Oracle Oracle C

PowerPoint プレゼンテーション

Oracle活用実践演習コース

Copyright(C)2010 i-corpration All Rights Reserved.

橡実践Oracle Objects for OLE

領域サイズの見積方法

相続支払い対策ポイント

150423HC相続資産圧縮対策のポイント

ハピタス のコピー.pages

Copyright 2008 All Rights Reserved 2

Oracle9i

健康保険組合のあゆみ_top

PowerPoint プレゼンテーション

Microsoft Word - sample_adv-programming.docx

DB12.1 Beta HandsOn Seminar


Dolteng Scaffoldに対する機能追加とマスタ-ディテールScaffoldの紹介

PowerPoint Presentation

法制度改革と電子マネーにおける立法の可能性

BC4J...4 BC4J Association JSP BC4J JSP OC4J

早分かりS2Dao

release-270.PDF


PowerPoint プレゼンテーション

n n n ( ) n Oracle 16 PostgreSQL 3 MySQL

テキスト中の表記について 画面中に表示される文字の表記ウィンドウ ボタン メニューなど 画面に表示される文字は [] で囲んで表記しています 画面上に表示される選択肢や 入力する文字については で囲んで表記しています ディレクトリの表記本テキストではファイルのパスを表す際 すべてデフォルトのインスト

untitled

初心者にもできるアメブロカスタマイズ新2016.pages

- 2 Copyright (C) All Rights Reserved.

テキスト中の表記について 画面中に表示される文字の表記ウィンドウ ボタン メニューなど 画面に表示される文字は [] で囲んで表記しています 画面上に表示される選択肢や 入力する文字については で囲んで表記しています ディレクトリの表記本テキストではファイルのパスを表す際 すべてデフォルトのインスト

高確率軸馬発掘法&今週末から競馬の勝ち組になれる5つの作戦

Copyright All Rights Reserved. -2 -!

Microsoft PowerPoint - Visualプログラミング

Microsoft PowerPoint - 3-Forms-Others.ppt

untitled

Microsoft Word - 最終版 バックせどりismマニュアル .docx

APEX Spreadsheet ATP HOL JA - Read-Only

PowerPoint -O80_REP.PDF

Microsoft PowerPoint pptx

橡ExCtrlPDF.PDF

テキスト 中 の 表 記 について 画 面 中 に 表 示 される 文 字 の 表 記 ウィンドウ ボタン メニューなど 画 面 に 表 示 される 文 字 は[]で 囲 んで 表 記 しています 画 面 上 に 表 示 される 選 択 肢 や 入 力 する 文 字 については で 囲 んで 表 記

クエリの作成が楽になるUDF

untitled

セットアップカード

3 - 正しい SQL ( 方言を排除した SQL 文の記述方法 )

Oracle Application Expressの機能の最大活用-インタラクティブ・レポート

Oracle 入門 ~ 研修受講後のスキルアップサポート ~ 対応バージョン :Oracle 10gR1 ~ 12cR1 本資料は アシスト Oracle 研修をご受講いただいたお客様からのご質問や 研修ではご案内できなかった情報などを FAQ にまとめたものです 研修受講後のスキルアップの一助とし

Java講座

要旨 : データステップ及び SGPLOT プロシジャにおける POLYGON/TEXT ステートメントを利用した SAS プログラムステップフローチャートを生成する SAS プログラムを紹介する キーワード :SGPLOT, フローチャート, 可視化 2

CONTENTS 1 All Rights Reserved Copyright(C)

内容 Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作... 1 サーバーエクスプローラ... 4 データ接続... 4 データベース操作のサブメニューコンテキスト... 5 データベースのプロパティ... 6 SQL Server... 6 Microsoft

_02_3.ppt

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

untitled

_02-4.ppt

PowerPoint プレゼンテーション

: ORDER BY

Oracle Database 12cでのSQL*LoaderのExpress Modeによるロード

Transcription:

はじめに コース概要と目的 SQL での作業の幅を広げるための応用的なテクニックをご説明します また 効率性の向上や正しい結果を得 るための記述方法など 実践的な記述方法についても併せてご説明します 本コースは SQL の応用的な記述テクニックとしてどのようなものがあるかを 1 日で広く浅くご理解いた だくことを目的としたコースです 細かな構文やオプションの習得は目的としておりませんことをご了承 ください 受講対象者 アプリケーション開発者 前提条件 弊社 Oracle 研修 SQL トレーニング コースを受講された方 もしくは同等の知識をお持ちで ある程度の 現場経験のある方を対象としています テキスト内の記述について 構文 [ ] 省略可能 { A B } A または B のどちらかを選択 n _ 数値の指定 デフォルト値 マーク 指定バージョンからの新機能 ( 左記の場合 Oracle 12cR1 からの新機能 ) 知っておいたほうが良いテクニック もしくは注意事項 参照ページ

第 1 章 条件分岐 この章では 条件に応じて処理を分岐する方法について説明します 1. CASE 式で複雑な条件分岐を実現 2. 関数を使用した条件分岐 3. MERGE 文による条件に応じた DML の実行

1. CASE 式で複雑な条件分岐を実現 CASE 式を使用すると条件に合わせて処理を分岐できます 条件分岐処理は DECODE などの関数でも可能ですが 関 数に比べてより複雑な分岐条件を設定できるなどの特徴があります (1) CASE 式の特徴 CASE 式には次のような特徴があります 1) コードの読みやすさ 一般的に DECODE などの分岐関数を使用した場合 分岐の数が増えると処理内容が読みづらくなってしまいます しかし CASE 式では分岐条件が増えても わかりやすいコード表現を維持できます 以下網掛けの部分は DEPTNO 列の値に応じて異なる値を戻す処理を DECODE 関数 CASE 式でそれぞれ実施した例です DECODE 関数を使用した場合 DECODE(deptno,10,'ACCOUNTING', 20,'RESEARCH', 30,'SALES', 'OPERATIONS') CASE 式を使用した場合 CASE deptno WHEN 10 THEN 'ACCOUNTING' WHEN 20 THEN 'RESEARCH' WHEN 30 THEN 'SALES' ELSE 'OPERATIONS' 上記例のように CASE 式は WHEN 句 THEN 句などのキーワードを指定するため 分岐条件やそれに対応する処理内容が明確であり 読みやすいコードになっていることがわかります 株式会社アシスト Copyright(C) K.K. Ashisuto All Rights Reserved. 1-1

2) 複雑な分岐条件を設定できる CASE 式では 分岐条件に演算子や副問合せを含めることができます そのため 分岐関数に比べて複雑な分岐条件を設定できます 以下は分岐条件に BETWEEN AND 演算子を使用し 範囲による分岐処理を行っている例です より複雑な分岐条件を設定 CASE WHEN sal BETWEEN 1 AND 2000 THEN ' 少ない ' WHEN sal BETWEEN 2001 AND 4000 THEN ' 普通 ' WHEN sal BETWEEN 4001 AND 6000 THEN ' 多い ' ELSE ' 不明 ' DECODE 関数の場合 上記のような範囲検索や非等価演算子を使用するなどの複雑な分岐条件は設定できません 3) 様々な箇所で使用できる CASE 式 であるため 他の句と組合わせ SQL の様々な箇所で条件分岐を行うことができます SUM 関数と CASE 式を組合わせ HAVING 句に指定 SELECT job FROM health_chk GROUP BY job HAVING COUNT(*) = SUM(CASE WHEN chk_date < '11-01-31' THEN 1 ELSE 0 ); Copyright(C) K.K. Ashisuto All Rights Reserved. 1-2 株式会社アシスト

(2) CASE 式の記述方法 CASE 式の基本構文と記述時の注意点を解説します 1) 基本構文 CASE 式の構文には 単純 CASE 式と検索 CASE 式の 2 つがあります 単純 CASE 式の分岐条件では等価評価しか行えませんが 検索 CASE 式は分岐条件で等価演算子以外の 演算子も使用できます また 単純 CASE 式は検索 CASE 式に書き換えできます そのため 本コース では検索 CASE 式を中心に解説します 単純 CASE 式単純 CASE 式の分岐条件では 選択子式と条件値を等価評価します CASE 句に選択子式として比較対象を指定し WHEN 句で等価評価する条件値をそれぞれ指定します THEN 句で各条件値に応じた処理内容を指定します また ELSE 句でその他に対する処理内容を記述します CASE 選択子式 WHEN 条件値 THEN 処理内容 [ WHEN 条件値 THEN 処理内容 ] [ ELSE 処理内容 ] 検索 CASE 式検索 CASE 式では WHEN 句で分岐条件を 1 つ 1 つ指定します この分岐条件は WHERE 句の条件と同じように指定できるため 等価演算子以外の演算子も使用できます その他の指定項目は単純 CASE 式と同様です CASE WHEN 条件 THEN 処理内容 [ WHEN 条件 THEN 処理内容 ] [ ELSE 処理内容 ] 株式会社アシスト Copyright(C) K.K. Ashisuto All Rights Reserved. 1-3

単純 CASE 式と検索 CASE 式の比較 /* 単純 CASE 式 */ CASE deptno WHEN 10 THEN 'ACCOUNTING' WHEN 20 THEN 'RESEARCH' WHEN 30 THEN 'SALES' ELSE 'OPERATIONS' CASE 句の後に比較対象である DEPTNO 列を指定 WHEN 句で DEPTNO 列が 10 20 30 その他における分岐処理をそれぞれ指定 /* 検索 CASE 式 */ CASE WHEN deptno = 10 THEN 'ACCOUNTING' WHEN deptno = 20 THEN 'RESEARCH' WHEN deptno = 30 THEN 'SALES' ELSE 'OPERATIONS' WHEN 句で分岐条件を 1 つずつ指定 上記例のように 分岐条件で等価評価を行う場合は 単純 CASE 式 検索 CASE 式のどちらでも記述でき ます 検索 CASE 式で分岐条件に等価演算子以外の演算子を使用 CASE WHEN deptno <= 10 THEN 'ACCOUNTING' WHEN deptno <= 20 THEN 'RESEARCH' WHEN deptno <= 30 THEN 'SALES' ELSE 'OPERATIONS' 分岐条件が等価評価以外の場合は検索 CASE 式を使用する 上記例のように 等価演算子以外で分岐条件を定義する場合は検索 CASE 式を使用します Copyright(C) K.K. Ashisuto All Rights Reserved. 1-4 株式会社アシスト

2) 注意事項 最後の 句の書き忘れに注意 /* 句を書き忘れた場合 */ SQL> SELECT CASE WHEN job = 'MANAGER' THEN sal*1.1 2 WHEN job = 'SALESMAN' THEN sal*1.2 3 ELSE NULL 4 FROM emp * 行 4 でエラーが発生しました : ORA-00905: キーワードがありません ELSE 句の記述を推奨 ELSE 句の記述は必須ではなく 省略した場合は ELSE NULL(NULL を戻す ) になります しかし 意図しない結果の表示を防止したり コードをわかりやすくしたりするために ELSE 句を記述しておくことをお薦めします ELSE 句なし CASE WHEN job = 'MANAGER' THEN sal*1.1 WHEN job = 'SALESMAN' THEN sal*1.2 JOB が MANAGER と SALESMAN に対する条件はあるが それ以外に対する明確な指定がない ELSE 句あり CASE WHEN job = 'MANAGER' THEN sal*1.1 WHEN job = 'SALESMAN' THEN sal*1.2 ELSE NULL ELSE 句により JOB が MANAGER と SALESMAN 以外に対して何もしなくて良いことが明確に表現されている 株式会社アシスト Copyright(C) K.K. Ashisuto All Rights Reserved. 1-5

THEN 句と ELSE 句で戻される値の型は 全てにおいて一致している必要あり SQL> 2 CASE WHEN deptno = 10 3 THEN 'ACCOUNTING' 4 WHEN deptno = 20 5 THEN 1 6 ELSE NULL 7 8 THEN 1 行 5 でエラーが発生しました : * 1 つ目の THEN 句で文字型 2 つ目の THEN 句で数字型が戻されるためエラー発生 ORA-00932: データ型が一致しません : CHAR が予想されましたが NUMBER です WHEN 句の記述順に注意分岐条件は記述した順番に評価され 該当の条件が見つかった時点で評価は打ち切られます そのため 上の行に記述されている条件が下の条件を含んでいる場合 意図した結果が返ってきません このことを意識して WHEN 句を記述します SQL> SELECT sal, 2 CASE WHEN sal >= 1000 THEN ' 少ない ' 3 WHEN sal >= 3000 THEN ' 普通 ' 4 ELSE ' 不明 ' 5 AS amount 6 FROM emp 7 ORDER BY sal DESC; SAL AMOUNT ---------- ---------- 5000 少ない 3000 少ない 3000 少ない 2975 少ない : : SAL 列が 3000 以上の場合 普通 と表示したいが 1 つ目の WHEN 句の条件 sal >= 1000 に合致したため 2 つ目の WHEN 句が評価されていない 上記例のように CASE 式での評価結果に対して別名を定義することをお勧めします ( の後に AS 別名 と指定 ) 定義しないと CASE 式の指定内容がそのまま列ヘッダになってしまいます Copyright(C) K.K. Ashisuto All Rights Reserved. 1-6 株式会社アシスト

(3) CASE 式の効果的な使用方法 CASE 式を使用すると 複数の SQL を 1 文で実施したり 複雑な条件分岐が行えます 本テキストでは 以下 3 つの使用例をご紹介しています 例 ページ 関数では行えない複雑な条件分岐を行う 1-8 複雑な CHECK 制約を設定する付 -2 更新する値を条件によって変更する付 -3 株式会社アシスト Copyright(C) K.K. Ashisuto All Rights Reserved. 1-7

1) 関数では行えない複雑な条件分岐を行う CASE 式の WHEN 句には 比較演算子 (< > BETWEEN LIKE IN EXISTS など ) を使用できます また 副問合せを含めることもできます そのため DECODE 関数などに比べて複雑な分岐条件を指定できます 例 )EMP 表の部門番号 30 の社員の給与と 社員 WARD の給与を比較し その結果を AMOUNT 列として表示 する 表示内容は WARD の給与より少なければ 少ない 同じであれば 同じ 多ければ 多 い とする EMP 表の部門番号 30 のデータ SQL> SELECT deptno,ename,sal 2 FROM emp 3 WHERE deptno = 30; DEPTNO ENAME SAL ---------- ---------- ---------- 30 ALLEN 1600 30 WARD 1250 30 MARTIN 1250 30 BLAKE 2850 30 TURNER 1500 30 JAMES 950 表示したい結果 DEPTNO ENAME SAL AMOUNT ------- ---------- ---------- ---------- 30 ALLEN 1600 多い 30 MARTIN 1250 同じ 30 BLAKE 2850 多い 30 TURNER 1500 多い 30 JAMES 950 少ない WARD の給与 1250 と 他の社員の給与をそれぞれ比較 比較した結果を 少ない 同じ 多い で表示する Copyright(C) K.K. Ashisuto All Rights Reserved. 1-8 株式会社アシスト

実行する SQL SELECT deptno,ename,sal, CASE WHEN sal < (SELECT sal FROM emp WHERE ename = 'WARD') THEN ' 少ない ' WHEN sal > (SELECT sal FROM emp WHERE ename = 'WARD') THEN ' 多い ' WHEN sal = (SELECT sal FROM emp WHERE ename = 'WARD') THEN ' 同じ ' ELSE ' その他 ' AS amount FROM emp WHERE deptno = 30 AND ename!= 'WARD'; 1 2 3 SELECT 句の選択リストの 4 つ目にて CASE 式による表示内容の分岐を行います WHEN 句の分岐条件で 各社員の給与と WARD の給与を比較する条件を指定します この WARD の給与 は 1 回では求められないため 副問合せを使用します (1) また 分岐処理の結果に応じて戻す値を THEN 句に指定します (2) また ELSE 句でその他の場合についての対応を指定します (3) 最後に 句を記述して CASE 式の指定は終了です 株式会社アシスト Copyright(C) K.K. Ashisuto All Rights Reserved. 1-9