PostgreSQL 其他常用 SQL 操作深度详解文档

PostgreSQL:高级SQL特性 在数据驱动的时代,SQL早已突破"增删改查"的简单定位,成为数据处理领域的瑞士军刀。作为全球最先进的开源关系型数据库,PostgreSQL 15(2023年最新版本)将SQL的表达能力推向了新的高度——其内置的窗口函数可进行复杂数据分析,递归CTE能轻松处理树形结构,LATERAL JOIN颠覆传统子查询模式,而键集分页技术更是将海量数据访问效率提升十倍级。 阅读详情

在 PostgreSQL 的强大生态中,除了 DDL、DML、DQL、TCL、DCL 五大标准分类外,还存在大量高频使用、企业级必备、但不属于传统分类的 SQL 操作。这些操作往往决定系统的性能、可维护性、扩展性和安全性,却常被 Java 开发者忽视。

以下是一份专为 Java 后端开发者(尤其是使用 Spring Boot 的团队)撰写的 PostgreSQL 其他常用 SQL 操作深度详解文档,涵盖:序列管理、函数与触发器、CTE 递归查询、分区表、复制与导出、JSONB 聚合、全文检索增强、窗口函数进阶、系统视图与监控 等 9 大类,全部采用清晰中文注释式结构,提供标准、完整、可直接用于生产环境的示例,助你打造高性能、高可靠、易维护的企业级 PostgreSQL 架构。


🛠️ PostgreSQL 其他常用 SQL 操作深度详解文档

—— 超越五大分类的 9 大企业级核心能力

适用对象:Java 后端架构师、高级开发、DBA、技术负责人
目标:系统掌握 PostgreSQL 中不属于 DDL/DML/DQL/TCL/DCL 的 9 类高频、高价值 SQL 操作,补齐技术盲区,实现从“能用”到“精通” 的跨越,推动团队构建现代化、可扩展、高性能的数据层。


一、序列(SEQUENCE)—— 自增 ID 的“精密引擎”

说明:BIGSERIAL 是语法糖,本质是 BIGINT + SEQUENCE。
企业价值:控制 ID 生成规则、支持自定义前缀、避免并发冲突。

✅ 标准使用示例(带中文注释)

-- 📌 示例1:创建自定义序列(推荐用于订单号、发票号等)
CREATE SEQUENCE order_seq
    START WITH 1000000          -- ✅ 起始值,避免暴露系统内部ID
    INCREMENT BY 1              -- ✅ 步长
    MINVALUE 1000000            -- ✅ 最小值
    MAXVALUE 9999999            -- ✅ 最大值(避免溢出)
    CACHE 100                   -- ✅ 缓存100个值,提升并发性能(减少磁盘I/O)
    NO CYCLE;                   -- ✅ 不循环,避免重复(金融系统必须)

-- 📌 示例2:在插入时使用序列生成业务ID
INSERT INTO orders (order_no, user_id, total_amount)
VALUES (
    'ORD-' || nextval('order_seq'),  -- ✅ 生成:ORD-1000001
    1001,
    299.90
);

-- 📌 示例3:查看当前序列值
SELECT currval('order_seq');  -- ✅ 返回当前会话最后一次使用的值

-- 📌 示例4:重置序列(仅用于测试或初始化)
ALTER SEQUENCE order_seq RESTART WITH 1000000;

-- 📌 示例5:获取下一个值但不消费(仅查看)
SELECT nextval('order_seq');  -- ✅ 消费并返回下一个值
SELECT setval('order_seq', 999999); -- ✅ 手动设置当前值(慎用!)

-- 📌 示例6:为多个表共享一个序列(罕见,但可用于统一编号)
CREATE SEQUENCE global_id_seq START 1;
CREATE TABLE users (id BIGINT PRIMARY KEY DEFAULT nextval('global_id_seq'));
CREATE TABLE products (id BIGINT PRIMARY KEY DEFAULT nextval('global_id_seq'));
-- ✅ 用户ID和产品ID全局唯一,但可能不连续(如:用户1,产品2,用户3...)

✅ 团队规范建议:

  • 业务 ID(如订单号、发票号)必须使用 SEQUENCE + 字符串拼接,避免直接暴露 BIGSERIAL。
  • 禁止使用 UUID 作为人类可读的外部 ID(如订单号),应使用 SEQUENCE 生成。
  • CACHE 100 是性能关键,默认值 1 在高并发下是性能灾难。
  • 所有序列必须命名规范:表名_字段名_seq。

二、函数(FUNCTION)与存储过程(PROCEDURE)—— 业务逻辑的“数据库内核”

说明:PostgreSQL 支持用 PL/pgSQL 编写函数,将业务规则下沉到数据库层,提升一致性、减少网络开销。

✅ 标准使用示例(带中文注释)

