问题:查询当前数据库系统时间(sysdate)
select sysdate
from dual;
dual :是Oracle自带的一张虚拟表,没有任何意义,为了保证sql语句的完整性。
Oracle中携带了大量了函数:
单行函数(single function)
多行函数(组函数)
--------------数字函数-------------------------------------
round(列|值|表达式,小数的有效位数) 表示四舍五入
select round(3.1415926,3)from dual;
-------------
3.142
trunc(列|值|表达式,小数的有效位数) 直接截取
select trunc(3.1415926,3)from dual;
--------------
3.141
案例:
--将值2784.342933精确到小数点后3位,四舍五入
select
round(2784.342933,3)
from
dual;
--将值2784.342933精确到小数点后3位,不四舍五入
select trunc(2784.342933,3) from dual;
--将值2784.642933精确到整数,2784
select trunc(2784.342933,0) from dual;
--将值2784.342933精确到整数十位,2780
select trunc(2784.342933,-1) from dual;
--将值2784.342933精确到整数百位,2800
select round(2784.342933,-2) from dual;
mod(列|值,列|值) 求余数
--求5/2的余数
select mod(5,2) from dual;
abs(列|值) 求绝对值
--求-2的绝对值
select abs(-2) from dual;
--查询订单表s_ord中总金额total(取整)
select trunc(total,0) from s_ord;(不四舍五入)
select round(total,0) from s_ord;(四舍五入)
-------------字符函数-------------------------------------
length(列|值|表达式);求长度
--获取员工表中员工名字及其名字长度
select
first_name,length(first_name)
from
s_emp
;
--查看HelloWorld字符串的长度
select length(HelloWorld) from dual;
--查询出员工姓名长度为6的员工信息
select * from s_emp where length(first_name)=6;
>>
upper(列|值|表达式);全部转大写字母
lower(列|值|表达式);全部转小写字母
initcap(列|值|表达式);每个单词首字母大写
select upper('abc')from dual;==>ABC
select lower('ABC')from dual;==>abc
select initcap('hello world')from daul;==>Hello World
例子:查询ben的工资
select salary from s_emp where lower(first_name) = lower('ben');
>>
lpad(列|值,宽度,填充字符);从左边补不足宽度个填充字符
rpad(列|值,宽度,填充字符);从右边补不足宽度个填充字符
select rpad('abc',10,'de')from dual;
------------------
abcdededed
select lpad('abc',10,'de')from dual;
----------------
dedededabc
>>
ltrim(列|值,截取字符);从左边截取字符
rtrim(列|值,截取字符);从右边截取字符
select rtrim('abcdedede','de') from dual;
------------
abc
select rtrim('abcddedede','de') from dual;
--------------
abc --表示从右边开始截取de|d|e,直到不同于截取字符的字符为止
>>
replace(列|值,被置换的字符,置换的字符);置换指定字符
select replace('helloworld','owo','***')from dual;==》hell***rld
select replace(111222333,222,666)from dual;==>111666333
>>
translate(参数一,参数二,参数三);转换指定字符
参数一:要处理的内容,列|值
参数二:要检索的内容
参数三:检索后,与检索内容一一对应替换的内容(如果无替换值,则全部去掉)
select
translate('He1l20l4o W65o75rl4d765!',
'abcdefghijklmnopqrstuvwxyz0123456789',
'abcdefghijklmnopqrstuvwxyz')
from dual;
>>
instr(要查询的字符串,希望查询的字符串,从什么位置开始,第几次出现)查找指定字符串中所在的位置下标
select instr('go,go,come on!','go',1,2)from dual;
注意:数据库字符串下标从1开始计数。
>>
substr(列|值,指定位置下标,保留几位)
select substr('hello world!',3)from dual;表示:从指定下标处开始获取字符。
select length(substr('hello world!',3,4))from daul;表示:从3号坐标开始获取,保留四个长度
练习:
--4、找出名字长度超过5的员工
select * from s_emp where length(first_name)>5;
--5、找出职位是stock clerk的员工
select * from s_emp where lower(title) = lower('stock clerk');
--1、把图片表(s_image)中文件名(filename)列中后缀查出来
select
distinct substr(filename,instr(filename,'.',-1,1))
from
s_image;
--2、查出客户表(s_customer)中phone列最后一个-线后面部分
select
substr(phone,instr(phone,'-',-1,1)+1)
from
s_customer
;
例:奥巴马-->奥**
select replace('奥巴马','巴马','**') from dual;
--3、在员工表中模拟显示加密姓名(如:奥巴马-->奥**)
方法一:rpad
select rpad(substr(first_name,1,1),length(first_name),'*') from s_emp;
方法二:replace
select
first_name,
replace(first_name,substr(first_name,2),rpad('*',length(first_name)-1,'*'))
from
s_emp;
>>
decode()
a.类似一个三目运算符:(表达式?a:b)如果表达式为true,取a;如果表达式为false,取b
比较第一和第二个参数,如果相等取第三个参数,如果不相等取第四个参数。
select decode('A','A','B','C')from dual;
select decode(1,1,2,3)from dual;
select decode(1,2,2,3)from dual;
b.if else if else
decode(A,b,c,d,e,f,g,h,i,j)
如果A=b,输出c;
如果A=d,输出e;
如果A=f,输出g;
如果b,d,f都不满足A,输出h.
--输出显示每个订单编号及支付方式,支付方式要么是现金,要么是信用卡,否则就是未知数。
select id,decode(payment_type,'CASH','现金','CREDIT','信用卡','未知数' )
from s_ord;
--输出区域表(s_region)中,每个地区对应的中文
>>
case when 可以把它看成switch功能;
select name 部门名,
case region_id
when 1 then '北美'
when 2 then '南美'
when 3 then '中东'
when 4 then '亚洲'
when 5 then '欧洲'
else '未知区域'
end "区域名"
from s_dept;
--请把员工工资分为3等,超过2000元的为高等,在1500到2000之间的为中等,低于1500的为低等
select
first_name,
case
when salary<1500 then'低等'
when salary>=1500and salary<=2000 then'中等'
when salary>2000 then'高等'
end
from
s_emp;
注意:case后面是否出现列名,取决于when后面条件是否出现比较列
如果when后面已经出现列名,那case后面务必不能写列名,
如果when后面是值,那么必须在case后面指定列名,否则无法确定所给的值的真正含义
-------日期函数-------------------------------------------------------
oracle默认的日期格式为 dd-MON-yy
select sysdate from daul;
dd 表示2位数的日
mon/month 表示月份,如:6月
mm 表示2位数的月,如:06
yyyy 表示4位数的年份
HH24 表示24小时
HH 表示12小时
mi 表示分钟
ss 表示秒
fm 表示去掉前面的0,如:fm 06,值为6
day 表示星期几
日期函数:
sysdate 当前日期
months_between(date1,date2) 2个日期之间的月数
--查询2014年11月1日和2016年12月9日之间的间隔月数
select trunc(abs(months_between(to_date('2014-11-1','yyyy-mm-dd'),to_date('2016-12-9','yyyy-mm-dd'))),0) from dual;
add_months(date1,n) 在date1的基础上加n个月
--半年后的日期是什么?
select add_months(sysdate,6) from dual;
--半年前的日期是什么?
select add_months(sysdate,-6) from dual;
next_day(date1,'星期几') 在date1的基础上,下星期几是什么时候
--下一个星期五是几号?
select next_day(next_day(sysdate,'星期五')) from dual;
last_day(date1) date1日期所在月的最后一天是什么时候
--查询当月底是几号
select last_day(sysdate) from dual;
--查询下月底是几号
select last_day(add_months(sysdate,1)) from dual;
练习:
--查询所有员工的工作月数
select trunc(months_between(sysdate,start_date),0) from s_emp;
--查询所有员工的工作天数
select first_name,round((sysdate-start_date),0) from s_emp;
注意:Oracle中日期类型是可以减法运算的,结果是两个日期的天数!!!
--计算一年前,当前,一年后的时间
select add_months(sysdate,-12),sysdate,add_months(sysdate,12) from dual;
--当前日期的前六个月的最后一天
select last_day(add_months(sysdate,-6)) from dual;
--显示下个星期五是什么日期
select next_day(next_day(sysdate,'星期五')) from dual;
补充:
修改当前会话语言环境:
alter session set nls_language = 'american';//改为英文
alter session set nls_language = 'simplified chinese';//改为简体中文
修改当前会话日期格式:
alter session set nls_date_formate='yyyy-mm-dd HH24:mi:ss';//改为年月日时分秒
-----转换函数--------------------------------
to_number:字符转换成数字
select to_number('9837492.563','999999999.999') from dual
to_date:字符转换成日期
select to_date('2009-10-3 15:10:23','yyyy-mm-dd hh24:mi:ss') from dual
to_char:日期/数字 转换成 字符
select to_char (sysdate,'yyyy-mm-dd hh24:mi:ss') from dual
select to_char(9837492,'$999,999,999.99') from dual
select to_char(9837492.563,'999999999.99') from dual
--把123字符串转换成数字123
--把2000-02-22字符串按照模板yyyy-mm-dd转换成日期
--把数字格式化为字符窜的时候可以用一些符号
9 代表任意数据
L 代表本地的货币符号
$ 代表美元
0 代表0