不同数据库Oracle、PostgreSQL、Vertical、Mysql常用操作
授权语句用于管理数据库用户的权限,常见的授权语句如下:
1、授权用户对表的SELECT权限
GRANT SELECT ON dbname.tbname TO username; 赋权限
grant select on test_db.students to new_user;
2、类型转换
cast(col AS INTEGER); 转整型
to_char(now()-interval '1 day','yyyymmdd'); 时间转字符串
NVL(to_char(to_char(col,'YYYYMMDDHH24MISS')))
3、PGV数据库:区分大小写,库表列名小写,常用类型有: bigint、numeric、date、timestamp、time
string_agg(column_name, separator) 将结果集某个字段的所有行连接成字符串
substr("原始字符","指定的字符",布尔值) 获取指定字符串之后或之前所有字符
SUBSTRING(string FROM start [FOR length]) 截取字符串中指定位置的字符
LEFT(string, length) 截取字符串左边指定数量的字符
RIGHT(string, length) 截取字符串右边指定数量的字符
CONCAT(string1, string2, ...) 将多个字符串进行连接
replace(uuid_generate_v4()::text,'-','') 获取uuid:sys_uuid、gen_random_uuid、uuid_generate_v5
cast('123' as bigint) '123'::numeric bigint '123'
row_number() over( [ partition by col1] order by col2[ desc ] )
select max(length(colname)) from tbname; 获取列最大长度
NVL(expr1,expr2); 如果expr1为空,则返回expr2;否则返回expr1(函数需要先创建)
COALESCE(expr1, expr2, ...); 逐个判断返回不为空的值,如果所有表达式均为空,则返回NULL
md5(str)
pgv3不能用NOT IN,用 LEFT JOIN或NOT EXISTS实现
SELECT ID FROM A WHERE NOT EXISTS IN(SELECT 1 FROM B WHERE A.ID=B.ID)
时间操作:
select now() ;当前时间 /* timestamp格式 'yyyyMMdd hh:mm:ss' */
select current_date ;当前时间 /* date格式 'yyyyMMdd' */
select now() - interval '1 week'; 近一周
select to_char(now()-interval '1 month','yyyymm'); 获取上月日期
select date_trunc('day',now()::TIMESTAMP) 获取当天时间
select date_trunc('month',now()::TIMESTAMP) 获取当月1号
select trunc(now(),'mm') 获取当月1号
select date_trunc('month',now()) + '1month -1day'; 当前日期的月末
select (date_trunc('month',now()) +'-1 day')::date ; 当前日期的上月末
select (date_trunc('month',now()) +'-1 month')::date ; 当前日期的上月1号
select add_months(trunc(now(),'mm'),-1) 当前日期的上月1号
select date_trunc('quarter', current_date) 获取当前季度开始日期
select date_trunc('quarter', current_date) + '3 month' - interval '1 day' 获取当前季度结束日期
select date_trunc('year',now())::date ; 当前日期的年初
select date_trunc('year',now()) + '1year - 1 day' ::date ; 当前日期的年末
select extract(month from now()+'-1 month'); 获取上个月月份数
select extract(month from date('202402'||'01')); 获取数字月份数
select extract(year from now()+'-1 month'); 获取上年年份数
select to_char(to_timestamp('2024-2-26', 'YYYY-MM-DD'),'YYYY-MM-DD'); 日期转字符串
select to_char(now(), 'YYYY-MM-DD HH24:MI:SS') 获取日期时间字符串
select to_date('2024-2-26', 'YYYY-MM-DD'); 字符串转日期
select date_part('month',now()) 获取月份数
EXCEPT对比两张表差异:数据出现第一个表,但不在第二个表。outer join 加主键对比两表数据
select * from pg_tables where TABLENAME='tbname'; 查询表归属
select * from information_schema_table_privileges where table_name='tbname'; 查询表权限
select 'grant select on schN.'||tablename||' to newUN;' from pg_tables
where schemaName='schN' and tableowner='oldUN'; #批量赋权
select pid, query from pg_stat_cluster_activity where query like '%tbname%' and nodename like '%cn%'; #查询死锁
select pid, query from pg_stat_cluster_activity where queryid='qid'; #查看并行执行
select pg_terminate_backend( '进程pid'); 杀掉进程pid
select pg_cancel_backend( '进程pid'); 杀掉进程pid
4、ORACLE数据库: 严格区分大小写 (19c表别名可以不加AS) ,拼接单引号''',''' 特殊类型有 CLOB
LISTAGG(XXX,',') WITHIN GROUP( ORDER BY XXX) over(partition by XXX) rank 行转列拼接字符串
SELECT SUBSTR(CAST(LISTAGG(COL,''',''') WITHIN GROUP(ORDER BY KW) AS VARCHAR2(1000)),1,1000) AS LTAG
RTRIM(xmlagg(xmlparse(content col || ','wellformed) order by col).getclobval(),',')
RTRIM(xmlagg(XMLELEMENT(E, col,',').EXTRACT('//text()') order by col).getclobval(),',')
SUBSTR(string,start, [length]); 截取字符串
months_between('2024-02-11',sysdate-1); 获取月份差
select trunc(start-end) from dual; 获取时间差天数 floor(sta-end); 获取日期差
add_months(trunc(sysdate,'mm'),-1) 获取上一个月份1号
add_months(sysdate,-1) 获取上个月日期
SELECT add_months(SYSDATE, 1) FROM dual; 一个月后的日期
SELECT add_months(TRUNC(SYSDATE, 'YYYY'), 12) - TRUNC(SYSDATE, 'YYYY') days FROM dual; 当年天数
-- 当前时间减去10分钟,同理换成year(年)、month(月)、day(日)、hour(时)、second(秒)
select sysdate,sysdate - interval '10' minute from dual; 获取十分钟前时间
select sysdate - interval '10' day as ten_days_ago,sysdate -10 from dual; 获取十天前时间
to_date('202402'||'01','yyyymmdd') 字符串转格式化日期
to_char(add_months(sysdate,-1),'mm') 获取上个月月份数
to_char(sysdate, 'YYYY') 获取本年年份数
cast(to_date('2024/2/26','yyyy-mm-dd,hh24:mi:ss') as timestamp) 字符串转时间戳
to_char(to_timestamp('2024-2-26','yyyy-mm-dd hh24:mi:ss') ,'YYYY-MM-DD HH24:MI:SS') 特殊格式:DD-MON-YY HH.MI.SS AM
NVL(expr1,expr2);如果expr1为空,则返回expr2;否则返回expr1
COALESCE(expr1, expr2, ...); 逐个判断返回不为空的值,如果所有表达式均为空,则返回NULL。
select ROW_NUMBER() OVER (PARTITION BY uuid ORDER BY dt DESC) AS rn FROM tbname where rn=1; 分组排序取第一个
select SYS_GUID() from dual; 获取数据库 uuid
DBMS_RANDOM.VALUE 获取随机数RANDOM()
MINUS对比两张表差异。也可以使用NOT IN子查询,NOT EXISTS子查询,LEFT JOIN和IS NULL 判断
select * from all_tables t where t.table_name like '%tbname%' and t.owner like '%user%'; 查表
select * from all_objects t where t.object_name like '%tbname%' and t.owner like '%user%';
select * from dba_segments t where t.segment_name like '%tbname%' and t.owner like '%user%';
select * from all_col_comments t where t.table_name like '%tbname%' and t.column_name like '%comn%';
SELECT Last_Day FROM(SELECT TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE,-24)+LEVEL-1),'YYYY-MM-DD') AS Last_Day --获取最近两年每个月的最后一天日期
SELECT FROM DUAL CONNECT BY LEVEL<=ADD_MONTHS(SYSDATE,-0)-ADD_MONTHS(SYSDATE,-24)+1)aa GROUP BY Last_Day;
SELECT CASE WHEN REGEXP_LIKE(col,'^(-)*[[:digit:]]+(\.[[:digit:]]+)*$')
THEN '数字' ELSE '非数字' END AS rt FROM tbname; 查找数字
5、Vertical 数据库:严格区分大小写,常用函数与pg类似,部分函数与Oracle类似
row_number() over (partition by colkey order by col) as rnk 分组排序编号
rank() over (partition by colkey order by col) as rnk 分组排序续编号
GETDATE() NOW() 获取当前时间
MONTH(now())-1 获取上个月月份数
last_day(date('202402'||'01')) 当前日期的月末
substr(cast(listagg(col USING parameters max_length=3000,on_overflow='TRUNCATE') AS varchar),1,1199); 行转列拼接字符串,截取1199段
REPLACE(CAST(UUID_GENERATE() AS VARCHAR),'-','') 获取数据库uuid
SELECT MONTHS_BETWEEN('2023-03-01'::DATE,'2023-01-01'::DATE) AS MONTHS_DIFFERENCE; 获取月份差
DROP TABLE tbname CASCADE 删除有依赖对象的表
alter table schemaName.tbname alter column colname set DATA TYPE ${dataType}; 修改字段类型
alter table schemaName.tbname rename column colname to field2; 修改列名
alter table schemaName.tbname alter column colname drop not null; 删除字段不为空约束
select table_name,owner_name from tables where table_name='tbname'; 查看表所有者
6、MYSQL数据库:严格区分大小写
SELECT DATE_FORMAT(NOW(),'%Y-%M-%D %H:%I:%S'); 获取日期字符串
SELECT DATE_ADD(NOW(),INTERVAL 1 DAY); 加1天DAY/HOUR/WEEK/MONTH/QUARTER/YEAR
SELECT DATE_SUB(NOW(),INTERVAL 30 DAY);
以上是不同数据库常见的操作,包括授权语句、数据类型转换、时间操作、字符串操作、NULL值处理、窗口函数、数据库特定功能、表和权限管理以及对比表差异等,方便日常在不同数据库处理数据。