-- 📌 示例1:创建函数:自动更新 updated_at(推荐!)
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = NOW();  -- ✅ 自动设置更新时间
    RETURN NEW;              -- ✅ 返回修改后的行
END;
$$ LANGUAGE plpgsql;

-- 📌 示例2:绑定函数到表(触发器)
CREATE TRIGGER trigger_users_update_updated_at
    BEFORE UPDATE ON users
    FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();

CREATE TRIGGER trigger_orders_update_updated_at
    BEFORE UPDATE ON orders
    FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();

-- ✅ 效果:Java 代码中无需写 `setUpdatedAt()`,数据库自动维护!

-- 📌 示例3:创建函数:计算用户总消费(可被查询复用)
CREATE OR REPLACE FUNCTION get_user_total_spent(user_id BIGINT)
RETURNS DECIMAL AS $$
DECLARE
    total DECIMAL;
BEGIN
    SELECT COALESCE(SUM(total_amount), 0)
    INTO total
    FROM orders
    WHERE user_id = $1 AND status = 'paid';

    RETURN total;
END;
$$ LANGUAGE plpgsql;

-- ✅ 使用:SELECT get_user_total_spent(1001);  -- 一行 SQL 完成聚合

-- 📌 示例4:创建函数:返回多行结果(TABLE 类型)
CREATE OR REPLACE FUNCTION get_active_orders(user_id BIGINT)
RETURNS TABLE(order_no VARCHAR, total_amount DECIMAL, created_at TIMESTAMPTZ) AS $$
BEGIN
    RETURN QUERY
    SELECT o.order_no, o.total_amount, o.created_at
    FROM orders o
    WHERE o.user_id = $1 AND o.status = 'paid'
    ORDER BY o.created_at DESC;
END;
$$ LANGUAGE plpgsql;

-- ✅ 使用:SELECT * FROM get_active_orders(1001);  -- 像表一样查询

-- 📌 示例5:创建存储过程(PostgreSQL 11+)—— 用于复杂流程,无返回值
CREATE OR REPLACE PROCEDURE process_order_completion(order_id BIGINT)
LANGUAGE plpgsql
AS $$
DECLARE
    order_status VARCHAR;
BEGIN
    -- 查询当前状态
    SELECT status INTO order_status FROM orders WHERE id = order_id;

    IF order_status = 'paid' THEN
        UPDATE orders SET status = 'shipped' WHERE id = order_id;
        INSERT INTO order_events (order_id, event, created_at)
        VALUES (order_id, 'shipped', NOW());
    ELSE
        RAISE EXCEPTION '订单状态不是已支付,无法发货';
    END IF;
END;
$$;

-- ✅ 使用:CALL process_order_completion(12345);

✅ 团队规范建议:

  • 所有“自动维护字段”(如 updated_at)必须用触发器 + 函数实现,Java 层不再写。
  • 所有复杂聚合、业务校验、状态机转换,优先写在数据库函数中。
  • 函数必须命名清晰:fn_前缀,如 fn_calculate_discount。
  • 禁止在函数中执行 DDL 或长时间阻塞操作。
  • 所有函数必须写注释,说明输入、输出、边界条件。

三、递归 CTE(Recursive CTE)—— 树形结构的“魔法查询”

说明:用于查询无限层级的树形结构(如组织架构、评论回复、菜单分类)。

✅ 标准使用示例(带中文注释)

-- 📌 示例:查询某个分类的所有子分类(无限层级)
-- 表结构:categories(id, name, parent_id)

WITH RECURSIVE category_tree AS (
    -- ✅ 基础查询:从根节点开始(parent_id IS NULL)
    SELECT id, name, parent_id, 0 AS level
    FROM categories
    WHERE id = 1  -- ✅ 从“电子产品”分类开始

    UNION ALL

    -- ✅ 递归部分:查找所有子节点
    SELECT c.id, c.name, c.parent_id, ct.level + 1
    FROM categories c
    INNER JOIN category_tree ct ON c.parent_id = ct.id  -- ✅ 关联父级
)
SELECT id, name, parent_id, level
FROM category_tree
ORDER BY level, name;

-- ✅ 输出:
-- id | name         | parent_id | level
-- 1  | 电子产品     | NULL      | 0
-- 2  | 手机         | 1         | 1
-- 3  | 笔记本       | 1         | 1
-- 4  | iPhone       | 2         | 2
-- 5  | MacBook Pro  | 3         | 2

-- 📌 示例2:查询某个评论的所有回复(嵌套评论)
-- 表结构:comments(id, content, parent_id, created_at)

WITH RECURSIVE comment_tree AS (
    SELECT id, content, parent_id, created_at, 0 AS depth, ARRAY[id] AS path
    FROM comments
    WHERE id = 1001  -- ✅ 从主评论开始

    UNION ALL

    SELECT c.id, c.content, c.parent_id, c.created_at, ct.depth + 1, ct.path || c.id
    FROM comments c
    INNER JOIN comment_tree ct ON c.parent_id = ct.id
)
SELECT id, content, depth, path
FROM comment_tree
ORDER BY path;  -- ✅ 按路径排序,保证层级顺序

