累计总和和窗口内的计算
发布时间:2025-06-24 19:35:40 作者:北方职教升学中心 阅读量:412
示例:
-- 返回每个员工的下一个和上一个薪资SELECTemployee_id,salary,LEAD(salary,1)OVER(ORDERBYsalary DESC)ASnext_salary,LAG(salary,1)OVER(ORDERBYsalary DESC)ASprevious_salaryFROMemployees;
解释:
LEAD(salary, 1) OVER (ORDER BY salary DESC)
:获取当前行之后 1 行的薪资。
9.4.2 刷新物化视图
示例:
-- 刷新物化视图BEGINDBMS_MVIEW.REFRESH('emp_mv');END;/
解释:
- 使用
DBMS_MVIEW.REFRESH
存储过程手动刷新物化视图。 TRUNC(salary, 0)
:将salary
截断到整数部分。- 更多高级函数:包括 XML 和 JSON 数据处理、
FLOOR(salary)
:将薪资向下取整到最接近的整数。示例:
-- 返回员工薪资的平方和平方根SELECTemployee_id,salary,POWER(salary,2)ASsquared_salary,SQRT(salary)ASsqrt_salaryFROMemployees;
解释:
POWER(salary, 2)
:计算salary
的平方。
7.3 MONTHS_BETWEEN()
功能: 返回两个日期之间的月份数。
1.5 LEAD() 和 LAG()
功能: LEAD() 用于访问当前行的下一行数据,LAG() 用于访问当前行的上一行数据。日期和时间函数、
示例:
-- 返回所有名字以“A”开头的员工SELECTfirst_nameFROMemployeesWHEREREGEXP_LIKE(first_name,'^A.*');
解释:
REGEXP_LIKE(first_name, '^A.*')
:检查first_name
是否以字母“A”开头。示例:
-- 返回员工入职日期所在月份的最后一天的日期SELECThire_date,LAST_DAY(hire_date)ASlast_day_of_monthFROMemployees;
解释:
LAST_DAY(hire_date)
:返回hire_date
所在月份的最后一天。累计总和和窗口内的计算。示例:
-- 返回两个查询结果集的交集部分SELECTemployee_id,first_name,last_name FROMemployeesINTERSECTSELECTemployee_id,first_name,last_name FROMnew_employees;
解释:
INTERSECT
操作符返回两个查询结果集中的公共部分,即两个结果集都存在的行。示例:
-- 返回第一个查询结果集中不包含在第二个查询结果集中的部分SELECTemployee_id,first_name,last_name FROMemployeesMINUSSELECTemployee_id,first_name,last_name FROMnew_employees;
解释:
MINUS
操作符返回第一个结果集中存在但第二个结果集中不存在的行。9.2.1 JSON_VALUE()
功能: 提取 JSON 数据中的单个值。
示例:
-- 返回员工名字中第一个小写字母“a”出现的位置SELECTfirst_name,REGEXP_INSTR(first_name,'a')ASpositionFROMemployees;
解释:
REGEXP_INSTR(first_name, 'a')
:返回字符串中第一个小写字母“a”出现的位置。
9.1.3 XMLAGG()
功能: 将多个 XML 元素聚合成一个 XML 文档。正则表达式函数
正则表达式函数用于对字符串进行模式匹配和处理。集合操作符
集合操作符用于合并、比较和排除重复项,帮助进行集合间的操作。
示例:
-- 返回员工入职日期之后的第一个星期一的日期SELECThire_date,NEXT_DAY(hire_date,'MONDAY')ASnext_mondayFROMemployees;
解释:
NEXT_DAY(hire_date, 'MONDAY')
:返回hire_date
日期之后的第一个星期一。日期和时间函数:提供了丰富的日期和时间处理能力,如
SYSDATE
,CURRENT_DATE
,ADD_MONTHS()
,MONTHS_BETWEEN()
,NEXT_DAY()
, 和LAST_DAY()
,用于计算和格式化日期和时间。
四、分组以及生成序列等,帮助用户在数据集内进行深度分析和排序。
LOG(salary)
:计算salary
的自然对数。平均值以及前后行的值。一、
示例:
-- 聚合员工名字为一个逗号分隔的字符串SELECTdepartment_id,LISTAGG(first_name,', ')WITHINGROUP(ORDERBYfirst_name)ASall_namesFROMemployeesGROUPBYdepartment_id;
解释:
LISTAGG(first_name, ', ') WITHIN GROUP (ORDER BY first_name)
:将first_name
聚合为一个逗号分隔的字符串,并按first_name
排序。示例:
-- 创建 XML 元素SELECTXMLELEMENT("employee",XMLFOREST(employee_id AS"id",first_name AS"first_name",last_name AS"last_name"))FROMemployees;
解释:
XMLELEMENT()
创建一个 XML 元素,可以用来生成 XML 数据。示例:
-- 对员工入职日期进行四舍五入和截断操作SELECThire_date,ROUND(hire_date,'MONTH')ASrounded_date,TRUNC(hire_date,'MONTH')AStruncated_dateFROMemployees;
解释:
ROUND(hire_date, 'MONTH')
:将hire_date
四舍五入到所在月份的第一天。示例:
-- 返回员工入职日期和当前日期之间的月份数SELECThire_date,MONTHS_BETWEEN(SYSDATE,hire_date)ASmonths_diffFROMemployees;
解释:
MONTHS_BETWEEN(SYSDATE, hire_date)
:计算当前日期和hire_date
之间的月份数。
5.4 REGEXP_REPLACE
功能: 将字符串中匹配正则表达式模式的部分替换为指定的字符串。
示例:
-- 合并两个查询的结果集,去除重复行SELECTemployee_id,first_name,last_name FROMemployeesUNIONSELECTemployee_id,first_name,last_name FROMnew_employees;
解释:
UNION
操作符将两个查询的结果集合并在一起,并自动去除重复的行。递归部分选择每个员工的下属,并增加层级。示例:
-- 将员工名字中的小写字母“a”替换为大写字母“A”SELECTfirst_name,REGEXP_REPLACE(first_name,'a','A')ASnew_nameFROMemployees;
解释:
REGEXP_REPLACE(first_name, 'a', 'A')
:将名字中的所有小写字母“a”替换为大写字母“A”。- 递归查询:允许对层次结构数据进行递归处理,适用于树形数据的查询和分析。
9.2 JSON 函数
功能: 用于处理 JSON 数据。以下是一些补充的高级函数和功能,涵盖了更多的应用场景和需求:
九、
8.6 ROUND() 和 TRUNC()
功能: ROUND
() 和 TRUNC() 函数用于对数值进行四舍五入和截断操作。
示例:
-- 返回员工名字中符合正则表达式模式的子串SELECTfirst_name,REGEXP_SUBSTR(first_name,'[A-Z][a-z]*')ASsubstringFROMemployees;
解释:
REGEXP_SUBSTR(first_name, '[A-Z][a-z]*')
:返回名字中匹配大写字母开头跟随小写字母的子串。- 集合操作符:支持对多个查询结果进行合并、
9.4.1 创建物化视图
示例:
-- 创建物化视图CREATEMATERIALIZED VIEWemp_mvBUILD IMMEDIATEREFRESH FAST ONCOMMITASSELECT*FROMemployees;
解释:
CREATE MATERIALIZED VIEW
创建一个物化视图emp_mv
,并定义了即时构建和提交时快速刷新策略。
1.4 NTILE()
功能: 将结果集分成指定数量的组,并为每一行分配组编号。
9.2.3 JSON_TABLE()
功能: 将 JSON 数据映射到关系表中。
9.4 物化视图(Materialized View)
功能: 存储查询结果以提高查询性能。
示例:
-- 按部门计算每个员工的最低和最高薪资SELECTdepartment_id,employee_id,salary,MIN(salary)OVER(PARTITIONBYdepartment_id)ASdept_min_salary,MAX(salary)OVER(PARTITIONBYdepartment_id)ASdept_max_salaryFROMemployees;
解释:
MIN(salary) OVER (PARTITION BY department_id)
:按部门计算最低薪资。例如,如果前两名都是 1,那么第三名将是 2,而不是 3。
6.2 SUBSTR()
功能: 截取字符串的一部分。
集合操作符:用于处理和组合多个查询结果,如
UNION
,INTERSECT
,MINUS
,帮助用户合并、
6.4 LENGTH()
功能: 返回字符串的长度。
1.3 ROW_NUMBER()
功能: 为查询结果中的每一行分配一个唯一的序号,从 1 开始。