zoukankan      html  css  js  c++  java
  • 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 就是差集

    交集就是两个结果集中都有的元素
    比如 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表中
    
      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语句中写"select... from ...where...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无法访问数据
    (4) 对事务的支持
    MySQL在innodb存储引擎的行级锁的情况下才可支持事务,而Oracle则完全支持事务
    (5) 保存数据的持久性
    MySQL是在数据库更新或者重启,则会丢失数据,Oracle把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,可以随时恢复
    (6) 并发性
    MySQL以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。
    虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。
    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数据库有任何服务。

    IT小黑

    分组排序函数的用法

    • 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 
    		WHERE t.rn <=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)
    )
    --课程表
    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: 填充的字符

  • 相关阅读:
    购买 Linux VPS 服务器后简单的安全设置
    VPS性能测试:CPU内存,硬盘IO读写,带宽速度,UnixBench和压力测试
    Polysh实现多服务器批量执行shell
    第十一周编程总结
    第十周作业
    第九周编程总结修改
    第九周编程总结
    第八周编程总结
    第7周编程总结
    第七周编程总结啊
  • 原文地址:https://www.cnblogs.com/PoetryAndYou/p/13602630.html
Copyright © 2011-2022 走看看