モジュールのレッスン (4/4)
別のクエリ内のクエリ: サブクエリ
抽出、フィルター、グループ化、結合、変換する方法を学習しました。そこに 最後の基本的なアイデアは、クエリを別のクエリの中に入れるです。これらは サブクエリと呼ばれる、質問に答えるためのステップです 例: 「平均以上の収入を得ているのは誰ですか?」 または 「どの部門にその人がいますか?」 プロジェクトに割り当てられていますか?".
基本的な構文
サブクエリは括弧で囲まれた SELECT であり、単一クエリの代わりに使用されます。
別のクエリの値または値のリスト:
-- Find who earns MORE THAN THE COMPANY AVERAGE:
SELECT first_name, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);エンジンは最初にサブクエリを実行します — SELECT AVG(salary) FROM employees
単一の数値を返します — そしてその数値を外側の WHERE で使用します
まるで手書きで書いたかのように。これがまさに利点です。
事前に平均を知る必要はありません。SQL が平均を計算します。
最も一般的な 3 つの「タイプ」
1. 単一の値を返すサブクエリ
上の例: サブクエリは 1 行、1 列 (と呼ばれる) を生成します。
スカラー)。 =、>、< などと一緒に使用します。
-- Employee with the highest salary:
SELECT first_name, last_name
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);2. リストを返すサブクエリ
サブクエリは 1 つの列、多数の行を生成します。と一緒に使用します
IN (...):
-- Departments that have at least one employee:
SELECT name
FROM departments
WHERE id IN (SELECT DISTINCT department_id
FROM employees
WHERE department_id IS NOT NULL);3. 「テーブル」としてのサブクエリ(FROM)
FROM のテーブルの代わりにサブクエリを使用することもできます。役に立つのは、
集計を事前に計算してから、それらをフィルタリングまたは結合します。
-- Departments with average salary above 40000:
SELECT d.name, medie.stipendio_medio
FROM departments AS d
JOIN (SELECT department_id, AVG(salary) AS stipendio_medio
FROM employees
GROUP BY department_id) AS medie
ON d.id = medie.department_id
WHERE medie.stipendio_medio > 40000;サブクエリまたはJOIN?いつどれを使うか
多くの場合、JOIN またはサブクエリを使用しても同じ結果が得られます。
経験則:
- あるテーブルの行を別のテーブルのプロパティに基づいてフィルタするには
(「部門が…である従業員」)、
IN (subquery)は非常に読みやすいです。 - 結果内の複数のテーブルの 列を結合するには、
JOINを使用します。 - 集計を計算し、それをしきい値として使用するには (" Average") の場合、スカラー サブクエリが自然な選択になります。
実際には両方が見られます。SQL エンジンは多くの場合、それらを同じように最適化します。 方法。最も読みやすい形式を選択してください。
試してみてください
会社の平均よりも厳密に収入が多い従業員の名 (first_name)、姓 (last_name)、および給与 (salal) を検索します。 3 つの列。
ヒントを表示
交換する ?サブクエリ SELECT AVG(salary) FROM 従業員を使用すると、しきい値として使用する単一の数値が返されます。
3 回の試行後に解決策が利用可能になります
復習演習
給与が厳密に 50000 を超える従業員が少なくとも 1 人いる部門の名前 (Departments.name) をリストします。IN を使用したサブクエリを使用します。アルファベット順に注文します。
ヒントを表示
内側のサブクエリは、給与が 50000 を超える従業員がいる部門の ID を返します。次に、外側のクエリで WHERE id IN (...) を返します。
3 回の試行後に解決策が利用可能になります