メインコンテンツにスキップ
モジュール 4 · レッスン 4 / 4コース内の 16/57~12 min
モジュールのレッスン (4/4)

別のクエリ内のクエリ: サブクエリ

抽出、フィルター、グループ化、結合、変換する方法を学習しました。そこに 最後の基本的なアイデアは、クエリを別のクエリの中に入れるです。これらは サブクエリと呼ばれる、質問に答えるためのステップです 例: 「平均以上の収入を得ているのは誰ですか?」 または 「どの部門にその人がいますか?」 プロジェクトに割り当てられていますか?".

基本的な構文

サブクエリは括弧で囲まれた SELECT であり、単一クエリの代わりに使用されます。 別のクエリの値または値のリスト:

SQL
-- 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 列 (と呼ばれる) を生成します。 スカラー)。 =、>、< などと一緒に使用します。

SQL
-- Employee with the highest salary:
SELECT first_name, last_name
FROM   employees
WHERE  salary = (SELECT MAX(salary) FROM employees);

2. リストを返すサブクエリ

サブクエリは 1 つの列、多数の行を生成します。と一緒に使用します IN (...):

SQL
-- 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 のテーブルの代わりにサブクエリを使用することもできます。役に立つのは、 集計を事前に計算してから、それらをフィルタリングまたは結合します。

SQL
-- 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 エンジンは多くの場合、それらを同じように最適化します。 方法。最も読みやすい形式を選択してください。

試してみてください

運動#sql.m4.l4.e1
試行回数: 0読み込み中…

会社の平均よりも厳密に収入が多い従業員の名 (first_name)、姓 (last_name)、および給与 (salal) を検索します。 3 つの列。

エディターを読み込み中…
ヒントを表示

交換する ?サブクエリ SELECT AVG(salary) FROM 従業員を使用すると、しきい値として使用する単一の数値が返されます。

3 回の試行後に解決策が利用可能になります

復習演習

運動#sql.m4.l4.e2
試行回数: 0読み込み中…

給与が厳密に 50000 を超える従業員が少なくとも 1 人いる部門の名前 (Departments.name) をリストします。IN を使用したサブクエリを使用します。アルファベット順に注文します。

エディターを読み込み中…
ヒントを表示

内側のサブクエリは、給与が 50000 を超える従業員がいる部門の ID を返します。次に、外側のクエリで WHERE id IN (...) を返します。

3 回の試行後に解決策が利用可能になります