oracle常⽤语法
别名
别名中不能出现中⽂括号()
不能使⽤全⾓符号
coalesce
coalesce(参数列表):返回参数列表中第⼀个⾮空参数,最后⼀个参数通常为常量
distinct
去重
nvl
作⽤:判断某个值是否为空值,若不为空值则输出,若为空值,返回指定值。专
详细解释如下:
1、nvl()函数的格属式如下:NVL(expr1,expr2);
2、含义是:如果oracle第⼀个参数为空那么显⽰第⼆个参数的值,如果第⼀个参数的值不为空,则显⽰第⼀个参数本来的值。
3、例:select name,NVL(name,-1) from user;运⾏后,结果返回两列数值,若name为空,则返回-1,若name不为空值,则返回其⾃⾝。round
round函数⽤于数据的四舍五⼊
1、round(x,d) ,x指要处理的数,d是指保留⼏位⼩数
这⾥有个值得注意的地⽅是,d可以是负数,这时是指定⼩数点左边的d位整数位为0,同时⼩数位均为0;
2、round(x) ,其实就是round(x,0),也就是默认d为0;
union与union all
union:去重复,排序
union all:不重复也不排序.(推荐)
intersect 与 minus
intersect 就是交集
minus 就是差集
mysql语句转oracle交集就是两个结果集中都有的元素
⽐如 select uid from tb1
intersect
select uid from tb2
那么既存在zhitb1 ⼜存在tb2中相同的UID 就会查dao出来
差集:select uid from tb1
minus
select uid from tb2
存在于tb1 但不存在与tb2中的uid 会被查出
表的复制
如果需要对表中的数据进⾏删除和修改,建议通过复制表中的数据来对数据进⾏操作
create table 表名 as 查询语句;
--将emp表中的数据复制到t_emp表中
html页面中下面哪个表示空格create table t_emp
as
select * from emp;
--只需要表的结构
--将emp表的结构复制到t_emp表中
create table t_emp
as
select * from emp
where 1=0;/*提供⼀个否定条件*/
--只复制⼀部分数据
--将emp表中部门10的员⼯的数据复制到t_emp表中
create table t_emp
as
select * from emp
where deptno=10;
--将emp表中的员⼯姓名,⼯资,年薪保存到t_emp表中
create table t_emp
as
select ename,sal,sal*12 year_sal /*如果字段中出现函数或者计算需要提供别名*/ from emp;
--统计emp表中部门的⼈数,将部门编码和⼈数保存到t_emp表中
create table t_emp(did,ecount)
as
select deptno,count(ename)
from emp
group by deptno;
注意:表的复制只会复制表中的数据,不会复制表中的约束
伪列rowid,rownum
select rowid from dual;
rowid:是⼀个伪列,Oracle独有的.每⼀条记录的rowid 的记录是唯⼀的sign⽐较⼤⼩
与0进⾏⽐较,判断是不是正数,⼤于0显⽰1 ,⼩于0显⽰-1 ,等于0显⽰0 select sign( 100 ),sign(- 100 ),sign( 0 ) from dual;
如何进⾏SQL语句的优化
在select语句中避免使⽤*
减少数据库的访问次数
删除重复记录
尽量多使⽤commit
使⽤where替换having
多使⽤内部函数提⾼sql语句效率
多使⽤表的别名
使⽤exists替换in,使⽤not exists替换notin
尽量使⽤索引类进⾏查询
sql语句尽量⼤写.oracle会⾃动转换成⼤写
避免在索引列上进⾏计算
避免在索引类上使⽤not,oracle遇到not就使⽤全表扫描
可以使⽤>=替换>
使⽤in替换or
尽量使⽤where替换groupby
避免使⽤消耗资源的操作.如union
⼦查询注意事项
1.⼦查询需要定义在括号当中
2.⼦查询通常定义在条件判断的右边
3.在⼦查询中不建议使⽤ order by
⼦查询中多⾏⽐较符
in :等于列表中的任何⼀个
any:和⼦查询结果中的任意⼀个值进⾏⽐较
all:和⼦查询结果中的所有值进⾏⽐较
oracle 与 mysql的区别
(1) 对事务的提交
MySQL默认是⾃动提交,⽽Oracle默认不⾃动提交,需要⽤户⼿动提交,需要在写commit;指令或者点击commit按钮
(2) 分页查询
MySQL是直接在SQL语句中写" from ...limit x, y",有limit就可以实现分页;⽽Oracle则是需要⽤到伪列ROWNUM和嵌套查询
(3) 事务隔离级别
MySQL是read commited的隔离级别,⽽Oracle是repeatable read的隔离级别,同时⼆者都⽀持serializable串⾏化事务隔离级别,可以实现最⾼级别的
读⼀致性。每个session提交后其他session才能看到提交的更改。Oracle通过在undo表空间中构造多版本数据块来实现读⼀致性,每个session
查询时,如果对应的数据块发⽣变化,Oracle会在undo表空间中为这个session构造它查询时的旧的数据块
MySQL没有类似Oracle的构造多版本数据块的机制,只⽀持read commited的隔离级别。⼀个session读取数据时,其他session不能更改数据,但
可以在表最后插⼊数据。session更新数据时,要加上排它锁,其他session⽆法访问数据十进制转16进制算法
(4) 对事务的⽀持
MySQL在innodb存储引擎的⾏级锁的情况下才可⽀持事务,⽽Oracle则完全⽀持事务
(5) 保存数据的持久性
MySQL是在数据库更新或者重启,则会丢失数据,Oracle把提交的sql操作线写⼊了在线联机⽇志⽂件中,保持到了磁盘上,可以随时恢复
(6) 并发性
MySQL以表级锁为主,对资源锁定的粒度很⼤,如果⼀个session对⼀个表加锁时间过长,会让其他session⽆法更新此表中的数据。
虽然InnoDB引擎的表可以⽤⾏级锁,但这个⾏级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使⽤索引,那么仍然使⽤表级锁。
matlab中文下载Oracle使⽤⾏级锁,对资源锁定的粒度要⼩很多,只是锁定sql需要的资源,并且加锁是在数据库中的数据⾏上,不依赖与索引。所以Oracle对并
发性的⽀持要好很多。
(7) 逻辑备份
MySQL逻辑备份时要锁定数据,才能保证备份的数据是⼀致的,影响业务正常的dml使⽤,Oracle逻辑备份时不锁定数据,且备份的数据是⼀致
(8) 复制
MySQL:复制服务器配置简单,但主库出问题时,丛库有可能丢失⼀定的数据。且需要⼿⼯切换丛库到主库。
Oracle:既有推或拉式的传统数据复制,也有dataguard的双机或多机容灾机制,主库出现问题是,可以⾃动切换备库到主库,但配置管理较复杂。
(9) 性能诊断
MySQL的诊断调优⽅法较少,主要有慢查询⽇志。
Oracle有各种成熟的性能诊断调优⼯具,能实现很多⾃动分析、诊断功能。⽐如awr、addm、sqltrace、tkproof等
(10)权限与安全
MySQL的⽤户与主机有关,感觉没有什么意义,另外更容易被仿冒主机及ip有可乘之机。
Oracle的权限与安全概念⽐较传统,中规中矩。
(11)分区表和分区索引
MySQL的分区表还不太成熟稳定。
Oracle的分区表和分区索引功能很成熟,可以提⾼⽤户访问db的体验。
(12)管理⼯具
MySQL管理⼯具较少,在linux下的管理⼯具的安装有时要安装额外的包(phpmyadmin, etc),有⼀定复杂性。
Oracle有多种成熟的命令⾏、图形界⾯、web管理⼯具,还有很多第三⽅的管理⼯具,管理极其⽅便⾼效。
(13)最重要的区别
MySQL是轻量型数据库,并且免费,没有服务恢复数据。
Oracle是重量型数据库,收费,Oracle公司对Oracle数据库有任何服务。
分组排序函数的⽤法
row_number() over()
先分组后排序
row_number() over(partition by col1 order by col2)表⽰根据col1分组,在分组内部根据col2排序,⽽此函数计算的值就表⽰每组内部排序后的顺序编号(组内连续的唯⼀的)。
与rownum的区别在于:使⽤rownum进⾏排序的时候是先对结果集加⼊伪劣rownum然后再进⾏排序,⽽此函数在包含排序从句后是先排序再计算⾏号码。
row_number()和rownum差不多,功能更强⼀点(可以在各个分组内从1开始排序)。
rank() over()
rank()是跳跃排序,有两个第⼆名时接下来就是第四名(同样是在各个分组内)
dense_rank() over()
dense_rank()也是连续排序,有两个第⼆名时仍然跟着第三名。相⽐之下row_number是没有重复值的。
我⽤到的是第⼀个row_number() over()函数,要使⽤这个函数分组排序后获取最⼤值的oracle语句:
select a,b from(select a,b,row_number()over(partition by a order by b desc)rownumber from tablename ) where rownumber =1
获取⼀组中最⼤值
SELECT * FROM (
SELECT last_comment,
row_number() over(partition BY
employeeid,roadline,stationname
ORDER BY logindate DESC) rn
FROM reocrd) t
<=1
这段的意思是,将reocrd表根据员⼯⼯号( employeeid),线路(,roadline),站点名称(stationname)分组后,取登录⽇期(logindate) 最⼤的那⼀⾏的last_comment的值. CONCAT(str1,str2,…)
返回结果为连接参数产⽣的字符串。如有任何⼀个参数为NULL ,则返回值为 NULL。
||连接符
在oracle数据库中"||"起到连接的作⽤
SELECT 11 || 22 FROM DUAL;
WM_CONCAT regexp_like replace 查询数据
创建表
-
-选课表
create table testcourse(
id varchar2(20) primary key,
name varchar2(30),
course varchar2(30)
)
--课程表
seek按键是什么意思CREATE TABLE testDetailedcourse (
id varchar2(20) primary key,
name varchar2(30)
);
插⼊数据
select * from testcourse
ID NAME COURSE
1张三1,2,3
select * from testdetailedcourse
ID NAME
1语⽂
2英语
手机开发者工具下载3数学
4物理
查询数据:“张三选课详情”
WM_CONCAT: ⽤于数据合并,⽰例中⽤于连接课程名称name
regexp_like: ⽤于正则 regexp_like(原字段,正则)
replace: replace(原字段,“原字段旧内容“,“原字段新内容“)
1. ⾸先将course中的,替换成|,配合管道||使⽤拼接成正则表达式,如上述表达式 : ^1|2|3|$ 判断id中
包含1,2,3的数据
2. 使⽤regexp_like匹配数据
3. WM_CONCAT连接
lpad
lpad( string, padded_length, [ pad_string ] )
lpad函数格式-从左⾄右填充
string:为需要被填充的字符串,
padded_length: 填充后字段长度
pad_string: 填充的字符
拼⾳排序
SCHINESE_RADICAL_M 按照部⾸(第⼀顺序)、笔划(第⼆顺序)排序
SCHINESE_STROKE_M 按照笔划(第⼀顺序)、部⾸(第⼆顺序)排序
SCHINESE_PINYIN_M 按照拼⾳排序
select * from student order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');
表创建和最后修改时间
SELECT * FROM USER_TABLES 查看当前⽤户下的表
SELECT * FROM DBA_TABLES 查看数据库中所有的表
SELECT CREATED,LAST_DDL_TIME from user_objects where object_name=upper('表名')
SELECT CREATED, LAST_DDL_TIME
FROM USER_OBJECTS
WHERE OBJECT_NAME = 'PDCA_NEW_REPAIR';
其中CREATED 为创建时间 ,LAST_DDL_TIME为最后修改时间
截取字符串SUBSTR
语法:SUBSTR(string,start, [length])
string:表⽰源字符串,即要截取的字符串。
start:开始位置,从1开始查。如果start是负数,则从string字符串末尾开始算起。
length:可选项,表⽰截取字符串长度。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论