MySQLのFROM句でサブクエリ(派生テーブル)を使う方法をわかりやすく解説
MySQLでは、SELECT文のFROM句の中にサブクエリ(副問い合わせ)を記述できます。このようなサブクエリは「派生テーブル(Derived Table)」とも呼ばれ、サブクエリの実行結果をあたかも一時的なテーブルであるかのように扱い、その上からさらに条件を指定してデータを取得できる強力な手法です。
基本構文
SELECT ... FROM(サブクエリ) [AS] 別名 ...;
FROM句内のサブクエリには必ず別名(エイリアス)を付ける必要があります。別名がないとエラーになるため、「AS」は省略可能ですが、名前自体は必須です。
サンプルデータの確認
動作を理解するために、次のテーブル「cars」のデータを使用します。
mysql> Select * from Cars; +------+--------------+---------+ | ID | Name | Price | +------+--------------+---------+ | 1 | Nexa | 750000 | | 2 | Maruti Swift | 450000 | | 3 | BMW | 4450000 | | 4 | VOLVO | 2250000 | | 5 | Alto | 250000 | | 6 | Skoda | 1250000 | | 7 | Toyota | 2400000 | | 8 | Ford | 1100000 | +------+--------------+---------+ 8 rows in set (0.02 sec)
FROM句でサブクエリを使ったクエリ例
それでは実際に、FROM句内でサブクエリを使用したクエリを見てみましょう。サブクエリ側で列名を「Id_New」「Name_New」「Price_New」に変更し、その結果セットに対して外側のクエリで価格が50万より大きいレコードだけを絞り込んでいます。
mysql> Select Id_New, Name_New, Price_New FROM (SELECT Id as Id_New, Name as Name_New, Price as Price_New FROM Cars) as c Where Price_New > 500000; +--------+----------+-----------+ | Id_New | Name_New | Price_New | +--------+----------+-----------+ | 1 | Nexa | 750000 | | 3 | BMW | 4450000 | | 4 | VOLVO | 2250000 | | 6 | Skoda | 1250000 | | 7 | Toyota | 2400000 | | 8 | Ford | 1100000 | +--------+----------+-----------+ 6 rows in set (0.00 sec)
ポイントまとめ
- サブクエリの結果は、外側のクエリから見ると通常のテーブルと同じように扱えます。
- サブクエリ内で
ASを使って列名やテーブル名に別名を付けると、可読性が向上し、後続の処理で参照しやすくなります。 - 複雑な集計や結合を行った中間結果に対して、さらにフィルタリングやソートを行いたい場合に特に有効です。
-
MySQLビュー(VIEW)にWHERE句を使う方法をわかりやすく解説
MySQLビューでWHERE句を使用する方法MySQLでは、作成済みのビュー(VIEW)に対して、通常のテーブルと同じようにWHERE句を指定してデータを絞り込むことができます。基本となる構文は以下の通りです。select * from yourViewName where yourColumnName=yourValue;それでは、実際にサンプルを使って手順を確認していきましょう。1. サンプルテーブルを作成するまず、学生情報を格納するテーブルを作成します。mysql> create table DemoTable1432 -> ( -> StudentId
-
MySQLストアドプロシージャでSELECT INTOを使ってテーブルからOUTパラメータにデータを読み込む方法
MySQLのストアドプロシージャでテーブルからデータを読み取り、OUTパラメータに格納するには、SELECT INTO構文を使用します。この記事では、テーブルの作成からストアドプロシージャの呼び出しまで、具体的な手順をサンプルコードとともに解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table DemoTable1860 ( Amount int ); Query OK, 0 rows affected (0.00 sec) 2. レコードの挿入 INSERTコマンドを使用して、テーブルにい