PostgreSQL 常用 SELECT 数据查询命令

01.PostgreSQL基本SELECT语句 SQL 是用于访问和处理数据库的标准的计算机语言。SQL有两个标准:分别是SQL92和SQL99,他们分别代表了92年和99年颁布的SQL标准,我们今天使用的SQL语言依然遵循这些标准。注意:除了 SQL 标准之外,大部分 SQL 数据库程序都拥有它们自己的私有扩展! 阅读详情

SELECT 是 PostgreSQL(以及所有 SQL 数据库)中最核心、最常用的数据查询命令。作为 Java 后端开发程序员,掌握 SELECT 的各种用法,不仅能写出高效的 SQL,还能减少应用层的数据处理逻辑,提升系统性能。

下面我将从基础到高级,为你系统讲解 SELECT 命令的语法结构,并提供具有实际开发参考意义的示例,每个示例都附有中文注释说明,适合你在项目中直接参考使用。


🧩 一、SELECT 命令基本语法结构

SELECT [DISTINCT] 列名 | *
FROM 表名
[WHERE 条件]
[GROUP BY 分组字段]
[HAVING 分组后筛选条件]
[ORDER BY 排序字段 [ASC|DESC]]
[LIMIT 数量] [OFFSET 偏移量];

⚠️ 方括号 [] 表示可选部分


📚 二、实际开发示例(从简单到复杂)

✅ 示例 1:基础查询 —— 查询所有用户信息

-- 查询 users 表中所有字段的所有数据
-- 适用于:调试、导出全量数据
SELECT * FROM users;

💡 实际开发中不建议在接口中使用 SELECT *,应明确指定字段以提高性能和可维护性。


✅ 示例 2:指定字段查询 —— 只查用户名和邮箱

-- 只查询用户名和邮箱,避免传输不必要的字段(如密码哈希)
-- 适用于:用户列表接口
SELECT username, email, created_at 
FROM users 
ORDER BY created_at DESC;  -- 按创建时间倒序排列

✅ 推荐做法:接口返回 DTO 字段应与查询字段一致。


✅ 示例 3:条件查询 —— 查找特定用户

-- 根据用户名精确查找用户(登录验证)
-- 适用于:用户登录、权限校验
SELECT id, username, email, profile 
FROM users 
WHERE username = 'zhangsan';

-- 或者根据邮箱查找(注册去重)
SELECT id FROM users WHERE email = 'zhangsan@example.com';

🔍 提示:确保 username 和 email 字段有唯一索引。


✅ 示例 4:模糊查询 —— 支持中文搜索

-- 模糊搜索用户名或昵称(支持中文)
-- 适用于:后台管理用户搜索功能
SELECT id, username, profile->>'nick' AS nickname, email 
FROM users 
WHERE username ILIKE '%san%'           -- 不区分大小写匹配用户名
   OR profile->>'nick' ILIKE '%张%';   -- 搜索 JSON 字段中的昵称

📌 技巧:

  • ILIKE:不区分大小写
  • ->>:从 JSONB 字段提取文本值
  • 配合 GIN 索引可加速 JSONB 模糊查询

✅ 示例 5:分页查询 —— 实现列表分页

-- 分页查询用户列表(每页 10 条,第 2 页)
-- 适用于:REST API 分页接口
SELECT id, username, email, created_at 
FROM users 
ORDER BY created_at DESC 
LIMIT 10 OFFSET 10;  -- 第2页(跳过前10条,取10条)

-- 更现代的写法(PostgreSQL 8.4+ 支持)
-- LIMIT 10 OFFSET 10 等价于
-- OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

✅ 推荐:在 Spring Data JPA 中使用 Pageable,底层就是生成这种 SQL。


✅ 示例 6:去重查询 —— 统计不同状态的订单

-- 查询订单表中所有不同的状态(去重)
-- 适用于:前端下拉框选项加载
SELECT DISTINCT status 
FROM orders 
WHERE status IS NOT NULL;