✅ 团队规范建议:

  • 所有树形结构(菜单、分类、评论、组织架构)必须用递归 CTE 查询。
  • 禁止在 Java 中用循环递归查询,性能差、网络开销大。
  • 使用 path 数组记录路径,便于前端展开/折叠。
  • 限制递归深度:SET max_recursion_depth = 100; 防止死循环。

四、分区表(Partitioned Tables)—— 大数据量的“分而治之”

说明:将大表按时间、范围、列表拆分为多个物理子表,提升查询和维护性能。

✅ 标准使用示例(带中文注释)

-- 📌 示例1:创建按月分区的日志表(推荐用于日志、行为记录)
CREATE TABLE system_logs (
    id BIGSERIAL,
    event_time TIMESTAMPTZ NOT NULL,
    level VARCHAR(10),
    message TEXT,
    user_id BIGINT
) PARTITION BY RANGE (event_time);

-- ✅ 创建第一个分区:2025年1月
CREATE TABLE system_logs_2025_01 PARTITION OF system_logs
    FOR VALUES FROM ('2025-01-01') TO ('2025-02-01');

-- ✅ 创建第二个分区:2025年2月
CREATE TABLE system_logs_2025_02 PARTITION OF system_logs
    FOR VALUES FROM ('2025-02-01') TO ('2025-03-01');

-- ✅ 插入数据:自动路由到对应分区
INSERT INTO system_logs (event_time, level, message, user_id)
VALUES ('2025-02-15 10:30:00', 'INFO', 'User login', 1001);

-- ✅ 查询:只扫描相关分区(性能提升 10x+)
SELECT * FROM system_logs
WHERE event_time >= '2025-02-01' AND event_time < '2025-03-01';

-- ✅ 删除旧数据:直接删除分区,瞬间完成(比 DELETE 快 1000 倍)
DROP TABLE system_logs_2024_12;

-- 📌 示例2:创建按状态分区的订单表
CREATE TABLE orders (
    id BIGSERIAL,
    status VARCHAR(20) NOT NULL,
    created_at TIMESTAMPTZ,
    total_amount DECIMAL
) PARTITION BY LIST (status);

CREATE TABLE orders_paid PARTITION OF orders FOR VALUES IN ('paid', 'shipped');
CREATE TABLE orders_pending PARTITION OF orders FOR VALUES IN ('pending', 'cancelled');
CREATE TABLE orders_deleted PARTITION OF orders FOR VALUES IN ('deleted');

-- ✅ 查询:只查已支付订单
SELECT * FROM orders_paid WHERE created_at > '2025-01-01';

✅ 团队规范建议:

  • 所有日志表、行为表、历史表,超过 100 万行必须分区。
  • 按时间分区(RANGE)最常用,每月或每季一个分区。
  • 分区表的索引必须在每个分区上单独创建。
  • 使用 pg_partman 插件自动化创建/删除分区(推荐)。
  • 分区表的 PRIMARY KEY 必须包含分区键(如 id, event_time)。

五、数据导出与导入 —— 数据迁移与备份的“标准接口”

说明:PostgreSQL 提供标准命令行工具 pg_dump、pg_restore,不依赖 Java 代码。

✅ 标准使用示例(带中文注释)

# 📌 示例1:导出整个数据库(结构+数据)
pg_dump -h localhost -U app_user -d myapp -f myapp_backup.sql

# 📌 示例2:只导出结构(DDL)
pg_dump -h localhost -U app_user -d myapp -s -f myapp_schema.sql

# 📌 示例3:导出单表数据(CSV 格式,便于 Excel 处理)
COPY users (id, username, email, created_at) TO '/tmp/users.csv' WITH CSV HEADER;

# 📌 示例4:从 CSV 导入数据(快速加载)
COPY users (id, username, email, created_at) FROM '/tmp/users.csv' WITH CSV HEADER;

# 📌 示例5:导出为自定义格式(压缩,适合备份)
pg_dump -h localhost -U app_user -d myapp -F c -b -v -f myapp_backup.dump

# 📌 示例6:恢复备份
pg_restore -h localhost -U app_user -d myapp myapp_backup.dump

# 📌 示例7:导出为 JSON(用于 API 或迁移)
SELECT row_to_json(u) FROM users u WHERE status = 'active' LIMIT 10;

✅ 团队规范建议:

  • 生产环境备份必须使用 pg_dump -F c(自定义格式),支持并行恢复。
  • 禁止使用 Java 代码导出 CSV/JSON,性能差、易中断。
  • 所有备份文件必须加密存储,定期验证可恢复性。
  • 使用 pg_dump + cron + s3cmd 实现自动云备份。

六、JSONB 聚合与数组操作 —— 动态数据的“集合引擎”

