1. PostgreSQL查询基础入门刚接触PostgreSQL时SELECT查询就像一把打开数据宝库的钥匙。作为关系型数据库的核心操作SELECT语句的灵活运用直接决定了我们获取数据的效率和质量。在实际项目中我发现很多初级开发者虽然能写出基本查询但对条件筛选的细节掌握不足经常导致查询性能低下或结果不准确。PostgreSQL的SELECT语法继承了SQL标准又有所扩展支持从简单的单表查询到复杂的多表关联和聚合计算。我们先从最基础的查询结构开始逐步深入到条件筛选的各种技巧。掌握这些基础后你就能应对80%的日常数据查询需求。2. SELECT语句核心结构解析2.1 基本查询框架一个完整的SELECT查询包含以下几个关键部分SELECT [DISTINCT] column_list FROM table_name [WHERE condition] [GROUP BY grouping_columns] [HAVING filter_condition] [ORDER BY sort_columns] [LIMIT row_count]这个结构中WHERE子句是我们今天要重点探讨的条件筛选部分。但在深入之前我们需要先理解每个基础组件的用途SELECT指定要返回的列可以使用*表示所有列FROM指定数据来源的表WHERE对行数据进行筛选本节核心内容GROUP BY对结果进行分组HAVING对分组后的结果进行筛选ORDER BY对结果进行排序LIMIT限制返回的行数2.2 最简单的查询示例假设我们有一个员工表employees-- 创建示例表 CREATE TABLE employees ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, department VARCHAR(50), salary NUMERIC(10,2), hire_date DATE, is_active BOOLEAN DEFAULT true ); -- 插入示例数据 INSERT INTO employees (name, department, salary, hire_date) VALUES (张三, 技术部, 15000, 2020-05-10), (李四, 市场部, 12000, 2019-11-15), (王五, 技术部, 18000, 2018-03-22), (赵六, 人事部, 9000, 2021-01-30);最基本的查询是获取所有员工信息SELECT * FROM employees;这将返回employees表中的所有列和所有行。在实际项目中我建议尽量避免使用SELECT *而是明确列出需要的列名。这样做有两个好处一是减少不必要的数据传输二是当表结构变更时查询不会意外中断。3. 条件筛选(WHERE)深度解析3.1 基础比较运算符WHERE子句支持标准的比较运算符等于或!不等于大于小于大于等于小于等于示例查询薪资大于10000的员工SELECT name, department, salary FROM employees WHERE salary 10000;3.2 逻辑运算符组合条件PostgreSQL支持以下逻辑运算符组合多个条件AND- 逻辑与OR- 逻辑或NOT- 逻辑非示例查询技术部且薪资超过15000的员工SELECT name, salary FROM employees WHERE department 技术部 AND salary 15000;注意在组合多个条件时使用括号明确优先级是个好习惯。PostgreSQL遵循标准运算符优先级(NOT AND OR)但显式的括号能让查询更易读和维护。3.3 特殊条件表达式3.3.1 BETWEEN - 范围查询查找薪资在10000到15000之间的员工SELECT name, salary FROM employees WHERE salary BETWEEN 10000 AND 15000;这个查询等价于SELECT name, salary FROM employees WHERE salary 10000 AND salary 15000;3.3.2 IN - 多值匹配查询部门为技术部或市场部的员工SELECT name, department FROM employees WHERE department IN (技术部, 市场部);IN操作符特别适合与子查询结合使用例如SELECT name, department FROM employees WHERE department IN (SELECT department FROM departments WHERE budget 100000);3.3.3 LIKE - 模糊匹配查找名字以张开头的员工SELECT name FROM employees WHERE name LIKE 张%;LIKE支持两个通配符%匹配任意数量字符(包括零个)_匹配单个字符PostgreSQL还提供了更强大的模式匹配操作符SIMILAR TO和正则表达式匹配~但在大多数情况下LIKE已经足够使用。3.3.4 IS NULL - 空值检查查询没有部门信息的员工SELECT name FROM employees WHERE department IS NULL;重要提示在SQL中NULL表示未知或缺失值任何与NULL的比较(包括NULL)都会返回NULL而非true/false。因此必须使用IS NULL或IS NOT NULL来检查空值。3.4 日期条件筛选日期类型的条件筛选在实际应用中非常常见。PostgreSQL提供了丰富的日期时间函数和操作符。示例查询2020年之后入职的员工SELECT name, hire_date FROM employees WHERE hire_date 2020-01-01;更复杂的日期查询示例查询入职超过3年的员工SELECT name, hire_date FROM employees WHERE hire_date CURRENT_DATE - INTERVAL 3 years;PostgreSQL支持多种日期运算和格式化函数如date_part、age、to_char等可以满足各种复杂的日期处理需求。4. 高级筛选技巧与实践经验4.1 条件筛选的性能考量WHERE子句的编写方式会显著影响查询性能。以下是一些优化建议选择性高的条件放前面PostgreSQL的查询优化器会尝试优化条件顺序但明确的高选择性条件(能过滤更多数据的条件)放在前面有助于阅读和理解。避免在索引列上使用函数例如WHERE lower(name) 张三会使name列上的索引失效。如果必须使用函数考虑创建函数索引。小心使用OR条件多个OR条件可能导致索引失效可以考虑使用UNION ALL重写查询。LIKE查询的前导通配符问题WHERE name LIKE %张这样的查询无法使用普通B-tree索引可以考虑使用pg_trgm扩展的GIN索引。4.2 条件筛选中的常见陷阱浮点数比较由于浮点数的精度问题直接比较可能导致意外结果。对于数值比较建议使用WHERE abs(salary - 10000.0) 0.001这样的方式。字符集和排序规则字符串比较受数据库的LC_COLLATE设置影响特别是大小写敏感性和特殊字符排序。时区处理带时区的时间戳比较需要特别注意当前会话的时区设置。NULL值的逻辑运算记住NULL AND true结果是NULL而非false这在复杂条件组合时可能导致意外结果。4.3 实际案例电商订单查询假设我们有一个电商订单表ordersCREATE TABLE orders ( order_id BIGSERIAL PRIMARY KEY, user_id INTEGER NOT NULL, order_date TIMESTAMPTZ NOT NULL, total_amount NUMERIC(12,2) NOT NULL, status VARCHAR(20) NOT NULL, payment_method VARCHAR(20), shipping_address TEXT );典型的多条件查询示例-- 查询过去30天内未支付且金额大于100的信用卡订单 SELECT order_id, total_amount, order_date FROM orders WHERE order_date CURRENT_DATE - INTERVAL 30 days AND status unpaid AND total_amount 100 AND payment_method credit_card;对于这种常见查询建议在(status, order_date, payment_method)上创建复合索引以提高性能。5. PostgreSQL特有的筛选功能5.1 模式匹配增强PostgreSQL除了标准LIKE外还提供ILIKE不区分大小写的LIKE匹配SELECT name FROM employees WHERE name ILIKE zhang%;SIMILAR TO支持SQL标准的正则模式SELECT name FROM employees WHERE name SIMILAR TO (张|李)%;正则表达式更强大的~操作符SELECT name FROM employees WHERE name ~ ^[张李王];5.2 数组和JSON条件筛选对于PostgreSQL特有的数组和JSON类型有专门的查询语法数组包含查询-- 查询包含技术标签的员工 SELECT name FROM employees WHERE tags ARRAY[技术];JSON路径查询-- 查询metadata中location.city为北京的员工 SELECT name FROM employees WHERE metadata-location.city 北京;5.3 全文搜索PostgreSQL内置了强大的全文搜索功能-- 在员工简历中搜索数据库和设计相关的内容 SELECT name, resume FROM employees WHERE to_tsvector(chinese, resume) to_tsquery(chinese, 数据库 设计);6. 动态条件构建技巧在实际应用中我们经常需要根据用户输入构建动态查询。以下是几种实现方式6.1 CASE表达式条件筛选SELECT name, salary, CASE WHEN salary 10000 THEN 初级 WHEN salary BETWEEN 10000 AND 20000 THEN 中级 ELSE 高级 END AS level FROM employees;6.2 使用COALESCE处理可选条件-- 如果参数为NULL则忽略该条件 SELECT name, department, salary FROM employees WHERE (department COALESCE(:dept_param, department)) AND (salary COALESCE(:min_salary, 0));6.3 使用预处理语句防止SQL注入在应用程序中构建动态SQL时务必使用参数化查询# Python示例 query SELECT name, department FROM employees WHERE department %s AND salary %s cursor.execute(query, (dept_param, min_salary))7. 查询结果处理7.1 结果排序(ORDER BY)-- 按薪资降序排序 SELECT name, salary FROM employees ORDER BY salary DESC;可以指定多个排序条件-- 先按部门升序再按薪资降序 SELECT name, department, salary FROM employees ORDER BY department ASC, salary DESC;7.2 结果分页(LIMIT OFFSET)-- 获取第2页每页5条记录 SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 5 OFFSET 5;PostgreSQL 12支持更标准的分页语法-- 使用FETCH FIRST语法 SELECT name, salary FROM employees ORDER BY salary DESC OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;7.3 去重查询(DISTINCT)-- 获取所有不重复的部门名称 SELECT DISTINCT department FROM employees;对于多列去重SELECT DISTINCT ON (department) department, name FROM employees ORDER BY department, salary DESC;这个查询会返回每个部门薪资最高的员工。8. 最佳实践总结根据我在多个PostgreSQL项目中的经验以下SELECT查询的最佳实践值得注意明确指定列名避免使用SELECT *只查询需要的列。合理使用索引为经常用于条件筛选的列创建适当索引。注意NULL处理明确考虑NULL值在业务逻辑中的含义。分页优化对于大数据集分页考虑使用keyset分页(WHERE id last_id)代替OFFSET。查询分析使用EXPLAIN ANALYZE分析复杂查询的执行计划。参数化查询在应用程序中始终使用参数化查询防止SQL注入。适度使用高级特性JSON、数组等PostgreSQL特有功能很强大但不要过度使用。定期维护对频繁查询的表定期执行ANALYZE更新统计信息。
企业数字化 ERP 产品动态
相关推荐
WPS样式集:专业文档的结构化生产力引擎 1. 为什么“样式集”是WPS里最被低估的生产力开关?很多人用WPS写报告、做方案、编手册,天天调字体、改段距、手动加粗标题,反复点“格式刷”,结果一份30页的文档改到第5遍还在对齐编号——不是你不认真,而是你根本没打… · 2026/11/5 2:53:05
BeagleBone轻量监控页:Node.js直读/sys/class/thermal 简介:这是一份面向嵌入式开发与物联网初学者的 BeagleBone 实时监控实践项目,基于 Node.js 构建浏览器端 CPU 温度可视化系统,解决单板计算机运行状态远程可观测性问题。资源包为 ZIP 格式,大小 21.43MB,虽未提供具体文… · 2026/11/5 2:53:05
缓存技术解析:从本地到分布式架构实践 1. 缓存技术全景解析:从单机到分布式缓存技术是现代系统架构中不可或缺的一环。记得我第一次负责高并发系统时,数据库在流量高峰时CPU直接飙到100%,整个系统几乎瘫痪。当时紧急引入Redis后,QPS从500提升到5000,这个经历… · 2026/11/5 2:53:05
焊接还是压接?USB、DC 线焊点虚焊的判定与工艺边界 焊点是冶金连接,压接是冷变形机械连接,失效模式不同:压接坏了是电阻慢慢爬、通电发热;焊点坏了常常一次震动就断,而静态通电还是通的。判焊点好坏,第一判据是润湿角,不是「亮不亮」。大电流、强… · 2026/11/5 5:30:08
嵌入式 Linux 笔记:应用程序、设备驱动与内核之间的关系 一、整体关系在典型嵌入式 Linux 系统中:应用程序运行在用户空间,负责实现产品业务功能。设备驱动通常运行在内核空间,负责控制具体硬件。Linux 内核负责进程调度、内存管理、文件系统、网络协议栈、设备管理,并提供系统调用和设备… · 2026/11/5 5:30:08
高精度计算入门与immense数据模型精讲(七) 跳转链接
高精度计算入门与immense数据模型精讲(一)高精度计算入门与immense数据模型精讲(二)高精度计算入门与immense数据模型精讲(三)高精度计算入门与immense数据模型精讲(四)高… · 2026/11/5 5:30:08
OBIS 平台|二维码丢了,Matter 设备为什么可能再也配不上网? Matter 设备用上几年,很容易遇到这样一个问题。用户换了路由器,或者把设备恢复了出厂设置,需要重新配网。打开 App,提示扫描设备上的二维码。结果把设备翻过来一看,二维码已经磨得看不清了。
联系客服,客服… · 2026/11/5 5:30:08
深度 | DeepSeek 融资 1000 亿落定:领投的不是 VC,是宁德时代 10 月 22 日,Reuters、Bloomberg、WSJ 三家通讯社几乎同时确认:DeepSeek 完成了约 150 亿美元融资,折合近 1000 亿元人民币,投前估值约 5000 亿元。这是中概公司最大的一笔单笔私募 AI 融资,也让它的估值在半年内从 6 … · 2026/11/5 5:30:08
CMake 实战指南:从基础语法到静态库/动态库制作与链接 目录
1. CMAKE 的基本使用 1.1 注释1.2 使用 set 命令在 cmake 中进行变量的定义1.3 CMAKE 中设置 C 标准1.4 可执行文件的输出路径1.5 文件的查找1.6 头文件的引入 2. 制作动态库和静态库 2.1 指定库文件的输出路径 3. 包含库文件 3.1 链接系统动态库 4. 总结与经典面试题 4.… · 2026/11/5 5:29:08
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38