前コラムでも予告したとおり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)
このようにサブクエリによって,検索結果が連携するような処理が簡単に行えるようになった。