PostgreSQL 教程

PostgreSQL 查询数据

SELECT 语句是 SQL 数据检索的基础。它允许你查询数据库,并从一个或多个数据表中提取特定的信息。

对于任何与关系型数据库打交道的人来说,精通 SELECT 语句都是必修课,因为它是数据分析、报表生成和应用程序开发的基础。本章将为你提供在 PostgreSQL 中使用 SELECT 语句的全面指南,涵盖其核心语法、常用选项以及实际应用。

1. SELECT 基础语法

SELECT 语句最基本的语法结构如下:

SELECT column1, column2, ...
FROM table_name;
  • SELECT: 启动查询的关键字。
  • column1, column2, ...: 你想要检索的列名。你可以选择一列或多列。如果你想提取表中的所有列,可以使用星号 (*) 通配符。
  • FROM: 指定从哪个数据表中检索数据。
  • table_name: 你正在查询的表名。

1.1 检索指定列

假设我们有一个名为 employees (员工) 的表,结构如下:

列名 (Column)数据类型 (Data Type)
employee_idINTEGER
first_nameVARCHAR
last_nameVARCHAR
departmentVARCHAR
salaryDECIMAL

如果你只想提取所有员工的 first_name (名字) 和 last_name (姓氏),你需要使用以下查询:

SELECT first_name, last_name
FROM employees;

执行后,返回的结果集将只包含 employees 表中每一行的名字和姓氏这两列数据。

1.2 检索所有列 (使用星号 *)

如果你想提取表中的所有信息,可以使用星号 (*):

SELECT *
FROM employees;

这个查询会返回表中的每一列(employee_id, first_name, last_name, departmentsalary)。

最佳实践提醒: 虽然 SELECT * 敲起来很方便,但在生产环境中通常不建议这样做。因为它可能会提取比实际需要多得多的数据,从而拖慢网络传输和系统性能。此外,它可能会把应用程序本不需要的敏感列也暴露出来,增加安全风险。最好的习惯是:总是明确列出你需要的那些列。

2. 设置列别名 (Column Aliases)

列别名允许你在查询返回的结果集中对列进行“重命名”。这对于提高报表的可读性,或者为计算出来的列提供一个有意义的名称非常有用。

你可以使用 AS 关键字来定义别名,也可以直接把别名放在列名后面(省略 AS)。

语法:

SELECT column_name AS alias_name
FROM table_name;
-- 或者省略 AS:
SELECT column_name alias_name
FROM table_name;

示例:
你想提取员工的名字和姓氏,但希望在结果集中将表头显示为更正式的 given_namesurname

SELECT first_name AS given_name, last_name AS surname
FROM employees;

现在,输出结果的列标题变成了 given_namesurname。请注意,这仅仅是表面上的“化妆”,只影响查询的输出展示,数据库底层表的真实列名依然没变。

计算列的别名应用:
当你在查询中进行数学运算时,别名尤为重要。例如,在一个包含 price (原价) 和 discount (折扣率) 的 products (产品) 表中计算折后价:

SELECT price * (1 - discount) AS discounted_price
FROM products;

如果不加别名 AS discounted_price,返回的列标题将会是难看的表达式公式 price * (1 - discount)

3. 使用 DISTINCT 提取不重复的值

DISTINCT 关键字用于从指定的列中仅提取唯一(不重复)的值。这在需要消除结果集中的重复条目时非常关键。

语法:

SELECT DISTINCT column_name
FROM table_name;

示例 1:单列去重
如果你想知道公司里总共有哪些不同的部门(去掉重复的部门名称):

SELECT DISTINCT department
FROM employees;

示例 2:多列组合去重
你也可以对多个列同时使用 DISTINCT。在这种情况下,只有当指定的所有列的组合完全相同时,才会被视为重复并被剔除。

SELECT DISTINCT department, salary
FROM employees;

这个查询返回的是“部门 + 薪水”的唯一组合。

  • 如果同一个部门里有两名员工薪水一样,结果里只显示一行。
  • 如果同一个部门里两名员工薪水不同,或者两名员工薪水相同但部门不同,这两条记录都会被显示出来。

4. 预览:WHERE 条件过滤与 ORDER BY 排序

虽然我们会在后续章节中深入讲解 WHEREORDER BY,但由于它们经常与 SELECT 搭配使用,这里先做一个简单的预览。

4.1 使用 WHERE 过滤数据

WHERE 子句允许你根据特定条件筛选数据,只返回满足条件的行。

预览示例: 仅提取“销售部 (Sales)”员工的名字和姓氏:

SELECT first_name, last_name
FROM employees
WHERE department = 'Sales';

4.2 使用 ORDER BY 排序数据

ORDER BY 子句用于对返回的结果集按一列或多列进行排序。

  • ASC: 升序排列(从小到大,默认值)。
  • DESC: 降序排列(从大到小)。

预览示例: 提取所有员工信息,并按薪水 (salary) 从高到低降序排列:

SELECT *
FROM employees
ORDER BY salary DESC;