MySQL の初期バージョンでは(MySQL
4.1以前)、INSERT ... SELECT ...
と
REPLACE ... SELECT ...
の形のネスト化されたクエリだけがサポートされていました。MySQL
5.1
ではそうでないとしても、値のセットの中でメンバーシップをテストする別の方法があるという事も事実です。また、場合によっては、クエリをサブクエリ無しで再書き込みする事だけでなく、先ほどの別のテクニックを利用した方がより効果的であるというのも事実です。その1つが
IN()
コンストラクトです。
例えば、次の例は
SELECT * FROM t1 WHERE id IN (SELECT id FROM t2);
次のように書き換えられます。
SELECT DISTINCT t1.* FROM t1, t2 WHERE t1.id=t2.id;
次のようなクエリは、
SELECT * FROM t1 WHERE id NOT IN (SELECT id FROM t2); SELECT * FROM t1 WHERE NOT EXISTS (SELECT id FROM t2 WHERE t1.id=t2.id);
IN()
を利用して次のように書き換えられます。
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL;
サーバの方が上手最適化する事ができるかもしれないので、—
MySQL
サーバだけに特有であるというわけではない、LEFT
[OUTER] JOIN
はそれに同等のサブクエリよりも早いかもしれません。
SQL-92
以前は外部接合が存在しなかったので、特定の作業をする為には、サブクエリが唯一の方法でした。現在は、MySQL
サーバやその他のデータベース
システムが様々なタイプの外部接合を提供しています。
MySQL
サーバは、1つのテーブル、または複数のテーブルから一度に出される情報に基づき、行を効果的に削除する為に利用する事ができる複合テーブル
DELETE
ステートメントをサポートします。複合テーブル
UPDATE
ステートメントもまたサポートされています。