サブクエリ
-
意味:他のステートメントに表示されるselectステートメントはサブクエリまたは内部クエリと呼ばれます。
外部クエリステートメントはメインクエリまたは外部クエリと呼ばれます -
分類
- サブクエリの場所に従って:
- selectステートメント
は標準のクォンタムクエリのみをサポートし ます- ステートメント
サポートテーブルのサブクエリ - 場所または(フォーカス)
スカラー量子クエリ(単一行)
列サブクエリ(複数行)
行サブクエリ(少ない使用) - existsステートメントの後の
テーブルサブクエリ(相関サブクエリ)
- ステートメント
- selectステートメント
- 結果セットの行と列の数に応じて
+標準のクォンタムクエリ(結果は1つの行と1つの列のみ)
+列のサブクエリ(1つの列と複数の行のみ)
+行のサブクエリ(結果は1つの行と1つの列を持つことができます)
+テーブルのサブクエリ(結果セットは通常複数の行と列です) )
- サブクエリの場所に従って:
1. whereまたはhavingの後のサブクエリ
-
列サブクエリの複数行比較演算子
- IN / NOT IN:リスト内のいずれかに等しい
- ANY / SOME:サブクエリリストとの比較(各値の比較と同様にOR演算)
- ALL:サブクエリリストのすべての値と比較します(すべての値の比較と同様にAND演算です)。
-
特徴
-
サブクエリは括弧内に配置されます
-
サブクエリは通常、条件の右端に配置されます
-
標準の量子クエリ、通常は単一行演算子
<、>、<=、> =、=、!=
- 列サブクエリ、通常複数行演算子で使用されます
で、任意/一部、すべて
- サブクエリの実行優先度とメインクエリの実行
-
-
標準クォンタムクエリ(単一行サブクエリ)
-
ケース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);
-
-
列サブクエリ(複数行サブクエリ)
-
ケース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';
-
-
行サブクエリ(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);
関連テスト
-
Zlotkeyと同じ部門の従業員の名前と賃金を照会する
SELECT last_name, salary FROM employees WHERE department_id = (SELECT department_id FROM employees WHERE last_name = 'Zlotkey');
-
給与が会社の平均給与より高い従業員の従業員番号、名前、給与を照会する
SELECT employee_id, last_name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
-
部門の平均給与より給与が高い各部門の従業員番号と従業員名を問い合せます
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;
-
同じ部門で、名前に文字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%');
-
location_idが1700である部門で働いている従業員の従業員番号を照会します
SELECT employee_id FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700);
-
マネージャーがK_ingである従業員の名前と給与を照会します
SELECT last_name, salary FROM employees WHERE manager_id IN (SELECT employee_id FROM employees WHERE last_name = 'K_ing');
-
最高の給与を持つ従業員の名前を問い合せ、列としてfirst_nameおよびlast_nameを要求します
SELECT CONCAT(first_name, ' ', last_name) FROM employees WHERE salary = (SELECT MAX(salary) FROM employees);