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

oracle数据库的一些语法

2016-04-27 00:00 513 查看
摘要: 字符串操作【CONCAT】,【||】,【LENGTH】,【UPPER,LOWER,INITCAP】,【TRIM,LTRIM,RTRIM】 ,【LPAD,RPAD】,【SUBSTR】,【INSTR】;数值操作【ROUND】,【TRUNC】,【MOD】,【CEIL】,【FLOOR】;日期操作;空值操作;查询语句的一些查询条件;聚合函数;EXISTS关键字;伪列ROWNUM;DECODE函数;CASE ;排序函数;并、交、差集;高级分组函数

字符串操作【CONCAT】,【||】,【LENGTH】,【UPPER,LOWER,INITCAP】,【TRIM,LTRIM,RTRIM】 ,【LPAD,RPAD】,【SUBSTR】,【INSTR】;数值操作【ROUND】,【TRUNC】,【MOD】,【CEIL】,【FLOOR】;日期操作;空值操作;查询语句的一些查询条件;聚合函数;EXISTS关键字;伪列ROWNUM;DECODE函数;CASE ;排序函数;并、交、差集;高级分组函数

--------------------------------------------------------------------------------------------

oracle的字符串操作:
1.字符串连接:【CONCAT】
SELECT CONCAT(ename,sal) FROM emp

2.连接字符串操作符:【||】
SELECT ename||','||sal FROM emp

3.获取字符串长度:【LENGTH】
SELECT ename,LENGTH(ename) FROM emp

4.大小写字母转换:【UPPER,LOWER,INITCAP】
SELECT UPPER('helloworld'),LOWER('HELLOWORLD'),INITCAP('hello world') FROM dual

5.去重函数:【TRIM,LTRIM,RTRIM】
SELECT LTRIM('eeeeeliteeeee','e') FROM dual --liteeeee
SELECT LTRIM('esesesliteee','es') FROM dual --liteee

6.补位函数:【LPAD,RPAD】
SELECT LPAD(sal,6,'$') FROM emp

7.截取字符串:【SUBSTR】
参数:从指定字符串的指定位置开始连续取若干字符。第三个字符可以不传入,不传入则是取到末尾,若第三个参数的值大于实际可以获取的字符长度时也默认取到字符串末尾
SELECT SUBSTR('thinking in java',10,2) FROM dual -- in

8.【INSTR】函数:查找给定字符串在当前字符串中位置
参数3:从第几个字符开始查找。 参数4:查找第几次出现。若没有符合要求则返回值为0.
参数3,4都可以不指定,不指定则默认为1
SELECT INSTR('thinking in java','in',4,2) FROM dual -- 10
-------------------------------------------------------------------------------------
oracle数值操作:
1.四舍五入:【ROUND】
参数2表示保留到小数点后多少位,0则是保留到整数位,负数则是10位以上的单位。
SELECT ROUND(45.678,2) FROM dual -- 45.68
SELECT ROUND(45.678,-1) FROM dual -- 50
SELECT ROUND(45.678,-2) FROM dual --0

2.截取数值函数:【TRUNC】
SELECT TRUNC(45.789,2) FROM dual -- 45.78
SELECT TRUNC(45.789,-1) FROM dual -- 40
SELECT TRUNC(45.789,-2) FROM dual -- 0

3.求余:【MOD】
SELECT MOD(11.1,3) FROM dual -- 2.1

4.向上取整:【CEIL】 向下取整:【FLOOR】
SELECT CEIL(45.678) FROM dual -- 46
SELECT FLOOR(45.678) FROM dual -- 45
------------------------------------------------------------------------------------
oracle日期操作
1.DATE与TIMESTAMP
DATE:表示日期,精度到秒,七个字节分别表示世纪年月日时分秒
TIMESTAMP时间戳:表示日期,精度到纳秒,前七个字节与DATE一致,后四个字节记录秒以下的精度。
SELECT SYSDATE FROM dual
SELECT SYSTIMESTAMP FROM dual

2.日期计算:
【1】对一个日期类型的值加上一个指定的数字,等于加上了指定的天数。返回的日期是计算 后的日期,减去同理。
【2】两个日期类型额值相减,差是相差的天数,日期越晚的越大。
**RR是2位数字表示年的日期格式中的关键字,RR与YY的区别在于RR会根据当前系统时间自动判断世纪.