说明:PostgreSQL 支持对 JSONB 和数组进行聚合、展开、合并、过滤。

✅ 标准使用示例(带中文注释)

-- 📌 示例1:聚合 JSONB 字段(统计不同主题的用户数)
SELECT
    metadata->>'theme' AS theme,
    COUNT(*) AS user_count
FROM users
WHERE metadata ? 'theme'
GROUP BY metadata->>'theme'
ORDER BY user_count DESC;

-- 📌 示例2:展开 JSONB 数组(将嵌套数组转为行)
-- 用户标签:{"tags": ["admin", "vip", "premium"]}
SELECT
    username,
    unnest(metadata->'tags'::TEXT[]) AS tag
FROM users
WHERE metadata ? 'tags';

-- ✅ 输出:
-- username | tag
-- alice    | admin
-- alice    | vip
-- alice    | premium

-- 📌 示例3:聚合数组(将多个行合并为一个数组)
SELECT
    department_id,
    ARRAY_AGG(username) AS member_names
FROM users
WHERE status = 'active'
GROUP BY department_id;

-- ✅ 输出:
-- department_id | member_names
-- 1             | {alice,bob,charlie}

-- 📌 示例4:数组包含查询(查找同时包含 admin 和 vip 的用户)
SELECT *
FROM users
WHERE '{admin,vip}' <@ metadata->'tags';  -- ✅ 数组包含关系

-- 📌 示例5:合并两个 JSONB 对象
SELECT
    metadata || '{"last_login": "2025-10-17T10:00:00Z"}'::JSONB AS updated_metadata
FROM users
WHERE id = 1001;

✅ 团队规范建议:

  • 所有“多值属性”(标签、权限组、通知设置)统一用 JSONB 存储。
  • 使用 unnest() 展开数组,避免 Java 循环解析。
  • 使用 ARRAY_AGG() 聚合,替代 Java 中的 List<String> 收集。
  • 所有 JSONB 字段必须建立 GIN 索引。

七、全文检索增强 —— 智能搜索的“语义引擎”

说明:PostgreSQL 的全文检索支持多语言、同义词、词干提取、高亮。

✅ 标准使用示例(带中文注释)

-- 📌 示例1:创建中文全文索引(需安装 zhparser 插件)
CREATE EXTENSION IF NOT EXISTS zhparser;

-- 创建中文全文配置
CREATE TEXT SEARCH CONFIGURATION chinese (PARSER = zhparser);
ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR word WITH simple;

-- 创建索引
CREATE INDEX idx_articles_content_zh ON articles USING GIN (to_tsvector('chinese', content));

-- 查询(支持中文分词)
SELECT title,
       ts_headline('chinese', content, to_tsquery('chinese', 'Spring Boot 教程')) AS snippet
FROM articles
WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', 'Spring & Boot & 教程');

-- 📌 示例2:使用词典(同义词)
-- 创建同义词文件 /usr/share/postgresql/tsearch_data/synonym.txt
-- spring => java
-- boot => framework

-- 创建词典
CREATE TEXT SEARCH DICTIONARY synonym_dict (
    TEMPLATE = synonym,
    SYNONYMS = synonym
);

-- 创建配置
CREATE TEXT SEARCH CONFIGURATION synonym_config (PARSER = pg_catalog.simple);
ALTER TEXT SEARCH CONFIGURATION synonym_config ADD MAPPING FOR asciiword WITH synonym_dict, english_stem;

-- 查询
SELECT * FROM articles
WHERE to_tsvector('synonym_config', content) @@ to_tsquery('synonym_config', 'spring & boot');
-- ✅ 会匹配包含 "java framework" 的文章

✅ 团队规范建议:

  • 所有搜索功能(商品名、文章标题、用户备注)必须使用全文检索,禁止 LIKE。
  • 中文搜索必须使用 zhparser 或 jieba 插件。
  • 使用 ts_headline() 高亮匹配词,提升前端体验。
  • 为全文索引单独设置 tsvector 字段,避免每次计算。

八、窗口函数进阶 —— 分析型查询的“超级武器”

说明:超越基础排名,支持移动平均、累计求和、前后行访问。

✅ 标准使用示例(带中文注释)

-- 📌 示例1:移动平均(过去7天平均销售额)
SELECT
    order_date,
    daily_revenue,
    AVG(daily_revenue) OVER (
        ORDER BY order_date
        ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
    ) AS avg_7days
FROM (
    SELECT
        DATE(created_at) AS order_date,
        SUM(total_amount) AS daily_revenue
    FROM orders
    WHERE status = 'paid'
    GROUP BY DATE(created_at)
) daily
ORDER BY order_date;

-- 📌 示例2:获取上一行的值(计算增长)
SELECT
    user_id,
    order_date,
    total_amount,
    LAG(total_amount, 1) OVER (PARTITION BY user_id ORDER BY order_date) AS prev_amount,
    total_amount - LAG(total_amount, 1) OVER (PARTITION BY user_id ORDER BY order_date) AS growth
