完整教程:Postgresql常规SQL语句操作

news/2025/10/6 22:37:49/文章来源:https://www.cnblogs.com/wzzkaifa/p/19128014

        

目录

一、数据库与对象管理

二、数据操作 (CRUD)

三、查询优化与执行计划分析

四、事务控制

五、数据类型与高级特性应用

六、系统查询与维护

研发中的重要注意事项


        在 PostgreSQL 研发中,以下这些 SQL 应用是极其常见且核心的操作,涵盖了数据库设计、数据操作、查询优化和系统维护的关键方面:

一、数据库与对象管理

  1. 创建/修改表:

    CREATE TABLE employees (    id SERIAL PRIMARY KEY,  -- 自增主键    name VARCHAR(100) NOT NULL,    email VARCHAR(255) UNIQUE,    department_id INTEGER REFERENCES departments(id), -- 外键    salary NUMERIC(10, 2),    hire_date DATE DEFAULT CURRENT_DATE,    is_active BOOLEAN DEFAULT true,    skills TEXT[] -- 数组类型    profile JSONB -- JSONB 类型存储灵活数据); -- 添加索引CREATE INDEX idx_employees_department ON employees(department_id);CREATE INDEX idx_employees_name ON employees(name);CREATE INDEX idx_employees_profile_email ON employees USING gin ((profile->>'email')); -- JSONB 字段索引 -- 修改表 (添加列、修改列类型、添加约束等)ALTER TABLE employees ADD COLUMN phone VARCHAR(20);ALTER TABLE employees ALTER COLUMN salary TYPE DECIMAL(12, 2);ALTER TABLE employees ADD CONSTRAINT salary_check CHECK (salary > 0);
  2. 创建视图:

    CREATE VIEW active_employees ASSELECT id, name, email, department_idFROM employeesWHERE is_active = true;-- 物化视图 (定期刷新)CREATE MATERIALIZED VIEW department_salary_summary ASSELECT department_id, AVG(salary) AS avg_salary, SUM(salary) AS total_salaryFROM employeesGROUP BY department_idWITH DATA;REFRESH MATERIALIZED VIEW department_salary_summary; -- 手动刷新
  3. 创建函数/存储过程:

    CREATE OR REPLACE FUNCTION get_employee_count(dept_id INTEGER)RETURNS INTEGER AS $$DECLARE    emp_count INTEGER;BEGIN    SELECT COUNT(*) INTO emp_count    FROM employees    WHERE department_id = dept_id AND is_active = true;    RETURN emp_count;END;$$ LANGUAGE plpgsql; -- 调用函数SELECT get_employee_count(5);

二、数据操作 (CRUD)

  1. 插入数据:

    INSERT INTO employees (name, email, department_id, salary)VALUES ('Alice Smith', 'alice@example.com', 3, 75000.00),       ('Bob Johnson', 'bob@example.com', 3, 82000.00); -- 插入来自查询的结果INSERT INTO archived_employees (id, name, email, leave_date)SELECT id, name, email, CURRENT_DATEFROM employeesWHERE is_active = false;
  2. 查询数据:

  3. 更新数据:

    UPDATE employeesSET salary = salary * 1.05 -- 涨薪5%WHERE department_id = 3 AND performance_rating >= 4; -- 基于子查询更新UPDATE employees eSET manager_id = (SELECT manager_id FROM departments d WHERE d.id = e.department_id)WHERE e.manager_id IS NULL;
  4. 删除数据:

    DELETE FROM employeesWHERE is_active = false AND hire_date < '2020-01-01'; -- 使用事务确保操作原子性BEGIN;-- 先存档再删除INSERT INTO deleted_employees_log SELECT *, CURRENT_TIMESTAMP FROM employees WHERE id = 123;DELETE FROM employees WHERE id = 123;COMMIT;