3.TO_DATE函数:将指定的字符串按照指定的日期格式转换为日期
SELECT TO_DATE('2008-08-08 20:08:08','YYYY-MM-DD HH24:MI:SS') FROM dual
**在日期格式字符串中,除英文与符号外的其他字符,都应当使用双引号括起来。
SELECT TO_DATE('2008年08月08日 20:08:08','YYYY"年"MM"月"DD"日" HH24:MI:SS') FROM dual

4.TO_CHAR函数:将指定的日期按照指定的日期格式转换为字符串
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD') FROM dual

**一些常用的日期函数:
1.LAST_DAY(date):返回日期所在月的最后一天。
SELECT LAST_DAY(SYSDATE) FROM dual
SELECT LAST_DAY('20-2月-09') FROM dual -- 28-2月- 09

2.ADD_MONTHS()对指定的日期加上指定的月
SELECT ADD_MONTHS('20-2月-09',2) FROM emp -- 20-4月- 09

3.MONTHS_BETWEEN(date1,date2)
计算两个日期之间相差的天数,计算是用date1-date2的结果换算的。

4.NEXT_DAY(date,i)从给定的date第二天开始算,返回下周的周几。1表示周日,2表示周一。
SELECT NEXT_DAY('20-2月-09',2) FROM dual -- 23-4月- 09

5.GREATEST(expr1[,expr2[,expe3]]...)
LEAST(expr1[,expr2[,expr3]]...)返回参数列表中最大或最小的值

6.EXTRACT函数:可以提取给定日期中指定时间分量的值
DATE可以提取年月日,TIMESTAMP可以提取时分秒
SELECT EXTRACT(YERA FROM SYSDATE) FROM dual
-----------------------------------------------------------------------------------
空值操作
一.NULL的操作
1.更新NULL值
UPDATE student SET gender=NULL

2.判断NULL的条件
要用IS NULL或IS NOT NULL判断,不要使用“=”判断空
UPDATE student SET gender='M' WHERE gender is NULL

3.NULL的计算:
NULL与字符串拼接等于什么都没拼接
NULL与任何数字计算结果还是NULL
SELECT '你好'||NULL FROM dual -- 你好
SELECT NULL+2 FROM dual -- NULL

二.空值函数:
1.NVL(p1,p2)
若p1的值是null则函数返回p2,否则返回p1
SELECT ename,sal,comm,sal+NVL(comm,0) FROM emp

2.NVL2(P1,P2,P3)
若p1的值不为NULL时函数返回p2,若为NULL则返回p3.p2与p3类型要相同。
SELECT ename,comm,NVL2(comm,'有奖金','没奖金') FROM emp
-------------------------------------------------------------------------------------------
查询语句的一些查询条件:
1.> , < , >= , <= , != , <> , =
2.AND和OR
AND的优先级高于OR,可以通过括号来提高OR的优先级。

3.LIKE用于模糊查询字符串,支持两个通配符:
_ :表示任意一个字符
% :表示任意多个字符(0到多个)
SELECT ename,job FROM emp WHERE ename LIKE '_A%'

4.IN与NOT IN
IN:用于判断等于列表之一,IN常用于子查询。
NOT IN 用于判断不在列表中。
SELECT ename,job FROM emp WHERE job IN('MANAGER','CLERK')

5.BETWEEN...AND...用来判断在一个范围内:
SELECT ename,sal FROM emp WHERE sal BETWEEN 1500 AND 3000

6.ANY与ALL
不能单独使用,需要配合单行比较操作符(>,>=,<,<=)一起使用。
>ALL:大于所有列表中的值(大于最大)
>ANY:大于列表中的任意值(大于最小)
<ALL:小于所有列表中的值(小于最小)
<ANY:小于列表中的任意值(小于最大)
**列表中的内容通常是一个查询的结构集,而不是给定的具体值。否则实际没意义。
SELECT ename,job,sal FROM emp WHERE sal>ANY(2500,3000,3500) -- 列表中通常为查询结果集
--------------------------------------------------------------------------------------
聚合函数:会将指定字段查询出的每一条记录对应的值全部进行统计,然后得出一个结果。
1.最大值与最小值:【MAX,MIN】
SELECT MAX(sal),MIN(sal) FROM emp

2.求平均值与求和:【AVG,SUM】
SELECT AVG(NVL(comm,0)),SUM(comm) FROM emp
SELECT ROUND(AVG(NVL(comm,0))),SUM(comm) FROM emp

