SQL语言之子查询(Oracle)
子查詢(內(nèi)查詢)
一個select語句嵌套在另一個select語句中的子句;
例
可以用組合兩個查詢的方法解決這個問題,放置一個查詢到另一個查詢中。內(nèi)查詢或子查詢返回一個值給外查詢或主查詢。使用一個子查詢相當(dāng)于執(zhí)行兩個連續(xù)查詢并且用第一個查詢的結(jié)果作為第二個查詢的搜索值;
一、子查詢語法
?子查詢(內(nèi)查詢)在主查詢之前執(zhí)行一次;
?子查詢的結(jié)果被用于主查詢(外查詢);
?可以將子查詢放在許多SQL子句中,包括:where子句、having子句、from子句;
二、 使用子查詢
?原則
1.子查詢放在圓括號中;
2.將子查詢放在比較條件的右邊;
3.在單行子查詢中用單行運算符,在多行子查詢中用多行運算符;
(以hr用戶中的employees為例)
例
誰的薪水比abel高; 1.用內(nèi)連接實現(xiàn); Select eh.last_name,eh.salary from employees ea , employees eh where lower(ea.last_name)=’abel’ and ea.salary < eh.salary; 2.用子查詢實現(xiàn); select eh.last_name,eh.salary from employees eh where eh.salary > (Select salary from employees ea where lower(ea.last_name) = ‘a(chǎn)bel’);三、 子查詢的類型
?單行子查詢
1.子查詢語句只返回一行的查詢;
2.使用單行比較符;
3.主查詢對子查詢結(jié)果的單行比較運算符如下:
(以hr用戶中的employees為例)
例
一、顯示那些 job ID與雇員141 相同的雇員的名字與job ID; select e.last_name , e.job_id from employees e where e.job_id = (Select job_id from employees ea where ea.employee_id = 141); 二、顯示 job ID與雇員141 相同,并且薪水高于雇員143的那些雇員; select e.last_name , e.job_id , e.salary from employees e where e.job_id = (Select job_id from employees ea where ea.employee_id = 141) and e.salary > (select salary from employees eb where eb.employee_id = 143);?在子查詢中使用組函數(shù)
(以hr用戶中的employees為例)
例
顯示所有其薪水等于最低薪水的雇員的 last name、job ID 和 salary。 select e.last_name , e.job_id , e.salary from employees e where e.salary = (Select min(salary) from employees em) ;?帶子句查詢的having子句
可以在where子句中使用子查詢,也可以在having子句中使用子查詢;
(以hr用戶中的employees為例)
例
顯示所有其最低薪水大于部門 50 的最低薪水的部門號和最低薪水;select e.department_id , min(salary) from employees e group by department_id having min(salary) > (Select min(salary) from employees em where em.department_id = 50);?子查詢錯誤
使用子查詢的一個常見的錯誤是單行子查詢返回了多行;
?多行子查詢
1.返回多于一行;
2.使用多行比較符;
3.主查詢對于子查詢的多行比較運算符如下:
在條件中也可以使用not取反;
?在多行子查詢中使用in運算符
(以hr用戶中的employees為例)
例
查找各部門收入為部門最低的那些雇員。顯示他們的名字,薪水以及部門ID;select e.last_name , e.salary , e.department_id from employees e where e.salary in (Select min(em.salary) from employees em where em.department_id = e.department_id group by em.department_id) or e.department_id is null;?在多行子查詢中使用any運算符
1.小于any:小于其中的最大值;
2.大于any:大于其中的最小值;
(以hr用戶中的employees為例)
例
顯示工作崗位不是 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 salary from employees em where em.job_id = ‘IT_PROG’;)?在多行子查詢中使用all運算符
1.小于all:小于其中的最小值;
2.大于all:大于其中的最大值;
3.Any與all的區(qū)別
?Any:大于any表示至少大于一個值,即大于對最小值;
?All:大于all表示大于每一個值,即大于最大值;
(以hr用戶中的employees為例)
例
顯示那些薪水低于工作崗位 IT_PROG 的最低薪水,并且工作崗位不是 IT_PROG的所有雇員。 Select e.last_name, e.salary from employees e where e.salary < all(Select em.salary from employees em where em.job_id = ‘IT_PROG’) and e.job_id != ‘IT_PROG’; 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的SQL语言之子查询(Oracle)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL语言之组函数(Oracle)
- 下一篇: SQL语言之操作数据(Oracle)