Oracle UPDATE文での副問い合わせを実行する方法|UPDATE文で副問合せを実行する構文・具体例

Oracle UPDATE文での副問い合わせを実行する方法|UPDATE文で副問合せを実行する構文・具体例

Oracleエンジニア 案件・求人一覧はこちら

Oracle UPDATE文での副問い合わせを実行する方法


副問合せとはあるテーブルに対して検索や更新をしたいときに、他のテーブルの値を使用したい場合に使います。ここではOracleで副問合せを使用したUPDATE文について紹介します。

まず構文を記載し、次に具体例を挙げて、最後に各構文内の細かい解説を記載しています。すでにSQLの基礎知識がある方は構文と具体例だけ眺めてもらえればよいでしょう。

詳細な説明ではUPDATE文の基本的な構文から丁寧に説明していますので、Oracle SQLについて勉強している方はぜひ最後の説明まで読んで勉強して下さい。

また、このページではOracle SQLについて解説していますが、基本的なSQLの構文はMySQLなど、ほかのSQL文と大差ありませんので、Oralce SQL以外のSQLを勉強中の方でも参考にできます。

それでは構文の紹介から始めていきます。

UPDATE文で副問合せを実行する構文

ここからはOracleのUPDATE文で副問合せを行うための構文を紹介します。

1:別のテーブルを条件に項目を更新する。

上記はテーブル1のカラム1とテーブル2のカラム1が等しいレコードに対して、テーブル2のカラム2を更新するOracle SQLです。

詳しい説明については、下で説明していますのでわからないことがあれば「詳細な説明」を参照してください。

2:別テーブルの値を使って項目を更新する。

上記はテーブル1のカラム1とテーブル2のカラム1が等しいレコードに対して、テーブル1のカラム1にテーブル2のカラム1の値を代入するOracle SQLです。

続いて具体例を挙げて説明していきます。

副問合せの具体例

ここでは具体例を挙げて説明していきます。今回は分かりやすいように学校の学生名簿やテストの点数を例としてテーブルを作成しました。

作成するテーブルと項目名は次の通りです。

学生名簿: 学籍番号、クラス、氏名
テスト: 対象試験、科目、学籍番号、点数
テスト結果一覧: 学籍番号、氏名、国語、数学、英語、理科、社会

各テーブルのデータについては次の通りです。

学生名簿

|学籍番号 | クラス | 氏名 |
|———–|——–|——————|
| 210001 | 1-1 | 田中 太郎 |
| 210002 | 1-1 | 大滝 太子 |
| 210003 | 1-1 | 榎本 光洋 |
| 210004 | 1-1 | 杉本 たまき |
| 210005 | 1-1 | 中保 渚 |
| 210006 | 1-1 | 諸味 みき |
| 210007 | 1-2 | 鈴木 和則 |
| 210008 | 1-2 | 三浦 惟子 |
| 210009 | 1-2 | 山下 さおり |
| ・・・ | ・・・| ・・・ |
|———–|——–|——————|

テスト

| 対象試験| 科目 | 学籍番号 | 点数 |
|————–|——|————|——|
|2021-1-中間 | 国語 | 210001 | 80 |
|2021-1-中間 | 国語 | 210002 | 60 |
|2021-1-中間 | 国語 | 210003 | 75 |
|2021-1-中間 | 国語 | 210004 | 85 |
|2021-1-中間 | 国語 | 210005 | 90 |
|2021-1-中間 | 国語 | 210006 | 70 |
|2021-1-中間 | 国語 | 210007 | 60 |
|2021-1-中間 | 国語 | 210008 | 65 |
|2021-1-中間 | 国語 | 210009 | 90 |
|2021-1-中間 | 数学 | 210001 | 60 |
|2021-1-中間 | 数学 | 210002 | 70 |
|2021-1-中間 | 数学 | 210003 | 70 |
| ・・・ |・・・| ・・・ |・・ |
|————–|——|————|——|

テスト結果一覧

| 学籍番号 | 氏名 | 国語 | 数学 | 英語 | 理科 | 社会 |
|———–|——————|——|——|——|——|——|
| 210001 | 田中 太郎 | 80 | 60 | 70 | 50 | 75 |
| 210002 | 大滝 太子 | 60 | 70 | 60 | 75 | 75 |
| 210003 | 榎本 光洋 | 75 | 70 | 70 | 75 | 70 |
| ・・・ | ・・・ |・・ |・・ |・・ |・・ |・・ |
| 210007 | 鈴木 和則 | 60 | 80 | 60 | 85 | 60 |
| 210008 | 三浦 惟子 | 65 | 85 | 60 | 80 | 55 |
| 210009 | 山下 さおり | 90 | 90 | 90 | 90 | 90 |
| ・・・ | ・・・ |・・ |・・ |・・ |・・ |・・ |
|———–|——————|——|——|——|——|——|

例1 採点結果に誤りがあり、1-1クラスにだけ国語のテストの点数に10点加算する場合。

実行結果は以下の通りになるはずです。1-1クラスの方が一律10点加算されています。

テスト

| 対象試験| 科目 | 学籍番号 | 点数 |
|————–|——|————|——|
|2021-1-中間 | 国語 | 210001 | 90 |
|2021-1-中間 | 国語 | 210002 | 70 |
|2021-1-中間 | 国語 | 210003 | 85 |
|2021-1-中間 | 国語 | 210004 | 95 |
|2021-1-中間 | 国語 | 210005 | 100 |
|2021-1-中間 | 国語 | 210006 | 80 |
|2021-1-中間 | 国語 | 210007 | 60 |
|2021-1-中間 | 国語 | 210008 | 65 |
|2021-1-中間 | 国語 | 210009 | 90 |
|2021-1-中間 | 数学 | 210001 | 60 |
|2021-1-中間 | 数学 | 210002 | 70 |
|2021-1-中間 | 数学 | 210003 | 70 |
| ・・・ |・・・| ・・・ |・・ |
|————–|——|————|——|

