【Java上級】MySQLマルチテーブルクエリの子クエリについて詳しく解説

ここに画像の説明を挿入します

データベース クエリでは、複数テーブルのクエリは非常に一般的で重要なタスクです。これにより、複数の関連テーブルからデータを取得して結合し、さまざまな複雑なクエリのニーズを満たすことができます。マルチテーブル クエリでは、サブクエリはクエリ内に別のクエリをネストするために使用される強力なツールです。この記事では、MySQL のサブクエリについて、その概要、サブクエリの作成方法、サブクエリを使用して解決される一般的なクエリの問題などを詳しく説明します。

1. サブクエリとは何ですか?

サブクエリは、ネストされたクエリまたは内部クエリとも呼ばれ、別のクエリ内にネストされたクエリです。サブクエリは独立して実行でき、結果セットを返し、それが親クエリの条件の 1 つとして使用されます。言い換えれば、サブクエリは親クエリからのデータを提供するために使用され、そのデータに基づいて追加のデータをさらにフィルタリングまたは取得できるようになります。

サブクエリは通常WHEREクエリのニーズに応じて、親クエリの句、句FROMSELECT句、または句内に配置されます。HAVING

以下は、サブクエリの構造を示す簡単な例です。

SELECT column1
FROM table1
WHERE column2 = (SELECT column3 FROM table2 WHERE column4 = 'value');

上記の例では、サブクエリは、親クエリの句の条件に(SELECT column3 FROM table2 WHERE column4 = 'value')使用される値を含む結果セットを返します。WHERE

2. サブクエリの種類

MySQL には、次の一般的なタイプを含むさまざまなタイプのサブクエリがあります。

2.1 スカラーサブクエリ

スカラー サブクエリは単一の値を返し、通常は条件が true かどうかを判断するために比較演算子 (たとえば=>、 、 )の右側で使用されます。<たとえば、平均給与を超える給与を持つすべての従業員を検索するには、スカラー サブクエリを使用できます。

SELECT employee_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

上の例では、サブクエリは(SELECT AVG(salary) FROM employees)各従業員の給与と比較される平均給与値を返します。

2.2 行サブクエリ

行サブクエリはデータ行を返し、通常はINAND 、ANYORなどALLの演算子とともに使用されます。たとえば、すべての製品を購入した顧客を検索するには、行サブクエリを使用できます。

SELECT customer_id, customer_name
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders GROUP BY customer_id HAVING COUNT(DISTINCT product_id) = (SELECT COUNT(*) FROM products));

上の例では、行サブクエリは(SELECT customer_id FROM orders GROUP BY customer_id HAVING COUNT(DISTINCT product_id) = (SELECT COUNT(*) FROM products))すべての製品を購入した顧客を返しますcustomer_id

2.3 リストサブクエリ

列サブクエリはデータの列を返し、通常はINAND 、ANYORなどALLの演算子とともに使用されます。たとえば、同じ日に複数の製品を購入した顧客を検索するには、次のサブクエリを使用します。

SELECT customer_id, customer_name
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders GROUP BY customer_id HAVING COUNT(DISTINCT product_id) > 1);

上の例では、列サブクエリは(SELECT customer_id FROM orders GROUP BY customer_id HAVING COUNT(DISTINCT product_id) > 1)複数の製品を購入した顧客を返しますcustomer_id

3. サブクエリの適用

ここで、MySQL クエリにおけるサブクエリの威力を実証するための実際的なアプリケーション シナリオをいくつか見てみましょう。

3.1 サブクエリを使用してデータをフィルタリングする

一般的な使用法は、サブクエリを使用してデータをフィルタリングすることです。たとえば、最も給与が高い従業員を見つけたいとします。次のようなクエリを作成できます。

SELECT employee_name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

このクエリでは、サブクエリが(SELECT MAX(salary) FROM employees)最高給与の従業員の給与を返し、親クエリを使用して最高給与と同じ給与を持つすべての従業員がフィルタリングされます。

3.2 サブクエリは外部クエリと関連付けるために使用されます

サブクエリを外部クエリと組み合わせて使用​​して、外部クエリの結果に基づいてデータをさらに取得することもできます。たとえば、各部門で最も給与の高い従業員を見つけたいと仮定すると、次のようなクエリを作成できます。

SELECT department_name, employee_name, salary
FROM employees
WHERE (department_id, salary) IN (SELECT department_id, MAX(salary) FROM employees GROUP BY department_id);

このクエリでは、サブクエリが(SELECT department_id, MAX(salary) FROM employees GROUP BY department_id)各部門の最高給与を返し、次に外側のクエリを使用して従業員テーブルのデータと相関させ、最高給与の従業員を見つけます。

3.3 サブクエリはデータの計算に使用されます

サブクエリはデータの計算にも使用できます。たとえば、各部門の平均給与を見つけて、その部門内の各従業員の給与と比較して、それが平均給与より高いかどうかを判断するとします。次のようなクエリを作成できます。

SELECT department_name, employee_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees AS avg_salaries WHERE avg_salaries.department_id = employees.department_id);

このクエリでは、サブクエリ(SELECT AVG(salary) FROM employees AS avg_salaries WHERE avg_salaries.department_id = employees.department_id)を使用して各部門の平均給与を計算し、従業員テーブルのデータと比較します。

4. サブクエリの性能

サブクエリは強力なツールですが、場合によってはパフォーマンスの問題を引き起こす可能性があります。サブクエリには追加のクエリ操作が必要となるため、クエリの実行に時間がかかる可能性があります。したがって、クエリを作成するときは、サブクエリを慎重に使用し、同じ操作をより効率的に実行する方法があるかどうかを検討する必要があります。

クエリのパフォーマンスを最適化するには、JOINサブクエリの代わりにアクション クエリまたは結合クエリを使用することを検討してください。これらの方がデータをより速く取得できる場合が多いです。さらに、適切なインデックスを使用すると、クエリのパフォーマンスも向上します。

5. まとめ

サブクエリは MySQL の強力なクエリ ツールであり、さまざまな複雑なクエリ要件を解決するために使用できます。この記事では、サブクエリとは何か、サブクエリの種類、クエリにサブクエリを適用する方法について説明します。また、サブクエリの一般的な使用例についても説明し、サブクエリがパフォーマンスに与える影響についても言及しました。効率的な SQL クエリ作成者になるには、サブクエリをマスターすることが非常に重要なステップです。

この記事が、MySQL のサブクエリをよりよく理解し、適用するのに役立つことを願っています。

著者情報

著者:Fanyi
CSDN: https: //techfanyi.blog.csdn.net
Nuggets:https://juejin.cn/user/4154386571867191

おすすめ

転載: blog.csdn.net/qq_21484461/article/details/133419463