Oracle中复杂数据处理
利用聚合函数统计数据
求最大值-max()
max()可应用数值型和字符型和日期型(实质也是数值型)
select max(employee_age) max_age from employees
max()应用字符型时,会按照字母表有前之后的顺序进行排序,如果含有英文名,则英文名永远排在中文名之前
求最小值-min()
求平均值-avg()
avg()只能用于数值型
select avg(empaoyee_age) avg_age from employees
求和-sum()
统计记录数-count()
统计单列
select count(employee_name) count_name from employees
当统计的这列的某条数据为空时,count()不进行计数
统计所有列
count(*)、count(1)都是统计所有列。即使所有列值都为空,Oracle仍然进行计数
Oracle中的常用技巧
多值判断-decode()
语法:
decode(表达式,比较值1,结果值1,比较值2,结果值2,…,默认值)
decode()处理过程类似于解码过程,第一个参数表达式往往为变量或数据表中的列;其后的参数总以‘比较值-结果值’对的形式出现,表达式与‘比较值’进行比较,如果相等,返回相应的‘结果值’;如果所有比较都不,那么返回默认值
select employee_name,decode(sign(instr(employee_position,'工程师')),1,‘工程师’,‘行政管理部’) department from employees
sign(instr(employee_position,‘工程师’))获取工程师的位置并判断其正负性
空值处理-nvl()
nvl()判断表达式是否为空,如果为空则返回新值,不为空,返回原值
nvl(表达式,新值/表达式)
select nvl(sum(salary),0) total_salary from employees
结果集的行号-rownum()
select rownum from employees
rownum和order by 子句
首先利用内嵌视图获得排序之后的结果,然后对这个结果进行rownum()
select t.*,rownum from (select e.employee_id,employee_name from employee e order by e.employee_name) t where rownum<=3
rownum与比较运算符‘=’
select * from employees where rownum=1;
返回正确结果
select * from employees where rownum=4;
查询失败
因为rownum总是从1开始,那么rownum的返回值永远无法大于1。当Oracle遍历第一条数据时,rownum=1,但是whererownum=4,那么这条记录不再捕获范围内,当遍历第二条时,因为已捕获为0,所以rownum仍为1,以此类推,无论Oracle遍历多少数据,rownum总是为1,无法满足rownum=4。此时可以通过内嵌视图来解决
rownum与比较运算符‘>’
select * from employees where rownum=N;
当n>=1时,返回空,<1时,返回所有数据,原因与上一个同理
强制转换数据类型-cast()
cast(原数据 as 新的数据类型)
典型应用:利用一个已有表创建一个新表
create table t_salary as select cast(s.salary as varchar2(20)) salary_id,cast(employee_id as varchar2(20)) employee_id from salary s
数学运算(±*/)
无论操作数是何种数据类型,都将首先转换为数值型,然后才参与运算,当其中一个操作树null时,运算结果也为null。注意开发中要用nvl()来处理null的数据
逻辑运算
只要其中一个操作数为null,运算结果一定为假。即使null=null和null<>null,结果仍为假
按位运算
按位与
bitand()
如果数值参数不为整数,Oracle总是先将其转换为整数-转换规则为直接截取整数部分
列的乘积
因为标准sql并未对乘积提供专门的函数,但是乘积运算可以转换为指数运算eln18+eln19+eln15=e(ln12+ln19+ln15 ),sql如下:
select exp(ln(18)+ln(19)+ln(15)) result from dual
结果5130
select exp(ln(data)) result from 表名
这种情况只针对全部是正数的情况,其他情况不想写
Oracle中的特殊判式
between-范围测试
select * from employees where employee_age between 26 and 35
去年龄在26到35之间的数据,包含26和35
in-集合成员测试
in判式用于判断某个值或表达式的值是否处于某个集合之内
select employee_name from employees where employee_id in (select distinct employee_id from salary)
like-模糊匹配
匹配任意字符串-‘%’
select employee_name from employees where employee_name like '种%'
匹配单个字符-‘_’
select employee_name from employees where employee_name like '种_'
结果:钟强
多个’_'可以同时使用,以指定判式的字符串长度
select employee_name from employees where employee_name like '种__'
结果:钟晓平
判断匹配‘%’的值,需要转义
select 1 result from dual where '10%' like '%\%' escape '\'
结果:1
escape ''指定转义字符‘\’,like '%%'第一个%表示通配符,第二个%,表示原义字符%
is null -空值判断
Oracle不能用=判断是否为空,
is not null 判断不为空
exists-存在性判断
exists的操作对象是结果集,当结果集中的记录数大于0时,返回真,否则返回假
select * from employee e where exists(select 1 from salary s where s.employee_id=e.employee_id)
all,some,any-集合判断
获得年龄大于所有工程师的员工信息
select * from employees e where employee_age>all(select employee_age from employees where employee_position='工程师')
获取年龄大于任一位工程师的年龄,用some或any都可以。
select * from employees e where employee_age>any(select employee_age from employees where employee_position='工程师')
Oracle中的分析函数与窗口函数
排名函数
rank()的使用
按照年龄大小升序排列,每位员工的排名情况
select employee_name,employee_age,rank() over(order by employee_age) employee_position from employees
rank()排名具有跳跃性,,比如2个人的排名并列第二,那么下一个人的排名就是第四,rank()返回的排名也就是实际排名
dense_rank()的使用
dense_rank()排名没有跳跃性,其他和rank()相同
row_number()的使用
row_number()只是单纯的返回行号,没有排名功能
分区窗口
分区窗口是指与当前记录拥有相同的分区标准的所有记录,创建分区窗口的语法如下:
partition by 列名
partition by语句首先根据列名获取当前记录的列值,接着获取具有相同列值的所有记录,并将该记录集合作为当前记录窗口
select employee_name,employee_position,employee_age,avg(employee_age) over(partition by employee_position) avg_age from employees
获得员工姓名和年龄的同时,也获得该职位员工的平均年龄,可以使用分区窗口
在分区窗口中,同样可以进行排序,例如,在获得员工信息的同时,获得同职位中年龄大小排序的位置
select employee_name,employee_position,employee_age,dense——rank() over(partition by employee_position order by employee_age) position from employees
窗口子句
rows子句
rows的使用前提为,窗口已经用order by 排序
over(order by 列名 rows between 位移量 preceding and 位移量 following)
利用preceding向前追溯,利用following向后追溯
获取当前年龄和相邻的2位员工的年龄的总和
select employee_name,employee_position,employee_age, sum(employee_age) over(order by employee_age rows between 1 preceding and 1 following) sum_age from employees
range子句
rows子句以相对位置获取记录,而range子句以相对列值作为筛选记录
over(order by 列名 range between 差值 preceding and 差值 following)
利用preceding向前追溯,利用following向后追溯,追溯的范围为当前列值±差值
select employee_name,employee_position,employee_age, count(1) over(order by employee_age range between 1 preceding and 1 following) count from employees order by employee_age
获得与当前员工年龄相差1岁之内的员工数目
current row和unbounded
除了可以用确定的数值来限定窗口之外,还可以使用current row来指定当前记录,使用unbounded代替数值,表示不受限制的窗口范围
排序之后获取第一条记录至当前记录的窗口大小
select employee_name,employee_position,employee_age, count(1) over(order by employee_age rows between unbounded perceding and current row) count from employees order by employee_age
当然也可以对rows子句的前后位移均不进行限制。这样每条记录所获得的窗口均为表中的所有记录
select employee_name,employee_position,employee_age, count(1) over(order by employee_age rows between unbounded perceding and undounded following) count from employees order by employee_age
常用分析函数
first_value()
first_value()返回已排序窗口中第一条记录相关的信息
获得按照同龄人中,按姓名排序最前的员工
select employee_name,employee_age, first_value(employee_name) over(partition by employee_age order by employee_name) first_name from employees
last_value()
返回分区中最后一条记录
select employee_name,employee_age, first_value(employee_name) over(partition by employee_age order by employee_name rows between unbounded preceding and undounded following) first_name from employees
lag()
lag()以当前记录为坐标,按照特定位移向上搜索,并尝试捕获记录,语法如下:
lag(列名或列的表达式,位移,默认值)
列名或列的表达式针对捕获的记录,位移表示从当前行开始的偏移量,如果未捕获,则返回默认值
获取按姓名排序的前一位员工的信息
select employee_name,employee_age,lag(employee_name,1,'N/A') over(order by employee_age) lag_name lag(employee_age,1,null) over(order by employee_age) lag_age from employees
lead()
lead()和lag()一样,只不过lead()是想下偏移
Oracle中复杂数据处理的更多相关文章
- Oracle中的游标
Oracle游标 概念:内存中的一块区域,存放select结果 游标用来处理从数据库中检索的多行记录(使用SELECT语句).利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集.一.显示游标( ...
- Oracle中varchar,varchar2,nvarchar,nvarchar2的区别及其它数据类型描述
--varchar,varchar2 联系: 1.varchar/varchar2用于存储可变长度的字符串 比如varchar(20),存入字符串'abc',则数据库中该字段只占3个字节,而不是20个 ...
- Oracle中如何实现Mysql的两表关联update操作
在看<MySQL 5.1参考手册>的时候,发现MySQL提供了一种两表关联update操作.原文如下: UPDATE items,month SET items.price=month.p ...
- ORACLE中的LTRIM、RTRIM和TRIM
LTRIM.RTRIM和TRIM在ORACLE中的用法:1.LTRIM(C1,C2)其中C1和C2都可以字符串,例如C1是'Miss Liu',C2'MisL'等等.这是第一个和SQL SERVER不 ...
- oracle中临时表是用来做什么的
oracle中临时表是用来做什么的 某些情况下, 需要 多个非常大的表关联的情况下, 但是需要检索的, 是少量的数据的时候.可以先把 大表的数据, 检索出那一小部分, 然后插入到 临时表中, 最后再关 ...
- Oracle 中 decode 函数用法
Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...
- ORACLE 中ROWNUM用法总结(转)
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- 在Oracle中恢复被DROP掉的表
在Oracle中可能不小心会DROP掉一个表,如果没有定期做备份的话,将会带来很大的麻烦.如果有的情况下,每天的数据都很重要,而定期备份的周期又稍长,情况恐怕也不容乐观!以前只知道Windows有个回 ...
- Oracle中使用REGEXP_SUBSTR,regexp_replace函数
REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr ...
- Oracle中生成随机数的函数(转载)
在Oracle中的DBMS_RANDOM程序包中封装了一些生成随机数和随机字符串的函数,其中常用的有以下两个: DBMS_RANDOM.VALUE函数 该函数用来产生一个随机数,有两种用法: 1. 产 ...
随机推荐
- Armbian 安装与更换为国内软件源
Armbian 是为 ARM 架构的单板计算机(如树莓派.NanoPi.Orange Pi 等)提供的开源镜像系统,它基于 Debian 或 Ubuntu 系统.在使用 Armbian 进行开发.调试 ...
- Jmeter参数化总结
参数化步骤: 1.连接数据库 2.获取account表手机号数据 3.获取手机号个数 4.增加For Each控制器 5.将请求添加至循环控制器里面 脚本:循环登录.jmx 页面如下: 下面主要说明F ...
- 搜索算法1——聊聊dfs与回溯
搜索算法1--聊聊dfs与回溯 目录 1.dfs 的概念 $\ \ \ $1.1 dfs 的概念 2.dfs 的做法 $\ \ \ $2.1 为什么要用 dfs $\ \ \ $2.2 dfs 如何实 ...
- ADTF: 助力自动驾驶系统开发的强大工具箱!
在过去十年中,自动驾驶和高级驾驶辅助系统(AD/ADAS)软件与硬件的快速发展对多传感器数据采集的设计需求提出了更高的要求.然而,目前仍缺乏能够高质量集成多传感器数据采集的解决方案. 康谋ADTF正是 ...
- python 3 No module named ‘Crypto‘ 解决方案
pip3 install pycryptodome pip3 install crypto Pip3 install pycrypto 本机(mac)环境的解决方案: pip3 uninstall p ...
- Spring Boot Jpa封装快速构建Specification、OrderBy、Pageable的查询条件
1.简介 在我们使用JPA时,构建 Specification 查询条件时重复代码过多,而且需要大量的无效代码. 2.工具类提供的方法 2.1.自动构建规范 /** * 自动构建规范 * * @p ...
- MFC窗口闪烁问题
本文引自:<VC窗口闪烁问题的解决> 概述 一般的windows复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小时候出现闪烁. 闪烁产生的原因 原因一: 如 ...
- 求阶乘末尾0的个数(java)
末尾0的个数 题目描述 输入一个正整数,求n!末尾有多少个0?比如n = 10; n! = 3628800 ,所以答案为2 输入描述 输入为一行,n (1 <= n <= 1000)//输 ...
- Number of Islands——LeetCode进阶路
原题链接https://leetcode.com/problems/number-of-islands/ 题目描述 Given a 2d grid map of '1's (land) and '0' ...
- 会用 AI 的工程师,效率已经拉开差距了 - “ 我们曾经引以为傲的编码能力,正在被改写。”
最近尝试用Cursor做了几个内部业务系统,发现一个越来越明显的趋势 真正会用 AI 的工程师,效率已经拉开差距了. 做了十几年 Java, 这波 AI 编程浪潮来得快,一开始我也没太当回事,以为这波 ...