平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“PGSQL常见命令行与函数实例”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
# 基本连接(使用当前系统用户)
psql
# 连接指定数据库
psql -d mydatabase
# 连接指定用户和数据库
psql -U username -d mydatabase
# 连接远程数据库
psql -h hostname -p 5432 -U username -d mydatabase
# 连接并执行SQL文件
psql -d mydatabase -f script.sql
# 连接并执行单条命令
psql -d mydatabase -c "SELECT version();"
| 参数 | 说明 | 示例 |
|---|---|---|
-d | 数据库名 | -d postgres |
-U | 用户名 | -U postgres |
-h | 主机地址 | -h localhost |
-p | 端口号 | -p 5432 |
-W | 强制密码提示 | -W |
-f | 执行SQL文件 | -f init.sql |
-c | 执行命令 | -c "SELECT 1" |
-- 列出所有数据库
l
l+
-- 连接/切换数据库
c database_name
connect database_name
-- 创建数据库
CREATE DATABASE newdb;
-- 删除数据库
DROP DATABASE olddb;
-- 列出当前数据库所有表
dt
dt+
-- 描述表结构
d table_name
d+ table_name
-- 列出所有索引
di
di+
-- 列出所有序列
ds
ds+
-- 列出所有模式
dn
dn+
-- 设置搜索路径
SET search_path TO schema1, schema2;
-- 查看当前搜索路径
SHOW search_path;
-- 列出所有用户/角色
du
du+
-- 查看当前用户
SELECT current_user;
-- 查看用户权限
dp table_name
z table_name
-- 查看服务器版本
SELECT version();
-- 查看连接信息
conninfo
-- 查看当前数据库
SELECT current_database();
-- 查看当前模式
SELECT current_schema();
-- 扩展显示(行转列)
x on
x auto
x off
-- 设置输出格式
a (对齐切换)
f (字段分隔符)
-- 计时开关
timing on
timing off
-- 输出到文件
o filename.txt
o
| 命令 | 功能 | 示例 |
|---|---|---|
? | 查看所有元命令帮助 | ? |
h | SQL命令帮助 | h CREATE TABLE |
q | 退出psql | q |
! | 执行系统命令 | ! ls -l |
g | 再次执行上次查询 | g |
s | 查看命令历史 | s |
e | 采用编辑器编辑查询 | e |
i | 执行外部SQL文件 | i /path/to/file.sql |
copy | 导入导出数据 | copy table TO 'file.csv' CSV |
-- 绝对值
SELECT abs(-15); -- 15
-- 四舍五入
SELECT round(3.14159, 2); -- 3.14
SELECT round(123.456); -- 123
-- 取整函数
SELECT ceil(3.14); -- 4 (向上取整)
SELECT floor(3.14); -- 3 (向下取整)
SELECT trunc(3.14159, 2); -- 3.14 (截断)
-- 幂运算
SELECT power(2, 3); -- 8
SELECT sqrt(25); -- 5 (平方根)
SELECT cbrt(27); -- 3 (立方根)
-- 对数函数
SELECT ln(10); -- 自然对数
SELECT log(100); -- 以10为底对数
SELECT pi(); -- 3.14159265358979
SELECT sin(pi()/2); -- 1
SELECT cos(0); -- 1
SELECT tan(pi()/4); -- 1
SELECT degrees(pi()); -- 180 (弧度转角度)
SELECT radians(180); -- 3.14159 (角度转弧度)
SELECT random(); -- 0-1之间的随机数
SELECT setseed(0.5); -- 设置随机种子
-- 生成指定范围随机整数
SELECT floor(random() * 100)::int; -- 0-99随机整数
SELECT (random() * (max-min) + min)::int; -- min-max随机整数
-- 长度和位置
SELECT length('Hello'); -- 5
SELECT position('l' in 'Hello'); -- 3
SELECT strpos('Hello', 'l'); -- 3
-- 大小写转换
SELECT upper('hello'); -- HELLO
SELECT lower('HELLO'); -- hello
SELECT initcap('hello world'); -- Hello World
-- 修剪函数
SELECT trim(' hello '); -- 'hello'
SELECT ltrim(' hello'); -- 'hello'
SELECT rtrim('hello '); -- 'hello'
SELECT trim(BOTH 'x' FROM 'xxhelloxx'); -- 'hello'
-- 填充函数
SELECT lpad('hi', 5, '*'); -- '***hi'
SELECT rpad('hi', 5, '*'); -- 'hi***'
-- 子字符串
SELECT substring('Hello World' from 2 for 5); -- 'ello '
SELECT substr('Hello World', 2, 5); -- 'ello '
-- 字符串替换
SELECT replace('Hello World', 'World', 'PostgreSQL'); -- 'Hello PostgreSQL'
SELECT translate('12345', '123', 'abc'); -- 'abc45'
-- 字符串分割
SELECT split_part('a,b,c,d', ',', 2); -- 'b'
SELECT string_to_array('a,b,c', ','); -- {a,b,c}
SELECT array_to_string(ARRAY['a','b','c'], ','); -- 'a,b,c'
-- 字符串连接
SELECT concat('Hello', ' ', 'World'); -- 'Hello World'
SELECT 'Hello' || ' ' || 'World'; -- 'Hello World'
-- 格式化输出
SELECT format('Hello %s, your balance is %s', 'John', 100.50);
-- 'Hello John, your balance is 100.50'
-- 重复字符串
SELECT repeat('*', 5); -- '*****'
-- 获取当前时间
SELECT current_date; -- 当前日期
SELECT current_time; -- 当前时间
SELECT current_timestamp; -- 当前时间戳
SELECT now(); -- 当前时间戳(同current_timestamp)
SELECT localtimestamp; -- 本地时间戳
-- 带精度的当前时间
SELECT current_time(2); -- 当前时间(2位小数秒)
SELECT current_timestamp(3); -- 当前时间戳(3位小数秒)
-- EXTRACT函数
SELECT extract(year FROM current_timestamp); -- 年份
SELECT extract(month FROM current_timestamp); -- 月份
SELECT extract(day FROM current_timestamp); -- 日期
SELECT extract(hour FROM current_timestamp); -- 小时
SELECT extract(minute FROM current_timestamp); -- 分钟
SELECT extract(second FROM current_timestamp); -- 秒数
SELECT extract(dow FROM current_timestamp); -- 星期几(0-6,周日=0)
SELECT extract(doy FROM current_timestamp); -- 一年中的第几天
-- DATE_PART函数(同EXTRACT)
SELECT date_part('year', current_timestamp);
-- 日期加减
SELECT current_date + INTERVAL '1 day'; -- 明天
SELECT current_date - INTERVAL '1 week'; -- 一周前
SELECT current_timestamp + INTERVAL '2 hours 30 minutes'; -- 2小时30分钟后
-- 年龄计算
SELECT age('2000-01-01'::date); -- 从2000-01-01到现在的年龄
SELECT age('2000-01-01'::date, '2020-01-01'::date); -- 两个日期之间的年龄
-- 日期截断
SELECT date_trunc('hour', current_timestamp); -- 截断到小时
SELECT date_trunc('day', current_timestamp); -- 截断到天
SELECT date_trunc('month', current_timestamp); -- 截断到月
-- TO_CHAR格式化
SELECT to_char(current_timestamp, 'YYYY-MM-DD HH24:MI:SS'); -- '2023-01-01 14:30:00'
SELECT to_char(current_timestamp, 'Day, Month DD, YYYY'); -- 'Sunday, January 01, 2023'
SELECT to_char(123.45, '999D99'); -- '123.45'
-- TO_DATE和TO_TIMESTAMP转换
SELECT to_date('20230101', 'YYYYMMDD'); -- 2023-01-01
SELECT to_timestamp('20230101 143000', 'YYYYMMDD HH24MISS'); -- 2023-01-01 14:30:00
-- CASE表达式
SELECT
name,
salary,
CASE
WHEN salary > 100000 THEN 'High'
WHEN salary > 50000 THEN 'Medium'
ELSE 'Low'
END as salary_level
FROM employees;
-- 简单CASE
SELECT
product_type,
CASE product_type
WHEN 'A' THEN 'Type A'
WHEN 'B' THEN 'Type B'
ELSE 'Other'
END as type_description
FROM products;
-- COALESCE(返回第一个非空值)
SELECT coalesce(NULL, NULL, 'default'); -- 'default'
SELECT coalesce(email, 'N/A') FROM users; -- 如果email为NULL则返回'N/A'
-- NULLIF(相等返回NULL)
SELECT nullif(5, 5); -- NULL
SELECT nullif(5, 0); -- 5
-- GREATEST和LEAST
SELECT greatest(1, 5, 3); -- 5
SELECT least(1, 5, 3); -- 1
-- 计数
SELECT count(*) FROM table; -- 总行数
SELECT count(DISTINCT column) FROM table; -- 不重复计数
-- 求和与平均
SELECT sum(salary) FROM employees;
SELECT avg(salary) FROM employees;
-- 最大最小值
SELECT max(salary) FROM employees;
SELECT min(salary) FROM employees;
-- 统计信息
SELECT stddev(salary) FROM employees; -- 标准差
SELECT variance(salary) FROM employees; -- 方差
-- 分组统计
SELECT
department,
count(*) as emp_count,
avg(salary) as avg_salary,
sum(salary) as total_salary
FROM employees
GROUP BY department;
-- 字符串聚合
SELECT
department,
string_agg(name, ', ') as employees
FROM employees
GROUP BY department;
-- 数组聚合
SELECT
department,
array_agg(name) as employees
FROM employees
GROUP BY department;
-- JSON聚合
SELECT
department,
json_agg(json_build_object('name', name, 'salary', salary)) as employees
FROM employees
GROUP BY department;
-- 行号、排名、密集排名
SELECT
name,
salary,
row_number() OVER (ORDER BY salary DESC) as row_num,
rank() OVER (ORDER BY salary DESC) as rank,
dense_rank() OVER (ORDER BY salary DESC) as dense_rank
FROM employees;
-- 分区排名
SELECT
department,
name,
salary,
rank() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank
FROM employees;
-- LAG和LEAD(访问前后行)
SELECT
date,
sales,
lag(sales) OVER (ORDER BY date) as prev_sales,
lead(sales) OVER (ORDER BY date) as next_sales
FROM sales_data;
-- FIRST_VALUE和LAST_VALUE
SELECT
date,
sales,
first_value(sales) OVER (ORDER BY date) as first_sales,
last_value(sales) OVER (ORDER BY date) as last_sales
FROM sales_data;
-- 累计计算
SELECT
date,
sales,
sum(sales) OVER (ORDER BY date) as cumulative_sum,
avg(sales) OVER (ORDER BY date) as cumulative_avg
FROM sales_data;
-- 移动平均
SELECT
date,
sales,
avg(sales) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as moving_avg_3
FROM sales_data;
-- 创建JSON
SELECT json_build_object('name', 'John', 'age', 30);
SELECT json_build_array(1, 2, 3);
-- 解析JSON
SELECT json_extract_path('{"a": {"b": 1}}', 'a', 'b'); -- 1
SELECT '{"name": "John"}'::json->>'name'; -- 'John'
SELECT '{"ages": [10, 20, 30]}'::json->'ages'->>1; -- '20'
-- 行转JSON
SELECT row_to_json(employees) FROM employees WHERE id = 1;
-- JSON聚合
SELECT
department,
json_agg(json_build_object('name', name, 'salary', salary)) as employees
FROM employees
GROUP BY department;
# 备份单个数据库
pg_dump -U username -d mydatabase -f backup.sql
# 备份所有数据库
pg_dumpall -U username -f alldb_backup.sql
# 压缩备份
pg_dump -U username -d mydatabase | gzip > backup.sql.gz
# 恢复数据库
psql -U username -d mydatabase -f backup.sql
# 恢复压缩备份
gunzip -c backup.sql.gz | psql -U username -d mydatabase
-- 查看查询计划
EXPLAIN SELECT * FROM large_table WHERE id = 1000;
EXPLAIN ANALYZE SELECT * FROM large_table WHERE id = 1000;
-- 查看表大小和索引
SELECT
schemaname,
tablename,
tableowner,
tablesize,
indexsize
FROM pg_tables
WHERE schemaname = 'public';
-- 查看长查询
SELECT
pid,
now() - pg_stat_activity.query_start AS duration,
query
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;
-- 查看锁信息
SELECT
locktype,
relation::regclass,
mode,
granted
FROM pg_locks
WHERE relation = 'mytable'::regclass;
-- 查看连接数
SELECT
datname,
count(*) as connections
FROM pg_stat_activity
GROUP BY datname;
-- 查看表统计信息
SELECT
schemaname,
tablename,
seq_scan,
seq_tup_read,
idx_scan,
idx_tup_fetch
FROM pg_stat_user_tables;
结合项目来看,PostgreSQL 提供了丰富的命令行工具和内置函数,使得数据库管理和数据操作变得很高效。关键点包括:
【数据库知识】PostgreSQL介绍
到此这篇关于PGSQL常用命令行与函数实例详解的文章就介绍到这了,更多相关PGSQL常用命令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!
tplink5620与6300区别是什么(tplink5620与6300区别详解)
tplink路由器无线信道选哪个好(tplink路由器无线信道选择推荐)
tplink百兆路由器怎么改成千兆(tplink百兆路由器改成千兆方法)
tplink百兆路由器哪个好(tplink百兆路由器选择推荐)
postgres 数据库迁移的几种做法实用指南
PostgreSQL中rank()窗口函数实用指南与示例实用指南