社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

MySQL from 節いろいろ

サブクエリから生成されるテーブル
以下のような使い方は全く意味を成さない。直接NameとPopulationをcityテーブルから取得すればいい。

mysql> select t.Name, t.Population from (select ID, Name, CountryCode, District, Population from city) t limit 10;
+----------------+------------+
| Name           | Population |
+----------------+------------+
| Kabul          |    1780000 |
| Qandahar       |     237500 |
| Herat          |     186800 |
| Mazar-e-Sharif |     127800 |
| Amsterdam      |     731200 |
| Rotterdam      |     593321 |
| Haag           |     440900 |
| Utrecht        |     234323 |
| Eindhoven      |     201843 |
| Tilburg        |     193238 |
+----------------+------------+
10 rows in set (0.00 sec)

ビュー
ビューを作って

mysql> create view city_view as select Name, Population from city;
Query OK, 0 rows affected (0.01 sec)

ビューに対してクエリを発行し、データにアクセスする

mysql> select Name from city_view limit 10;
+----------------+
| Name           |
+----------------+
| Kabul          |
| Qandahar       |
| Herat          |
| Mazar-e-Sharif |
| Amsterdam      |
| Rotterdam      |
| Haag           |
| Utrecht        |
| Eindhoven      |
| Tilburg        |
+----------------+
10 rows in set (0.00 sec)

ビューが作成されたあと、追加のデータが作成されることはない。
ビューを作成する目的は、ユーザーから不要な列を隠したい、複雑なデータベースの状態を単純にしたいなど。

テーブルリンク
2つ以上のテーブルを何らかの共通のキーを元に結合して出力する。非常によく使われる。

mysql> select city.Name as CityName, country.Name as CountryName, country.Code from city INNER JOIN country ON city.CountryCode = country.Code limit
10;
+----------------+-------------+------+
| CityName       | CountryName | Code |
+----------------+-------------+------+
| Kabul          | Afghanistan | AFG  |
| Qandahar       | Afghanistan | AFG  |
| Herat          | Afghanistan | AFG  |
| Mazar-e-Sharif | Afghanistan | AFG  |
| Amsterdam      | Netherlands | NLD  |
| Rotterdam      | Netherlands | NLD  |
| Haag           | Netherlands | NLD  |
| Utrecht        | Netherlands | NLD  |
| Eindhoven      | Netherlands | NLD  |
| Tilburg        | Netherlands | NLD  |
+----------------+-------------+------+
10 rows in set (0.00 sec)

テーブルエイリアスを定義した場合

mysql> select c.Name as CityName, o.Name as CountryName, o.Code from city c INNER JOIN country o ON c.CountryCode = o.Code limit 10;
+----------------+-------------+------+
| CityName       | CountryName | Code |
+----------------+-------------+------+
| Kabul          | Afghanistan | AFG  |
| Qandahar       | Afghanistan | AFG  |
| Herat          | Afghanistan | AFG  |
| Mazar-e-Sharif | Afghanistan | AFG  |
| Amsterdam      | Netherlands | NLD  |
| Rotterdam      | Netherlands | NLD  |
| Haag           | Netherlands | NLD  |
| Utrecht        | Netherlands | NLD  |
| Eindhoven      | Netherlands | NLD  |
| Tilburg        | Netherlands | NLD  |
+----------------+-------------+------+
10 rows in set (0.00 sec)