MySQL でサブクエリを利用して他のテーブルのデータを元に処理をする
サブクエリを使うことによって、テーブル1の検索結果を元に、テーブル2に何らかの処理を行なう、というようなことが可能です。
例えば以下のように架空のショッピングサイトの、ユーザーのIDとアドレスを格納した「UserList」と、注文毎のIDと商品名と購入者のユーザーIDを格納した「OrderList」という二種類のテーブルがある場合。
UserID | MailAddress |
---|---|
1 | yukimidaifuku_daisuki@abe-tatsuya.com |
2 | nattou_kirai@abe-tatsuya.com |
3 | syabusyabu_tabetai@abe-tatsuya.com |
OrderID | OrderItem | OrderUserID |
---|---|---|
1 | しゃぶしゃぶ用鍋 | 3 |
2 | しゃぶしゃぶ用松坂牛 | 3 |
3 | 雪見だいふく とろける生キャラメル味 20個セット | 1 |
4 | 雪見だいふく W生チョコレート味 20個セット | 1 |
5 | 納豆撲滅装置 | 2 |
この場合、例えば「yukimidaifuku_daisuki@abe-tatsuya.com」というメールアドレスのユーザーが注文した商品をリストアップしたい、というときには、
- まず、テーブル「UserList」を検索して「yukimidaifuku_daisuki@abe-tatsuya.com」というアドレスのユーザーのIDを取得
- 取得したユーザーの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文では可能)。