例2 例1でテストの点数を修正したので、テスト結果一覧も更新します。

結果は以下の通りです。1-1クラスの国語の点数が10点ずつ加算されています。

テスト結果一覧

| 学籍番号 | 氏名 | 国語 | 数学 | 英語 | 理科 | 社会 |
|———–|——————|——|——|——|——|——|
| 210001 | 田中 太郎 | 90 | 60 | 70 | 50 | 75 |
| 210002 | 大滝 太子 | 70 | 70 | 60 | 75 | 75 |
| 210003 | 榎本 光洋 | 85 | 70 | 70 | 75 | 70 |
| ・・・ | ・・・ |・・ |・・ |・・ |・・ |・・ |
| 210007 | 鈴木 和則 | 60 | 80 | 60 | 85 | 60 |
| 210008 | 三浦 惟子 | 65 | 85 | 60 | 80 | 55 |
| 210009 | 山下 さおり | 90 | 90 | 90 | 90 | 90 |
| ・・・ | ・・・ |・・ |・・ |・・ |・・ |・・ |
|———–|——————|——|——|——|——|——|

いかがでしたでしょうか。

Oracleの副問合せのUPDATE文について、理解が深まりましたでしょうか。同じテーブルを作成する必要はありませんので、環境がすでにあれば自分の環境で試してみましょう。

もしよくわからないことがあれば、以降で詳しく解説していますのでぜひ参考にしてください。

UPDATE文についての詳細な説明

ここからは基本的なUPDATEの構文や構文中に出てきたワードの説明、副問合せを解説していきます。

すでに知っている内容のものは読み飛ばしていただいて結構です。時間の節約のためにも必要な内容だけピックアップして参考にしてください。

UPDATE文の基本的な構文について

Oracle SQLのUPDATE文について基本的な構文を解説していきます。次の構文はWHERE句の条件式に合致するレコードについて、指定したカラムを更新します。

UPDATE テーブル名 SET 更新するカラム名 = 更新する値
WHERE 条件式

続いて、複数の項目を一度に更新する構文を紹介します。カラムと更新後の値をかっこで囲んで、カンマ(,)区切りで対応する値を入れていきます。

以上がシンプルなUPDATEの構文になります。

この構文に副問合せのSELECT分を追加したり、条件をさらに追加することで要望に応じて項目を更新できます。

WHERE句については、書かなくてもUPDATE文は実行できてしまいます。

ただし、WHERE句がない場合はテーブル内のすべてのデータに対して対象項目が更新されることになります。基本的には全データを更新することはないでしょうから、必ずWHERE句をつける癖をつけておきましょう。

上記の例であれば、「1-1クラスだけ」という条件を付けていました。ほかにも、例えば点数が20点以下の人には救済措置として点数を一律30点にする、といったことも可能です。

EXISTS句について

EXISTSはかっこ内のSELECT文を実行して値が存在したら(1件以上あったら)という条件になります。

例えば、上記の学生名簿テーブルで国語の点数が80点以上の生徒を抽出させたい場合は以下のようなSQL文になります。

自分でUPDATE文の副問合せを実行してみよう

Oracle SQLのUPDATE文の副問合せについて解説してきました。

いかがでしたでしょうか。実際に読んだだけでも理解できたと思いますが、実際に自分の手で書いてみるとさらに理解が深まるので、読んで満足するのではなく実際に書いて実行してみましょう。

実際に副問合せが書けるようになると、SQLで実行できる幅が大きく広がります。

Oracleエンジニア 案件・求人一覧はこちら

インフラエンジニア専門の転職サイト「FEnetインフラ」

FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。

転職をお考えの方は気軽にご登録・ご相談ください。

合わせて読みたい

Oracle DBとは?概要や特徴・MySQLやPostgreSQLとの比較・基本的な使い方... hbspt.cta.load(20723875, 'e848ebee-6da0-461e-a268-2b5dc067cad8', {"useNewLoader":"true","region":"na1"}); Oracle DBとは? Oracle DB(オラクルデータベース)とは、米...
OracleデータベースでのSQL入門!テーブル作成方法とは?... hbspt.cta.load(20723875, 'e848ebee-6da0-461e-a268-2b5dc067cad8', {"useNewLoader":"true","region":"na1"}); OracleデータベースでのSQL入門 この記事ではOracleデー...
Oracle APEXとは?導入するメリット6つと活用例をわかりやすく紹介... hbspt.cta.load(20723875, 'e848ebee-6da0-461e-a268-2b5dc067cad8', {"useNewLoader":"true","region":"na1"}); Oracle APEXとは Oracle APEX(Oracle Appli...
OracleDatabaseとは?無料で導入する方法から、表領域の作成やユーザの作成方法を紹介... hbspt.cta.load(20723875, 'e848ebee-6da0-461e-a268-2b5dc067cad8', {"useNewLoader":"true","region":"na1"}); Oracle Database入門 今回は、Oracle Datab...
Oracle SQL Developerのメリット7つ|概要についても解説... hbspt.cta.load(20723875, 'e848ebee-6da0-461e-a268-2b5dc067cad8', {"useNewLoader":"true","region":"na1"}); Oracle SQL Developerとは何か Oracle SQL ...