不同数据库Oracle、PostgreSQL、Vertical、Mysql常用操作

不同数据库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值处理、窗口函数、数据库特定功能、表和权限管理以及对比表差异等,方便日常在不同数据库处理数据。

相关推荐
jackson凌3 小时前
【Java学习笔记】Java第一课,梦开始的地方!!!
java·笔记
I like Code?3 小时前
AntVG2可视化学习与开发笔记-React19(持续更新)
javascript·笔记·学习
那天的烟花雨4 小时前
android display 笔记(十一)surfaceflinger 如何将图层传到lcd驱动的呢?
android·笔记
你说你说你来说4 小时前
安卓开发Intent详细介绍和使用
android·笔记
jingjingjing11114 小时前
笔记:代码随想录算法训练营day67:Floyd 算法精讲、A * 算法精讲 (A star算法) 严重超时完结,不过,撒花
笔记
zhuyixiangyyds5 小时前
day28图像处理OpenCV
图像处理·笔记·学习
DaLi Yao6 小时前
【笔记】对抗训练-GAN
笔记
不爱吃于先生6 小时前
机器学习概述自用笔记(李宏毅)
人工智能·笔记·机器学习
辛姜_千尘红回6 小时前
AT_abc398_e [ABC398E] Tree Game 题解
c语言·c++·笔记·算法
*TQK*8 小时前
Java笔记5——面向对象(下)
java·笔记·学习