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