FROM orders
WHERE status = 'paid'
ORDER BY user_id, order_date;

-- 📌 示例3:获取下一行的值(预测下一个订单)
SELECT
    user_id,
    order_date,
    total_amount,
    LEAD(order_date, 1) OVER (PARTITION BY user_id ORDER BY order_date) AS next_order_date
FROM orders
WHERE status = 'paid'
ORDER BY user_id, order_date;

-- 📌 示例4:累计求和(用户终身消费)
SELECT
    username,
    order_date,
    total_amount,
    SUM(total_amount) OVER (
        PARTITION BY user_id
        ORDER BY order_date
        ROWS UNBOUNDED PRECEDING
    ) AS lifetime_spent
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.status = 'paid'
ORDER BY u.username, o.order_date;

✅ 团队规范建议:

  • 所有“趋势分析”“增长计算”“排行榜”必须用窗口函数。
  • 禁止在 Java 中用 for 循环计算累计值。
  • ROWS BETWEEN X PRECEDING AND CURRENT ROW 是性能关键。
  • 使用 LAG() / LEAD() 实现“上一次操作”“下一次操作”逻辑。

九、系统视图与监控 SQL —— 性能诊断的“望远镜”

说明:PostgreSQL 内置大量系统视图,无需外部工具即可诊断性能瓶颈。

✅ 标准使用示例(带中文注释)

-- 📌 示例1:查看当前所有连接(排查连接池耗尽)
SELECT
    pid,
    usename,
    application_name,
    client_addr,
    state,
    query_start,
    now() - query_start AS duration,
    query
FROM pg_stat_activity
WHERE state = 'active'
  AND usename NOT IN ('postgres', 'rdsadmin')
ORDER BY duration DESC;

-- 📌 示例2:查看最慢的查询(需启用 pg_stat_statements)
SELECT
    query,
    calls,
    total_time,
    mean_time,
    rows,
    100.0 * shared_blks_hit / nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;

-- 📌 示例3:查看表大小(排查大表)
SELECT
    tablename,
    pg_size_pretty(pg_total_relation_size(tablename)) AS total_size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(tablename) DESC;

-- 📌 示例4:查看索引使用情况(排查未使用索引)
SELECT
    relname AS table_name,
    indexrelname AS index_name,
    idx_tup_read,
    idx_tup_fetch
FROM pg_stat_user_indexes
WHERE idx_tup_read = 0  -- ✅ 从未被使用的索引
ORDER BY relname;

-- 📌 示例5:查看锁等待(排查死锁)
SELECT
    blocked_locks.pid AS blocked_pid,
    blocking_locks.pid AS blocking_pid,
    blocked_activity.query AS blocked_query,
    blocking_activity.query AS blocking_query
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype
    AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE
    AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
    AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
    AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
    AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
    AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
    AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
    AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
    AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
    AND blocking_locks.pid != blocked_locks.pid
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted;

✅ 团队规范建议:

  • 所有生产环境必须开启 pg_stat_statements:
    CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
    
  • 每周运行一次 pg_stat_activity 查询,识别长事务。
  • 每月运行一次 pg_stat_user_indexes,删除无用索引。
  • 使用 pg_stat_user_tables 监控表增长趋势。
  • 将监控 SQL 集成到 Grafana + Prometheus,实现可视化告警。

十、总结:超越五大分类的 9 大能力,决定你的系统高度

能力企业价值推荐使用场景
✅ 序列控制业务 ID 规则,防暴露订单号、发票号、凭证号
✅ 函数与触发器降低 Java 复杂度,保证一致性自动更新时间戳、状态机转换
✅ 递归 CTE高效查询树形结构组织架构、评论回复、菜单
✅ 分区表解决大数据量性能瓶颈日志表、行为记录、历史数据
✅ 导出/导入标准化数据迁移备份、恢复、数据迁移
✅ JSONB 聚合灵活处理动态属性标签、权限组、配置
✅ 全文检索替代 LIKE,性能提升百倍商品搜索、文章搜索、用户备注
✅ 窗口函数进阶替代 Java 循环,精准分析移动平均、增长趋势、预测
✅ 系统视图实时诊断性能问题慢查询、死锁、索引失效

✅ 终极建议:
一个只会写 SELECT * FROM users 的 Java 开发者,是“数据搬运工”。
一个能熟练使用分区表、递归 CTE、窗口函数、函数触发器的 Java 架构师,是“数据系统设计师”。


📌 下一步行动建议:

  1. 将本文档作为团队《PostgreSQL 高级实践手册》核心章节。
  2. 在 GitLab CI 中集成 pg_stat_statements,自动检测慢查询并生成报告。
  3. 组织一次“PostgreSQL 高级特性实战营”:用递归 CTE 查组织架构、用分区表模拟日志系统。
  4. 为所有核心表(日志、订单、用户)编写《性能优化方案》:是否需要分区?是否需要函数?是否需要全文索引?
  5. 制定《数据库监控清单》:每周运行哪些 SQL?谁负责看?

