Oracle语句&函数

oracle语句

ddl语句

create 建表

CREATE TABLE 表名( 
   id   number, 
   name varchar2 (20), 
);  

create 备份表

create table bf as select * from 原表

改列名

alter table 表名 rename column 旧列名 to 新列名;

改列的字段类型

1、有数据情况

方式一(不会改变列的位置)

    ALTER TABLE 表名 ADD 临时列 目标数据类型;  --新建临时列
    UPDATE 表名 SET 临时列= 目标列; --将目标列的数据复制到临时列中
    UPDATE 表名 SET 目标列= NULL; --将目标列的数据清空
    alter table 表名 modify 目标列 目标数据类型; --更改目标列的数据类型
    UPDATE 表名 SET 目标列 = 临时列; --将临时列的数据复制回目标列
    ALTER TABLE 表名 DROP COLUMN 临时列; --删除临时列。

方式二

Alter Table 表名 Add  临时列 新类型; -- 新增一个临时字段 
update 表名 set 临时列 = 旧列; -- 设置 临时列 字段的值为 旧列
alter table 表名 drop (旧列); -- 删除字段旧列
alter table 表名 rename column 临时列名 to 旧列名; -- 修改 临时列名 为 旧列名

2、无数据情况

alter table 表名 modify 列名 新类型;  
alter table 表名 modify(  列名  新类型)

增加列

alter table 表名  add 列名 类型   default; 

删除列

alter table 表名 drop column 列名

为字段添加注释

comment on  column 表名.列名  is '注释信息';

dml语句

插入

INSERT INTO 表名 (1,2,...) VALUES (1,2,....)  字符用单引号

修改

UPDATE 表名 SET 列名 = 新值 WHERE 列名称 = 某值

删除

DELETE FROM 表名称 WHERE 列名 =

复制表数据 insert into select

insert into biao(x1,x2) select x1,x2 from biao;

select语句

解锁复制数据

select * from 表名 for update

distinct

select distinct f.name from food f;

group having

select name as "食物名",count(*) as "数量" from food 
group by name
having count(*) > 10;
--查找数量大于10的食物名

rownum 分页查询


select * from (select rownum hanghao,f.* from food f) t 
where t.hanghao >= 1 and t.hanghao <=10;
--查找前10条food记录

排序查询

select * from food order by id desc nulls last;
--据food的id降序排序,NULL值放到最后。

多表查询

内连接:有对应的就连接 inner join on
左外:左表的都用上 =(+)
右外:右表都用上 right outer join on
全外:两表都用上 full outer join on
交叉:记录数的两表记录数的乘积 cross join on

oracle函数

wm_concat()

wm_concat() 

–实现行转列,即将查询出的某一列值使用逗号进行隔开拼接,成为一条数据。

select name , wm_concat(price) from food group by name;

instr() 找字符位置

instr() 

–字符查找,返回位置。

instr('helhoh','h',2,2)   =   6
--从第二个位置开始找第2个h的位置 ,没有返回0
instr('helhoh','h',-1,1)   =   6
--从倒数第1个位置开始找第1个h的位置 ,没有返回0

ceil

–返回大于等于参数的最小整数

round

四舍五入

保留4为小数
select round('12.25467',4) from dual;  -- 12.2547

to_date

–函数作用:将字符串转换为日期类型

select to_date('2023-05-19 8:54:57','yyyy-mm-dd hh24:mi:ss') from dual;
select * from xx where xx.rq between to_date('2023-11-17 0:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2023-11-18 23:59:59','yyyy-mm-dd hh24:mi:ss')

to_char

–函数作用:将其他类型转换为字符串类型

//sysdate 当前日期时间
select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;
select to_char(field,'yyyy-MM-dd HH24:mi:ss') from dual
//field  为 date类型字段

concat

concat(expression1, expression2)

–函数作用:字符串拼接函数

select concat('left', 'Right') from dual

注意:也可以利用 || 进行拼接,select ‘a’||‘b’ from dual

over partition by

 over(partition by field_name, order by field_name)

–函数作用:over函数是一个分析函数,和聚合函数搭配在一起使用可以简洁代码

select name, grade, classes,
sum(grade) over(partition by classes) sum,  --某班级总成绩,sum值一直是组内所有成绩的总和
sum(grade) over(partition by classes order by grade desc) sum --加上排序后sum值是按顺序逐步累加的值,越来越大,直到变成组内所有成绩的总和
from biao;

注意:按照以前的写法先进分组统计产生临时表关联原表才可以取到其他信息,现在则不需要了

通常和max(),min(),avg(),sum()等聚合函数一起使用

