DQLサブクエリ

サブクエリ

  • 意味:他のステートメントに表示されるselectステートメントはサブクエリまたは内部クエリと呼ばれます。
    外部クエリステートメントはメインクエリまたは外部クエリと呼ばれます

  • 分類

    • サブクエリの場所に従って:
      • selectステートメント
        は標準のクォンタムクエリのみをサポートし ます
        • ステートメント
          サポートテーブルのサブクエリ
        • 場所または(フォーカス)
          スカラー量子クエリ(単一行)
          列サブクエリ(複数行)
          行サブクエリ(少ない使用)
        • existsステートメントの後の
          テーブルサブクエリ(相関サブクエリ)
    • 結果セットの行と列の数に応じて
      +標準のクォンタムクエリ(結果は1つの行と1つの列のみ)
      +列のサブクエリ(1つの列と複数の行のみ)
      +行のサブクエリ(結果は1つの行と1つの列を持つことができます)
      +テーブルのサブクエリ(結果セットは通常複数の行と列です) )

1. whereまたはhavingの後のサブクエリ

  • 列サブクエリの複数行比較演算子

    1. IN / NOT IN:リスト内のいずれかに等しい
    2. ANY / SOME:サブクエリリストとの比較(各値の比較と同様にOR演算)
    3. ALL:サブクエリリストのすべての値と比較します(すべての値の比較と同様にAND演算です)。
  • 特徴

    1. サブクエリは括弧内に配置されます

    2. サブクエリは通常、条件の右端に配置されます

    3. 標準の量子クエリ、通常は単一行演算子

    <、>、<=、> =、=、!=

    1. 列サブクエリ、通常複数行演算子で使用されます

    で、任意/一部、すべて

    1. サブクエリの実行優先度とメインクエリの実行
  1. 標準クォンタムクエリ(単一行サブクエリ)

    • ケース1:Abelより給与が高い人

      SELECT 
          last_name, salary
      FROM
          employees
      WHERE
          salary > (
      		SELECT 
                  salary
              FROM
                  employees
              WHERE
                  last_name = 'Abel');
      
    • ケース2:job_idが従業員141と同じである従業員の名前、job_id、および給与を返す給与が従業員141より多い

      単一句クエリを実行する

      SELECT 
          last_name, job_id, salary
      FROM
          employees
      WHERE
          job_id = (SELECT 
                  job_id
              FROM
                  employees
              WHERE
                  employee_id = 141)
              AND salary > (SELECT 
                  salary
              FROM
                  employees
              WHERE
                  employee_id = 143);
      
    • ケース3:給与が最も低い従業員のlast_name、job_id、および給与を返す

      サブクエリでグループ関数を使用する

      SELECT 
          last_name, job_id, salary
      FROM
          employees
      WHERE
          salary = (SELECT 
                  MIN(salary)
              FROM
                  employees);
      
    • ケース4:部門IDと、部門50の最低賃金よりも高い最低賃金の最低賃金を照会する

      句のHAVINGステートメント

      SELECT 
          department_id, MIN(salary)
      FROM
          employees
      GROUP BY department_id
      HAVING MIN(salary) > (SELECT 
              MIN(salary)
          FROM
              employees
          WHERE
              department_id = 50);
      
  2. 列サブクエリ(複数行サブクエリ)

    • ケース1:location_idが1400または1700である部門のすべての従業員の名前を返す

      # 连接查询
      SELECT 
          d.location_id, e.last_name
      FROM
          departments d
              INNER JOIN
          employees e ON e.department_id = d.department_id
      WHERE
          d.location_id IN (1400 , 1700);
      # 列子查询
      SELECT 
          last_name
      FROM
          employees
      WHERE
          department_id IN (SELECT 
                  department_id
              FROM
                  departments
              WHERE
                  location_id IN (1400 , 1700));
      
    • ケース2:JOB_ID「IT_PROG」部門以外の部門への戻りのいずれかの作業低賃金の従業員の数、名前、JOB_ID、および給与

      複数行のサブクエリでANY演算子を使用する

      SELECT 
          employee_id, last_name, job_id, salary
      FROM
          employees
      WHERE
          salary < ANY (SELECT DISTINCT
                  salary
              FROM
                  employees
              WHERE
                  job_id = 'IT_PROG')
              AND job_id <> 'IT_PROG';
      
    • ケース3:job_idがjob_idよりも小さい部門のすべての従業員のジョブ番号、名前、job_id、および給与に戻る 'IT_PROG'

      複数行のサブクエリでALL演算子を使用する

      SELECT 
          employee_id, last_name, job_id, salary
      FROM
          employees
      WHERE
          salary < ALL (SELECT 
                  salary
              FROM
                  employees
              WHERE
                  job_id = 'IT_PROG')
              AND job_id <> 'IT_PROG';
      
  3. 行サブクエリ(1つの行に複数の列、複数の行に複数の列)

    • ケース:最小の従業員IDと最高の給与を持つ従業員の従業員IDをクエリします。名前、給与、job_id

      SELECT 
          employee_id, last_name, salary, job_id
      FROM
          employees
      WHERE
          employee_id = (SELECT 
                  MIN(employee_id)
              FROM
                  employees)
              AND salary = (SELECT 
                  MAX(salary)
              FROM
                  employees);
      

