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

相关推荐
GodKK老神灭1 小时前
ESP32蓝牙开发笔记(十五)
笔记
moxiaoran57532 小时前
Kubernetes(k8s)学习笔记(八)--KubeSphere定制化安装
笔记·学习·kubernetes
100分题库小程序3 小时前
汽车加气站操作工考试知识点总结
经验分享·笔记
吃货界的硬件攻城狮14 小时前
【STM32 学习笔记】EXTI外部中断
笔记·stm32·学习
吃货界的硬件攻城狮14 小时前
【STM32 学习笔记 】OLED显示屏及Keil调试
笔记·stm32·学习
njsgcs14 小时前
chili3d调试笔记12 deepwiki viewport svg雪碧图 camera three.ts
笔记
FBI HackerHarry浩15 小时前
Linux云计算训练营笔记day02(Linux、计算机网络、进制)
linux·运维·网络·笔记·计算机网络·进制
北极有牛17 小时前
cpp学习笔记2--class
c++·笔记·学习
sheng_er_sheng18 小时前
【笔记】【B站课程 pytorch】梯度下降模型
人工智能·pytorch·笔记
自小吃多19 小时前
STM32Cube-FreeRTOS任务管理工具函数-笔记
笔记·stm32·单片机