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

相关推荐
一只侯子14 小时前
Face AE Tuning
图像处理·笔记·学习·算法·计算机视觉
whale fall16 小时前
【剑雅14】笔记
笔记
星空的资源小屋17 小时前
跨平台下载神器ArrowDL,一网打尽所有资源
javascript·笔记·django
Xudde.18 小时前
Quick2靶机渗透
笔记·学习·安全·web安全·php
AA陈超18 小时前
Git常用命令大全及使用指南
笔记·git·学习
愚戏师19 小时前
Python3 Socket 网络编程复习笔记
网络·笔记
降临-max20 小时前
JavaSE---网络编程
java·开发语言·网络·笔记·学习
大白的编程日记.21 小时前
【计算网络学习笔记】MySql的多版本控制MVCC和Read View
网络·笔记·学习·mysql
IMPYLH1 天前
Lua 的 require 函数
java·开发语言·笔记·后端·junit·lua
YJlio1 天前
进程和诊断工具学习笔记(8.29):ListDLLs——一眼看清进程里加载了哪些 DLL,谁在偷偷注入
android·笔记·学习