输出示例:

   status   
------------
 pending
 paid
 shipped
 cancelled

✅ 示例 7:聚合查询 —— 统计订单总数和总金额

-- 按用户统计订单数量和总金额
-- 适用于:用户中心“我的订单”统计
SELECT 
    user_id,
    COUNT(*) AS order_count,           -- 订单总数
    SUM(amount) AS total_amount,       -- 总金额
    AVG(amount) AS avg_amount,         -- 平均金额
    MAX(created_at) AS last_order_time -- 最近下单时间
FROM orders 
WHERE status = 'paid'                  -- 只统计已支付订单
GROUP BY user_id 
HAVING COUNT(*) >= 1                   -- 至少有1笔订单
ORDER BY total_amount DESC 
LIMIT 5;                               -- 取消费最高的前5个用户

📊 这种查询可替代 Java 中的 Map<UserId, List<Order>> + Stream 处理。


✅ 示例 8:多表关联查询 —— 查询用户及其订单

-- 查询用户信息及其最近一笔订单
-- 适用于:用户详情页
SELECT 
    u.id AS user_id,
    u.username,
    u.email,
    o.id AS order_id,
    o.order_no,
    o.amount,
    o.status,
    o.created_at AS order_time
FROM users u
LEFT JOIN orders o ON u.id = o.user_id 
    AND o.created_at = (
        -- 子查询:获取该用户的最新订单时间
        SELECT MAX(created_at) 
        FROM orders 
        WHERE user_id = u.id
    )
ORDER BY u.created_at DESC;

🔍 使用 LEFT JOIN 确保没有订单的用户也能显示。


✅ 示例 9:使用 CTE(公共表表达式)—— 复杂逻辑分步处理

-- 使用 CTE 查询“每个用户最近3笔订单”
-- 适用于:用户订单历史页面
WITH user_recent_orders AS (
    SELECT 
        o.user_id,
        u.username,
        o.order_no,
        o.amount,
        o.status,
        o.created_at,
        -- 为每个用户的订单按时间倒序编号
        ROW_NUMBER() OVER (PARTITION BY o.user_id ORDER BY o.created_at DESC) AS rn
    FROM orders o
    JOIN users u ON o.user_id = u.id
    WHERE o.created_at >= NOW() - INTERVAL '90 days'  -- 近90天订单
)
-- 外层查询:只取每用户前3条
SELECT 
    user_id, username, order_no, amount, status, created_at
FROM user_recent_orders 
WHERE rn <= 3
ORDER BY username, created_at DESC;

✅ CTE 让复杂 SQL 更清晰,类似 Java 中的“中间变量”。


✅ 示例 10:窗口函数 —— 计算排名和累计值

-- 计算每个订单在其用户内的排名,以及累计消费
-- 适用于:用户消费分析报表
SELECT 
    user_id,
    order_no,
    amount,
    created_at,
    -- 当前用户订单排名
    ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at) AS order_rank,
    -- 累计消费金额(从第一笔到当前笔)
    SUM(amount) OVER (PARTITION BY user_id ORDER BY created_at) AS cumulative_amount
FROM orders 
WHERE status = 'paid'
ORDER BY user_id, created_at;

📈 窗口函数是 PostgreSQL 的强大特性,可替代 Java 中的 for 循环累计逻辑。


✅ 示例 11:JSONB 查询 —— 查询订单中的商品信息

-- 假设 orders.items 是 JSONB 字段,存储商品列表
-- 查询包含“Java书”的订单
SELECT 
    id, order_no, amount, items 
FROM orders 
WHERE items @> '[{"name": "Java书"}]';  -- JSONB 包含指定结构

-- 提取第一个商品名称
SELECT 
    order_no,
    items->0->>'name' AS first_item_name  -- 取第1个商品的 name 字段
FROM orders 
WHERE items ? 'name';  -- ? 检查 key 是否存在(适用于数组)

