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

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 条件式
続いて、複数の項目を一度に更新する構文を紹介します。カラムと更新後の値をかっこで囲んで、カンマ(,)区切りで対応する値を入れていきます。
この構文に副問合せのSELECT分を追加したり、条件をさらに追加することで要望に応じて項目を更新できます。
WHERE句については、書かなくてもUPDATE文は実行できてしまいます。
ただし、WHERE句がない場合はテーブル内のすべてのデータに対して対象項目が更新されることになります。基本的には全データを更新することはないでしょうから、必ずWHERE句をつける癖をつけておきましょう。
上記の例であれば、「1-1クラスだけ」という条件を付けていました。ほかにも、例えば点数が20点以下の人には救済措置として点数を一律30点にする、といったことも可能です。
EXISTS句について
EXISTSはかっこ内のSELECT文を実行して値が存在したら(1件以上あったら)という条件になります。
例えば、上記の学生名簿テーブルで国語の点数が80点以上の生徒を抽出させたい場合は以下のようなSQL文になります。
自分でUPDATE文の副問合せを実行してみよう
Oracle SQLのUPDATE文の副問合せについて解説してきました。
いかがでしたでしょうか。実際に読んだだけでも理解できたと思いますが、実際に自分の手で書いてみるとさらに理解が深まるので、読んで満足するのではなく実際に書いて実行してみましょう。
実際に副問合せが書けるようになると、SQLで実行できる幅が大きく広がります。
FEnetを運営しているネプラス株式会社はサービス開始から10年以上
『エンジニアの生涯価値の向上』をミッションに掲げ、
多くのインフラエンジニア・ネットワークエンジニアの就業を支援してきました。
ネプラス株式会社はこんな会社です
秋葉原オフィスにはネプラス株式会社をはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
インフラ業界に特化
ネットワーク・サーバー・データベース等、ITインフラ業界に特化。Cisco Systemsプレミアパートナーをはじめ各種ベンダーのパートナー企業です。
業界を知り尽くしているからこそ大手の取引先企業、経験豊富なエンジニアに選ばれています。
-
正社員なのにフリーランスのような働き方
正社員の方でも希望を聞いたうえでプロジェクトをアサインさせていただいており、フリーランスのような働き方が可能。帰社日もありません。
プロジェクト終了後もすぐに次の案件をご紹介させていただきますのでご安心ください。
-
大手直取引の高額案件
案件のほとんどが大手SIerやエンドユーザーからの直取引のためエンジニアの皆様へに高く還元できています。
Ciscoをはじめ、Juniper、Azure、Linux、AWS等インフラに特化した常時300件以上の案件があります。
-
スキルアップ支援
不要なコストを削減し、その分エンジニアの方へのスキルアップ支援(ネットワーク機器貸出、合格時の受験費用支給など)や給与で還元しています。
受験費用例)CCNP,CCIE:6-20万円、JNCIS:3-4万円、AWS:1-3万円など
※業務に関連する一定の資格のみ。各種条件がありますので詳しくは担当者へにお尋ねください。
-
現給与を保証します!※
前職の給与保証しており、昨年度は100%の方が給与アップを実現。収入面の不安がある方でも安心して入社していただけます。
※適用にはインフラエンジニアの業務経験1年以上、等一定の条件がございます。
-
インセンティブ制度
ネットワーク機器の販売・レンタル事業等、売上に貢献いただいた方にはインセンティブをお支払いしています。
取引先企業とエンジニア側、双方にメリットがあり大変好評をいただいています。
-
社会保険・福利厚生
社員の方は、社会保険を完備。健康保険は業界内で最も評価の高い「関東ITソフトウェア健康保険組合」です。
さらに様々なサービスをお得に利用できるベネフィットステーションにも加入いただきます。
-
東証プライム上場企業グループ
ネプラスは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
ネプラス株式会社に興味を持った方へ
ネプラス株式会社では、インフラエンジニアを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Oracle新着案件New Job
-
【高額年収】/基盤運用保守/東京都千代田区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅勤務
年収600万~720万円東京都千代田区(溜池山王駅) -
【高額年収】/国内クラウドシステムのサーバ運用保守/東京都新宿区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅勤務
年収600万~720万円東京都新宿区(東新宿駅) -
国内クラウドシステムのサーバ構築のテスター/東京都新宿区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅勤務
年収300万~420万円東京都新宿区(東新宿駅) -
【高額年収】/カスタマイズサービスの運用保守/東京都23区西部/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅勤務
年収600万~720万円東京都23区西部(-駅) -
カスタマイズサービス設計構築のテスター/東京都23区西部/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅勤務
年収300万~420万円東京都23区西部(-駅) -
【高額年収】/インフラ運用保守/Oracle/神奈川県横浜地域/【WEB面談可】/在宅勤務/20代~40代の方活躍中
年収600万~720万円神奈川県横浜地域(-駅)