PostgreSQL 中的数据过滤和简单查询

PostgreSQLBeginner
立即练习

介绍

在这个实验中,你将学习如何在 PostgreSQL 中执行数据过滤和简单查询。你将首先连接到 PostgreSQL 数据库,并创建一个包含数据的示例 employees 表。

然后,本实验将指导你使用 WHERE 子句根据特定条件过滤数据,使用 LIKE 进行模式匹配,使用 ORDER BY 对结果进行排序,以及使用 LIMITOFFSET 限制返回的行数。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 94%。获得了学习者 100% 的好评率。

使用 WHERE 子句过滤数据

在这一步中,我们将学习如何在 PostgreSQL 中使用 WHERE 子句根据特定条件过滤数据。WHERE 子句是一个强大的工具,允许你仅检索满足你条件的行。

在我们开始之前,让我们连接到 PostgreSQL 数据库。在你的 LabEx 虚拟机(VM)中打开一个终端。你可以使用默认的 Xfce 终端。

首先,使用 psql 命令连接到 PostgreSQL 数据库。我们将使用 postgres 用户连接到 postgres 数据库。你可能需要使用 sudo 来执行该命令。

sudo -u postgres psql

现在你应该看到 PostgreSQL 提示符 (postgres=#)。

现在,让我们创建一个名为 employees 的示例表,并将一些数据插入其中。该表将存储员工信息,包括他们的 ID、姓名、部门和薪水。

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50),
    department VARCHAR(50),
    salary INTEGER
);

INSERT INTO employees (name, department, salary) VALUES
('Alice Smith', 'Sales', 60000),
('Bob Johnson', 'Marketing', 75000),
('Charlie Brown', 'Sales', 55000),
('David Lee', 'Engineering', 90000),
('Eve Wilson', 'Marketing', 80000),
('Frank Miller', 'Engineering', 95000);

为了验证表已正确创建和填充,请执行以下 SQL 查询:

SELECT * FROM employees;

你应该看到类似于这样的输出:

 id |     name      | department  | salary
----+-----------------+-------------+--------
  1 | Alice Smith     | Sales       |  60000
  2 | Bob Johnson     | Marketing   |  75000
  3 | Charlie Brown   | Sales       |  55000
  4 | David Lee       | Engineering |  90000
  5 | Eve Wilson      | Marketing   |  80000
  6 | Frank Miller    | Engineering |  95000
(6 rows)

现在,让我们使用 WHERE 子句来过滤数据。假设我们只想检索在 'Sales' 部门工作的员工。我们可以使用以下查询:

SELECT * FROM employees WHERE department = 'Sales';

此查询将仅返回 department 列等于 'Sales' 的行。输出应为:

 id |     name      | department | salary
----+-----------------+------------+--------
  1 | Alice Smith     | Sales      |  60000
  3 | Charlie Brown   | Sales      |  55000
(2 rows)

你还可以在 WHERE 子句中使用其他比较运算符,例如 ><>=<=<>。例如,要检索薪水大于 70000 的员工,你可以使用以下查询:

SELECT * FROM employees WHERE salary > 70000;

输出应为:

 id |     name      | department  | salary
----+-----------------+-------------+--------
  2 | Bob Johnson     | Marketing   |  75000
  4 | David Lee       | Engineering |  90000
  5 | Eve Wilson      | Marketing   |  80000
  6 | Frank Miller    | Engineering |  95000
(4 rows)

你还可以使用逻辑运算符(如 ANDOR)组合多个条件。例如,要检索在 'Sales' 部门工作且薪水大于 58000 的员工,你可以使用以下查询:

SELECT * FROM employees WHERE department = 'Sales' AND salary > 58000;

输出应为:

 id |    name     | department | salary
----+---------------+------------+--------
  1 | Alice Smith | Sales      |  60000
(1 row)
PostgreSQL 过滤的图示

最后,退出 psql shell:

\q

这将使你返回到 labex 用户的终端。

使用 LIKE 进行模式匹配

在这一步中,我们将学习如何在 PostgreSQL 中使用 LIKE 运算符进行模式匹配。LIKE 运算符允许你搜索与特定模式匹配的数据,这在你不知道你要查找的确切值时特别有用。

首先,让我们连接到 PostgreSQL 数据库。在你的 LabEx 虚拟机(VM)中打开一个终端。

使用 psql 命令连接到 PostgreSQL 数据库:

sudo -u postgres psql

