PostgreSQL

PostgreSQL 知识量:10 - 51 - 182

5.1 单表查询><

SELECT语法- 5.1.1 -

PostgreSQL的SELECT语法用于从数据库中检索数据。以下是SELECT语句的基本结构:

SELECT 列1, 列2, ...  
FROM 表名  
WHERE 条件;

其中:

  • SELECT 关键字用于指定要检索的列。可以选择一个或多个列,用逗号分隔。

  • FROM 关键字用于指定要从中检索数据的表。

  • WHERE 子句用于指定筛选条件,以过滤结果集。条件是可选的,如果没有提供条件,将返回表中的所有行。

简单查询- 5.1.2 -

可以使用 SQL 查询来检索单表中的数据。以下是一个简单的例子:

假设有一个名为 employees 的表,该表有 id, name, age, 和 salary 列。

1. 查询所有列:

SELECT * FROM employees;

这将返回表中的所有行和所有列。

2. 查询特定列:

如果只想查询特定的列,例如 name 和 age,可以这样写:

SELECT name, age FROM employees;

等值查询- 5.1.3 -

可以使用等值查询来检索特定字段与给定值匹配的记录。以下是针对数值型字段和字符型字段的等值查询的示例:

1. 数值型字段等值查询:
假设有一个名为 employees 的表,其中包含一个数值型字段 salary。可以使用等值查询来检索 salary 字段等于特定值的记录。

SELECT * FROM employees WHERE salary = 5000;

上述查询将返回 salary 字段值为 5000 的所有员工记录。

2. 字符型字段等值查询:
假设 employees 表还包含一个名为 name 的字符型字段。可以使用等值查询来检索 name 字段等于特定值的记录。

SELECT * FROM employees WHERE name = 'John Doe';

上述查询将返回 name 字段值为 'John Doe' 的所有员工记录。

范围查询- 5.1.4 -

在 PostgreSQL 中,可以使用范围查询来检索特定字段在指定范围内的记录。以下是范围查询的示例:

假设有一个名为 employees 的表,其中包含一个数值型字段 salary。可以使用范围查询来检索 salary 字段在特定范围内的记录。

SELECT * FROM employees WHERE salary BETWEEN 3000 AND 5000;

上述查询将返回 salary 字段值在 3000 和 5000 之间的所有员工记录。

还可以使用范围查询来检索字符型字段的记录。假设 employees 表还包含一个名为 name 的字符型字段。可以使用范围查询来检索 name 字段在特定范围内的记录,如下所示:

SELECT * FROM employees WHERE name BETWEEN 'A%' AND 'C%';

上述查询将返回 name 字段值以字母 A 开头并且以字母 C 开头之间的所有员工记录。

去重- 5.1.5 -

在 PostgreSQL 中,可以使用 DISTINCT 关键字来执行去重查询。DISTINCT 用于返回唯一的行,避免重复记录的出现。

以下是使用 DISTINCT 关键字进行去重查询的示例:

假设有一个名为 employees 的表,其中包含一个名为 department 的列。可以使用以下查询来检索不同的部门:

SELECT DISTINCT department FROM employees;

上述查询将返回 department 列中的唯一值,去除重复的部门记录。

如果想要在查询结果中包含其他列,可以将它们与 DISTINCT 关键字一起列出,如下所示:

SELECT DISTINCT department, name FROM employees;

上述查询将返回 department 和 name 列中的唯一组合,去除重复的记录。

需要注意的是,DISTINCT 关键字适用于所有列的组合,而不是单个列。如果只想在特定列上去重,可以只选择该列。

排序- 5.1.6 -

可以使用 ORDER BY 子句对查询结果进行排序。ORDER BY 子句允许根据一个或多个列对结果集进行升序(ASC)或降序(DESC)排序。

以下是使用 ORDER BY 子句对查询结果进行排序的示例:

假设有一个名为 employees 的表,其中包含 name 和 salary 列。可以使用以下查询按薪水升序排列员工记录:

SELECT * FROM employees ORDER BY salary ASC;

上述查询将返回所有员工记录,并根据薪水列进行升序排序。

如果想按降序排列,只需将 DESC 关键字添加到 ORDER BY 子句中,如下所示:

SELECT * FROM employees ORDER BY salary DESC;

上述查询将返回所有员工记录,并根据薪水列进行降序排序。

还可以根据多个列对结果进行排序。例如,如果想首先按薪水降序排列,然后按名字升序排列,可以这样写:

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

上述查询将首先根据薪水列进行降序排序,然后在薪水相同的情况下根据名字列进行升序排序。

需要注意的是,ORDER BY 子句在查询中指定了排序的优先级。如果在查询中使用了多个 ORDER BY 子句,那么第一个子句的排序优先级最高,第二个子句的排序优先级次之,依此类推。因此,在上述示例中,薪水的降序排列优先于名字的升序排列。

分组- 5.1.7 -

可以使用 GROUP BY 子句对查询结果进行分组。GROUP BY 子句用于将结果集按照一个或多个列进行分组,以便可以对每个组进行聚合操作,如计数、求和、平均等。

以下是使用 GROUP BY 子句对查询结果进行分组的示例:

假设有一个名为 employees 的表,其中包含 department 和 salary 列。可以使用以下查询按部门分组,并计算每个部门的平均薪水:

SELECT department, AVG(salary) AS average_salary    
FROM employees    
GROUP BY department;

上述查询将返回每个部门以及对应的平均薪水。GROUP BY 子句根据 department 列对结果进行分组,然后使用 AVG 聚合函数计算每个组的平均薪水。

还可以根据多个列进行分组。例如,如果想同时按部门和薪水等级分组,可以这样写:

SELECT department, salary_grade, COUNT(*) AS count    
FROM employees    
GROUP BY department, salary_grade;

上述查询将返回每个部门和薪水等级的组合,以及每个组合中的记录数。GROUP BY 子句根据 department 和 salary_grade 列对结果进行分组,然后使用 COUNT 聚合函数计算每个组的记录数。

需要注意的是,在 GROUP BY 子句中列出的列必须是查询结果中的列或者是聚合函数的参数。如果在查询结果中使用了未包含在 GROUP BY 子句中的列,那么该查询将引发错误。因此,在使用 GROUP BY 子句时,要确保正确地指定了分组依据的列。

分页- 5.1.8 -

在 PostgreSQL 中,可以使用 LIMIT 和 OFFSET 子句对查询结果进行分页。这样可以有效地从大量数据中获取特定范围的结果,提高查询性能和效率。

以下是使用 LIMIT 和 OFFSET 进行分页的示例:

假设有一个名为 employees 的表,并且想要获取第 2 页的数据,每页包含 10 条记录。可以使用以下查询:

SELECT * FROM employees    
LIMIT 10 OFFSET 10;

上述查询将跳过前 10 条记录,并返回接下来的 10 条记录。这样,就可以获取第 2 页的数据。

可以根据需要调整 LIMIT 和 OFFSET 的值来获取不同页数的数据。需要注意的是,LIMIT 子句指定返回的记录数,而 OFFSET 子句指定从结果集中的哪个位置开始返回记录。

另外,如果使用的是 PostgreSQL 8.4 或更高版本,还可以使用 FETCH 和 OFFSET 的组合来实现相同的效果:

SELECT * FROM employees    
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

上述查询与之前的查询具有相同的效果,但使用了更现代的语法。