postgre进阶sql

1、分组排序取第一条

如:成绩表中有每个学生每年的总成绩,现需要查询每个学生历年最好成绩:

select *,MAX(score) over(PARTITION BY id order by score desc) as max_score from tablename

或者历年任意第几成绩,如学生没有对应排行成绩则无法查出成绩

select * from (
	select *,"row_number"() over(PARTITION BY 分组依据 order by 排序依据 desc) as row_number from tablename
)a where row_number=1

2、JSON相关

如果是以字符串形式存储的JSON需先强转为jsonb

2.1、解析JSON

select json字段::jsonb ->> 'key值' AS 别名 from tablename

2.2、修改JSON中某个key的value

存在该key则修改,不存在则新增

update tablename set json字段 = jsonb_set(j_ext::jsonb,'{lb}','"5"',true)

2.3、连表更新JSON中的value

存在该key则修改,不存在则新增

update 更新表 table1 set c_ext = jsonb_set(table1.c_ext::jsonb,to_jsonb(table2.lb),true)
from 数据来源表 table2 where table1.id = table2.id

2.4、删除JSON中某个key

SELECT jsonb '{"a":1,"b":2}' - 'a',-- 结果为 '{"b":2}'
       jsonb '["a",1,"b",2]' - 1    -- 结果为 '["a",2]'

2.5、深层次删除

如需删除的key在嵌套JSON里面

SELECT '{"a":[null,{"b":[3.14]}]}' #- '{a,b,0}'
-- 结果为 '{"a":[null,{"b":[]}]}'

2.6、在JSON末尾添加key

SELECT jsonb_insert('{"a":[null,{"b":[1,2]}]}','{a,-1}',jsonb '3',true)
-- 结果为 '{"a":[null,2,3]}]}'

3、强制踢出数据库所有用户

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='std_new' AND pid<>pg_backend_pid();

4、连表更新与删除

连表更新

update db_test.t_student s set student_name=c.class_name from db_test.t_class c where s.class_id=c.class_id

连表删除

delete from db_test.t_student s USING db_test.t_class c where s.class_id=c.class_id

5、时间操作

5.1、获取今年第一天

获取去年将now减一年即可

SELECT date_trunc('year',now())

5.2、获取近12个月的年月

select to_char (generate_series (now()-INTERVAL'11 month',now(),'1 month'),'yyyy-mm')

6、锁表处理

首先获取所有活动的被锁的表

select pid,state,usename,query,query_start 
from pg_stat_activity 
where pid in (
  select pid from pg_locks l 
  join pg_class t on l.relation = t.oid 
  and t.relkind = 'r' 
  
);

将被锁的表解锁,pid为前面查出的pid

SELECT pg_cancel_backend(pid);

7、系统表相关

7.1、查询所有表名、字段名、及注释

SELECT
	relname AS 表名,obj_description (oid) AS 表中文名,A .attname AS 字段名称,col_description (A .attrelid,A .attnum) AS 字段中文名,format_type (A .atttypid,A .atttypmod) AS 数据类型,A .attnotnull AS 是否可为空
FROM
	pg_class AS C,pg_attribute AS A
WHERE
	A .attrelid = C .oid
AND A .attnum > 0
AND relkind = 'r'
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'sql_%'

7.2、查询数据库中表占用空间(包括索引)

SELECT table_schema || '.' || table_name AS table_full_name,pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS size
FROM information_schema.tables
ORDER BY
pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC limit 20;

8、数据库操作

8.1、指定数据库查找模式

将模式名加入search_path后跨模式查询不用添加模式名

alter database 数据库名称 set search_path to schema1,schema2;

查询search_path,默认值是$user,public,意思就是当以某个用户登录到数据库的时候,默认就是先查找和登录用户同名的schema,再查找public

show search_path

9、postgre备份及还原

需有pg_dump和psql,默认在安装目录的bin里面

9.1、备份

./pg_dump --help 可查看更多参数,加入–insert后会以insert脚本导出,会更兼容其他数据库,但会严重影响导入导出性能

./pg_dump  –h 数据库IP  -p  数据库端口  -U  用户  –f  导出文件名称  -d 导出数据库
./pg_dump  –h 127.0.0.1  -p  5432  -U  postgres  –f  dbname.sql  -d dbname

9.2、还原

需先创建数据库

./psql –h 数据库IP -p 数据库端口 -U 用户 –f 导入文件名称 -d 导入数据库
./psql –h 127.0.0.1 -p 5432 -U postgres –f db_bak.sql -d dbname

相关文章

文章浏览阅读601次。Oracle的数据导入导出是一项基本的技能,...
文章浏览阅读553次。开头还是介绍一下群,如果感兴趣polardb...
文章浏览阅读3.5k次,点赞3次,收藏7次。折腾了两个小时多才...
文章浏览阅读2.7k次。JSON 代表 JavaScript Object Notation...
文章浏览阅读2.9k次,点赞2次,收藏6次。navicat 连接postgr...
文章浏览阅读1.4k次。postgre进阶sql,包含分组排序、JSON解...