💡 JSONB + GIN 索引 = 半结构化数据的高效查询。


✅ 示例 12:条件表达式 —— 返回状态中文描述

-- 将订单状态英文转换为中文,用于前端展示
-- 适用于:API 返回 DTO 映射
SELECT 
    order_no,
    amount,
    status,
    CASE 
        WHEN status = 'pending' THEN '待支付'
        WHEN status = 'paid' THEN '已支付'
        WHEN status = 'shipped' THEN '已发货'
        WHEN status = 'cancelled' THEN '已取消'
        ELSE '未知状态'
    END AS status_text,
    created_at
FROM orders 
ORDER BY created_at DESC;

✅ 避免在 Java 中用 if-else 转换状态,直接在 SQL 中处理更高效。


🎯 三、开发建议总结

场景建议
接口查询避免 SELECT *,明确字段
分页使用 LIMIT + OFFSET 或 cursor-based pagination
模糊搜索用 ILIKE + GIN 索引加速
统计分析用 GROUP BY + HAVING 替代 Java Stream
多表查询用 JOIN,避免 N+1 查询
复杂逻辑用 CTE 或 窗口函数 提升可读性
JSON 字段用 ->>, @>, ? 操作 JSONB
性能优化配合 EXPLAIN ANALYZE 查看执行计划

📌 四、常见性能陷阱

错误写法正确做法
SELECT * FROM users WHERE LOWER(username) = 'xxx'建 LOWER(username) 函数索引 或 用 ILIKE
OFFSET 10000 LIMIT 10(深度分页慢)改用 WHERE id > last_id LIMIT 10(游标分页)
WHERE profile->>'age' = '28'为 profile 建 GIN 索引:CREATE INDEX idx_users_profile ON users USING GIN (profile);

✅ 总结

SELECT 不只是“查数据”,它是你构建高效后端系统的核心工具。掌握它,你就能:

  • 减少 Java 层的数据处理
  • 提升接口响应速度
  • 写出更简洁、可维护的代码
  • 应对复杂的业务查询需求

如果你需要,我可以为你生成:

  • 一份“SELECT 常用模式速查表”
  • 一个 Spring Boot 分页查询 + PostgreSQL 的完整示例
  • CTE 和窗口函数的对比使用指南
深入解析数据查询操作:SELECT 语句的使用与应用 title: 深入解析数据查询操作:SELECT 语句的使用与应用author:excerpt:数据查询是数据库操作中最频繁、最重要的一部分。无论是开发应用程序、进行数据分析,还是维护数据库,熟练使用 SELECT 语句都是必不可少的技能。本文将系统地讲解 PostgreSQL 中的 SELECT 语句,包括基本查询、条件查询以及如何利用 ORDER BY 和 LIMIT 进行排序与限制展示的数据量。扫描在关系型数据库管理系统中,数据查询(SELECT)是与数据交互的核心操作之一。 阅读详情

相关推荐

postgresql常用命令_postgis 去掉用户的密码

赋予创建角色的权限--修改schema的名称#赋予用户zhaobsh数据库所有权限# 赋予用户zhaobsh数据库更新权限/* 赋给用户表的所有权限 *//* 赋给用户数据库的所有权限 *//* 撤销用户权限 */**删除用户:**修改指定用户指定权限注意:如果出现 FATAL: role ‘…’ is not permitted to log in. 的错误4、建用户授权#连接数限制## 创建数据库– 创建数据库指定所属者或者。

2501_90389106的博客 1915

PostgreSQL 中的 SELECT 语句的用法

一,基本用法 SQL语句是不区分大小写的。 SQL language is case insensitive. 按照惯例,我们用大写的形式来写SQL关键字,使得代码更容易阅读。 By convention, we will use SQL keywords in uppercase to make the code easier to read. 1.查看当前数据库中有哪些表 select * f...

weixin_40544320的博客 1万+

PostgreSQL SELECT 语句详解

