Oracle中SQL语句部分总结

/*
   在设计表时,由于没有设计公司编码这列,后来由于需求变动,需要添加列,并且
   补充公司编码这列
*/
UPDATE T_B_PHD_RECORD REC
   SET REC.CORP_ID = (SELECT CORP_ID
                        FROM T_B_PHD_COMPANY COM
                       WHERE COM.CORP_NAME = REC.CORP_NAME)
 WHERE REC.CORP_NAME IN
       (SELECT A.CORP_NAME
          FROM T_B_PHD_RECORD A
          LEFT JOIN T_B_PHD_COMPANY B ON A.CORP_NAME = B.CORP_NAME)
          
/*
   需求变动,需要在表中插入公司编码这列
*/
INSERT INTO T_B_PHD_RECORD
  (CORP_NAME, START_TIME, END_TIME, REMARK, CORP_ID)
  SELECT '' CORP_NAME,
         TO_DATE(TO_CHAR(SYSDATE, 'yyyy-MM-dd hh24:mi:ss'),
                 'yyyy-MM-dd hh24:mi:ss') START_TIME,
         '' END_TIME,
         '' REMARK,
         T.CORP_ID
    FROM T_B_PHD_COMPANY T
   WHERE T.CORP_NAME = ''
   

/*
   获取结束时间为空、邮件标识为0和(系统时间-开始时间)> 60分钟的记录
*/ 
SELECT *
  FROM T_B_PHD_RECORD
 WHERE END_TIME IS NULL
   AND F_MAIL = 0
   AND TRUNC((SYSDATE - START_TIME) * 24 * 60) > 60
   
/*
   -- 截取日期的年月日
   INSTR函数返回要截取的字符串在源字符串的位置,语法如下:
   INSTR(string1,string2,[,start_position[,nth_appearance]]
   string1 源字符串
   string2 要在string1中查找的字符串
   start_position 从哪个位置开始查找。此参数可选,如果省略默认为1,字符串索引
   从1开始,如果此参数为正,从左到右开始检索,如果此参数为负,从右到左检索,返
   回要查找的字符串在源字符串中的开始索引。
   nth_appearance代表要查找第几次出现的string2,此参数可选,如果省略,默认为1
   如果为负系统会报错。
   
   SUBSTR函数有三个参数,第一个参数为目标字符串
   第二个参数为将要输出的子串的起点
   第三个参数为将要输出的子串的长度
   如果第二个参数为负数,那么将会从源字符串的尾部开始向前定位至负数的绝对值的位置
*/
SELECT TO_DATE(SUBSTR('2010-12-07 11:00:00',
                      0,
                      INSTR('2010-12-07 11:00:00', ' ', 1, 1) - 1),
               'yyyy-MM-dd') DATETIME
  FROM DUAL
  

/*
   TRUNC(date[,fmt]) 为指定元素而截取的日期值
   fmt日期格式,该日期将由指定的元素格式截去。忽略它则由最近的日期截去
 
   TRUNC(number[,decimals]返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数
   不对指定小数前或后的部分做相应舍入选择处理,而统统截去。
*/
SELECT TRUNC(TO_DATE('2010-12-07 11:00:00', 'yyyy-MM-dd hh24:mi:ss'), 'dd') DATETIME
  FROM DUAL
  
SELECT TRUNC(89.725, -1) NUM FROM DUAL


/*
   DISTINCT用来过滤掉重复记录只保留一条,它必须放在查询字段的开头,可以作用多个字段。
*/
SELECT DISTINCT T.CORP_ID, T.UNIT_ID FROM T_B_PHD_ALLUNITS T


/*
   GROUP BY、HAVING、ORDER BY、GROUP BY ROLLUP、GROUP BY CUBE
   GROUP BY GROUPING SETS
   -- 统计地区公司装置数量
   用了ROLLUP的GROUP BY子句所产生的超级集合就是指在产生聚合时会从右往左逐个对每一列进
   行小结,并在结果中生成独立的一行,同时也会对聚合列生成一个合计列。
*/
SELECT DISTINCT T.CORP_ID, T.UNIT_ID, COUNT(T.TRGT_NAME) NUM
  FROM T_B_PHD_ALLUNITS T
 GROUP BY ROLLUP(T.CORP_ID, T.UNIT_ID)
 ORDER BY T.CORP_ID
 
SELECT CASE
         WHEN A.DEPTNO IS NULL THEN
          '总计'
         WHEN A.DEPTNO IS NOT NULL AND A.EMPNO IS NULL THEN
          '小计'
         ELSE
          '' || A.DEPTNO
       END DEPTNO,
       A.EMPNO,
       A.ENAME,
       SUM(A.SAL) TOTAL_SAL
  FROM EMP A
 GROUP BY GROUPING SETS((A.DEPTNO),(A.DEPTNO, A.EMPNO, A.ENAME),())
 
 
 /*
   UNION和UNION ALL
   相同点:都是将多个结果合并在一起显示出来
   区别:UNION 对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序。
         UNION ALL 对两个结果集进行并集操作,包括重复行,不进行排序。
         
   IN、NOT IN 和 EXISTS、NOT EXISTS
   -- 当子查询有返回NULL值时,NOT IN不会有结果返回。
   -- 使用NOT EXISTS,即使子查询中包含NULL值,也会得到正确结果。
   -- 改为表连接后,性能一般都会提高。
 */
SELECT DNAME FROM DEPT WHERE DEPTNO NOT IN(SELECT DEPTNO FROM EMP)

SELECT DNAME FROM DEPT
WHERE NOT EXISTS(SELECT * FROM EMP WHERE EMP.DEPTNO=DEPT.DEPTNO)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值