PostgreSQL 9.5.3中文文档全解 本文还有配套的精品资源,点击获取 简介:PostgreSQL是广受好评的开源对象关系型数据库管理系统,以ACID原则、MVCC并发控制和高级SQL支持著称。本文档v1.0提供了一个全面的指南,涵盖9.5.3版本的新特性、安装、配置、SQL语言、数据类型、索引、备份恢复、性能优化和安全控制等方面。包含三种格式:HTML、CHM、PDF,以适应不同用户阅读和使用习惯。文档深入阐... 阅读详情

相关推荐

保姆级教程:在摩尔线程MTT S80上快速部署Ollama运行DeepSeek R1模型(附性能测试)

本文提供了一份详细的保姆级教程,指导用户在摩尔线程MTT S80显卡上部署Ollama并运行DeepSeek R1模型。内容涵盖从驱动安装、Docker环境配置到模型拉取、性能测试的全流程,并分享了实测数据与优化技巧,旨在帮助开发者快速在国产GPU平台上实现高效的大语言模型推理。

weixin_29091837的博客 518

PostgreSQL 12.2 手册

(1 row)这样做是 OK 的,因为子查询是一次独立的计算,它独立于外层的查询计算出自己的聚集。聚集同样也常用于和GROUP BY子句组合。比如,我们可以获取每个城市观测到的最低温度的最高值:city | max(2 rows)这样给我们每个城市一个输出。每个聚集结果都是在匹配该城市的表行上面计算的。我们可以用HAVING 过滤这些被分组的行:13SQL语言city | max(1 row)

qq_41528616的博客 3754

绿标短网址app.10086.cn/xxxxx移动短网址缩短接口网址api调用php方式解析

绿标短网址app.10086.cn/xxxxx 移动网缩短接口网址api调用php方式解析 app.10086.cn是移动网站的接口,可以制作移动网等第三方官方网站域名的任意生成接口,由于是认证企业,可以再抖音 微信 qq等第三方渠道正常打开不拦截提示,第三方网址,头条文章等,效果非常号,这里记录下api接口,纯技术php生成,具体规则可以去抖音的开放平台去申请对应接口 。这里用我php模拟抓包获取方式 GET http://www.app10086cn.cn/?i=app.10068.cnHTTP/1.1

qq_20300095的博客 5907

PostgreSQL 14 文档

版权 © 1996–2021 PostgreSQL全球开发组。目录

pger 的博客 772

GD32F103VBT6串口OTA升级保姆级教程:当硬件没留Boot0引脚时,我是如何用Keil和Ymodem搞定的

本文详细介绍了GD32F103VBT6在无Boot0引脚情况下的串口OTA升级方案,通过Keil工程改造和Ymodem协议实现可靠固件更新。文章涵盖Bootloader配置、APP工程调整、Ymodem传输优化等关键步骤,为嵌入式开发者提供了一套完整的解决方案,特别适用于封闭式设备的远程更新需求。

weixin_28744613的博客 182

大疆机场及无人机上云(航线规划、指令飞行...)

最近基于大疆上云api进行二次开发,后面将按照开发步骤对其进行说明!

资深三维GIS开发 5570

PostgreSQL 12 文档

版权 © 1996-2020 PostgreSQL全球开发组。

pger 的博客 514

草莓成熟度与叶片病虫害智能检测数据集应用全解析

本文深入解析草莓成熟度与叶片病虫害智能检测数据集的应用价值,涵盖从绿草莓到红果转色的完整成熟周期及白粉病、炭疽病等7种病害的精准识别。通过实战案例展示如何提升病害识别率至94%,并介绍数据集的科研价值,包括跨品种迁移学习和多模态数据融合技术。

weixin_28366353的博客 274

PostgreSQL 9.4 文档

© 1996-2015 PostgreSQL 全球开发组。

pger 的博客 390

学Simulink——基于电能质量治理的场景实例:静止无功发生器(SVG)与并网逆变器的结合

本文详细介绍了基于Simulink的SVG与光伏并网逆变器联合仿真建模方法。系统包含光伏单元、SVG主电路、控制策略(无功检测+双闭环控制)等模块,通过ip-iq法实现动态无功补偿。仿真结果表明,SVG能快速响应负载变化,将功率因数提升至0.98以上,有效稳定母线电压。该方案为新能源并网系统提供了有功/无功协同控制解决方案,具有10ms级响应速度和±5kvar补偿能力。文章提供了完整的建模流程、控制算法实现和结果分析,可作为电力电子与电能质量治理领域的实践指导。

amy_mhd的博客 167

Android车载音频系统概览