SELECT 语句是 PostgreSQL 数据查询的核心,熟练掌握 SELECT 语句可以帮助我们高效地获取所需数据。本文介绍了 SELECT 语句的基础语法、高级特性和分页查询技巧,希望对您有所帮助。在实际应用中,请根据具体需求灵活运用 SELECT 语句,充分发挥 PostgreSQL 数据库的优势。

csbysj2020 444

PostgreSQL11 | 查询数据

本文根据原书《PostgreSql11 从入门到精通》(清华大学出版社)第8章总结整理,为提问与解答可以帮助更多人,本博客模拟GitHub的issue方案,所以私信已关,有问题请在评论区直接指正与提问,允许转发、复制或引用本文章,必须遵守开源法则注释来源与作者,感谢您的阅读。

红星编程实验室 9243

【postgresql 基础入门】数据表的查询基本知识,条件过滤、单列多列排序、按页浏览数据、数据去重,得到你想要的数据

postgresql 数据库是一款通用的关系型数据,在开源数据库中能与商业数据媲美,在业界也越来越流行。因为是开源数据库,不仅公开源码,还有很多使用案例,好用的插件,所以它的慢慢变成了数据库的先驱和标准,通过postgresql可以很好从使用到原理,彻底搞懂;如果是学习编程,也可以学到丰富的编程知识,数据结构,编程技巧,它里面还有很多精妙的架构设计,分层思想,可以灵活定制的思想。

一个追逐梦想的码农 6644

【PostgreSQL教程】PostgreSQL 删除表格

PostgreSQL 使用 DROP TABLE 语句来删除表格,包含表格数据、规则、触发器等,所以删除表格要慎重,删除后所有信息就消失了。

No8g攻城狮的博客 789

PostgreSQL 常用 SELECT 数据查询命令示例

PostgreSQL SELECT语句全指南:从基础查询到高级功能 本文详细介绍了PostgreSQL中SELECT语句的24种用法,涵盖基础查询到高级特性。内容包括:基本查询、条件筛选(WHERE、LIKE、IN等)、排序分组(ORDER BY、GROUP BY)、聚合函数、多表连接(JOIN)、子查询、窗口函数、CTE表达式等。特别展示了PostgreSQL特有功能如ILIKE不区分大小写查询、JSON数据处理和LATERAL横向连接。每种用法都配有中文注释的SQL示例,适合不同水平的开发者学习参考,从

python15397的博客 584

【PostgreSQL教程】PostgreSQL SELECT 语句

PostgreSQL SELECT 语句用于从数据库中选取数据。结果被存储在一个结果表中,称为结果集。

No8g攻城狮的博客 874

Week8学习总结-数据库

Week8学习总结-数据库 一. 关系数据库 1. 关系数据库特点 理论基础:关系代数,关系运算,一阶谓词逻辑。 具体表象:用二维表(有行和列)组织数据。 编程语言:结构化查询语言(SQL - Structured Query Language)。 注意:数据库中的数据尽量不要为空值 2. ER模型(实体关系模型)和概念模型图 ER模型,全称为实体关系模型(Entity-Relationship Model),由美籍华裔计算机科学家陈品山先生提出,是概念数据模型的高层描述方式,如下图所示。

HenryWang0412的博客 917

QMT量化交易实战:如何用通达信预警数据自动买卖股票(附完整Python代码)

本文详细介绍了如何利用QMT平台结合通达信预警数据实现股票自动化交易,提供完整的Python代码实现。通过实时监控通达信预警板块文件,系统自动执行买卖操作,提升交易效率。文章涵盖系统架构设计、数据对接、信号处理、订单执行等核心模块,适合量化交易初学者和通达信用户参考实践。

weixin_29251567的博客 677

AI for Science:GNN预测分子性质全流程详解与工业实践

