以下のサブクエリーは異なったクエリーを実行しているが、結果は同じになります。
※ ともにそれぞれの大陸で1番大きい国を選んでます
例1)
以下の例は、同じテーブルを利用している訳ではなく
外部、サブクエリーの依存関係はありません。
サブクエリーだけでも成り立ちます。
しかしサブクエリーは独立していて、且つ複数の結果を
返すため ”=”だけでは成り立たない為、”= ANY”
を付けて複数のサブクエリーが返す結果に対応しています。
select Continent,Name,SurfaceArea from Country
where surfaceArea = ANY
(select max(SurfaceArea)
from Country group by Continent);
サブクエリーだけでも成り立ちます。しかし複数列を返すのでANYを利用しています。
mysql> select max(SurfaceArea) from Country group by Continent;
+——————+
| max(SurfaceArea) |
+——————+
| 9572900.00 |
| 17075400.00 |
| 9970610.00 |
| 2505813.00 |
| 7741220.00 |
| 13120000.00 |
| 8547403.00 |
+——————+
7 rows in set (0.00 sec)
mysql>
ANYを利用しないと以下のようエラーになります。
mysql> select Continent,Name,SurfaceArea from Country
-> where surfaceArea =
-> (select max(SurfaceArea)
-> from Country group by Continent);
ERROR 1242 (21000): Subquery returns more than 1 row
mysql>
————————————————————————————————————
例2)
自己結合を用いている。
サブクエリーだけでは成り立たず、外部のQueryと結合して初めて答えが出る。
SELECT C.Continent, C.Name, C.SurfaceArea
FROM Country C
WHERE SurfaceArea =(
SELECT MAX(SurfaceArea)
FROM Country C2
WHERE C2.Continent = C.Continent);
サブクエリーだけだと以下のようにエラーになります。
mysql> SELECT MAX(SurfaceArea)
-> FROM Country C2
-> WHERE C2.Continent = C.Continent;
ERROR 1054 (42S22): Unknown column 'C.Continent' in 'where clause'
mysql>
※ ともにそれぞれのCityテーブルから、町田を抽出しています。
SELECT Name,Population,District FROM City
WHERE (Name, District, CountryCode) = ('Machida', 'Tokyo-to', 'JPN');
SELECT Name,Population,District FROM City
WHERE CountryCode = 'JPN' and District ='Tokyo-to' and Name ='Machida';
実行プランはどちらも同じです。