根据父类id查询所有的父级_031、组函数和子查询
1.組函數(聚合函數)
(1)組函數介紹
組函數操作行集,給出每組的結果。組函數不象單行函數,組函數對行的集合進行操作,
對每組給出一個結果。這些集合可能是整個表或者是表分成的組。
組函數與單行函數區別
單行函數對查詢到每個結果集做處理,而組函數只對分組數據做處理。
單行函數對每個結果集返回一個結果,而組函數對每個分組返回一個結果。
組函數的類型
? AVG 平均值
? COUNT 計數
? MAX 最大值
? MIN 最小值
? SUM 合計
組函數的語法
使用組函數的原則
? 用于函數的參數的數據類型可以是 CHAR、VARCHAR2、NUMBER 或 DATE。
? 所有組函數忽略空值。為了用一個值代替空值,用 NVL、NVL2 或 COALESCE 函數。
(2)組函數的使用 AVG 和 SUM 函數
AVG(arg)函數:對分組數據做平均值運算。
arg:參數類型只能是數字類型。
SUM(arg)函數:對分組數據求和。
arg:參數類型只能是數字類型。
示例:求雇員表中的的平均薪水與薪水總額。
select avg(salary) ,sum(salary) from employees;使用 MIN 和 MAX 函數
MIN(arg)函數:求分組中最小數據。
arg:參數類型可以是字符、數字、日期。
MAX(arg)函數:求分組中最大數據。
arg:參數類型可以是字符、數字、日期。
示例 :求雇員表中的最高薪水與最低薪水。
select min(salary),max(salary) from employees;使用 COUNT 函數
COUNT 函數:返回一個表中的行數。
COUNT 函數有三種格式:
? COUNT(*)
? COUNT(expr)
? COUNT(DISTINCT expr)
COUNT(*) :
返回表中滿足 SELECT 語句標準的行數,包括重復行,包括有空值列的行。如果WHERE 子句包括在 SELECT 語句中,COUNT(*) 返回滿足 WHERE 子句條件的行數。
示例:返回查詢結果的總條數。
select count(*) from employees;COUNT(expr)函數 :
返回在列中的由 expr 指定的非空值的數。
示例:顯示部門 80 中有傭金的雇員人數。
select count(commission_pct) from employees e where e.department_id = 80;COUNT(DISTINCT expr):
使用 DISTINCT 關鍵字禁止計算在一列中的重復值。
示例:顯示 EMPLOYEES 表中不重復的部門數。
select count(distinct department_id) from employees ;組函數和 Null 值
所有組函數忽略列中的空值。
在組函數中使用 NVL 函數來處理空值。
示例:計算有傭金的員工的傭金平均值。
select avg(commission_pct) from employees;2.創建數據組(GROUP BY)
什么是創建數據組
可以根據需要將查詢到的結果集信息劃分為較小的組,用 GROUP BY 子句實現。
GROUP BY 子句語法
GROUP BY 子句:GROUP BY 子句可以把表中的行劃分為組。然后可以用組函數返回
每一組的摘要信息。
使用分組原則
? 如果在 SELECT 子句中包含了組函數,就不能選擇單獨的結果,除非單獨的列出現在 GROUP BY 子句中。如果未能在 GROUP BY 子句中包含一個字段列表,你會收到一個錯誤信息。
? 使用 WHERE 子句,你可以在劃分行成組以前過濾行。
? 在 GROUP BY 子句中必須包含列。
? 在 GROUP BY 子句中你不能用列別名。
? 默認情況下,行以包含在 GROUP BY 列表中的字段的升序排序。可以用 ORDER BY子句覆蓋這個默認值。
GROUP BY 子句的使用
我們可以根據自己的需要對數據進行分組,在分組時,只要將需要做分組的列的列名添
加到 GROUP BY 子句后側就可以。GROUP BY 列不必在 SELECT 列表中。
示例:求每個部門的平均薪水。
select department_id , avg(salary) from employees e group by e.department_id;GROUP BY 子句的執行順序
先進行數據查詢,在對數據進行分組,然后執行組函數。
非法使用 Group 函數的查詢
? 在 SELECT 列表中的任何列必須在 GROUP BY 子句中。
? 在 GROUP BY 子句中的列或表達式不必在 SELECT 列表中。
約束分組結果
HAVING 子句 的概念
HAVING 語句通常與 GROUP BY 語句聯合使用,用來過濾由 GROUP BY 語句返回的記錄集。
HAVING 語句的存在彌補了 WHERE 關鍵字不能與聚合函數聯合使用的不足。
HAVING 子句語法
示例:顯示那些最高薪水大于 $10,000 的部門的部門號和最高薪水。
select e.department_id,max(e.salary) from employees e group by e.department_id having max(e.salary) > 10000;查詢那些最高薪水大于 $10,000 的部門的部門號和平均薪水。
select e.department_id,avg(e.salary) from employees e group by e.department_id having max(e.salary) > 10000;嵌套組函數
在使用組函數時我們也可以根據需要來做組函數的嵌套使用。
示例 :顯示部門中的最大平均薪水。
select max(avg(e.salary)) from employees e group by e.department_id;3.子查詢
子查詢介紹
子查詢是一個 SELECT 語句,它是嵌在另一個 SELECT 語句中的子句。
子查詢語法
? 子查詢 (內查詢) 在主查詢之前執行一次
? 子查詢的結果被用于主查詢 (外查詢)
可以將子查詢放在許多的 SQL 子句中,包括:
? WHERE 子句
? HAVING 子句
? FROM 子句
使用子查詢的原則
? 子查詢放在圓括號中。
? 將子查詢放在比較條件的右邊。
? 在單行子查詢中用單行運算符,在多行子查詢中用多行運算符。
示例:誰的薪水比 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');子查詢的類型
? 單行子查詢:子查詢語句只返回一行的查詢
? 多行子查詢:子查詢語句返回多行的查詢
單行子查詢
? 僅返回一行
? 使用單行比較符
示例:顯示那些 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);示例:顯示 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);在子查詢中使用組函數
示例 :顯示所有其薪水等于最低薪水的雇員的 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);帶子查詢的 HAVING 子句
可以在 WHERE 子句中使用子查詢,也可以在 HAVING 子句中使用子查詢。
示例 :顯示所有其最低薪水小于 部門 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);什么是子查詢錯誤?
子查詢錯誤:使用子查詢的一個常見的錯誤是單行子查詢返回了多行。
多行子查詢
? 返回多于一行
? 使用多行比較符
主查詢對子查詢的多行比較運算符
在條件中也可使用 NOT 取反。
4.在多行子查詢中使用 IN 運算符
示例 :查找各部門收入為部門最低的那些雇員。顯示他們的名字,薪水以及部門 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);5.在多行子查詢中使用 ANY 運算符
< ANY 意思是小于最大值。 >ANY 意思是大于最小值。
示例
顯示工作崗位不是 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') ;6.在多行子查詢中使用 ALL 運算符
<ALL 意思是小于最小值。>ALL 意思是大于最大值。
ANY 與 ALL 的區別:
ANY: >ANY 表示至少大于一個值,即大于最小值。
ALL: >ALL 表示大于每一個值,既大于最大值。
總結
以上是生活随笔為你收集整理的根据父类id查询所有的父级_031、组函数和子查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis aof 备份和恢复_Redi
- 下一篇: 和gdi绘图效率比较_绘图计算器测评来袭