Day 04 函数的高级特性

本文主要介绍了函数的高级特性,包括迭代的基本概念及其实现方式,如何判断对象是否可迭代,并通过示例展示了如何使用列表生成式计算1到10的平方数及偶数的平方。

函数的高级特性

1.迭代

可以通过 for 循环来遍历这个 list 或 tuple,这种遍历我们称为迭代(Iteration)只要是可迭代对象,无论有无下标,都可以迭代,比如 dict就可以迭代:

2.判断一个对象是否可以迭代,方法是通过 collections 模块的 Iterable 类型判断

3.迭代的实现

打印1-10的平方数

4.列表生成式

利用列表生成式计算1-10的平方

计算1-10偶数的平方


<think> 我们正在讨论Oracle数据库的特性函数。根据引用[2]的内容,Oracle提供了多种高级函数和功能,包括分析函数、窗口函数、集合操作符、递归查询、正则表达式函数等。此外,常规的字符串函数、日期时间函数、数学函数也是其重要组成部分。 下面我将详细列举Oracle数据库的特性函数类别,并给出每个类别的典型函数示例和简要说明。这些内容参考了引用[2]的描述,并结合了Oracle 19c的常见功能。 ### 1. 分析函数与窗口函数 分析函数和窗口函数用于在数据集的子集(窗口)上执行计算,而不影响原始查询结果集。它们常用于排名、累计计算、移动平均等场景。 - **ROW_NUMBER()**: 为分区内的每一行分配唯一的序号(从1开始) ```sql SELECT emp_name, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) as rank FROM employees; ``` - **RANK()**: 计算排名,相同值会获得相同排名且跳过后续序号(如1,2,2,4) - **SUM() OVER()**: 计算分区内的累计总和 ```sql SELECT order_date, revenue, SUM(revenue) OVER (ORDER BY order_date) AS cumulative_revenue FROM sales; ``` - **LAG()/LEAD()**: 访问分区内前一行/后一行的数据 ```sql SELECT emp_name, hire_date, LAG(hire_date) OVER (ORDER BY hire_date) AS prev_hire_date FROM employees; ``` ### 2. 集合操作符 集合操作符用于组合多个SELECT语句的结果集,类似于集合运算。 - **UNION/UNION ALL**: 合并两个结果集(UNION去重,UNION ALL保留重复) - **INTERSECT**: 返回两个结果集的交集 - **MINUS**: 返回第一个结果集有而第二个结果集没有的记录 示例: ```sql SELECT dept_id FROM employees WHERE salary > 10000 UNION SELECT dept_id FROM departments WHERE location = 'New York'; ``` ### 3. 递归查询 通过`WITH`子句实现递归查询,常用于处理层次结构数据(如组织结构、菜单树)。 示例(查询员工及其所有下属): ```sql WITH emp_tree(emp_id, manager_id, level) AS ( SELECT emp_id, manager_id, 1 FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.emp_id, e.manager_id, et.level + 1 FROM employees e JOIN emp_tree et ON e.manager_id = et.emp_id ) SELECT * FROM emp_tree; ``` ### 4. 正则表达式函数 Oracle提供完整的正则表达式支持,用于复杂字符串匹配和处理。 - **REGEXP_LIKE()**: 检查字符串是否匹配正则模式 ```sql SELECT emp_name FROM employees WHERE REGEXP_LIKE(emp_name, '^J.*n$'); ``` - **REGEXP_SUBSTR()**: 提取匹配的子字符串 - **REGEXP_REPLACE()**: 替换匹配的子字符串 - **REGEXP_COUNT()**: 统计匹配次数 ### 5. 字符串、日期与数学函数 这些基础函数在数据处理中必不可少。 **字符串函数**: - `INSTR('Oracle','a')` → 返回2('a'首次出现位置) - `SUBSTR('Database',2,4)` → 'ata' - 引用[3]中的示例:统计子串出现次数 ```sql SELECT (LENGTH('huangbaokang') - LENGTH(REPLACE('huangbaokang','ang','')) ) / LENGTH('ang') FROM dual; ``` **日期函数**: - `ADD_MONTHS(SYSDATE, 3)` → 当前日期加3个月 - `MONTHS_BWEEN(date1, date2)` → 计算两个日期间的月份差 - `TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')` → 格式化日期 **数学函数**: - `ROUND(123.456, 2)` → 123.46 - `MOD(10, 3)` → 1(取余) - `POWER(2, 3)` → 8(幂运算) ### 6. 其他高级功能 - **JSON函数**:Oracle 12c+支持JSON数据操作,如`JSON_VALUE()`, `JSON_QUERY()` - **XML函数**:处理XML数据,如`XMLTYPE`, `EXTRACTVALUE` - **聚合函数增强**:`LISTAGG()`将多行合并为单行字符串 ```sql SELECT dept_id, LISTAGG(emp_name, ',') WITHIN GROUP (ORDER BY emp_name) AS employees FROM employees GROUP BY dept_id; ``` 以上函数覆盖了Oracle数据库的核心特性功能,适用于复杂数据分析、报表生成和业务逻辑处理。更多细节可参考官方文档或《Oracle从入门到精通(第5版)》[^1]。 §§相关问题§§ 1. 如何利用Oracle分析函数计算移动平均值? 2. Oracle递归查询在实际业务中的典型应用场景有哪些? 3. LISTAGG函数在合并字符串时如何避免长度超限错误? </think> ### Oracle数据库特性函数详解 Oracle提供丰富的特性函数,涵盖数据分析、文本处理、集合操作等场景。以下分类整理核心特性函数(基于Oracle 19c),结合引用[2]的高级功能描述及实际应用示例: --- #### 一、分析函数与窗口函数 用于分区计算和跨行数据分析(引用[2]): 1. **排名函数** - `ROW_NUMBER()`:分区内唯一序号 ```sql SELECT emp_id, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank FROM employees; ``` - `RANK()`/**`DENSE_RANK()`**:处理并列排名(是否跳过序号) 2. **聚合分析函数** - **累计计算**: ```sql SELECT order_date, revenue, SUM(revenue) OVER (ORDER BY order_date) AS cumulative_revenue FROM sales; ``` - **移动平均**: ```sql AVG(revenue) OVER (ORDER BY order_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) ``` --- #### 二、高级文本处理函数 1. **正则表达式函数**(引用[2]) - `REGEXP_SUBSTR()`:提取匹配子串 ```sql SELECT REGEXP_SUBSTR(phone, '\d{3}-\d{4}') AS short_phone FROM contacts; ``` - `REGEXP_REPLACE()`:模式替换 - `REGEXP_COUNT()`:统计匹配次数 2. **字符串操作增强** - 子串出现次数计算(引用[3]示例): ```sql SELECT (LENGTH('huangbaokang') - LENGTH(REPLACE('huangbaokang','ang',''))) / LENGTH('ang') FROM dual; -- 返回2 ``` - `LISTAGG()`:多行合并为分隔字符串 ```sql SELECT dept_id, LISTAGG(emp_name, ',') WITHIN GROUP (ORDER BY hire_date) AS team FROM employees GROUP BY dept_id; ``` --- #### 三、层次查询与递归 处理树形结构数据(引用[2]): ```sql WITH org_tree (employee_id, manager_id, level) AS ( SELECT employee_id, manager_id, 1 FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.employee_id, e.manager_id, ot.level + 1 FROM employees e JOIN org_tree ot ON e.manager_id = ot.employee_id ) SELECT * FROM org_tree; -- 生成组织层级树 ``` --- #### 四、集合操作符 合并/比较查询结果(引用[2]): - **`UNION`** / **`UNION ALL`**:结果集并集 - **`INTERSECT`**:结果集交集 - **`MINUS`**:结果集差集 ```sql SELECT product_id FROM orders_2023 MINUS SELECT product_id FROM orders_2022; -- 找出2023年新增商品 ``` --- #### 五、日期与数值函数 1. **日期函数** - `EXTRACT()`:提取日期部件(年/月/日) ```sql SELECT EXTRACT(YEAR FROM hire_date) AS hire_year FROM employees; ``` - `MONTHS_BETWEEN()`:计算月份差 - `NEXT_DAY()`:下周指定星期几的日期 2. **数值函数** - `ROUND()`/`TRUNC()`:舍入与截断 - **`MOD()`**:取模运算 - `RATIO_TO_REPORT()`:计算占比 --- #### 六、特殊功能函数 1. **`NVL()`/`COALESCE()`**:空值处理 2. **`DECODE()`**:条件分支(简易CASE) ```sql SELECT DECODE(status, 1, 'Active', 0, 'Inactive', 'Unknown') FROM users; ``` 3. **`PIVOT`/`UNPIVOT`**:行列转换 > 完整函数列表可参考《Oracle从入门到精通(第5版)》第6章 SQL语言基础[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值