trunc()

trunc()

–函数作用:是截取日期或数字,根据规则返回指定的值

//截取日期
select  trunc(sysdate,'dd') from   dual ;--返回当前年月日

//截取数值(不四舍五入),trunc(a,b) a参数是源数据,如果b没有就是取整;如果b是正数保留小数点后b位;如果b是负数马,则从小数点左边开始截取。

select trunc(126.567) from dual union all      --126
select trunc(126.567,2) from dual  union all   --126.56
select trunc(126.567,-2) from dual  		   --100

rank()

rank() over(partition by field_name order by field_name)

函数作用:根据分区排名,不连续 1 1 3 4。
gift-price
a-10
a-10
b-20
a-30
b-40

用例:select rank() over(partition by gift order by price) rank_num, t.* from biao t;
rank_num-gift-price
1-a-10
1-a-10
3-a-30
1-b-20
2-b-40

dense_rank()

dense_rank() over(partition by field_name order by field_name)

函数作用:根据分区排名,连续 1 1 2 3。
gift-price
a-10
a-10
b-20
a-30
b-40

用例:select dense_rank() over(partition by gift order by price) rank_num , t.* from biao t;
rank_num-gift-price
1-a-10
1-a-10
2-a-30
1-b-20
2-b-40

row_number()

分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。
gift-price
a-10
a-10
b-20
a-30
b-40

用例:select row_number() over(partition by gift order by price) rank_num , t.* from biao t;
rank_num-gift-price
1-a-10
2-a-10
3-a-30
1-b-20
2-b-40

截取字符串 substr

select substr('abcde', 2, 3) from dual   --  bcd
位置2开始截取长度为3的字符串
select instr('abcbde', 'b',1,2) from dual -- 4
从位置1 开始查找第二次出现字符 b  的位置
select replace('abcbde', 'b','x') from dual -- axcxde
把所有b替换为x

注意:oracle字符串索引从1开始

trim()

函数作用:去掉左右两端的空白字符

用例:

select trim('    zifuchuan    ') from dual;

注意:仅去掉左边空白字符用ltrim,仅去掉右边空白字符用rtrim

sign(n)

函数作用:取数字n的符号,大于0返回1, 小于0返回-1, 等于0返回0

用例:

select sign(8),sign(-8),sign(0) from dual;

round(number[,decimal])

函数作用:对数字n进行四舍五入处理,保留decimal位小数

用例:select round(100.21),round(100.56),round(100.58,1),round(105.34,-1) from dual;

coalesce(expression1,expression2…)

函数作用:返回表达式中第一个不为空的值,如果全为空则返回空值

用例:

select coalesce(null,6,7) value from dual;

decode()

decode(field_name, value1, new_value1, value2, new_value2, default_value)

函数作用:类似if…else…语句块,针对某个字段,如果它的值为value1,则转换为newValue1,如果值为value2,则转换为newValue2,其他情况显示默认值

replace()

replace(field_name, sub_str, replace_str)

函数作用:将指定的字符串替换为指定的字符串

translate()

select translate('abcd','a','1') from dual;  -- 1bcd
select translate('abcd','a','123') from dual; --1bcd
select translate('abcd','abc','123') from dual; --123d
select translate('abcd','abc','12') from dual; --12d
select translate('abcd','abc','1') from dual; --1d
select translate('abcd','e','1') from dual; --abcd

nvl()

nvl(e1,e2)

返回第一个不为空的参数

nvl2()

nvl2(expression1,expression2,expression3)

e1 非null ,则e2 , null 则e3

case when … then … else … end

select case when name= 'hangbao' then '汉堡' when name = 'kele' then '可乐' else '香蕉' end name_ch from food

行转列

方式一 (group by 聚合函数)

select name,
max(decode(course,'物理',score,'')) as 物理,
max(decode(course,'化学',score,'')) as 化学,
max(decode(course,'信息',score,'')) as 信息 from  biao group by name;

方式二 (oracle 自带 pivot )

select * from (
select name,course,score from biao
)
pivot (
max(score) for course in ('物理' as 物理, '化学' as 化学 , '信息' as  信息)
);

列转行

方式一 (union all)

select name,'物理' as course,物理 as score from biao1
union all
select name,'化学' as course,化学 as score from biao1
union all
select name,'信息' as course,信息 as score from biao1;

方式二 (oracle 自带 unpivot )

select name,course,score from(
select name,物理,化学,信息 from biao1
) 
unpivot( 
score for course in (
物理 as '物理',
化学 as '化学',
信息 as '信息'
)
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值