3.统计给定字段的记录条数(不为NULL的记录):【COUNT】
SELECT COUNT(*) FROM emp
SELECT COUNT(ename) FROM emp
---------------------------------------------------------------------------------------
EXISTS关键字:用于WHERE中作为判断条件使用的,其后需要紧跟一个子查询,
只要该子查询能查询至少一条记录,那么EXISTS表达式就返回真。也可以用NOT EXISTS表示反效果。
查看有员工的部门信息?
SELECT dname,deptno FROM dept d WHERE EXISTS
(SELECT *FROM emp e WHERE e.depton=d.deptno)
------------------------------------------------------------------------------------------
伪列:RACLE支持一个关键字ROWNUM
ROWNUM是一个伪列,该列不存在于任何一张表,但每张表都可以查询该列,该列在结果集中的值是结果集中每条记录的行号,ROWNUM给结果集编号是在查询的过程中进行的,只要可以从表中查询出一条记录,该记录的行号就会作为这条记录ROWNUM字段的值,ROWNUM从1开始递增。

**由于ROWNUM从一开始,所以在第一次查询表中数据进行编号时,不要使用ROWNUM做大于1以上的数字判断,否则查询不到数据。
-------------------------------------------------------------------------------------------
DECODE函数,可以实现类似if-else的操作

SELECT ename,job,sal,
DECODE(job,
'MANAGER',sal*1.2,
'ANALYST',sal*1.1,
'SALESMAN',sal*1.05,
sal
) decode
FROM emp

CASE 字段 WHEN ...THEN....也可以实现类似fi-else的操作

SELECT ename,job,sal,
CASE job WHEN 'MANAGER' THEN sal*12
WHEN 'ANALYST' THEN sal*1.1
WHEN 'SALESMAN' THEN sal*1.05
ELSE sal END
bonus
FROM emp

在GROUP BY中使用DECODE可以做到将字段值不同的记录看做一组,只要将需要看做一组的记录的该字段的

值替换为相同的值即可。例如:
SELECT COUNT(*),DECODE(job,
'MANNAGE','VIP',
'ANALYST','VIP',
'OTHER')
FROM emp
GROUP BY DECODE(job,
'MANNAGE','VIP',
'ANALYST','VIP',
'OTHER')

也可以在ORDER BY中使用DECODE来帮助排序
SELECT deptno,dname,loc
FROM dept
ORDER BY
DECODE(dname,
'OPERRATIONS',1,
'ACCOUNTING',2,
'SALES',3)
------------------------------------------------------------------------------------------
排序函数:可以按照指定的字段分组,然后再按照指定的字段排序,最后位记录生成组内的编号。
1.【ROW_NUMBER()】函数:生成组内连续且唯一的数字。
查看每个部门中的工资排名:
SELECT ename,sal,depton,
ROW_NUMBER() OVER(
PARTITION BY depton
ORDER BY sal DESC
) RANK
FROM emp

2.【RANK()】:生成组内不连续不唯一的数字
3.【DENSE_RANK()】生成组内连续但不唯一的数字
-----------------------------------------------------------------------------------------
UNION并集:去重
SELECT ename,job,sal FROM emp
WHERE job='MANAGER'
UNION
SELECT ename,job,sal FROM emp
WHERE sal>2500

UNION ALL并集:不去重
INTERSECT;交集
MINUS:差集 ** 集合A 差集 集合B = A-A交B
------------------------------------------------------------------------------------------
高级分组函数:
1.GROUP BY ROLLUP(a,b,c)等价于:abc,ab,a,全表
GROUP BY a,b,c
UNION ALL
GROUP BY a,b
UNION ALL
GROUP BY a
UNION ALL
全表

2.CUBE函数:
会将每个参数的不同组合进行分组,然后将所有分组统计结果并在一起分组次数是2的参数 个数次方
GROUP BY(a,b,c)
abc ab ac bc a b c 全部

3.GROUPING SETS:
该函数可以按照指定的分组方式进行分组,然后将结果集并在一起,其中每一个参数就是一种组合方式。
查看每天及每月的营业额?
SELECT year_id,month_id,day_id,SUM(sales_value)
FROM sales
GROUP BY
GROUPING SETS(
(year_id,month_id,day_id),
(year_id,month_id)
)
ORDER BY year_id,month_id,day_id
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: