sql常用语句
一、字符串相关
1.根据指定字符替换
select replace(column_name, '旧字符', '新字符') from table_name;
2.截取指定下标开始的指定长度字符串
select substring(column_name ,start_index,字符长度) from table_name;
3.获取指定字符的下标
select charindex('字符',column_name) from table_name;
4.反转指定字段数据
select reverse(column_name) from table_name;
5.获取指定前几个字符
select left(column_name,字符长度) from table_name;
6.获取指定后几个字符
select right(column_name,字符长度) from table_name;
二、时间相关
1.将时间转为字符串(24小时制)
select to_char(column_name,'yyyy-MM-dd HH24:mi:ss') from table_name;
2.将字符串格式化为时间
select to_date('2024-02-29 14:11:24','yyyy-MM-dd HH24:mi:ss') from dual;
三、数据处理相关
1.查询根据指定字段去重(去除重复数据,保留id最大的重复数据)select * from 表名 where id in (select id from
(select su.*, row_number() over (partition by 去重字段名 order by su.id desc ) rn
from 表名 su where 其他条件 ) where rn = 1 )
2.查询重复多余的数据
select * from 表名 where id in (select id from
(select su.*, row_number() over (partition by 去重字段名 order by su.id desc ) rn
from 表名 su where 其他条件 ) where rn != 1 )
3.distinct过滤重复数据,限制较大,要过滤和获取较少的字段推荐使用。
select distinct 字段名1,字段名2 from 表名 where 其他条件;
4.sql查询,将某个字段值设置为固定的,适用于固定值的匹配,例如学生表性别匹配
select name,
case sex
when 1 then '男'
when 0 then '女'
else
'未定义'
end as sex
from student
数据源:
查询结果:
5.行转列拼接(仅适用oracle数据库)
(1)将多行数据,根据某一列(或两列)分组,另一列按照特定规则拼接,例如:将相同部门的人员转为一条数据,并用“,”拼接起来
数据如下:
sql和结果:
select organname,listagg(name, ', ') within group (order by name) as username from userinfo group by organname
(2)将多字段行转列拼接
新增性别字段:
将姓名和性别拼接到一起,再进行行转列:
select organname,listagg(name || '-' || sex, ', ') within group (order by name) as username from userinfo group by organname
(3)将多列的值拼接到一个字段并且字符很长时,可以使用xmlagg生成clob字段
select organname, RTRIM(XMLCAST(XMLAGG(XMLELEMENT(e, name || ' - $' || sex) ORDER BY name) AS CLOB), ', ') AS info FROM userinfo GROUP BY organname;
四、语法差异
1.truncate和delete
- truncate 只能删除table,delete可以删除table、view等
- 用delete删除数据,表空间中其被删除数据的表占用的空间还在,便于以后的使用,另外它是“假相”的删除,相当于windows中用delete删除数据是把数据放到回收站中,还可以恢复,当然如果这个时候重新启动系统(OS或者RDBMS),它也就不能恢复了!
用truncate清除数据,内存中表空间中其被删除数据的表占用的空间会被立即释放,相当于windows中用shift+delete删除数据,不进回收站,不能够恢复! - truncate 后面不能带where条件,delete可以带where条件。