次に、selectステートメントの背後にあるサブクエリ

selectは標準の量クエリのみをサポート

  • ケース1:各部門の従業員数を照会する

    # 子查询
    SELECT 
        d.department_id,
        (SELECT 
                COUNT(*)
            FROM
                employees e
            WHERE
                e.department_id = d.department_id) COUNT
    FROM
        departments d;
    # 分组查询
    SELECT 
        department_id, COUNT(last_name) COUNT
    FROM
        employees
    GROUP BY department_id;
    
  • ケース2:従業員番号が102の部門名をクエリする

    # 子查询版本
    SELECT 
        department_name
    FROM
        departments
    WHERE
        department_id = (SELECT 
                department_id
            FROM
                employees
            WHERE
                employee_id = 102);
    # 连接查询
    SELECT 
        d.department_name
    FROM
        departments d
            INNER JOIN
        employees e ON e.department_id = d.department_id
    WHERE
        e.employee_id = 102;
    

3、背後にあるサブクエリ

  • ケース1:各部門の平均給与の給与レベルを照会する

    SELECT 
        A.department_id, round(A.AVG_SAL, 2), j.grade_level
    FROM
        (SELECT 
            AVG(salary) AVG_SAL, department_id
        FROM
            employees
        GROUP BY department_id) A
            INNER JOIN
        job_grades j ON A.AVG_SAL BETWEEN lowest_sal AND highest_sal;
    

4.背後にあるサブクエリが存在する(相関サブクエリ)

# 判断子查询里面有没有值
SELECT 
    EXISTS( SELECT 
            employee_id
        FROM
            employees); # 1 有
SELECT 
    EXISTS( SELECT 
            salary
        FROM
            employees
        WHERE
            salary = 30000); # 0 没有
  • ケース:従業員の部門名を照会する

    # exists版本
    SELECT 
        department_name
    FROM
        departments d
    WHERE
        EXISTS( SELECT 
                *
            FROM
                employees e
            WHERE
                d.department_id = e.department_id);
    # in版本
    SELECT 
        department_name
    FROM
        departments d
    WHERE
        d.department_id IN (SELECT 
                department_id
            FROM
                employees e
            WHERE
                e.department_id = d.department_id);
    

関連テスト

  1. Zlotkeyと同じ部門の従業員の名前と賃金を照会する

    SELECT 
        last_name, salary
    FROM
        employees
    WHERE
        department_id = (SELECT 
                department_id
            FROM
                employees
            WHERE
                last_name = 'Zlotkey');
    
  2. 給与が会社の平均給与より高い従業員の従業員番号、名前、給与を照会する

    SELECT 
        employee_id, last_name, salary
    FROM
        employees
    WHERE
        salary > (SELECT 
                AVG(salary)
            FROM
                employees);
    
  3. 部門の平均給与より給与が高い各部門の従業員番号と従業員名を問い合せます

    SELECT 
        employee_id, last_name
    FROM
        employees e
            INNER JOIN
        (SELECT 
            AVG(salary) av, department_id
        FROM
            employees
        GROUP BY department_id) A ON e.department_id = A.department_id
    WHERE
        e.salary > A.av;
    
  4. 同じ部門で、名前に文字uが含まれている従業員の従業員番号と名前を照会する

    SELECT 
        employee_id, last_name
    FROM
        employees e
    WHERE
        e.department_id IN (SELECT DISTINCT
                department_id
            FROM
                employees
            WHERE
                last_name LIKE '%u%');
    
  5. location_idが1700である部門で働いている従業員の従業員番号を照会します

    SELECT 
        employee_id
    FROM
        employees
    WHERE
        department_id IN (SELECT 
                department_id
            FROM
                departments
            WHERE
                location_id = 1700);
    
  6. マネージャーがK_ingである従業員の名前と給与を照会します

    SELECT 
        last_name, salary
    FROM
        employees
    WHERE
        manager_id IN (SELECT 
                employee_id
            FROM
                employees
            WHERE
                last_name = 'K_ing');
    
  7. 最高の給与を持つ従業員の名前を問い合せ、列としてfirst_nameおよびlast_nameを要求します

    SELECT 
        CONCAT(first_name, ' ', last_name)
    FROM
        employees
    WHERE
        salary = (SELECT 
                MAX(salary)
            FROM
                employees);

おすすめ

転載: www.cnblogs.com/klenkiven/p/12723738.html