zoukankan      html  css  js  c++  java
  • Oracle Sql语句

    ---------------------------------------------------------------------------
    查看oracle中运行的sql语句
    Select Last_Load_Time, First_Load_Time, Sql_Text From V$sql
    where rownum < 20 and module='w3wp.exe'
    order by Last_Load_Time desc

    ---------------------------------------------------------------------------
    查看数据修改记录
    select object_name, created,last_ddl_time from user_objects order by last_ddl_time desc

    ---------------------------------------------------------------------------
    时间格式化
    TO_DATE('2014/5/22 20:00:35', 'yyyy-mm-dd hh24:mi:ss')

    --add(添加视图、表格、存储过程、函数)
    CREATE TABLE "BASE_MANAGERANGE"  (
       "BASE_MANAGERANGEOID" VARCHAR2(40)                    NOT NULL,
       "RANGECODE"          VARCHAR2(40),
       "RANGENAME"          VARCHAR2(300),
       "PARENTRANGEID"      VARCHAR2(40),
       "ISMULTILINGUAL"     INT,
       "KEYID"              VARCHAR2(40)                    NOT NULL,
       "LEVEL"              INT,
       "REMARK"             VARCHAR2(100),
       CONSTRAINT PK_BASE_MANAGERANGE PRIMARY KEY ("BASE_MANAGERANGEOID")
    );


    --update(修改表结构、数据)
    ALTER TABLE (表名) ADD (列名 数据类型);
    ALTER TABLE (表名) MODIFY (列名 数据类型);
    ALTER TABLE (表名) RENAME COLUMN (当前列名) TO (新列名);
    ALTER TABLE (表名) DROP COLUMN (列名);
    ALTER TABLE (当前表名) RENAME TO (新表名);
    e.g. UPDATE Bm_Buyerdata b SET b.sessionnum='116' WHERE b.sessionnum='117';

    --delete(删除数据、表格)
    DROP TABLE "BASE_MANAGERANGE"
    DELETE FROM Bm_Buyerdata b WHERE b.sessionnum='dfasdfsadf';

    -- 排序规则
    SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序
    SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序
    SCHINESE_PINYIN_M 按照拼音排序,系统的默认排序方式为拼音排序
    e.g. select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');

    -- order时null排序的处理
    1)不加“关照”的情况下,我们可以把那些NULL值假想为所有内容中值是最大的,因此,升序排序后NULL值在最后,倒序排序后NULL值在最前!
    2)特殊“关照”的情况下,当指定“NULLS FIRST”时,无论是升序排序还是倒序排序,NULL值都会排列在最前面;当指定“NULLS LAST”时,无论是升序排序还是倒序排序,NULL值都会排列在最后面。

    -- 常用函数
    1、 多行合并为一列 wmsys.wm_concat(col1) 在oracle 10下使用
    替换默认的“,”分隔符,使用replace(wmsys.wm_concat(col1), ',',';'); 增加其他的内容 wmsys.wm_concat(col1 || ' 单位(' || col2 || ')' )

    -- rownum 大于的问题
    rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的:
    rowid 是物理存在的,表示记录在表空间中的唯一位置ID,在DB中是唯一的。只要记录没被搬动过,rowid是不变的。
    因为rownum总是从1开始的,第一条不满足去掉的话,第二条的rownum 又成了1。依此类推,所以永远没有满足条件的记录。可以这样理解:rownum是一个序列,是Oracle数据库从数据文件或缓冲区中读取数据的顺序。
    所以select * from table1 where rownum > 1始终获取不到值
    正确的做法是 select * from (select rownum rownum_, t.* from table1 t) where rownum_ > 1

    -- 子查询中不能使用order by的问题
    在From 语句中出现的子查询被称为 inline view(内联视图),在where 语句中出现的子查询被称为nested subquery(嵌套子查询)。
    经测试证明在嵌套子查询中不允许出现order by 语句
    select * from scott.emp
    where ename in (select ename from scott.emp order by ename)
    会报 “ORA-00907:缺少右括号”的错误。
    如果将上面的嵌套子查询再包装一层,成为第二层查询的内联视图。
    select * from scott.emp
    where ename in (select * from(select ename from scott.emp order by ename))
    则可以成功执行。

    -- clob字段插入数据
    ORA-01704: string literal too long
    DECLARE
      str varchar2(32767);
    BEGIN
      str := '{"EM_TaskOID":"da8ebe4d-cbd3-498b-9892-d9dd073aa82a","TemplateID":"000814c8-0000-0000-0000-0000d01e4a99","ContentTemplate":"<div style="OVERFLOW: hidden; HEIGHT: 232px; WIDTH: 700px; MARGIN: 0px auto"><img alt="" src="http://invitation.cantonfair.org.cn/images/sendmail/images/115best/top.jpg" height="232" width="700" /></div><table cellpadding="0" cellspacing="0" align="center" border="0" width="700"><tbody><tr><td background="http://invitation.cantonfair.org.cn/images/sendmail/images/115best/left.jpg" valign="top" width="100">'|| '&' ||'nbsp;</td><td background="http://invitation.cantonfair.org.cn/images/sendmail/images/115best/middle.jpg" height="600" valign="top"><p style="TEXT-ALIGN: center"><span style="font-family:仿宋_GB2312;FONT-SIZE: 18pt"><span style="font-size:16px;"><span style="font-family:Arial;mso-fareast-font-family: 仿宋_GB2312"><br /></span></span></span><span class="STYLE1">欢迎参加第115届中国进出口商品交易会</span></p><p style="TEXT-ALIGN: center">                          {{content6}}</p><p class="STYLE1">尊敬的{{content2}}: <br />  您的朋友{{content3}},来自{{content4}}向您推荐中国第一展— 中国进出口商品交易会。 <br />  中国进出口商品交易会,又称广交会,创办于1957年春,每年春秋两季在广州举办,是中国目前历史最长、层次最高、规模最大、商品种类最全、到会客商最多且国别地区分布最广、成交效果最好、信誉最佳的综合性国际贸易盛会。  <br />  第{{content5}}届广交会将于2014年4月15日—5月5日在广州中国进出口商品交易会展馆分三期举办。本届广交会总展览面积达116万平方米,展位数5.9万个。<br />  广交会的参展企业都是中国优秀品牌企业,信誉良好,同时广交会的产品种类齐全,且质量好价格优,还能根据客人需求进行个性化设计和制作,非常值得您前来参观采购。<br />  欢迎您前来参加第{{content5}}届广交会!关于广交会境外采购商在线申请注册、报到办证、翻译服务、酒店订房及交通信息等事宜,请登陆广交会官方网站<a href="http://www.cantonfair.org.cn/">www.cantonfair.org.cn</a>或咨询广交会客户联络中心,电邮:info@cantonfair.org.cn,电话:4000888999(中国境内),86-20-28888999(中国境外)。<br />  出口展区:第一期2014年4月15-19日:电子及家电;照明;车辆及配件;机械;五金工具;建材;化工产品。第二期2014年4月23-27日:日用消费品;礼品;家居装饰品。第三期2014年5月1日- 5月5日:纺织服装;鞋;办公、箱包及休闲用品;医药及医疗保健;食品。<br />  进口展区:第一期2014年4月15-19日:电子及家电;建材及五金;机械设备;工业原材料等。第三期2014年5月1日-5月5日:食品及农产品;医疗保健及美容护理产品;礼品及装饰品等。<br />  展区安排的相关信息截至2014年3月26日,最新消息请以广交会官方网站<a href="http://www.cantonfair.org.cn">www.cantonfair.org.cn</a> 发布为准。<br />  请您与会办证时带上此邀请邮件和境外个人有效证件,您将享受到免费办理首张入馆证件的优惠。</p><span><span style="font-size:16px;"><span style="font-family:Times New Roman;"></span></span></span><p class="MsoNormal" style="TEXT-ALIGN: left; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-char-indent-count: 2.0" align="left"></p></td><td background="http://invitation.cantonfair.org.cn/images/sendmail/images/115best/right.jpg" valign="top" width="103">'|| '&' ||'nbsp;</td></tr></tbody></table><div class="cc" style="WIDTH: 702px; MARGIN: 0px auto; heihgt: 128px"><div style="HEIGHT: 128px; WIDTH: 111px; FLOAT: left"><img alt="" src="http://invitation.cantonfair.org.cn/images/sendmail/images/115best/0830-3_02.jpg" height="128" width="111" /></div><div class="fl" style="HEIGHT: 128px; WIDTH: 590px; FLOAT: left"><div style="HEIGHT: 19px"><img alt="" src="http://invitation.cantonfair.org.cn/images/sendmail/images/115best/0830-3_03cn.jpg" height="19" width="589" /></div><div class="cc" style="HEIGHT: 90px"><div style="HEIGHT: 90px; WIDTH: 275px; BACKGROUND: url([basecodebar]); FLOAT: left">{{content1}}</div><div style="HEIGHT: 90px; WIDTH: 314px; FLOAT: left"><img alt="" src="http://invitation.cantonfair.org.cn/images/sendmail/images/115best/0830-3_05cn.jpg" height="90" width="314" /></div></div><div><img alt="" src="http://invitation.cantonfair.org.cn/images/sendmail/images/115best/0830-3_06cn.jpg" height="19" width="589" /></div></div></div>","SubjectTemplate":"老采购商推荐新采购商 ","ifSubmit":false,"mailSeq":null,"mailListNo":"185539","mpid":null,"mptempid":null,"mpaccid":null,"html":null,"fileName":"20140725173024.txt","mpTitle":null,"ReplyEmail":"cmail@cantonfair.org.cn","ReplyName":"cmail@cantonfair.org.cn","Language":"ZH"}';
      UPDATE EM_EmaiTask SET SYS_LAST_UPD=SYSDATE, submitResult=str WHERE EM_EmaiTaskOID='da8ebe4d-cbd3-498b-9892-d9dd073aa82a';
    END;
    分析:把长度超过4000的字符串赋值给变量,然后在update或insert

    -- &nbsp;在oracle中为变量nbsp;问题解决
    update table1 set col1 = 'text'|| '&' || 'test1'
    分析:oracle中把&当做了自定义变量,也可以使用ASCII码chr(38)

    -- 单引号的处理
    Select 'test ''' from dual;
    Select 'It' || chr(39) || 'fine' from dual;
    分析 '' 等同于一个单引号,另外chr(39)是单引号的ASCII码

    -- 字符串类型的字段,里面的值如果都是数字,使用order by排序时,需要 to_number(column1)
    你这列是字符串,不是int,就按ASCⅡ码排序,不转换为数字,那么类似的效果为
    column1
    ----
    9
    80
    700
    10000

    -- decode(字段或字段的运算,值1,值2,值3)
    这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3;当然值1,值2,值3也可以是表达式。

    -- 重建索引
    alter index index_name rebuild tablespace tablespace_name
    “tablespace_name”加入表空间名,会将指定的索引移动到指定的表空间当中。
    注:
    analyze 操作只是统计信息,并将统计信息存放起来供日后分析SQL使用,不进行重建之类的具体实施性操作,因此要重建索引的话
    还是要用 alter index index_name rebuild
    可能造成的错误:
    无法删除数据,提示“ORA-01502:索引‘table.index’或所这类索引的分区处于不可用状态”

    --------------------------------------------------------------------------------------------
    -- 加号在oracle中的使用
    1. LEFT OUTER JOIN:左外关联
    SELECT e.last_name, e.department_id, d.department_name
    FROM employees e
    LEFT OUTER JOIN departments d
    ON (e.department_id = d.department_id);

    等价于
    SELECT e.last_name, e.department_id, d.department_name
    FROM employees e, departments d
    WHERE e.department_id=d.department_id(+);

    2. RIGHT OUTER JOIN:右外关联

    SELECT e.last_name, e.department_id, d.department_name
    FROM employees e
    RIGHT OUTER JOIN departments d
    ON (e.department_id = d.department_id);

    等价于

    SELECT e.last_name, e.department_id, d.department_name
    FROM employees e, departments d
    WHERE e.department_id(+)=d.department_id;


    --------------------------------------------------------------------------------------------
    like的速度

    可以使用instr来替换,来提高速度

    ----------------------------------------------------
    instr用法
    instr( string1, string2, start_position,nth_appearance ) [1]  [2]
    string1
    源字符串,要在此字符串中查找。
    string2
    要在string1中查找的字符串 。
    start_position
    代表string1 的哪个位置开始查找。此参数可选,如果省略默认为1. 字符串索引从1开始。如果此参数为正,从左到右开始检索,如果此参数为负,从右到左检索,返回要查找的字符串在源字符串中的开始索引。
    nth_appearance
    代表要查找第几次出现的string2. 此参数可选,如果省略,默认为 1.如果为负数系统会报错。
    注意:
      位置索引号从1开始。
      如果String2在String1中没有找到,instr函数返回0。
      示例:
      SELECT instr('syranmo','s') FROM dual; -- 返回 1
      SELECT instr('syranmo','ra') FROM dual; -- 返回 3
      SELECT instr('syran mo','a',1,2) FROM dual; -- 返回 0

    --------------------------------------------------------------------------------------------
    EXISTS 与 in
    1、exists的用法
    EXISTS里的子查询结果集非空,EXISTS()子句的值就是true;
    EXISTS里的子查询结果集为空,EXISTS()子句的值就是false。
    e.g. select * from T1 where exists(select 1 from T2 where T1.a=T2.a)
    2、性能分析
    数据量大的时候用exists,数据量少的时候用in
    通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因

  • 相关阅读:
    mysql #与$的区别
    linux连接mysql
    19年春第十三周学习
    第二阶段冲刺-02
    第二阶段冲刺-01
    19年春第十二周学习
    第一阶段SCRUM冲刺-10
    第一阶段SCRUM冲刺-09
    第一阶段SCRUM冲刺-08
    19年春第十一周学习
  • 原文地址:https://www.cnblogs.com/smallidea/p/5786273.html
Copyright © 2011-2022 走看看