从分子表示到工业落地,一文掌握图神经网络在药物研发与材料设计中的核心实战近年来,的浪潮正深刻变革着传统科研范式。在药物研发与材料设计领域,作为核心环节,已从传统的实验试错转向基于图神经网络(GNN)的智能计算。本文将深入解析GNN预测分子性质的,涵盖数据准备、模型设计、训练优化到工业部署,并揭秘前沿技术与实战案例。

datacanvas2426的博客 1674

PostgreSQL常用命令&常见错误

PostgreSQL常用操作命令 创建数据库新用户 CREATE USER test WITH PASSWORD '1q2w3e'; 注意:语句要以分号结尾,密码要用单引号括起来。 创建用户数据库 CREATE DATABASE testdb01 OWNER test; 将数据库的所有权限赋予用户 GRANT ALL PRIVILEGES ON DATABASE testdb01 TO test; 修改数据库的owner为test用户(如果创建时未指定owner、也可以通过alter命令指定) al

sunny05296的博客 2万+

华为海思IC设计岗位笔试全解析:物理、电路与工艺三大方向备考指南

本文全面解析华为海思IC设计岗位笔试的物理、电路与工艺三大方向备考要点。针对物理设计方向,重点讲解半导体能带理论、载流子输运机制等核心考点;电路设计方向涵盖Verilog语法、UVM验证等关键技术;工艺方向则深入探讨FinFET工艺、光刻技术等前沿知识。提供高效备考策略和应试技巧,助力考生提升通过率。

weixin_29196613的博客 1082

【PostgreSQL】数据查询-XML 函数

有一组函数和类函数的表达式可以用来从 SQL 数据产生 XML 内容。它们特别适合于将查询结果格式化成 XML 文档以便于在客户端应用中处理。

圈小圈DBA的博客 2411

