前コラムでも予告したとおり10月23日にMySQL 4.1.7がリリースされ,MySQl 4.1はProductionとなった。MySQL 4.1シリーズの最初のバージョン(2003/4/3に4.1.0をリリース)から1年半を費やし,名実ともに製品となったのだ。今回も前月に引き続きMySQL 4.1に関して解説する。

MySQL 4.1の新機能

 前回は,MySQL 4.1の新機能プリペアド・クエリにフォーカスした。今回は,正式リースとなったので,新機能の全般に関して触れておく。

サブクエリ(副問合わせ)のサポート

 サブクエリのサポートは,MySQL 4.1の最も注目される機能である。ユーザーの悲願とも言える機能である。

 MySQL 4.0シリーズでは,サブクエリがサポートされていなかったので,TEMPORARYタイプのテーブルで代替したユーザーも多いだろう。サブクエリのサポートによって,その必要もなくなった。

 サブクエリは,複数のSQLステートメントが連携するもので,SQLステートメントの処理結果を基に別のSQLステートメントを実行可能するものだ。実際にサブクエリの動作を確認しよう。

 テーブル「Country」に国データの一覧が格納されている。また,テーブル「City」には,都市データの一覧が格納されている。テーブル「Country」の検索結果を基にテーブル「City」を検索する処理をサブクエリで実行する。

 リスト1は,テーブル「Country」のフィールド「Name」が「Israel」であるレコードを検索した結果だ。

リスト1●テーブル「Country」の検索結果(確認のため)

mysql> SELECT Code,Name FROM Country WHERE Name = 'Israel';
+------+--------+
| Code | Name   |
+------+--------+
| ISR  | Israel |
+------+--------+
1 row in set (0.00 sec)

 「Id」フィールドの値を使って,テーブル「City」を検索する。リスト2は,SQLステートメントに「Id」フィールドの値を直接記述して検索している。

リスト2●テーブル「City」の検索結果(確認のため)

mysql> SELECT * FROM City WHERE Country='ISR';
+------+------------------+---------+-----------+------------+
| Id   | Name             | Country | District  | Population |
+------+------------------+---------+-----------+------------+
| 1450 | Jerusalem        | ISR     | Jerusalem |     633700 |
| 1451 | Tel Aviv-Jaffa   | ISR     | Tel Aviv  |     348100 |
| 1452 | Haifa            | ISR     | Haifa     |     265700 |
| 1453 | Rishon Le Ziyyon | ISR     | Ha Merkaz |     188200 |
| 1454 | Beerseba         | ISR     | Ha Darom  |     163700 |
| 1455 | Holon            | ISR     | Tel Aviv  |     163100 |
| 1456 | Petah Tiqwa      | ISR     | Ha Merkaz |     159400 |
| 1457 | Ashdod           | ISR     | Ha Darom  |     155800 |
| 1458 | Netanya          | ISR     | Ha Merkaz |     154900 |
| 1459 | Bat Yam          | ISR     | Tel Aviv  |     137000 |
| 1460 | Bene Beraq       | ISR     | Tel Aviv  |     133900 |
| 1461 | Ramat Gan        | ISR     | Tel Aviv  |     126900 |
| 1462 | Ashqelon         | ISR     | Ha Darom  |      92300 |
| 1463 | Rehovot          | ISR     | Ha Merkaz |      90300 |
+------+------------------+---------+-----------+------------+
14 rows in set (0.01 sec)

 コード1とコード2の内容をサブクエリにより1つのSQLステートメントで実行すると,リスト3のようになる。

リスト3●サブクエリによる一括検索

mysql> SELECT * FROM City WHERE Country = (SELECT Code FROM Country WHERE Name = 'Israel');
+------+------------------+---------+-----------+------------+
| Id   | Name             | Country | District  | Population |
+------+------------------+---------+-----------+------------+
| 1450 | Jerusalem        | ISR     | Jerusalem |     633700 |
| 1451 | Tel Aviv-Jaffa   | ISR     | Tel Aviv  |     348100 |
| 1452 | Haifa            | ISR     | Haifa     |     265700 |
| 1453 | Rishon Le Ziyyon | ISR     | Ha Merkaz |     188200 |
| 1454 | Beerseba         | ISR     | Ha Darom  |     163700 |
| 1455 | Holon            | ISR     | Tel Aviv  |     163100 |
| 1456 | Petah Tiqwa      | ISR     | Ha Merkaz |     159400 |
| 1457 | Ashdod           | ISR     | Ha Darom  |     155800 |
| 1458 | Netanya          | ISR     | Ha Merkaz |     154900 |
| 1459 | Bat Yam          | ISR     | Tel Aviv  |     137000 |
| 1460 | Bene Beraq       | ISR     | Tel Aviv  |     133900 |
| 1461 | Ramat Gan        | ISR     | Tel Aviv  |     126900 |
| 1462 | Ashqelon         | ISR     | Ha Darom  |      92300 |
| 1463 | Rehovot          | ISR     | Ha Merkaz |      90300 |
+------+------------------+---------+-----------+------------+
14 rows in set (0.01 sec)

 このようにサブクエリによって,検索結果が連携するような処理が簡単に行えるようになった。