官网有些部分的内容描述比较简单,对没有app、系统和底层开发经验,容易一眼扫过,没有留意到相关细节。 本节补充车载音频相关细节。

hwj的博客 785

PostgreSQL DML(数据操作语言)深度详解文档

本文为Java后端开发者(尤其是Spring Boot团队)提供了一份PostgreSQL DML(数据操作语言)深度详解文档,涵盖定义、核心语句、企业级最佳实践和真实场景示例。文档强调DML作为业务系统最频繁的数据库操作,直接影响系统稳定性,并详细解析INSERT、UPDATE、DELETE、MERGE四大核心语句,提供生产环境推荐写法。重点包括:批量插入替代单条循环、ON CONFLICT实现Upsert、JSONB字段操作、UPDATE必须带WHERE条件等规范,旨在帮助团队实现安全、高效、可追溯的数

python15397的博客 989

Allegro快速编辑丝印文字操作指导

选择setup-Application Mode-placement edit。Allegro支持丝印文字的编辑,下面介绍快速编辑丝印文字的两种方法如下。这个功能还支持拷贝粘贴,可以从其它地方拷贝过来,免去了书写的麻烦。出现text edit窗口,输入自己需要的文字,点击ok。鼠标移动到丝印文字位置,文字会被高亮起来。Allegro快速编辑丝印文字操作指导。点击丝印文字,丝印会被高亮起来。选择Text edit 命令。输入需要更改后的文字,如下。右击选择text edit。以编辑下方丝印文字为例。

weixin_54787054的博客 4192

PostgreSQL 元数据查看与诊断操作深度详解文档

PostgreSQL 元数据查看与诊断命令速查指南(150字摘要) 本文为Java后端团队提供PostgreSQL核心元数据操作手册,涵盖16项高频命令。通过\l查看数据库、\d+分析表结构、\di检查索引等操作,开发者能快速定位问题、验证设计。文档采用SQL+psql双模式,每条命令附带生产级使用建议,如Schema隔离、权限检查等最佳实践。特别推荐\dt+查看表大小和注释,以及information_schema标准化查询,帮助团队实现"数据库可视化",减少沟通成本,提升调试效率。适

python15397的博客 961

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

PostgreSQL 查询性能优化深度详解文档

《PostgreSQL查询性能优化实战指南》摘要 本文系统性地为Java后端开发者(特别是Spring Boot团队)提供PostgreSQL性能优化解决方案。核心观点指出90%的性能问题源于DQL写法不当,并构建了从开发到生产的全流程优化体系。内容涵盖: 性能影响因素全景图:从查询语句、数据库配置到硬件资源的9个层级分析 标准排查流程:提供从慢查询定位到硬件检查的9步企业级排查顺序 常见错误与优化方案:重点解析4类典型问题(SELECT *、LIKE模糊查询、JSONB无索引、关键字段无索引),给出具体优

python15397的博客 1560

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

PostgreSQL DQL(数据查询语言)深度详解文档

📌 PostgreSQL DQL 深度详解摘要 适用场景:Java后端团队(Spring Boot)的PostgreSQL查询规范与优化指南 核心内容: DQL定义:仅包含SELECT的查询语言,负责数据检索但不修改数据 关键组件:SELECT(必须显式字段)、WHERE(需索引支持)、JOIN(禁止逗号连接)、GROUP BY等12个核心语法 企业级规范: 禁止SELECT * 所有WHERE条件必须建索引 JOIN必须显式声明类型 必须分页(LIMIT/OFFSET) 性能要点: 用JSONB操作替代

python15397的博客 1082

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

PostgreSQL DCL(数据控制语言)深度详解文档

《PostgreSQL DCL 企业级安全规范》摘要: 本文为 Java/Spring Boot 团队提供 PostgreSQL 数据控制语言(DCL)的完整安全指南。核心观点:DCL 是数据库安全不可绕过的最后防线,必须实施最小权限原则。 主要内容: 1️⃣ 权限管理:通过 GRANT/REVOKE 实现精准授权,禁止使用超级用户 2️⃣ 账号隔离:按功能创建独立账号(应用/报表/运维),并限制连接数 3️⃣ 批量授权:使用 ALTER DEFAULT PRIVILEGES 实现新建对象自动授权 4️⃣

python15397的博客 876

PostgreSQL和Oracle的sql差异

oracle的递归查询中level表示查询深度(或者递归层次),在PG中没有此含义的关键字,需要自行在with recursive实现。PG having语句必须在group by之后,oracle可以在group by之前。null和’’在oracle中是一致的,最终都会存储为null,在PG中会进行区分。Oracle delete语句可以没有from,pg必须要有from。[注:'999999' ---- 6位数为COL1字段的长度]PG中无效的别名,可以尝试加as关键字,例如name。

m0_46478042的博客 1759

PostgreSQL DDL(数据定义语言)深度详解文档

