SQLにはサブクエリが必要ですか?
関係データベース用の構造化照会言語の十分に一般化された実装を想像してください。正規のSQL SELECT
ステートメントの構造は、これが意味をなすために実際に非常に重要なので、リレーショナル代数に直接アピールしませんが、式の形式に適切な制限を加えることで、これらの用語でこれを組み立てることができます。
SQLのSELECT
クエリは、一般的に投影(から成るSELECT
部分)のいくつかの数JOIN
の操作(JOIN
パート)、いくつかの数SELECTION
の操作(SQLにおいて、WHERE
句)、セット単位(操作UNION
、EXCEPT
、INTERSECT
、など)、他の続きますSQL SELECT
クエリ。
結合されるテーブルは、式の計算結果にすることができます。言い換えると、次のようなステートメントを作成できます。
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN (SELECT id, address
FROM table2 AS t3
WHERE t3.id = t1.id) AS t2
WHERE t1.salary > 50,000;
SQLクエリの一部として計算テーブルをサブクエリとして使用することに言及します。上記の例では、2番目の(インデントされた)SELECT
サブクエリです。
すべてのSQLクエリは、サブクエリを使用しないように記述できますか?上記の例は次のことができます。
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN table2 AS t2
ON t1.id = t2.id
WHERE t1.salary > 50,000;
この例はやや見せかけの、または取るに足らないものですが、同等の式を回復するためにかなり多くの労力が必要になる場合が考えられます。言い換えると、サブクエリを含むすべてのSQLクエリ、サブクエリのないクエリq ′が存在し、qおよびq ′が同じ基になるテーブルに対して同じ結果を生成することが保証されている場合ですか?SQLクエリを次の形式に制限しましょう。
SELECT <attribute>,
...,
<attribute>
FROM <a table, not a subquery>
JOIN <a table, not a subquery>
...
JOIN <a table, not a subquery>
WHERE <condition>
AND <condition>
...
AND <condition>
UNION
-or-
EXCEPT
-or-
<similar>
SELECT ...
等々。左と右の外部結合はあまり追加されないと思いますが、私が間違っている場合は、それを指摘してください...いずれにしても、それらは公正なゲームです。集合演算に関する限り、それらのいずれもうまくいくと思います...結合、差、対称差、交差など、役立つものは何でも。すべてのSQLクエリを削減できる既知の形式はありますか?これらのいずれかがサブクエリを排除しますか?または、サブクエリのない同等のクエリが存在しない場合がありますか?参照は高く評価されます...または、それらが必要であるか不要であるかの証明(証拠による)は素晴らしいでしょう。感謝します。これが有名な(または些細な)結果であり、申し訳ありませんが、その結果、私は痛いほど無知です。
select count(*) from (select id from sometable group by id having count(*)>1) d
。それが含まれgroup by
ているので、私はこれを答えとして入れていません。
ON
は句が必要ですがJOIN
、カンマだけで外積が取得されます。