三、查询优化与执行计划分析

  1. EXPLAIN / EXPLAIN ANALYZE

    EXPLAIN ANALYZESELECT * FROM ordersWHERE customer_id = 456 AND order_date BETWEEN '2023-01-01' AND '2023-12-31'ORDER BY total_amount DESCLIMIT 10;
    • 解读输出,查看是否使用了正确的索引、扫描类型(Seq Scan, Index Scan, Bitmap Heap Scan)、连接策略、排序方式、预估/实际行数、执行时间等。
    • 这是优化慢查询的最重要工具
  2. 强制使用索引 (通常不推荐,优化器通常更聪明):

    SET enable_seqscan = off; -- 临时关闭顺序扫描 (测试用,勿在生产库长期开启)-- ... 运行查询 ...SET enable_seqscan = on;
  3. 创建/优化索引:

四、事务控制

  1. 显式事务:

    BEGIN;-- 一系列操作 (INSERT, UPDATE, DELETE, SELECT ... FOR UPDATE)UPDATE accounts SET balance = balance - 100.00 WHERE id = 1;UPDATE accounts SET balance = balance + 100.00 WHERE id = 2;-- 根据业务逻辑决定提交或回滚COMMIT; -- 或 ROLLBACK;
  2. 事务隔离级别:

    SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 默认级别-- 或 REPEATABLE READ, SERIALIZABLEBEGIN;... -- 在指定隔离级别下执行事务COMMIT;
  3. SELECT ... FOR UPDATE / SELECT ... FOR SHARE

    BEGIN;SELECT * FROM inventory WHERE product_id = 789 FOR UPDATE; -- 锁定该行,防止其他事务并发修改-- 检查库存、扣减库存...UPDATE inventory SET stock = stock - 1 WHERE product_id = 789;COMMIT;

五、数据类型与高级特性应用

  1. JSONB 操作:

    -- 插入INSERT INTO products (id, name, attributes)VALUES (1, 'T-Shirt', '{"color": "red", "size": ["S", "M", "L"], "material": "cotton"}'); -- 查询SELECT name, attributes->'size' AS available_sizesFROM productsWHERE attributes @> '{"color": "red"}'; -- 包含 color=red -- 更新UPDATE productsSET attributes = jsonb_set(attributes, '{price}', '19.99') -- 添加/更新 price 键WHERE id = 1; UPDATE productsSET attributes = attributes || '{"discount": 0.1}' -- 合并添加 discount 键WHERE id = 1;
  2. 数组操作:

    SELECT name FROM employees WHERE 'PostgreSQL' = ANY(skills); -- 包含特定技能UPDATE employees SET skills = array_append(skills, 'Docker') WHERE id = 456; -- 添加技能SELECT unnest(skills) AS skill, COUNT(*) FROM employees GROUP BY skill; -- 展开数组统计
  3. 全文搜索:

    -- 创建 tsvector 列和索引ALTER TABLE articles ADD COLUMN search_vector tsvector;UPDATE articles SET search_vector = to_tsvector('english', title || ' ' || body);CREATE INDEX idx_articles_search ON articles USING gin(search_vector); -- 搜索SELECT title, snippet(search_vector, query) AS highlightFROM articles, plainto_tsquery('english', 'database performance') queryWHERE search_vector @@ queryORDER BY ts_rank(search_vector, query) DESC;

六、系统查询与维护

  1. 查看表/索引信息:

    \d employees -- psql 元命令SELECT * FROM pg_tables WHERE schemaname = 'public'; -- 系统表SELECT * FROM pg_indexes WHERE tablename = 'employees'; -- 索引信息SELECT pg_size_pretty(pg_total_relation_size('employees')); -- 表大小 (含索引)
  2. 查看连接/锁:

    SELECT * FROM pg_stat_activity; -- 当前活动连接/查询SELECT * FROM pg_locks; -- 当前锁信息
  3. 权限管理:

    GRANT SELECT, INSERT, UPDATE ON employees TO developer_role;REVOKE DELETE ON employees FROM public;

