SQL學習之子查詢,基於Oracle下的HR使用者(四)
六、 子查詢
1 子查詢介紹
1.1 什麼是子查詢
子查詢是一個 SELECT 語句,它是嵌在另一個 SELECT 語句中的子句。
可以用組合兩個查詢的方法解決這個問題,放置一個查詢到另一個查詢中。內查詢或子查詢返回一個值給外查詢或主查詢。使用一個子查詢相當於執行兩個連續查詢並且用第一個查詢的結果作為第二個查詢的搜尋值。
1.2 子查詢語法
• 子查詢 (內查詢) 在主查詢之前執行一次
• 子查詢的結果被用於主查詢 (外查詢)
可以將子查詢放在許多的 SQL 子句中,包括:
• WHERE 子句
• HAVING 子句
• FROM 子句
2 使用子查詢
2.1 使用子查詢的原則
• 子查詢放在圓括號中。
• 將子查詢放在比較條件的右邊。
• 在單行子查詢中用單行運算子,在多行子查詢中用多行運算子。
2.1.1 示例
誰的薪水比Abel高。用內連線實現:
select em.last_name,em.salary from employees abel,employees em
where abel.last_name = 'Abel' and em.salary > abel.salary;
用子查詢實現:
select em.last_name,em.salary from employees em where em.salary >(
select m.salary from employees m where m.last_name ='Abel');
3 子查詢的型別
• 單行子查詢:子查詢語句只返回一行的查詢
• 多行子查詢:子查詢語句返回多行的查詢
3.1 單行子查詢
• 僅返回一行
• 使用單行比較符
主查詢對子查詢結果的單行比較運算子:
3.1.1 示例一
顯示那些 job ID 與僱員 141 相同的僱員的名字與 job ID。
select em.last_name,em.job_id from employees em where em.job_id = (
select job_id from employees e where e.employee_id = 141);
3.1.2 示例二
顯示 job ID 與僱員 141 相同,並且薪水 高於僱員 143 的那些僱員。
select e.last_name,e.job_id,e.salary from employees e where e.job_id = (
select em.job_id from employees em where em.employee_id = 141) and e.salary > (
select emp.salary from employees emp where emp.employee_id = 143);
3.2 在子查詢中使用組函式
在子查詢中也可使用組函式。
3.2.1 示例
顯示所有其薪水等於最低薪水的僱員的 last name、job ID 和 salary。
select em.last_name,em.job_id,em.salary from employees em
where em.salary =(select min(salary) from employees);
3.3 帶子查詢的 HAVING 子句
可以在 WHERE 子句中使用子查詢,也可以在 HAVING 子句中使用子查詢。
3.3.1 示例
顯示所有其最低薪水大於 部門 50 的最低薪水的部門號和最低薪水。
select em.department_id,min(em.salary) from employees em group by em.department_id having min(em.salary) > (
select min(e.salary) from employees e where e.department_id = 50);
3.4 什麼是子查詢錯誤?
子查詢錯誤:使用子查詢的一個常見的錯誤是單行子查詢返回了多行。
3.5 多行子查詢
• 返回多於一行
• 使用多行比較符
主查詢對子查詢的多行比較運算子
操作 | 含義 |
---|---|
in | 等於列表中的任何成員 |
any | 比較子查詢返回的每一個值 |
all | 比較子查詢返回的全部值 |
在條件中也可使用 NOT 取反。
3.6 在多行子查詢中使用 IN 運算子
3.6.1 示例
查詢各部門收入為部門最低的那些僱員。顯示他們的名字,薪水以及部門 ID。
select e.last_name,e.department_id,e.salary from employees e where e.salary in(
select min(em.salary) from employees em group by em.department_id);
3.7 在多行子查詢中使用 ANY 運算子
< ANY 意思是小於最大值。 >ANY 意思是大於最小值。
3.7.1 示例
顯示工作崗位不是 IT_PROG 的僱員,並且這些僱員的的薪水少於 IT_PROG 工作崗位的僱員的 ID、名字、工作崗位和薪水。
select e.employee_id,e.last_name,e.job_id,e.salary from employees e where e.job_id <> 'IT_PROG' and e.salary < any (
select em.salary from employees em where em.job_id = 'IT_PROG') ;
3.8 在多行子查詢中使用 ALL 運算子
<ALL 意思是小於最小值。>ALL 意思是大於最大值。
ANY 與 ALL 的區別:
ANY: >ANY 表示至少大於一個值,即大於最小值。
ALL: >ALL 表示大於每一個值,既大於最大值。
3.8.1 示例
顯示那些薪水低於工作崗位 IT_PROG 的最低薪水,並且工作崗位不是 IT_PROG 的所有僱員。
4 子查詢小結練習
4.1 寫一個查詢顯示與 Zlotkey 在同一部門的僱員的 last name
和 hire date,結果中不包括 Zlotkey。
select em.last_name,em.hire_date from employees em where em.department_id = (
select e.department_id from employees e where e.last_name = 'Zlotkey');
4.2 建立一個查詢顯示所有其薪水高於平均薪水的僱員的僱員號和名字。按薪水的升序排序。
select em.employee_id,em.last_name from employees em where em.salary > (
select avg(salary) from employees) order by em.salary;
4.3 寫一個查詢顯示所有工作在有任一僱員的名字中包含一個 u的部門的僱員的僱員號和名字。
select e.employee_id,e.last_name from employees e where e.department_id in(
select em.department_id from employees em where em.last_name like '%u%');
4.4 顯示所有部門地點號 (department location ID ) 是 1700的僱員的 last name、department number 和 job ID。
select em.last_name,em.department_id,em.job_id from employees em where em.department_id in(
select d.department_id from departments d where d.location_id = 1700);
4.5 顯示每個向 King 報告的僱員的名字和薪水。
select e.last_name,e.salary from employees e where e.manager_id in(
select em.employee_id from employees em where em.last_name = 'King');
4.6 顯 示 在 Executive 部 門 的 每 個 僱 員 的 department number、last name 和 job ID。
select em.department_id,em.last_name,em.job_id from employees em where em.department_id = (
select d.department_id from departments d where d.department_name ='Executive');
4.7 查詢顯示所有收入高於平均薪水並且工作在有任一僱員的名字中帶有一個 u 的部門的僱員的 employee numbers、last、names 和 salaries。
select emp.employee_id,emp.last_name,emp.salary from employees emp where emp.salary > (
select avg(salary) from employees) and emp.department_id in(
select em.department_id from employees em where em.last_name like '%u%');
相關文章
- MySQL學習(三) SQL基礎查詢MySql
- 【學習】SQL基礎-007-子查詢SQL
- 資料庫高階查詢之子查詢資料庫
- 【學習】SQL基礎-006-多表連線查詢SQL
- SQL查詢語句 (Oracle)SQLOracle
- SQL學習(三) 複雜查詢SQL
- MySQL入門系列:查詢簡介(五)之子查詢MySql
- 多表聯合查詢 - 基於註解SQLSQL
- SQL的基礎查詢案例SQL
- 【SQL】Oracle查詢轉換之 OR用法SQLOracle
- oracle學習筆記(十一) 高階查詢Oracle筆記
- 關於oracle的空間查詢Oracle
- 關於MySQL8的WITH查詢學習MySql
- .Net 下 Solr 入門學習系列(四)Solr查詢引數整理Solr
- 資料庫學習(四)連線查詢資料庫
- Sql介紹 與 Sql基礎查詢SQL
- 【SQL】Oracle查詢轉換之物化檢視查詢重寫SQLOracle
- ORACLE_OCP之SQL_子查詢OracleSQL
- 查詢oracle正在執行的SQL和事務OracleSQL
- SQL查詢的:子查詢和多表查詢SQL
- Oracle總結【SQL細節、多表查詢、分組查詢、分頁】OracleSQL
- 查詢Oracle正在執行的sql語句及執行該語句的使用者OracleSQL
- go 連線資料庫 - GORM學習 - sql查詢Go資料庫ORMSQL
- SQL-基礎語法 - 條件查詢 - 模糊查詢SQL
- 【SQL】Oracle查詢轉換之謂詞推送SQLOracle
- Oracle常用抓取SQL-標量子查詢等OracleSQL
- SQL基礎的查詢語句烈鉍SQL
- SQL語言基礎(子查詢)SQL
- 查詢使用者登入資訊sqlSQL
- 基於聯合查詢的注入
- sql查詢入門練習題SQL
- 《MySQL 基礎篇》四:查詢操作MySql
- oracle資料庫sql查詢檢視第二次查詢很慢Oracle資料庫SQL
- 【TUNE_ORACLE】列出有標量子查詢的SQL參考OracleSQL
- 【SQL】Oracle查詢轉換之檢視合併SQLOracle
- Oracle 查詢Oracle
- 快速學會慢查詢SQL排查SQL
- SQL Server實戰四:查詢資料庫的資料SQLServer資料庫