技術資料

MySQLのサブクエリ活用法:テーブル間でデータを参照・更新する方法

作成日:2010.12.09

MySQLでサブクエリを使って、異なるテーブル間のデータを簡単に参照・更新する方法を解説します。サブクエリを活用すれば、複雑なデータ取得や条件に基づく更新を効率的に行うことができます。

error この記事は最終更新日から15年以上が経過しています。

サブクエリを使うことによって、テーブル1の検索結果を元に、テーブル2に何らかの処理を行なう、というようなことが可能です。

例えば以下のように架空のショッピングサイトの、ユーザーのIDとアドレスを格納した「UserList」と、注文毎のIDと商品名と購入者のユーザーIDを格納した「OrderList」という二種類のテーブルがある場合。

UserList
UserID MailAddress
1 yukimidaifuku_daisuki@abe-tatsuya.com
2 nattou_kirai@abe-tatsuya.com
3 syabusyabu_tabetai@abe-tatsuya.com
OrderList
OrderID OrderItem OrderUserID
1 しゃぶしゃぶ用鍋 3
2 しゃぶしゃぶ用松坂牛 3
3 雪見だいふく とろける生キャラメル味 20個セット 1
4 雪見だいふく W生チョコレート味 20個セット 1
5 納豆撲滅装置 2

この場合、例えば「yukimidaifuku_daisuki@abe-tatsuya.com」というメールアドレスのユーザーが注文した商品をリストアップしたい、というときには、

  1. まず、テーブル「UserList」を検索して「yukimidaifuku_daisuki@abe-tatsuya.com」というアドレスのユーザーのIDを取得
  2. 取得したユーザーのIDを元に「OrderList」を検索して、注文した商品リストを取得

という手順になるわけですが、この処理をサブクエリを使うことによって、以下のようにできます。

select OrderList.OrderItem
from OrderList
where OrderList.OrderUserID = (select UserList.UserID
                               from UserList
                               where UserList.MailAddress = 'yukimidaifuku_daisuki@abe-tatsuya.com');

こんな感じで、where句の中に括弧でくくった別の select文を書くことで、サブクエリとして実行できます。

update文やdelete文でも、同様にwhere句の中にサブクエリを使うことができます。

他にも、

update TABLE1
set TABLE1.col1 = (select TABLE2.col2 from TABLE2 where TABLE2.col3 = 'hoge')
where TABLE1.col4 = 'huga';

こんな感じの使い方もできます。
update文で更新する値そのものを、別のテーブルから引っ張ってくる、というわけですね。

なおMySQLでは、update や delete でサブクエリを使う場合は「テーブル1の何らかの検索結果を元に、同じテーブル1に対して処理を実行する」ということができないようです(select文では可能)。

この記事を書いた人

※上が私です。

奈良市を拠点に、27年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。

これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。

【制作会社・企業様向けサポート】
  • 専任エンジニアのいない企業様に対するシステム面の不安を解消
  • 柔軟な契約形態や短納期での対応により、急なニーズにも迅速にサポート
  • システムの企画段階から運用まで、ワンストップでのサービスを提供

Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。

ぜひ、プロフィールやWeb制作会社様向け業務案内、一般企業様向け業務案内もご覧くださいね。

MySQLのDATE_FORMATとTIME_TO_SEC:日時の表示と時間の数値化

2026.10.13

MySQLのDATE_FORMATで日時の表示を整える方法と、TIME_TO_SECで時間を秒数へ変換する方法を解説します。入力と結果を比較しながら、月と分の書式指定、NULL、負の時間、24時間を超える時間の扱いも紹介します。

MySQL

MySQLのCASE式入門:条件に応じてSELECTの出力を切り替える

2026.10.12

MySQLのCASE式を使い、条件に応じてSELECTの出力値を切り替える方法を解説します。状態コードを表示名に変換する例を通して、基本構文、ELSEとNULLの扱い、条件が重なる場合のWHENの順序を紹介します。

MySQL

MySQLで文字列を整形・抽出する:TRIM・SUBSTRING_INDEX・REGEXP_SUBSTRの使い方

2026.10.11

MySQLで取得する文字列から不要な空白を除いたり、区切り文字や正規表現を使って必要な部分を取り出したりする方法を紹介します。TRIM・SUBSTRING_INDEX・REGEXP_SUBSTRの基本構文と使い分けを、具体的なSQL例で解説。NULLや空文字、想定した形式に合わない値を扱う際の注意点も整理します。

MySQL

phpMyAdminユーザー向けMySQL Workbench入門:テーブル確認からSQL実行まで

2026.10.10

phpMyAdminに慣れた人向けに、MySQL Workbenchの基本操作を解説します。両ツールの動作場所と接続経路の違いから、接続設定、テーブル・カラムの構造確認、SQLの実行、結果とエラーの見方までを紹介。SELECTを試す前にEXPLAINで実行計画を確認する手順も扱います。

MySQL MySQL Workbench phpMyAdmin

阿部辰也へのお仕事の依頼・お問い合わせ

軽いご相談もお気軽にどうぞ!

個人情報の取り扱いについて *必須 プライバシーポリシーをご確認いただき、同意いただける場合は「同意する」にチェックをしてください。

© 2005 - 2026 Tatsuya Abe. All Rights Reserved.