研发中的重要注意事项

  1. 避免 N+1 查询: 在 ORM (如 Hibernate, Django ORM, ActiveRecord) 中尤其要注意。使用 JOIN 或批量查询 (WHERE ... IN (...)) 代替在循环中执行单个查询。
  2. 参数化查询: 永远使用参数化查询或预处理语句来防止 SQL 注入攻击。不要拼接 SQL 字符串。
  3. 理解索引: 不是所有字段都适合加索引。索引有写入开销。理解查询模式,创建合适的索引(类型、字段顺序、条件)。定期分析索引使用情况 (pg_stat_all_indexes)。
  4. 事务边界: 明确事务的开始和结束。保持事务尽可能短小,减少锁竞争。正确处理并发冲突。
  5. 批量操作: 对于大批量插入/更新,使用 COPY 命令、批量 INSERT ... VALUES (...), (...), ... 或 INSERT ... SELECT ...,比循环单条插入高效得多。
  6. 监控与分析: 使用 EXPLAIN ANALYZE 分析慢查询。监控数据库性能指标(连接数、锁、CPU、IO)。使用 pg_stat_statements 扩展找出高频/高消耗 SQL。
  7. 连接池: 在应用层(如 HikariCP, pgBouncer)使用连接池管理数据库连接,避免频繁建立/断开连接的开销。
  8. 模式迁移: 使用成熟的迁移工具(如 Flyway, Liquibase, Alembic, Django Migrations)管理数据库模式变更,确保变更可追溯、可重复、可在不同环境一致执行。

        掌握这些常规 SQL 应用并结合 PostgreSQL 的强大特性(如 JSONB、数组、GIN/GiST 索引、窗口函数、CTE、强大的 PL/pgSQL),能够高效、安全地进行应用研发,构建高性能、可扩展的后端系统。


     这篇博客到这里就接近尾声了,希望我的分享能给您带来一些启发和帮助,别忘了点赞、收藏。您的每一次互动、鼓励是我持续创作的动力!期待与您再次相遇,共同探索更广阔的世界!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/929777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

酷派Cool20/20S/30/40手机安装Play商店-谷歌三件套-GMS方式

酷派Cool20/20S/30/40手机安装Play商店-谷歌三件套-GMS方式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

拼多多电商网站建设学校网站建设方案设计

使用 services 指令&#xff0c;请先安装 brew tap gapple/services 安装完成后使用 brew services start mysql

关于网络编辑作业做网站栏目新闻的ppt免费网站软件大全

今年有哪些成功的发行版发布呢&#xff1f; 让我重点介绍最好的几个。 这些发行版在 2023 年引起了人们的关注&#xff01; 每年我们都会推出一些令人兴奋的新发行版&#xff0c;它们尝试以不同的方式工作&#xff0c;或者提供一些有意义的东西&#xff0c;而不仅仅是“又一个发…

【sa-token】 sa-token非 web 上下文无法获取 HttpServletRequest - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Cloudflare洛杉矶数据中心维护通知:技术架构与影响解析

本文详细介绍了Cloudflare将于2025年10月8日在洛杉矶数据中心进行的计划性维护,包括维护时间窗口、流量重路由机制、潜在延迟影响,以及针对PNI/CNI客户的重要技术建议和通知订阅方式。维护概览 计划维护时间:2025年…

正规的手机网站建设小程序官方平台

等到花都谢了&#xff0c;你怎么还不开机&#xff1f;这电脑开机真是离奇的慢&#xff0c;有心将它换了&#xff0c;奈何兜里空空。凑合着用又无法忍受这种煎熬。其实你只需要用鼠标点几下就可以不用等待这漫长的开机过程了。高铁&#xff0c;飞机&#xff0c;网络&#xff0c;…

友点企业网站管理系统模板保定市清苑区网站建设