PostgreSQL DDL 规范摘要 本文为Java后端团队提供PostgreSQL DDL完整指南,重点包含: 核心概念:DDL用于定义数据库结构,是系统架构契约,需版本化管理 核心内容:涵盖表结构、字段变更、索引、约束等7类关键操作 企业级实践: 建表标准:必须包含主键、UUID、时间戳等基础字段 索引规范:统一命名,针对高频查询优化 JSONB字段:使用GIN索引提升查询效率 安全变更:所有ALTER操作需通过Flyway等工具管理,禁止直接生产执行 协作要求:强制字段注释、统一命名规范,确保团队协

python15397的博客 944

PostgreSQL 性能优化全方位指南:深度提升数据库效率

在现代互联网应用中,数据库性能优化是系统优化中至关重要的一环,尤其对于数据密集型和高并发的应用而言,PostgreSQL(以下简称PG)凭借其丰富的特性和强大的功能,成为很多企业的首选。然而,随着数据规模的扩展和查询复杂度的提升,PostgreSQL的性能问题逐渐显现。PostgreSQL的查询优化器会生成查询执行计划,选择最优的执行路径,但这依赖于数据库的统计信息、表结构和SQL的写法。然而,在高并发查询的场景中,适当的反规范化(如将一些查询频繁的字段冗余存储)可以减少JOIN操作,提高查询效率。

Asuna666w的博客 4417

PostgreSQL TCL(事务控制语言)深度详解文档

🔄 PostgreSQL TCL 事务控制语言核心指南 摘要:本文为Java后端开发者提供PostgreSQL事务控制语言(TCL)的深度解析,涵盖事务的四大核心语句(BEGIN/COMMIT/ROLLBACK/SAVEPOINT)及其企业级应用。重点强调: 事务四大特性:原子性、一致性、隔离性和持久性(ACID)的实现原理 生产环境标准示例:包含完整中文注释的转账、订单创建等典型场景 Java映射规范:Spring @Transactional注解与底层TCL语句的对应关系 关键实践: 必须显式控制事务

python15397的博客 678

PostgreSQL详解

PostgreSQL是一种开源的对象关系型数据库系统,它使用并扩展了SQL语言,同时添加了许多安全、存储、索引以及查询方面的功能。

qq_60219215的博客 1110

PostgreSQL兼容性深度解析:QuestDB的SQL扩展功能

QuestDB是一款专为时序数据设计的高性能开源数据库,它不仅提供了完整的PostgreSQL协议兼容性,还扩展了强大的时序SQL功能。作为时序数据库领域的佼佼者,QuestDB通过PostgreSQL Wire Protocol实现了与现有生态系统的无缝集成,同时提供了专为时序数据分析优化的SQL扩展功能。 ## 🚀 QuestDB的PostgreSQL协议兼容性 QuestDB完全支持P

gitblog_00063的博客 486

PostgreSQL 工程化部署深度解析

本文档是PostgreSQL工程化部署的深度解析,主要包含以下核心内容: 架构设计:采用Docker容器化部署,实现数据与计算分离,确保容器可销毁重建而不丢失数据。 部署全流程解析: 从环境准备(Docker验证、国内镜像源配置) 到Compose声明式部署(详解docker-compose.yml每个配置项) 再到连接验证与管理维护 关键设计理念: 声明式配置管理 最小权限原则(非root运行) 完善的监控与健康检查机制 完整的备份恢复方案 深度技术解析: 逐行拆解所有配置命令和参数 阐明每个操作的技术原

A1063348628的博客 465

SQL笔记(目前记录 MySQL和PostgreSQL)

一、Mysql笔记 1、常用函数 参考:sql常用函数大全 2、Lpad()和Rpad()的用法 这是mysql的两个函数,用来填充某个字段的查询结果的 参考:SQL---Lpad()函数,Rpad()函数,数据库 二、PostgreSQL 笔记 1、字符串分隔函数(regexp_split_to_table、regexp_split_to_array) PostgreSQL 数据库提供 regexp_split_to_table 和 regexp_split_to_ar

qq_42199464的博客 2650

MySQL,SQL Server,PostgreSQL三种数据库的区别

MySQL、PostgreSQL和SQLServer在数据类型、SQL语法、存储引擎等方面存在显著差异。PostgreSQL类型系统最丰富,支持JSON、数组等高级类型;SQLServer集成Windows特性,提供CLR类型;MySQL类型相对基础。语法上,分页、字符串连接等操作各有不同实现方式。PostgreSQL和SQLServer支持高级特性如CTE、窗口函数,MySQL8.0开始完善。架构方面,MySQL采用插件式引擎,PostgreSQL基于WAL日志,SQLServer深度集成Windows系

m0_69564658的博客 1402
上一篇: PostgreSQL TCL(事务控制语言)深度详解文档
下一篇: PostgreSQL 元数据查看与诊断操作深度详解文档
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值