Vue - 萤石云监控 ezuikit 视频实例销毁方案,解决使用stop方法无法销毁EZUIKit实例或销毁后依然占用内存并且监控画面依然有声音问题(解决页面多个监控摄像头画面同时播放,翻页或关闭页

vue2,vue3,萤石,监控摄像头,萤石云销毁视频实例,退出页面销毁,stop销毁原视频流,占用内存怎么办,销毁后视频依旧在后台播放有声音,销毁视频播放器,页面上有多个视频画面怎么销毁某一个,stop方法不生效怎么办,浏览器非常卡,dom销毁,ezuikit-js萤石云播放器Vue中使用beforeDestory销毁播放器实例,调用萤石云ezuikit-js的视频对象销毁,vue使用萤石云监控视频录像回放,不销毁实例会出现离开页面后依旧有监控声音并且占内存问题,不好使,页面崩了,崩溃,视频监控太多,没有用

🏆 前端领域优质创作者 1万+

基于FPGA的UDP 通信(六)

本文基于FPGA和MATLAB对千兆以太网通信模块UDP数据发送(FPGA发送)进行联合调试。

记录所学,分享知识,结识挚友 4728

PostgreSQL——数据查询

包含星号通配符和选字段列表,表示查询所有的字段,表示查询指定的字段。字段列至少包含一个字段名称,如果要查询多个字段,多个字段之间用逗号隔开,最后一个字段后不要加逗号。 :表1和表2表示查询数据的来源,可以是单个或者多个。 是可选项,如果选择该项,[查询条件]将限定查询行必须满足的查询条件 该子句告诉PostgreSQL如何显示查询出来的数据,并按照指定的字段分组 该子句告诉PostgreSQL按什么样的顺序显示查询出来的数据,可以进行的排序有:、 该子句告诉PostgreSQL每次显示查询出来的数据条数。

吴声子夜歌的博客 1343

OpenHarmony AI系列:神经网络处理单元(NPU)驱动架构与实现详解

NPU(Neural Processing Unit,神经网络处理单元)是专门为神经网络计算设计的硬件加速器。在OpenHarmony系统中,NPU驱动是通过NNRT(Neural Network Runtime,神经网络运行时)框架实现的,它作为中间桥梁连接上层AI推理框架和底层NPU硬件,实现AI模型的跨芯片推理计算。

m0_67505153的博客 665

PostgreSQL 常用 SQL 命令集合

一份全面的 PostgreSQL 常用 SQL 命令集合,包含数据库管理、表操作、数据查询、性能优化等核心功能

TOOZOOY的博客 891

ORB-SLAM3代码详解 - 第 18 篇 · Atlas 多地图系统、地图保存与全系统调优

会跑:理解三线程架构与数据流(01/08/10/13),能编译、配参、复现各数据集结果。会改:掌握相机模型抽象(05)、g2o 顶点与边(14)、预积分(15),能接入新传感器、新相机、新约束。会调:理解每个参数背后的物理含义与耦合(03/15/16/18),能针对自己的平台与场景做精度/实时/鲁棒的权衡。ORB-SLAM3 的价值不止于一个可用的 SLAM 系统,更在于它是一套工程化的几何状态估计模板:清晰的模块边界、可替换的相机/传感器抽象、紧耦合优化的标准范式。

PX4-SLAM-PNC 171

YOLOv8-COCO指标转换

本文介绍了将YOLO格式数据集转换为COCO格式并评估模型性能的完整流程。首先需将YOLO格式的标注数据转换为COCO格式,通过修改classes、image_path等参数适配不同数据集。然后使用YOLO模型对验证集进行预测并保存结果为JSON格式。最后通过比较预测结果和转换后的COCO标注文件,使用COCO官方评估指标和TIDE工具进行性能分析,生成包含AP、AR等指标的报告及错误分析图表。整个过程实现了从数据准备到模型评估的完整闭环,为计算机视觉任务提供标准化的性能评估方案。

FJN110的博客 401

PostgreSQL 的常用命令及其作用

PostgreSQL实用命令指南(Java后端开发版) 摘要:本文整理了PostgreSQL最常用的命令,分为SQL命令和psql元命令两大类,涵盖数据库管理、表结构操作、数据增删改查等场景。特别针对Java开发者提供了实用命令示例,包括: 数据库结构查看命令(\l, \dt, \d等) 表创建示例(含注释和索引) 数据操作语法(带RETURNING返回结果) 事务控制和性能分析命令 这些命令可帮助开发者快速掌握PostgreSQL基本操作,提升日常开发效率,特别适合项目初期数据库结构探索和SQL性能优化场

python15397的博客 909

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

PostgreSQL数据查询--详细速查手册

PostgreSQL数据查询详细速查手册 一基本查询语句 1 SELECT语句的基本格式 二单表查询 01 查询所有字段 02 查询指定字段 03 查询指定记录 04 范围查询IN 的用法 05 范围查询BETWEEN AND 的用法 06 模糊查询LIKE 的用法 07 多条件查询AND OR 的用法 07x 多表查询 08 空值查询 IS NULL 09 分组查询GROUP BY的用法 10

白衣 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

PostgreSQL 常用函数

在数据库管理系统中,函数是执行特定任务的基本构建块。PostgreSQL 是一个功能强大的开源关系数据库管理系统,提供了丰富的内置函数,这些函数极大地增强了数据库操作的能力。以下是一些在 PostgreSQL 中常用的函数,涵盖了数据查询、转换、计算等多个方面。

froginwe11的博客 832

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

PostgreSQL 终端命令详解及实际应用案例

PostgreSQL 作为一款功能强大的开源关系型数据库,其终端命令是数据库管理员、开发人员日常操作的核心工具。这些命令覆盖数据库连接、对象管理、数据操作、备份恢复、权限控制等多个维度,掌握其实际应用场景能显著提升工作效率。本文结合不同行业的实操案例,详细解析常用终端命令的用法与实战价值。

七夜zippoe的博客 1038
上一篇: 什么是 N+1 查询问题?推荐怎么解决?
下一篇: PostgreSQL 的 UPDATE 数据更新功能有哪些用法?
龙茶清欢
博客等级 码龄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、付费专栏及课程。

余额充值