看看如果设定了Rollover中某个状态的效果&#xff0c;则 CA&#xff0e;在动画面板上制作的动画适用于所有的Rollover状态B&#xff0e;动画不能应用在Rollover状态上C&#xff0e;在动画面板上制作的动画仅适用于当前的Rollover状态D&#xff0e;同一动画不能赋予多个Rollover…

沧州建设银行招聘网站电子商务网站建设中

参考 一个叫做Version&#xff0c;一个叫做Build&#xff0c;&#xff08;version是版本号&#xff0c;build是打正式包每次Archive时的都增加的值&#xff09;这两个值都可以在Xcode中选中target&#xff0c;点击“Summary”后看到。 Version在plist文件中的key是“CFBundleSh…

住房和城乡建设部官方网站已前程无忧招聘网

需求&#xff1a;项目中需要使用netty&#xff0c;本地测试的时候使用的是ws&#xff0c;然后要部署到服务器上&#xff0c;使用https连接&#xff0c;https下就不能用ws了&#xff0c;必须升级到wss 1.阿里云申请免费证书 2.保存证书到本地目录 3.修改代码 SslUtil 工具类…

Windows+VSCode搭建小智(xiaozhi)开发环境 - 教程

Windows+VSCode搭建小智(xiaozhi)开发环境 - 教程2025-10-06 22:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…

StarTree支持Apache Iceberg扩展湖仓用例

StarTree宣布其云服务全面支持Apache Iceberg,实现直接查询Iceberg表而无需移动或转换底层数据,解决了高并发实时查询的挑战,同时避免了数据重复存储和复杂管道构建。StarTree支持Apache Iceberg以扩展湖仓用例 基于…

偏微分方程的解

偏微分方程的解求未知函数。

如何在 HTML 中添加按钮 - 实践

如何在 HTML 中添加按钮 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…

网站备案的链接如何创建电商平台

前言 这篇文章用于记录阿里天池 NLP 入门赛&#xff0c;详细讲解了整个数据处理流程&#xff0c;以及如何从零构建一个模型&#xff0c;适合新手入门。 赛题以新闻数据为赛题数据&#xff0c;数据集报名后可见并可下载。赛题数据为新闻文本&#xff0c;并按照字符级别进行匿名…

jsp网站开发视频教程关键词网站排名软件

来源&#xff1a;中国科学报去年&#xff0c;当一颗美式足球场大小的雪茄形天体Oumuamua进入太阳系时&#xff0c;它并非仅仅让人们第一次看到了一块星际岩石。根据一项新的研究&#xff0c;这也支持了太空岩石通过在遥远的恒星系统之间运送微生物&#xff0c;从而在星际间传播…

Road Trip of the National Day holiday

During the National Day holiday, I went on a road trip with my wife to western Sichuan. We started from Chengdu and passed through Yaan and Luding. On the first day, we visted the "Red Army Flying…

selenium基础 - 教程

selenium基础 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…

贵阳网站建设公企业型网站

前言 在之前的博客中&#xff1a; 1.Surface Web —&#xff1e; Deep Web —&#xff1e; Dark Web&#xff0c;我们解释了表层网络、深层网络等的相关概念&#xff1b; 2.Tor浏览器——层层剥开洋葱&#xff0c;我们阐述了Tor的历史和基本工作原理&#xff1b; 3.Tor浏览器…

详细介绍:20250602在荣品的PRO-RK3566开发板的Android13下的uboot启动阶段配置BOOTDELAY为10s

详细介绍:20250602在荣品的PRO-RK3566开发板的Android13下的uboot启动阶段配置BOOTDELAY为10s2025-10-06 22:08 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !impo…

兰州网站seo收费交友视频网站建设

61、在Word 2003中&#xff0c;下列关于查找操作的叙述&#xff0c;正确的是 。A、使用查找命令时&#xff0c;可以区分全角和半角字符&#xff0c;但不能区分大小写B、不支持用通配符来描述查找内容C、查找时只能从文档开始处进行D、除了可以按文字的内容进行查找&#xff0c;…