この記事では、SQLサブQueries(ネストされたクエリ)について説明し、Select、From、Where Whereでの使用を紹介します。それは、利点、一般的な落とし穴(相関サブ征服、INの非効率的な使用)、および最適化技術(結合、CTES、存在することを強調しています
ネストされたクエリとも呼ばれるサブクエリは、別のSQLクエリに組み込まれたクエリです。それらは、単一のシンプルなクエリで達成することが困難または不可能な複雑なクエリを作成するのに非常に便利です。複雑な問題をより小さく、より管理しやすい部分に分解することができます。サブクリーズは、 SELECT
、 FROM
、 WHERE
、clausesを含むメインHAVING
のさまざまな条項で使用できます。
例で説明しましょう:
例1:句のサブクエリ:
Customers
(顧客、名前、都市)とOrders
(OrderID、CustomerID、OrderDate、Totalamount)の2つのテーブルがあるとします。合計額が平均注文額を超えて注文した顧客の名前を見つけたいと思います。
<code class="sql">SELECT Name FROM Customers WHERE CustomerID IN (SELECT CustomerID FROM Orders GROUP BY CustomerID HAVING AVG(TotalAmount) > (SELECT AVG(TotalAmount) FROM Orders));</code>
このクエリでは、 WHERE
句のサブクエリを使用して、 Customers
テーブルから対応する名前を選択する前に、指定された基準を満たすCustomerID
を見つけます。最小のサブクエリは、すべての注文にわたる平均注文額を計算します。
例2:Select句のサブクエリ:
顧客名と費やした総額を取得したいと想像してください。
<code class="sql">SELECT c.Name, (SELECT SUM(TotalAmount) FROM Orders o WHERE o.CustomerID = c.CustomerID) AS TotalSpent FROM Customers c;</code>
ここでは、 SELECT
句のサブクエリが各顧客のTotalSpent
を計算します。
例3:FROM句のサブクエリ(CTEを使用 - 読みやすさのための共通テーブル式 - を使用):
より良い読みやすさ、特に複雑なサブ征服では、一般的なテーブル式(CTE)を使用することをお勧めします。先月注文した顧客を見つけましょう。
<code class="sql">WITH RecentOrders AS ( SELECT CustomerID FROM Orders WHERE OrderDate >= DATE('now', '-1 month') ) SELECT c.Name FROM Customers c JOIN RecentOrders ro ON c.CustomerID = ro.CustomerID;</code>
この例では、メインクエリの前に定義されたサブクエリであるCTE、 RecentOrders
を使用しています。メインクエリは、 RecentOrders
Customers
と顧客に加わり、目的の結果を得ます。このアプローチは、 FROM
句のサブクエリを直接組み込むことと比較して、読みやすさを大幅に改善します。
サブクリーリーは強力ですが、いくつかの落とし穴はパフォーマンスの問題や誤った結果につながる可能性があります。
WHERE
句で使用される列に適切なインデックスが整っていることを確認してください。IN
vs.の誤った使用: EXISTS
: EXISTS
一般に、特に大きなデータセットでIN
の存在をチェックするよりも効率的です。すべての行を処理する必要がIN
間、試合が見つかるとすぐに検索がEXISTS
します。サブ征服の最適化には、いくつかの戦略が含まれます。
WHERE
句のテーブルと列に適切なインデックスが存在するようにします。EXISTS
一般にIN
をチェックするよりも効率的です。EXPLAIN PLAN
、MySQLおよびPostgreSQL、SQL Server ProfilerでEXPLAIN
)。クエリの実行計画を分析し、ボトルネックを特定します。はい、サブクリーリーは、MySQL、PostgreSQL、SQL Server、Oracleなどを含む、ほぼすべての主要なSQLデータベースによってサポートされています。基本的な構文は、これらのデータベースで類似していますが、構文やサポートされている機能にはわずかなバリエーションがある可能性があります。ただし、パフォーマンスの特性と最適化戦略は、特定のデータベースシステムとそのオプティマイザーによってわずかに異なる場合があります。データベースシステムのクエリオプティマイザーの詳細を理解することは、効率的なクエリライティングに不可欠です。
以上がSQLでサブQueriesを使用して複雑なクエリを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。