oracle 学习笔记 (二)
函数
Oracle 字符函数;
首字母大写;
INITCAP :函数;
select ID,NAME,INITCAP(NAME) from alex_t05 ;
Oracle查询替换函数 REPLACE
select NAME,REPLACE(NAME,'x','__') FROM alex_05
oracle 字符函数; 字符长度=4的行;
select * from alex_t05 where LENGTH(name)=4;
想办法截取前三个字符。那么截取的操作就一定要使用SUBSTR()函数.可是在截取之前有必要提醒的是,SUBSTR()函数有两种形式:
从指定位置截取到结尾:SUBSTR(列|字符串,截取开始点);
截取部分的字符串: SUBSTR(列|字符串,截取开始点,截取个数).
列子:
select * from alex_t05 where SUBSTR(name,1,3)='ale';
select * from alex_t05 where SUBSTR(name,0,3)='ale';
在Oracle数据库之中,下标都是从1开始;
select name 原始,SUBSTR(name,3) 截取之后 from alex_t05
select name 原始,SUBSTR(name,-3) 截取之后 from alex_t05
Oracle 数值函数
ROUND函数基本的机制是小数进位;
select ROUND(789.652) FROM alex_t05;
select ROUND(789.652,2) FROM alex_t05 保留两位小数;
select ROUND(789.652,-1) FROM alex_t05 保留整数进位;
select ROUND(8000/30,2) FROM alex_t05 求出用户月薪;
ROUND函数的功能是小数进位,而TRUNC()的功能是不进位
截取数值函数TRUNC
select
TRUNC(789.652) 截取小数,
TRUNC(789.652,2)截取两位小数,
TRUNC(789.652,-2)取整
from alex_t05;
MOD函数
select
mod(100,3)
from alex_t05
oracle 日期函数
SYSDATE:时间函数,取出当前时间的函数;
MONTHS_BETWEEN函数返回两个日期之间的月份数;
select SYSDATE from alex_t05;
alter session set NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss';
#更改日期格式;启动转换函数;
#若干天的日期: 日期-数字;
#若干天后的日期: 日期+数字;
#如果要想计算天数唯一可以使用的公式就是"日期"
select SYSDATE,SYSDATE+3,SYSDATE-3 from alex_t05;
求出当前日期之后4个月的日期add_months;
SELECT SYSDATE, add_months(SYSDATE, 4) 四个月之后的日期 from alex_t05
SELECT
SYSDATE,
add_months(SYSDATE, 4) 四个月之后的日期,
add_months(SYSDATE,-3) 三个月之前的日期,
add_months(SYSDATE,60) 六十个月之后的日期,
SYSDATE + 90
from alex_t05
SELECT
SYSDATE,
NEXT_DAY(SYSDATE,'星期日') 下一个星期日,
NEXT_DAY(SYSDATE,'星期一') 下一个星期一,
NEXT_DAY(SYSDATE,'星期三')下一个星期三
from dual
LAST_DAY 函数:
本月的最后一天:
select SYSDATE,LAST_DAY(SYSDATE) FROM dual
select empno 雇员编号,ename 雇员姓名, hiredate 雇员日期,
trunc(months_between(SYSDATE, hiredate)/12) 雇佣总年份,
trunc(mod (months_between(SYSDATE, hiredate),12))雇佣总月份,
SYSDATE - add_months(hiredate, months_between(SYSDATE, hiredate) 雇佣总天数
from emp
select
extract (YEAR FROM SYSTIMESTAMP) years,
extract (month from systimestamp)months,
extract (day from systimestamp)days
from emp;
select
extract (YEAR FROM SYSTIMESTAMP) years,
extract (month from systimestamp)months,
extract (day from systimestamp)days,
extract (hour FROM SYSTIMESTAMP) hours,
extract (minute from systimestamp) minutes,
extract (second from systimestamp) seconds
from emp;
查处两个时间段相隔多少天;多少秒;
select
extract (day from datetime_one - datetime_two) days ,
extract (hour from datetime_one - datetime_two) hours,
extract (minute from datetime_one -datetime_two)minutes,
extract (SECOND from datetime_one - datetime_two)seconds
from (
select to_timestamp('1982-08-13 12:17:57', 'yyyy-mm-dd hh24:mi:ss') datetime_one,
to_timestamp('1981-09-27 09:08:33', 'yyyy-mm-dd hh24:mi:ss') datetime_two
from emp);
去掉秒单位;前到0
select SYSDATE 当前系统时间,
to_char(SYSDATE, 'YYYY-MM-DD')格式化日期,
to_char(SYSDATE, 'YYYY-MM-DD HH24-MI:SS')格式化日期时间,
to_char(SYSDATE, 'FMYYYY-MM-DD HH24-MI:SS')去掉前到0的日期时间
from emp;
oracle 数据库表内链接;左外连接;
select e.empno, e.ename, m.empno,e.ename from emp e , emp m where e.mgr=m.empno(+);
交叉连接:笛卡尔集;
select * from emp cross join dept
内连接; 这个时候
select * from emp NATURAL join dept
外连接;设置连接字段;
select * from emp join dept USING(deptno)
完全右外连接:
select * from user u right outer join user_static s on (u.id = s.id) where u.id is not null
左外连接
select * from user u left outer join user_static s on (u.id = s.id) where u.id is not null
oracle 能够使用(+);来控制左右连接;
要实现集合的运算;主要使用四种运算符:
union(并集) : 返回若干个查询结果的全部内容;但是重复元祖不显示;
SELECT * FROM user WHERE ID = 43456 UNION SELECT * FROM user WHERE ID = 43457
unionall(并集):返回若干个查询结果的全部内容;重复元祖也会显示;
SELECT * FROM user WHERE ID in (43456,43457,43458) UNION ALL SELECT * FROM user WHERE ID = 43457
minus(差集): 返回若干个查询结果中的不同部分;
intersect(交集):返回若干个查询结果中的相同部分;
SQL 统计函数:
select min(id) , max(id) from user
SQL 统计公司user收入之中中间的收入;
use jrd;
select MEDIAN(income) from user
查询每个职位的