計算フィールドとしてサブクエリを使用する
サブクエリを使用する別の方法は、計算フィールドを作成することです。顧客テーブルに各顧客の合計注文数を表示する必要があるとします。注文は、対応する顧客 ID とともに注文テーブルに保存されます。
この操作を実行するには、以下の手順に従ってください。
(1) 顧客テーブルから顧客リストを取得します。
(2) 取得した顧客ごとに、注文テーブル内の注文数をカウントします。
前の 2 つの章で説明したように、SELECT COUNT (*) を使用してテーブル内の行をカウントできます。また、WHERE 句を指定して特定の顧客 ID をフィルターすることで、その顧客の注文のみをカウントできます。たとえば、次のコードは顧客 10001 の注文をカウントします。
入力:
select count(*) as orders from orders where cust_id = 10001;
各顧客の COUNT(*) 計算を実行するには、COUNT(*) をサブクエリとして使用する必要があります。以下のコードを見てください:
入力:
select cust_name,cust_state,(select count(*) from orders where orders.cust_id = customers.cust_id) as orders from customers order by cust_name;
出力:
分析: この SELECT ステートメントは、customers テーブル内の各顧客に対して 3 つの列 (cust_name、cust_state、orders) を返します。 order は、かっこ内のサブクエリから構築された計算フィールドです。このサブクエリは、取得された顧客ごとに 1 回実行されます。この例では、5 人の顧客が取得されたため、サブクエリが 5 回実行されます。
サブクエリの WHERE 句は、完全修飾列名 (第 4 章で最初に説明) を使用するため、以前に使用した WHERE 句とは少し異なります。次のステートメントは、orders テーブルの cust_id と、customers テーブルから現在取得されている cust_id を比較するように SQL に指示します。
where orders.cust_id = customers.cust_id
相関サブクエリ (相関サブクエリ) 外部クエリを含むサブクエリ。このタイプのサブクエリは相関サブクエリと呼ばれます。列名があいまいな場合は常に、この構文 (テーブル名と列名をピリオドで区切る) を使用する必要があります。なぜこんなことになっているのでしょうか?
完全修飾列名を使用しない場合に何が起こるかを見てみましょう:
入力:
select cust_name,cust_state,(select count(*) from orders where cust_id = cust_id) as orders from customers order by cust_name;
出力:
分析: 明らかに、返された結果は間違っています (以前の結果と比較してください)。これは起こっていますか? cust_id 列は 2 つあり、1 つは顧客に、もう 1 つは注文にあり、注文と対応する顧客を正確に照合するために比較する必要があります。カラム名を完全修飾しない場合、MySQL は cust_id を、orders テーブル内のそれ自体と比較していると想定します。そして、 SELECT COUNT(*) FROMorders WHERE cust_id = cust_id; は常に、orders テーブル内の注文の合計数を返します (MySQL は各注文の cust_id がそれ自体と一致するかどうかを調べ、もちろん常に一致するためです)。
サブクエリはこの種の SELECT ステートメントを構築する際に非常に便利ですが、あいまいな列名を制限するように注意する必要があります。
複数の解決策 この章の前半で述べたように、ここで示したサンプル コードはうまく機能しますが、この種のデータ取得を解決する最も効率的な方法ではありません。この例については後の章でもう一度説明します。 サブクエリを徐々に追加してクエリを構築する サブクエリを使用したクエリのテストとデバッグは、特にステートメントの複雑さが増すにつれて難しくなる場合があります。サブクエリを使用してクエリを構築 (およびテスト) する最も信頼できる方法は、MySQL がサブクエリを処理するのとほぼ同じ方法で、段階的に実行することです。まず、最も内側のクエリを構築してテストします。次に、ハードコーディングされたデータを使用して外部クエリを構築してテストし、機能することを確認した後にのみサブクエリを埋め込みます。この時点で、もう一度テストしてください。追加するクエリごとにこれらの手順を繰り返します。これを行うと、クエリの構築にかかる時間はほんの少ししか追加されませんが、後で (クエリが機能しない理由を理解するために) 大幅に時間が節約され、そもそもクエリが適切に機能する可能性が大幅に高まります。 【関連おすすめ】1. mysqlサブクエリとは何ですか?サブクエリを使用してフィルタリングするにはどうすればよいですか? 2.mysql の結合テーブルと関係テーブルとは何ですか? 3. 結合を使用する理由と結合の作成方法4. MySQL の WHERE 句の重要性と複数のテーブルを結合する方法以上がmysql でサブクエリを使用して計算フィールドを作成するチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。