Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


13.2.10.11 サブクエリーの結合としての書き換え

場合によっては、一連の値におけるメンバーシップをテストするために、サブクエリーを使用する以外の方法が存在することがあります。また、クエリーをサブクエリーなしで書き換えることが可能なだけでなく、サブクエリーを使用する代わりにこれらの手法のいくつかを使用する方が効率的になる場合もあります。これらのうちの 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 Server だけに特有の事実ではありません) ため、同等のサブクエリーより高速になる場合があります。SQL-92 より前は、外部結合が存在しなかったため、サブクエリーが特定の処理を実行するための唯一の方法でした。今日では、MySQL Server やその他の多くの最新データベースシステムがさまざまなタイプの外部結合を提供しています。

MySQL Server は、1 つのテーブルからの情報や、場合によっては一度に多数のテーブルからの情報に基づいて行を効率的に削除するために使用できる複数テーブルの DELETE ステートメントをサポートしています。また、複数テーブルの UPDATE ステートメントもサポートされています。セクション13.2.2「DELETE 構文」およびセクション13.2.11「UPDATE 構文」を参照してください。