目录
④ replace() 替换SELECT replace(' fff ddd ', ' ', '') as tt from dual --将空字符串去掉
④ COALESCE (expr1, expr2, ..., exprn)
阅读前须知:①由于之前已经会mysql了,所以这里跟mysql相同的sql就不再记录了。
②oracle要求表名和字段名必须大写,但是为了方便阅读,部分sql故意写成小写了。
③先将用到的表字段列取出来,如下:表明为:EMPLOYEES
1. ||
表示连接符,将两个字段连接起来
2. 双引号“”
别名中使用特殊字符,或者是强制大小写敏感,或有空格时,都需加双引号
FIRST_NAME 和 LAST_NAME 是表种的字段
SELECT FIRST_NAME||LAST_NAME as "name" FROM EMPLOYEES;
3. 单引号‘’
用来连接字符串
SELECT FIRST_NAME||LAST_NAME||'的工作是:'||salary as describe from employees;
4.空值
-- 空值的任何算术表达式都等于空,包括加减
-- 包括空值的连接表达式等于与空字符串连接,也就是原来的字符串
SELECT salary*commission_pct as tt from employees;
效果:设计到有空的运算,全部边为空
5.distinct
使用distinct关键字去重(列去重/行去重)
SELECT distinct salary from employees;--列去重,后面可跟多个
SELECT distinct* from employees; --行去重
6. 字符串处理
①.dual虚表:
存储临时数据 mysql里边也有

② substr(‘’,int,int)
注意:java里面索引是从0开始,而数据库里面是从1开始 ,所以下面两个是一样的
SELECT SUBSTR('fdsfdgfdg', 0, 3) as tt ,SUBSTR('fdsfdgfdg', 1, 3) as yy from dual;

③ trim()
将符串两边的空格去掉(中间的不会去掉)
SELECT TRIM(' fff ddd ') as tt from dual

④ replace() 替换
SELECT replace(' fff ddd ', ' ', '') as tt from dual --将空字符串去掉
7. 数字函数
① Round()四舍五入
SELECT "ROUND"(156.123456, 2) as tt,"ROUND"(156.123456, -2) as yy from dual;

② TRUNC()取余数
SELECT "TRUNC"(156.123456, 2) from dual;
SELECT "TRUNC"(156.123456, -2) from dual;
8. 日期函数
① 时间运行的环境
注意:使用时间函数的时候,需查看运行的环境,如下
--查看当前的环境
SELECT * from V$NLS_PARAMETERS;
--设置当前会员环境语言为 简体中文
alter session set nls_language='SIMPLIFIED CHINESE';
--设置当前会员环境语言为 英文
alter session set nls_language='AMERICAN';
② add_months 、 sysdate
--add_months(date_value,number_of_months):用于从一个日期值增加或减少一些月份
-- sysdate 表示返回当前的会话时间
select add_months(sysdate,12) as "明年今日",
add_months(sysdate,-12) as "去年今日"
from dual;
③ current_date
-- current_date:返回当前会话时区中的当前日期(出国才有影响)
select sessiontimezone,current_date from dual;
alter session set time_zone='-11:00'//修改当前会话时区
④ extract
--extract(date_field from datetime_value):找出日期或间隔值的字段值
select extract(year from sysdate) "当前月份",
extract(month from sysdate) "当前月份",
extract(day from sysdate) "当前月份"
from dual;
⑤ last_day(date_value)
a--last_day(date_value):返回指定日期中的月份的最后一天的日期
select last_day('2000-02-01') "润月" from dual;--操作失败,因为里面要求是时间格式
b--转换时间格式函数TO_DATE
select last_day(TO_DATE('2000-02-01', 'yyyy-mm-dd')) "润月" from dual;
c--业务场景:查询每个月最后3天入职的人
SELECT * FROM employees where hire_date>=last_day(hire_date)-2
⑥ next_day( date, weekday )
--next_day( date, weekday ):返回指定时间的下一个星期的指定星期对应的日期(注意时间环境)
--注意,跟语言环境有关系,如果是中文环境,下面传入中文,如果是英文环境,就是传入英文(少用,因为不知道用户的操作环境)
select next_day(sysdate,'星期一') from dual;
⑦ months_between(f,s)
--months_between(f,s) 日期f和s间相差月数 (注意时间环境)
select months_between(sysdate,'04-5月-09')from dual;
--场景:查询入职五年的员工
select t.* from employees t where months_between(sysdate, hire_date)>=12*5
9 转换函数
① to_char函数
2.4.1 隐式转换
select '222'+44 as num from dual; //--这里含有一个隐式转换,一般不这样写。
2.4.2 数字9
9 代表一位数字,如果当前位有数字,显示数字,否则不显示(小数部分仍然会强制显示)
select to_char(123456.789,'999,999,99')
from dual;
2.4.3 数字0
0 强制显示该位,如果当前位有数字,显示数字,否则显示0
select to_char(123456.789,'000,000,00')
from dual;
2.4.4 $
$ 增加美元符号显示
select to_char(123456.789,'$999,999,99') from dual;
②TO_DATE函数
select * from employees t
where hire_date between to_date('2010-01-01','yyyy-mm-dd')
and to_date('2010-12-31','yyyy-mm-dd')
10 其他函数
① NVL (expr1, expr2)
相当于mysql里面的ifnull函数
将空值转换为替换的值
支持多种数据格式可以是日期,字符,数字
NVL的两个参数数据类型必须匹配 ,否则出错。
select NVL(NULL,5) from dual
② NVL2 (expr0,expr1,expr2)
相当于三目运算
如果expr0不为Null,返回expr1, 为Null,返回expr2.
expr0可以为任何数据类型
select "NVL2"(null, 1, 2) from dual
③ NULLIF (expr1, expr2)
比较两个表达式,如果相等返回空值,如果不等返回第一个表达式。
select "NULLIF"(2, 1) from dual
④ COALESCE (expr1, expr2, ..., exprn)
返回表达式列表里的第一个非空表达式的值,表达式列表可以包含很多表达式,
当第一个满足值非空时,返回这个表达式的值。 expr1,expr2,...,exprn的数据类型必须一致
select coalesce(null,1,2,null,3) from dual
⑤ CASE 函数
相当于if-else
select
CASE 1
WHEN 1 THEN 1
WHEN 2 THEN 2
WHEN 3 THEN 3
ELSE 4
END as tt
from dual
⑥ DECODE函数
类似于CASE 或 IF-THEN-ELSE 语句
DECODE(col/expression, search1, result1
[, search2, result2,...,]
[, default])
如下:第一个红框的值等于下面红框的某个值,那么就返回那个值后面的值,否则就返回最后的默认值。比较的时候只能是等于效果
持续更新中。