目錄
1.聚合函數
2.COUNT(1)&COUNT(*)&COUNT(字段)區別(面試常問)
3.分組聚合——group by
4.去重:DISTINCT?、GROUP?BY
5.聚合函數的過濾HAVING
6.oracle中having與where的區別 ?(面試常問)
7.ROUND與TRUNC函數
8.ROLLUP上卷與CUBE各維度匯總
9.子查詢
單行子查詢案例:
多行子查詢案例:
1.聚合函數
聚合函數:可以同時對多行進行操作,并返回一個結果
聚合函數有:
(1)avg(x):返回x的平均值;
(2)count(x):查詢返回的行數;
(3)max(x):返回x的最大值;
(4)min(x):返回x的最小值;
(5)median(x):返回x的中位數;
(6)sum(x):返回x的和;
2.COUNT(1)&COUNT(*)&COUNT(字段)區別(面試常問)
COUNT(1)&COUNT(*) 都是統計行數 得到的結果都是一樣的
但是 COUNT(1) 比 COUNT(*) 性能要好一點,因為COUNT(*)需要先得到表的字段信息然后再計數。
而COUNT(1)相當于新增一列,然后對該列進行直接計數。
COUNT(字段)是統計該字段非空的行數(不把為空的行統計進去)
3.分組聚合——group by
分組的情況下,group by后面有什么字段,select 才可以查對應的字段
4.去重:DISTINCT?、GROUP?BY
特性 | DISTINCT | GROUP BY |
---|---|---|
主要用途 | 去除查詢結果中的重復行 | 對數據進行分組并允許使用聚合函數 |
是否可與聚合函數一起使用 | 不可以 | 可以 |
對輸出的影響 | 返回去重后的結果集 | 根據分組條件返回每組的匯總信息 |
性能考慮 | 對于簡單去重操作較為直接有效 | 更適合需要匯總、統計等復雜查詢 |
示例 | SELECT DISTINCT department_id FROM employees; | SELECT department_id, COUNT(*) FROM employees GROUP BY department_id; |
5.聚合函數的過濾HAVING
HAVING必須和group by 配合使用,且having必須在group by后面
HAVING?關鍵字和 WHERE?關鍵字都可以用來過濾數據,
且 HAVING?支持 WHERE?關鍵字中所有的操作符和語法。
注意:使用聚合函數之前盡量先用where進行過濾,先過濾再分組
? ? ? ? ? ?避免查*,用到哪些字段就查詢哪些字段??????????
6.oracle中having與where的區別 ?(面試常問)
- where?不能放在 group?by?的后面
- HAVING?是跟 GROUP?BY?連在一起用的,放在 GROUP?BY?后面,此時的作用相當于WHERE
- WHERE?后面的條件中不能有聚合函數,比如 SUM()、AVG()等,而 HAVING?可以
示例1:找出部門平均薪資大于1000 并且 部門編號不為10的 部門和部門平均薪資
select?deptno,avg(sal) avg_sal
from?emp
where?deptno<>10
group?by?deptno
having?avg(sal)>1000;
7.ROUND與TRUNC函數
ROUND(x,y)--四舍五入至y位小數
ROUND(x)--四舍五入至整數
TRUNC(x,y)--根據指定的小數位數截斷數值(不進行四舍五入)。
8.ROLLUP上卷與CUBE各維度匯總
特性 | ROLLUP(job, deptno) | CUBE(job, deptno) |
---|---|---|
匯總層級 | 層次化匯總 | 所有可能組合 |
包含哪些分組 | (job, deptno), (job), () | (job, deptno), (job), (deptno), () |
是否包含部門小計 | ? 不包含只按部門的小計 | ? 包含 |
結果行數 | 較少 | 更多 |
9.子查詢
--單行子查詢,返回的結果里只有一條數據????????????????SELECT?COUNT(1) FROM?EMP;
--多行子查詢,返回的結果集里有多條數據????????????????SELECT?ENAME FROM?EMP;?
單行子查詢案例:
示例:查詢EMP,找出哪些人薪資比SCOTT用戶高
SELECT SAL
FROM EMP
WHERE ENAME = 'SCOTT';
--
SELECT ENAME
FROM EMP
WHERE SAL > 3000;
--
SELECT ENAME
FROM EMP
WHERE SAL > (SELECT SALFROM EMPWHERE ENAME = 'SCOTT');
多行子查詢案例:
示例:在10 和 20 部門中找出工作崗位和30部門中存在的任意一個崗位相同的員工的信息
SELECT DISTINCT JOB
FROM EMP
WHERE DEPTNO = 30;SELECT *
FROM EMP
WHERE DEPTNO IN (10, 20)AND JOB IN (SELECT DISTINCT JOBFROM EMPWHERE DEPTNO = 30);