我们知道每个RDBMS在sql方面都会存在自己的特色。那么今天我们来看看oracle有啥特色值得我们来在意呢
1 :
Oracle分析函数与开窗函数:
语法:
FUNCTION_NAME(<argument>,<argument>...)
OVER
(<Partition-Clause><Order-by-Clause><Windowing Clause>)
例如:
sum(sal) over (partition by deptno order by ename rows between。。。)
其中,sum是函数名,
Over()是关键字,用于识别sum()是聚合函数还是分析函数,
作用:
(1) 通常在做统计分析时我们都想尽可能多滴选择出原始列和统计值列,但是这样group by后面就必须跟随更多的列,使用分析函数可以避免使用group by时选择出来的列名必须出现在group by列表中的痛苦。
(2) Over():直接点就是给分析函数加条件。
(3) 聚合函数用group by分组,每个分组返回一个统计值;分析函数用partition by分组,每组每行都可以返回一个统计值。
(4)分析函数带有一个开窗函数over(),含三个分析字句:
分组(partition by)排序(order by)窗口(rows)
(5)两个order by的区别:
分析函数是在整个sql查询后(sql语句的执行比较特殊)再进行的操作,也就是说,sql语句的order by也会影响分析函数的执行结果。
A) 如果sql语句中的order by满足分析函数分析时要求的排序,那么sql语句的排序将先执行,分析函数在分析时就 不必再排序了。
B) 如果sql语句中的order by不满足分析函数分析时要求的排序,那么sql语句中的排序将先执行。
(6)窗口就是分析函数分析时要处理的数据范围:
第一行是:unbounded preceding
当前行是:current row
最后一行是:unbounded following
窗口字句不能单独出现,必须有order by子句时才能出现。而出现order by子句时,不一定要有窗口子句,此时的窗口缺省是第一行到最后一行;
当省略窗口子句时:
A)如果存在order by,则缺省的窗口是unbounded preceding
And current row;
B)如果同时省略order by,则缺省的窗口是unbounded preceding and unbounded following
例如:
1 统计每个部门工资最高的哪位?
select * from
(
select ename,sal,deptno,rank()over(partition by deptno order by sal desc) mm from emp
)
where mm=1
注意:
1).在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一, row_number()只返回一个结果
2).rank()和dense_rank()的区别是:
--rank()是跳跃排序,有两个第二名时接下来就是第四名
--dense_rank()l是连续排序,有两个第二名时仍然跟着第三名
2 显示各部门员工的工资,并附带该部门的最高工资。
select deptno,empno,ename,sal,last_value(sal)over(partition by deptno order by sal rows between unbounded preceding and unbounded following)
max_sal from emp;
2 :
灵活使用decode()函数:
基本语法:DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等于if1时,DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。可以用函数或表达式来替代value,if,then,else从而作出一些更有用的比较。
来看看具体的运用:假设我们想给百度职员加工资,其标准是:工资在8000元以下的将加20%;工资在8000元以上的加15%。
则:
select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary from employee
表table_subject,有subject_name列。要求按照:语、数、外的顺序进行排序。
则:
select * from table_subject order by decode(subject_name, '语文', 1, '数学', 2, , '外语',3)
3: oracle update的特色:
来看个问题先:
有一表a,列有id 和count;现在有表b,列也是id count,怎么用把表b中id相对应的count 更新到表a中呢?
不严格的解法如下:
Update a
Set count=count+nvl((select count from b where id=a.id),0)
如果a跟b表一对多的话,会有问题,因为,子查询跟运算符比如等于号连用,只能是单值。以后,子查询和运算符联用需要特别在意这个问题:看看子查询返回的值的个数!!!
遇到需要从另外一个表来更新本表的值的问题的时候,oracle有两种解决的办法:
其一,使用子查询,使用子查询时一定要注意where条件(一般后面接exists子句),除非两个表是一对一关系,否则where条件必不可少,遗漏掉where条件时可能会导致插入大量空值(如果不写where子句,oracle将会默认的把所有的值全部更新,即使你这里使用了子查询并且某值并不能在子查询里找到,你就会想当然的以为,oracle或许将会跳过这些值吧,你错了,oracle将会把该行的值更新为空)
update a
set a.count = a.count+(select nvl(sum(count),0) from b where b.id = a.id)
where exists (select 1 from b where b.id = a.id)
其二,类视图的更新方法,这也是oracle所独有的。先把对应的数据全部抽取出来,然后更新表一样更新数据,这里需要注意的是,必须保证表的数据唯一性(设主键来实现)
update (select a.count acount,b.count bcount from a,b where a.id=b.id)
set acount=acount+bcount
4:oracle ROWNUM浅谈
(1) rownum是伪劣,会根据返回记录自动生成一个序列化的数字。
(2)作用:可以做一些原先难以实现的结果输出
常见的操作如下:
(3)TOP N结果输出:
Select * from emp where rownum < 5
[对排序结果去top n 时要注意陷阱]
(4)分页查询:
利用rownum对结果进行分页,下面返回结果的第6到10条记录:
SQL> select * from
(
select e.*,rownum as rn from emp e
where rownum<=10
)b
where b.rn>5;
(:5) 利用rownum作分组子排序
如果我们希望在分组后对组中的成员的再进行编号,则:
select decode(ROWNUM-min_sno,0,a.job,NULL)job,decode(ROWNUM-min_sno,0,1,rownum+1-min_sno) sno,a.ename
from (select *
from emp
order by job,ename) a,
(select job,min(rownum) min_sno
from (select *
from emp
order by job,ename)
group by job) b
where a.job=b.job
(6) 确认某个表是否含数据:
10g以后:
Select * from emp where rownum=1;
常见的陷阱如下:由于rownum是伪劣,只有有结果记录时,rownum才有相应的值。
(7) 对rownum使用>(大于1的值),>=(大于或等于1的值),=(大于1的值),这样子没有结果输出;
因为:
A :rownum是伪列,必须要有返回结果后,每条返回记录就会对应产生一个rownum数值;
B :返回结果记录的rownum是从1开始排序的,因此第一条始终是1;
这样当查询到第一条记录时,该记录的rownum为1,但条件要求rownum>1,因此不符合,继续查询下一条;因为前面没有符合要求的记录,因此下一条记录过来后,其rownum还是为1,如此循环就不会有结果。
但可以通过实例化来实现对>,>=,=的使用:
例如:
Select deptno,ename
From (select deptno,ename ,rownum as r
From emp)
Where r>5
(8)rownum 和 order by
在使用rownum时,只有当order by 的字段是主键时,查询结果才会先排序再计算rownum
5 : oracle 常用函数rollup()和cube(),grouping()的使用:
1 rollup()只作用于第一列:将第一列分成几个小组,先对各小组小计,再对全部小组总计。而cube()先对第一列小计,再对第二列小计,。。。,每一列的处理和rollup一致,最后对全部总计。所以,要有两个rollup语句才能顶上一个cube()。
例如:
SQL> select deptno,job,sum(sal) from c group by rollup(deptno,job);
+
SQL> select deptno,job,sum(sal) from c group by rollup(job,deptno);
=
SQL> select deptno,job,sum(sal) from c group by cube(deptno,job);
2 GROUPING函数可以接受一列,返回0或者1。如果列值为空,那么GROUPING()返回1;如果列值非空,那么返回0。GROUPING只能在使用ROLLUP或CUBE的查询中使用。当需要在返回空值的地方显示某个值时,GROUPING()就非常有用。可以通过case…when..then..else来增加可读性。
SQL> select case grouping(deptno)
when 0 then '部门'
when 1 then '部门汇总'
end
, sum(sal)
from c group by rollup(deptno);
下面是几个比较有用的oracle sql:
1 oracle计算时间差
Ceil(n):取比n大的最小整数;
To_date() :时间格式可按需调整,’yyyy-mm-dd hh24:mi:ss’
Mm与mi区别:因为sql不区分大小写;
To_date():两两相减后是天数
毫秒级
select ceil((To_date('2008-05-02 00:00:00' , 'yyyy-mm-dd hh24-mi-ss') - To_date('2008-04-30 23:59:59' , 'yyyy-mm-dd hh24-mi-ss')) * 24 * 60 * 60 * 1000) 相差豪秒数 FROM DUAL;
秒级,分钟级,时级,天级 只要调整24*60*60*1000便可。
2 阿拉伯的英汉对照
select to_char(to_date(n,'yyyy'),'year') from dual;
输入:n=2
输出:two
3 返回标量值可用dual表测试:
比如:
Select power(3,2) from dual
select sign( 100 ),sign(- 100 ),sign( 0 ) from dual;
【sign(n):取数字n的符号,大于0返回1,小于0返回-1,等于0返回0】
4 获得一个列的所有行的乘积:
Select power(10, Sum(Log(10, columnName))) From t
5 查询指定记录:
例如:
显示第5到第10记录
select a.* from
(select rownum num,e.* from emp e) a
where a.num >= 5 and a.num <= 10
6
查询当前用户某个表中创建了哪些索引:
select index_name from user_indexes where table_name='表名';
查询当前用户的所有表:
select table_name from user_tables;
7
去掉字母保留数字:
select regexp_replace(v,'[[:alpha:]]','') from b;
8
查看系统参数表:
Select * from nls_session_parameters;
若想对其修改:
Alter session set ………….
分享到:
相关推荐
综上所述,无论是命名规范还是具体的语法特性,Oracle与MS SQL Server都各有特色。了解这些差异有助于开发者和数据库管理员在不同的环境下更高效、更准确地进行数据库设计和管理。掌握这些知识,能够帮助我们更好地...
- **常见问题及解决方案**:本书收集并整理了一系列Oracle数据库管理过程中常见的问题,并提供了实用的解决思路和方法。 - **实战案例研究**:通过真实的案例分析,帮助读者更好地理解和掌握Oracle数据库管理的关键...
本资料"经典数据库面试题整理首发"聚焦于数据库面试中常见的问题,主要涵盖了Oracle和SQL Server两大主流数据库系统。以下是对这些知识点的详细解析: 1. **Oracle数据库**: - **SQL语法**:Oracle支持标准SQL,...
自动存储管理(ASM)是Oracle 10g的重要特色,它提供了一种高级别的存储抽象层,允许数据库自动管理物理存储,从而简化了存储管理,提高了数据访问效率。 #### 集群就绪服务(CRS) 集群就绪服务(CRS)增强了集群环境下...
为了解决这些问题,PL/SQL Developer作为一种专为Oracle设计的强大工具应运而生。 #### 二、PL/SQL Developer功能特色详解 ##### 2.1 功能强大的PL/SQL编辑器 PL/SQL Developer提供了一个功能全面且易于使用的编辑...
"DBImport_V3.rar" 提供的工具就是为了解决这一问题,它是一款兼容多种主流数据库的导入工具,包括 SQL Server、MySQL 和 Oracle 等。 SQL Server 是微软公司推出的关系型数据库管理系统,广泛应用于企业级应用,以...
其中,规范化理论是逻辑设计中的关键部分,如第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF(巴斯-科德范式)。 5. **数据库安全性与完整性**:确保数据安全性和完整性是数据库管理的重要任务。这涉及...
在数据库访问方面,ASP.NET利用ADO.NET提供了与SQL Server、Oracle等数据库的无缝连接。Entity Framework作为ORM(对象关系映射)工具,简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。 ASP.NET还...
书中还会详细讲解如何使用ADO(ActiveX Data Objects),这是微软提供的一个数据库访问技术,支持多种数据库系统,如Oracle、SQL Server和Access等。通过ADO,开发者可以利用ODBC(Open Database Connectivity)或...
这些适配器覆盖了市场上常见的多种数据源,如亿信BI、i@Report、各种数据库(包括但不限于Greenplum、MySQL、Oracle、PostgreSQL、SQL Server等)、Elasticsearch、HBase等。这意味着用户可以轻松地从各种不同的数据...
1. **多数据库支持**:DBDocumentGenerator可能兼容多种常见的数据库管理系统,如MySQL、Oracle、SQL Server、PostgreSQL等,允许用户连接到不同类型的数据库进行数据字典的生成。 2. **元数据提取**:它能自动获取...
TDH版本的安装、使用以及基于其上开发的SQL引擎Inceptor-SQL、SQL兼容测试及语法知识是TDH发行版本的特色内容。 HUE(Hadoop User Experience)是一个开源的Web界面,通过HUE,用户可以方便地与Hadoop集群交互,...
"另类其它"标签可能暗示了该网站提供了不同于传统招聘网站的一些特色功能或者非主流的招聘方式。"控件"可能指的是ijob人才网在用户界面设计上使用了一些特定的程序控件来提升用户体验,例如搜索框、筛选器等交互元素...
4. **数据库支持**:Jforum支持MySQL、Oracle、SQL Server等主流数据库,具有良好的数据库兼容性。 5. **集成性**:由于金山顶尖的Web服务基于Java,与Jforum的集成更加顺畅。 然而,Jforum也存在一些挑战: 1. **...
从给定的“软件开发工程师简历模板”文档中,我们可以提炼出以下相关的IT知识和技能点,虽然文档本身并未直接涉及具体的IT技术细节,但...简历是求职的第一步,因此应当尽量突出自己的优势和特色,以吸引招聘方的注意。
- **数据库安装**:系统支持SQL Server 2000和Oracle 10g两种数据库,分别适用于不同的应用场景。 - **ArcGIS Desktop安装**:用于提供高级GIS功能,包括地图编辑、空间分析等。 - **ArcSDE安装**:ArcSDE是ArcGIS的...
它支持多种数据库平台,包括大型数据库系统如Oracle、Sybase、DB2、Informix,企业级数据库如MS SQL SERVER、MySql,以及桌面数据库系统如MS ACCESS、FoxPro和Paradox。用户可以通过统一的界面轻松访问、管理和维护...
本系统的一大特色是实现了用户访问权限的设置,使得管理员、学生和教师能够根据其权限,在系统中执行不同的操作。这样的设置极大地提高了系统的灵活性和安全性,确保了系统的实际应用价值。 总的来说,通过这次...