ITPub博客

首页 > 数据库 > 数据库开发技术 > 《PostgreSQL 开发指南》第 09 篇 简单查询

《PostgreSQL 开发指南》第 09 篇 简单查询

原创 数据库开发技术 作者:BUAA_dxy 时间:2022-02-18 21:00:01 0 删除 编辑

我们对于数据库中数据的常见操作,简单来说可以称为增删改查(CRUD,Create、Retrieve、Update、Delete)。其中,使用最多,也最复杂的功能当属数据查询。根据 SQL 标准,查询语句使用SELECT关键字表示。

单表查询

我们先从简单查询开始,来看一个示例。

SELECT first_name,
last_name
FROM employees;
first_name |last_name |
-----------|-----------|
Steven |King |
Neena |Kochhar |
Lex |De Haan |
Alexander |Hunold |
Bruce |Ernst |
...

基本上不用解释,我们都能知道以上查询语句将会返回员工表(employees)中的名(first_name)和姓(last_name )。

SELECT后面是要返回的信息,比如字段名或表达式,多个值使用逗号分隔;FROM表示要查询哪个表;分号表示查询语句结束。

SQL 语句不分区大小写,但是通常将关键字(SELECT、FROM等)进行大写,其他内容使用小写,便于阅读。

下面的查询通过一个表达式计算员工的年度薪水:

SELECT first_name,
last_name,
salary * 12 AS annual_income
FROM employees;
first_name |last_name |annual_income|
-----------|-----------|-------------|
Steven |King | 288000.00|
Neena |Kochhar | 204000.00|
Lex |De Haan | 204000.00|
Alexander |Hunold | 108000.00|
Bruce |Ernst | 72000.00|
...

其中,AS 关键字用于为查询的结果指定一个别名,可以省略。

如果想要查询某个表的全部字段,可以一一列出所有的字段名称,也可以使用星号(*)表示:

SELECT *
FROM employees;
employee_id|first_name |last_name |email |phone_number |hire_date |job_id |salary |commission_pct|manager_id|department_id|
-----------|-----------|-----------|--------|------------------|----------|----------|--------|--------------|----------|-------------|
100|Steven |King |SKING |515.123.4567 |2003-06-17|AD_PRES |24000.00| | | 90|
101|Neena |Kochhar |NKOCHHAR|515.123.4568 |2005-09-21|AD_VP |17000.00| | 100| 90|
102|Lex |De Haan |LDEHAAN |515.123.4569 |2001-01-13|AD_VP |17000.00| | 100| 90|
103|Alexander |Hunold |AHUNOLD |590.423.4567 |2006-01-03|IT_PROG | 9000.00| | 102| 60|
104|Bruce |Ernst |BERNST |590.423.4568 |2007-05-21|IT_PROG | 6000.00| | 103| 60|
...

通常,我们只在快速查询时使用星号;在实际项目中,应该避免使用SELECT *,因为应用程序可能并不需要全部的字段,而且表结构可能会发生改变,明确指定的字段名称可以减少不确定性。

无表查询

有的时候,我们可能会遇到这样的查询语句:

SELECT 2 + 3;
?column?|
--------|
5|

也就是省略了FROM子句的查询,这是 PostgreSQL 的扩展语法。这种查询通常用于返回系统信息,或者当作计算器使用。需要注意的是,并非所有的关系数据库都支持这种写法,因此它并不具有可移植性。

消除重复结果

现实生活中,存在许多名字相同的人。在执行数据库查询时,也可能会返回重复的值,例如,以下语句查询员工表中的部门编号:

SELECT department_id 
FROM employees;
department_id
---------------
90
90
90
100
100
100
100
100
100
...
(107 rows)

由于一个部门可以存在多个员工,查询结果中包含了大量重复的数据。如果想要知道员工表中存在多少个不同的部门编号,需要针对以上结果进行去重操作。SQL 提供了消除查询结果重复值的DISTINCT关键字。例如:

SELECT DISTINCT department_id 
FROM employees;
department_id
---------------
70
80
20
10

90
100
110
30
50
40
60
(12 rows)

查询结果只有不重复的 12 条数据。DISTINCT也可以针对多个字段进行去重操作,例如:

SELECT DISTINCT first_name,
last_name
FROM employees;

表示查询姓和名组合不重复的数据。

使用注释

在 PostgreSQL 中,以两个连字符(--)开始,直到这一行结束的内容表示注释:

-- 这是标准 SQL 注释方式
SELECT DISTINCT
first_name
FROM employees;

注释的内容会在语法分析之前替换成空格,因此不会被服务器执行。另外,PostgreSQL 还支持 C 语言风格的注释方法(/* … */)。例如:

SELECT DISTINCT
first_name
/* 这是一个多行注释,
DISTINCT 表示排除重复值
/* 这是一个嵌套的注释 */

*/
FROM employees;

PostgresSQL 中的这种注释支持嵌套。

SELECT ... FROM返回表中的全部数据(DISTINCT基于这些数据再进行处理),如果想要返回满足特定条件的结果,比如某个部门的员工,需要使用 SQL 中的条件过滤,即WHERE子句。当然,这是下一篇的主题。

原文作者:SQL编程思想;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
《SQL编程思想》作者,专注于数据库领域知识的分享。

注册时间:2021-08-26

  • 博文量
    443
  • 访问量
    546977