Oracle中的sql操作符 和分析函数
Oracle中的操作符
算术操作符:
无论是在sqlserver,或者是java中,每种语言它都有算术操作符,大同小异。
Oracle中算术操作符(+)(-)(*)(/) 值得注意的是:/ 在oracle中就相当于显示中的除法 5/2 = 2.5
比较操作符:
其中等号可以换成其他运算符:(后面为该操作符的单条件查询样例)
!= 不等于 select empno,ename,job from scott.emp where job!='manager'
^= 不等于 select empno,ename,job from scott.emp where job^='manager'
<>不等于 select empno,ename,job from scott.emp where job<>'manager'
<小于 select sal from scott.emp where sal<1000
>大于 select sal from scott.emp where sal>1000
<=小于等于 select sal from scott.emp where sal<=1000
>=大于等于 select sal from scott.emp where sal>=1000
in 在列表 select sal from scott.emp where sal in(1000,2000)
时间的查询可以使用in 例如 select * from student where time in (’06-3月-09’,’08-5月-09’);
not in 不在列表 select sal from scott.emp where sal not in(1000,2000)
between...and 介于..与..间
select sal from scott.emp where sal between 1000 and 2000
not between...and 不介于..与..之间
select sal from scott.emp where sal not between 1000 and 2000
like 模式匹配 select ename from scott.emp where ename like 'M%' (%表示任意长度的长度串)
select ename from scott.emp where ename like 'M_' (_表示一个任意的字符)
is null 是否为空 select ename from scott.emp where ename is null
is not null 不为空 select ename from scott.emp where ename is not null
逻辑操作符:
or(或) select ename from scott.emp where ename='joke' or ename='jacky'
and(与) select ename from scott.emp where ename='and' or ename='jacky'
not(非) select ename from scott.emp where not ename='and' or ename='jacky'
集合操作符:
union(并集) union连接两句sql语句, 两句sql语句的和 去掉重复的记录。
(select deptno from scott.emp) union (select deptno from scott.dept)
union all(并集) 接两句sql语句,两句sql语句的和不用去掉重复的记录。
(select deptno from scott.emp) union all (select deptno from scott.dept)
intersect (交集) Intersect连接两句sql语句 取查询出来的两个集合的 共同部分。
(select deptno from scott.emp) intersect (select deptno from scott.dept)
minus (补集) Minus 连接两句sql 语句,取查询出来的两个集合的差。
(select deptno from scott.emp) minus (select deptno from scott.dept)
连接操作符: (||) 用来连接连个字段,或者将多个字符串连接起来。
操作符的优先级别:算术》连接》比较》逻辑(not and or)
(1)sum函数,统计总和
按照月份,统计每个地区的总收入
(2)rank() over开窗函数
按照月份、地区,打工收入排序
(3)关于Row_number() Rank() Dense_rank()规则
解析:通用语法 over(partition by A,B order by C,d)
区别:Row_number() over(partition by A,B order by C,d) 本条记录所有列都相同的时候,编号列如下 (1 2 3)没有并列第二
rank() over(partition by A,B order by C,d) 本条记录所有列都相同的时候,编号列如下 (1 1 3)有并列第一的情况,中间有断裂情况
评级函数
常见评级函数如下:
- RANK():返回数据项在分组中的排名,在排名相等时会在名次中留下空位,造成排名不连续。
- DENSE_RANK():同样返回数据项在分组中排名,不过在排名相等时不会留下名位空位。
- CUME_DIST():返回特定值相对于一组值的位置,是累积分布(cumulative distribution)的简写。
- PERCENT_RANK():返回某个值相对于一组值的百分比排名。
- NTILE():返回n分片后的值,如三分片、四分片等。
- ROW_NUMBER():为每一条分组记录返回一个数字,注意不同于rownum伪列。
RANK()和DENSE_RANK()
rank()和dense_rank()函数都可用于计算数据项在分组中(在不使用partition by时以所有数据为一个分组)的排名。它们的区别在于rank()在排名相等时,如:有3个第1名时,则下一个排名为第4名,没有2、3名;而dense_rank()则在有3个第1名时,下一个排名为第2名。即,rank()会出现排名间隔,而dense_rank()则不会出现排名间隔。
这两个函数多用于select子句中,在不进行分组的情况下,可以不使用partition by子句。其使用举例如,找出公司所有人工资排名:
select ename,
rank() over (order by sal desc) rank,
dense_rank() over (order by sal desc) dense_rank
from emp;
从语句中可以看出,rank()函数需要有关键字over和order by。而且rank()是一个单值函数,而不是聚合函数。若需要找出每种工作的最高工资在所有工作最高工资中的排名:
select job,
rank() over (order by max(sal) desc) rank,
dense_rank() over (order by max(sal) desc) dense_rank
from emp
group by job;
在排名中,会出现NULL值在前在后的问题,可以在ORDER BY子句之后使用关键字NULLS FIRST/LAST来控制。
PARTITION BY子句
当需要进行获得分组后各组内的排名,则需要使用partition by子句。它不同于group by的分组,这种分组不“合并聚合”,它相当于把值分组后计算,然后重复每个值。
最常见的例子如:在table表中有name(姓名)、class(班级)和score(分数)三个字段,求每个班级里前三名姓名、班级及分数,SQL语句为:
select name,class,score
from (select name,
class,
score,
rank() over(partition by class order by score desc) rank
from table)
where rank <= 3;
在SCOTT用户中测试,求每个部门工资前3名的人姓名、部门、工作和工资,如:
select *
from (select ename,
deptno,
job,
sal,
dense_rank() over(partition by deptno order by sal desc) rank
from emp)
where rank <= 3;
ROW_NUMBER()
row_number为每一行返回一个数字,在分组中较常用(rownum在非分组中常用)。如,给emp表中每种工作工资由高到低进行排序:
select ename,job,sal,row_number() over (partition by job order by sal desc) from emp;
Desen_rank() over(partition by A,B order by C,d) 本条记录所有列都相同的时候,编号列如下 (1 1 2) 有并列第一的情况,但是没有断裂
Oracle中的sql操作符 和分析函数的更多相关文章
- Oracle中PL/SQL的执行部分和各种流程控制
Oracle中PL/SQL的执行部分和异常部分 一.PL/SQL的执行部分. 赋值语句. 赋值语句分两种,一种是定义一个变量,然后接收用户的IO赋值:另一种是通过SQL查询结果赋值. 用户赋值举例: ...
- Oracle中PL/SQL简介、基本语法以及数据类型
Oracle中PL/SQL简介.基本语法以及数据类型 一.PL/SQL简介. Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询和Oracle自身过程控 ...
- 在Oracle中使用sql获取数据库名称
在Oracle中使用sql获取当前数据库名称 select name from v$database;
- Oracle中的SQL分页查询原理和方法详解
Oracle中的SQL分页查询原理和方法详解 分析得不错! http://blog.csdn.net/anxpp/article/details/51534006
- Oracle中动态SQL详解(EXECUTE IMMEDIATE)
Oracle中动态SQL详解(EXECUTE IMMEDIATE) 2017年05月02日 18:35:48 悠悠倾我心 阅读数:744 标签: oracle动态sqloracle 更多 个人分类: ...
- oracle中的SQL优化
一.SQL语言的使用1.IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格. 但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用 ...
- oracle中动态SQL详解
部分内容参考网上资料 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情 ...
- oracle中动态SQL使用详细介绍
Oracle编译PL/SQL程序块分为两个种:通常静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式,需要了解的朋友可以参考下 1.静态SQLSQL与动态SQL Oracle编译PL ...
- (转)Oracle中动态SQL详解
本文转载自:http://www.cnblogs.com/gaolonglong/archive/2011/05/31/2064790.html 1.静态SQLSQL与动态SQL Oracle编译PL ...
随机推荐
- RabbitMQ(五)
SSL 官方地址:http://www.rabbitmq.com/ssl.html 百科: SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport L ...
- spring mvc使用@InitBinder 标签对表单数据绑定
在SpringMVC中,bean中定义了Date,double等类型,如果没有做任何处理的话,日期以及double都无法绑定. 解决的办法就是使用spring mvc提供的@InitBinder标签 ...
- json转换
Newtonsoft.Json.JsonConvert.SerializeObject 使用上述语句,将创建的对象, 转换成json格式
- Struts2中使用OGNL
链接:Struts标签库 OGNL(Object Graphic Navigatino Language) OGNL称为对象图导航语言.以一个对象为根(起点),通过OGNL可以访问与这个对象关联的其它 ...
- Linux RPM、TAR包管理
一.RPM软件包命令的使用 RPM主要有5种基本操作模式:安装.卸载.刷新.升级及查询.下面分别介绍. 1.安装软件包 命令语法: rpm -ivh [RPM包文件名称] 命令中各参数的含义如下: - ...
- 正则表达式regex狂记
正则.正则..往往在某个不经意间显示其强大的潜能 概念等基础知识不做介绍,直奔规则.格式.实例…… 元字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个向后引用.或一个八进制转义符 ...
- Android 调用系统联系人界面的添加联系人,添加已有联系人,编辑和修改。
一.添加联系人 Intent addIntent = new Intent(Intent.ACTION_INSERT,Uri.withAppendedPath(Uri.parse("cont ...
- More Effective c++
指针和引用 引用对象必须存在,即不能引用空值,指针可以指向空值,引用必须初始化指向一个对象 指针可以改变指向的对象,引用不能改变所引用的对象 不改变指向对象使用引用,改变指向对象使用指针 重载[]时必 ...
- dijit.form.Select 基本用法
dijit.form.Select 1)创建: var division = new dijit.form.Select({ id: "Division",//id必须唯一 nam ...
- Git本地提交到远程指定分支
git push origin master:ziranmeng2.(本地分支:远程分支)