现在你应该看到 PostgreSQL 提示符 (postgres=#)。

我们将继续使用在上一步中创建的 employees 表。如果你尚未创建它,请参考上一步来创建表并插入数据。

让我们回顾一下 employees 表中的数据:

SELECT * FROM employees;

你应该像之前一样看到员工数据。

LIKE 运算符在 WHERE 子句中使用,以查找与指定模式匹配的行。该模式可以包括通配符:

  • %:表示零个或多个字符。
  • _:表示单个字符。

例如,要查找所有名字以 'A' 开头的员工,你可以使用以下查询:

SELECT * FROM employees WHERE name LIKE 'A%';

此查询将返回 name 列以 'A' 开头的所有行。输出应为:

 id |    name     | department | salary
----+---------------+------------+--------
  1 | Alice Smith | Sales      |  60000
(1 row)

要查找所有名字包含字母 'o' 的员工,你可以使用以下查询:

SELECT * FROM employees WHERE name LIKE '%o%';

此查询将返回 name 列包含字母 'o' 的所有行。输出应为:

 id |     name      | department  | salary
----+-----------------+-------------+--------
  2 | Bob Johnson     | Marketing   |  75000
  3 | Charlie Brown   | Sales       |  55000
  5 | Eve Wilson      | Marketing   |  80000
(3 rows)

要查找所有名字以 'n' 结尾的员工,你可以使用以下查询:

SELECT * FROM employees WHERE name LIKE '%n';

此查询将返回 name 列以 'n' 结尾的所有行。输出应为:

 id |     name      | department | salary
----+---------------+------------+--------
  2 | Bob Johnson   | Marketing  |  75000
  3 | Charlie Brown | Sales      |  55000
  5 | Eve Wilson    | Marketing  |  80000
(3 rows)

你还可以使用 _ 通配符来匹配单个字符。例如,要查找所有名字的第二个和第三个字符为 'e ' 的员工,你可以使用以下查询:

SELECT * FROM employees WHERE name LIKE '_e%';

此查询将返回 name 列的第二个字符为 'e' 的所有行。输出应为:

 id | name | department | salary
----+------+------------+--------
(0 rows)

LIKE 运算符区分大小写。如果你想执行不区分大小写的搜索,你可以使用 ILIKE 运算符。例如:

SELECT * FROM employees WHERE name ILIKE 'a%';

此查询将返回 name 列以 'a' 或 'A' 开头的所有行。

LIKE 运算符用法的图示

最后,退出 psql shell:

\q

这将使你返回到 labex 用户的终端。

使用 ORDER BY 排序数据

在这一步中,我们将学习如何在 PostgreSQL 中使用 ORDER BY 子句来排序数据。ORDER BY 子句允许你基于一个或多个列对查询的结果集进行排序,可以按升序或降序排列。

首先,让我们连接到 PostgreSQL 数据库。在你的 LabEx 虚拟机(VM)中打开一个终端。

使用 psql 命令连接到 PostgreSQL 数据库:

sudo -u postgres psql

现在你应该看到 PostgreSQL 提示符 (postgres=#)。

我们将继续使用在前几步中创建的 employees 表。如果你尚未创建它,请参考前几步来创建表并插入数据。

让我们回顾一下 employees 表中的数据:

SELECT * FROM employees;

你应该像之前一样看到员工数据。

ORDER BY 子句用于对查询的结果集进行排序。默认情况下,ORDER BY 子句按升序对数据进行排序。

例如,要按薪水升序对员工进行排序,你可以使用以下查询:

SELECT * FROM employees ORDER BY salary;

此查询将返回 employees 表中的所有行,并按 salary 列升序排序。输出应为:

 id |     name      | department  | salary
----+-----------------+-------------+--------
  3 | Charlie Brown   | Sales       |  55000
  1 | Alice Smith     | Sales       |  60000
  2 | Bob Johnson     | Marketing   |  75000
  5 | Eve Wilson      | Marketing   |  80000
  4 | David Lee       | Engineering |  90000
  6 | Frank Miller    | Engineering |  95000
(6 rows)

要按降序对数据进行排序,你可以在列名后使用 DESC 关键字。例如,要按薪水降序对员工进行排序,你可以使用以下查询:

SELECT * FROM employees ORDER BY salary DESC;

此查询将返回 employees 表中的所有行,并按 salary 列降序排序。输出应为:

 id |     name      | department  | salary
----+-----------------+-------------+--------
  6 | Frank Miller    | Engineering |  95000
  4 | David Lee       | Engineering |  90000
  5 | Eve Wilson      | Marketing   |  80000
  2 | Bob Johnson     | Marketing   |  75000
  1 | Alice Smith     | Sales       |  60000
  3 | Charlie Brown   | Sales       |  55000
(6 rows)

你还可以按多个列对数据进行排序。例如,要按部门升序排序,然后按薪水降序排序,你可以使用以下查询:

SELECT * FROM employees ORDER BY department ASC, salary DESC;

此查询将首先按 department 列升序对数据进行排序。在每个部门内,数据将按 salary 列降序排序。输出应为:

 id |     name      | department  | salary
----+---------------+-------------+--------
  6 | Frank Miller  | Engineering |  95000
  4 | David Lee     | Engineering |  90000
  5 | Eve Wilson    | Marketing   |  80000
  2 | Bob Johnson   | Marketing   |  75000
  1 | Alice Smith   | Sales       |  60000
  3 | Charlie Brown | Sales       |  55000
(6 rows)
PostgreSQL 中排序数据的图示

最后,退出 psql shell:

\q

这将使你返回到 labex 用户的终端。

使用 LIMIT 和 OFFSET 限制结果数量

在这一步中,我们将学习如何在 PostgreSQL 中使用 LIMITOFFSET 子句,分别用于限制查询返回的行数和跳过一定数量的行。这些子句对于实现分页或检索数据的特定子集非常有用。

首先,让我们连接到 PostgreSQL 数据库。在你的 LabEx 虚拟机(VM)中打开一个终端。

使用 psql 命令连接到 PostgreSQL 数据库:

sudo -u postgres psql

现在你应该看到 PostgreSQL 提示符 (postgres=#)。

我们将继续使用在前几步中创建的 employees 表。如果你尚未创建它,请参考前几步来创建表并插入数据。

让我们回顾一下 employees 表中的数据:

SELECT * FROM employees;

你应该像之前一样看到员工数据。

LIMIT 子句用于限制查询返回的行数。例如,要仅检索前 3 位员工,你可以使用以下查询:

SELECT * FROM employees LIMIT 3;

此查询将返回 employees 表中的前 3 行。输出应为:

 id |     name      | department  | salary
----+-----------------+-------------+--------
  1 | Alice Smith     | Sales       |  60000
  2 | Bob Johnson     | Marketing   |  75000
  3 | Charlie Brown   | Sales       |  55000
(3 rows)

OFFSET 子句用于在开始返回行之前跳过一定数量的行。它通常与 LIMIT 子句结合使用以实现分页。例如,要在跳过前 2 位员工后检索接下来的 3 位员工,你可以使用以下查询:

SELECT * FROM employees LIMIT 3 OFFSET 2;

此查询将跳过前 2 行,然后返回 employees 表中的接下来的 3 行。输出应为:

 id |     name      | department  | salary
----+-----------------+-------------+--------
  3 | Charlie Brown   | Sales       |  55000
  4 | David Lee       | Engineering |  90000
  5 | Eve Wilson      | Marketing   |  80000
(3 rows)

你还可以将 LIMITOFFSETORDER BY 子句结合使用。例如,要检索薪水最高的 2 位员工,你可以使用以下查询:

SELECT * FROM employees ORDER BY salary DESC LIMIT 2;

此查询将首先按薪水降序对员工进行排序,然后返回前 2 行。输出应为:

 id |     name      | department  | salary
----+-----------------+-------------+--------
  6 | Frank Miller    | Engineering |  95000
  4 | David Lee       | Engineering |  90000
(2 rows)

要检索薪水第 3 和第 4 高的员工,你可以使用以下查询:

SELECT * FROM employees ORDER BY salary DESC LIMIT 2 OFFSET 2;

此查询将首先按薪水降序对员工进行排序,跳过前 2 行,然后返回接下来的 2 行。输出应为:

 id |     name      | department  | salary
----+-----------------+-------------+--------
  5 | Eve Wilson      | Marketing   |  80000
  2 | Bob Johnson     | Marketing   |  75000
(2 rows)
LIMIT 和 OFFSET 的图示

最后,退出 psql shell:

\q

这将使你返回到 labex 用户的终端。

总结

在这个实验中,我们首先使用 psql 命令连接到 PostgreSQL 数据库,并创建了一个示例 employees 表,其中包含 ID、姓名、部门和薪水等列。然后,我们用员工数据填充了该表,并使用 SELECT 查询验证了其内容。

最初的重点是使用 WHERE 子句根据特定条件过滤数据。这允许仅检索满足已定义条件的行,从而能够从 employees 表中进行有针对性的数据检索。