您的位置:首页 > 数据库 > Oracle

Oracle中SQL语句部分总结

2010-12-07 18:54 405 查看
/*
在设计表时,由于没有设计公司编码这列,后来由于需求变动,需要添加列,并且
补充公司编码这列
*/
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: