MySQL 5.1
はサブクエリーをサポートしていますが
(項8.2.9. 「サブクエリー構文」
を参照)、値のセットでメンバーシップをテストするためのほかの方法が存在する場合があることも依然として事実です。また、場合によっては、クエリーをサブクエリーなしで再書き込みすることだけでなく、先ほどの別のテクニックを利用した方がより効果的であるというのも事実です。その
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);
次のように書き換えられます。
SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL;
LEFT [OUTER] JOIN
は、サーバーがより適切に最適化できる可能性があるため、同等のサブクエリーより高速です。これは、MySQL
サーバーだけに特有のことではありません。SQL-92
以前は外部結合が存在しなかったので、特定の作業をするためには、サブクエリーが唯一の方法でした。現在は、MySQL
サーバーやその他のデータベースシステムが様々なタイプの外部結合を提供しています。
MySQL サーバーは、1
つのテーブル、または複数のテーブルから一度に出される情報に基づき、行を効果的に削除するために利用することができる複合テーブル
DELETE
ステートメントをサポートします。複合テーブル
UPDATE
ステートメントもまたサポートされています。項8.2.2. 「DELETE
構文」、項8.2.11. 「UPDATE
構文」
を参照してください。