如何使用 SQL SELECT 从表中检索一个或多个数据列

本文介绍了如何使用 SQL 的 SELECT 语句来检索单个表列、多个表列以及所有表列。也介绍了如何返回不同的值以及如何注释代码。

一、SELECT 语句

正如 学习 SQL 之前需要了解的基础知识 所述,SQL 语句是由简单的英语单词构成的。这些单词称为关键字,每个 SQL 语句都是由一个或多个关键字构成的。

最经常使用的 SQL 语句大概就是 SELECT 语句了。它的用途是从一个或多个表中检索数据。

为了使用 SELECT 检索数据库表中的数据,必须至少给出两条信息——想选择什么,以及从什么地方选择。

二、检索单个列

我们将从简单的 SQL SELECT 语句讲起,此语句如下所示:

1
2
SELECT prod_name
FROM Products;

上述语句利用 SELECT 语句从 Products 表中检索一个名为 prod_name 的列。所需的列名写在 SELECT 关键字之后,FROM 关键字指出从哪个表中检索数据。此语句的输出如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
prod_name
-------------------
Fish bean bag toy
Bird bean bag toy
Rabbit bean bag toy
8 inch teddy bear
12 inch teddy bear
18 inch teddy bear
Raggedy Ann
King doll
Queen doll

根据你使用的具体 DBMS 和客户端,可能你会看到一条信息说明检索了多少行,以及花了多长时间。例如,MySQL 命令行会显示类似下面这样的一行信息:

1
9 rows in set (0.01 sec)

如上的一条简单 SELECT 语句将返回表中的所有行。数据没有过滤(过滤将得出结果集的一个子集),也没有排序。

三、检索多个列

要想从一个表中检索多个列,仍然使用相同的 SELECT 语句。唯一的不同是必须在 SELECT 关键字后给出多个列名,列名之间必须以逗号分隔。

下面的 SELECT 语句从 Products 表中选择 3 列。

1
2
SELECT prod_id, prod_name, prod_price
FROM Products;

与前一个例子一样,这条语句使用 SELECT 语句从表 Products 中选择数据。在这个例子中,指定了 3 个列名,列名之间用逗号分隔。此语句的输出如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
prod_id       prod_name                prod_price
---------     --------------------     ----------
BNBG01        Fish bean bag toy        3.49
BNBG02        Bird bean bag toy        3.49
BNBG03        Rabbit bean bag toy      3.49
BR01          8 inch teddy bear        5.99
BR02          12 inch teddy bear       8.99
BR03          18 inch teddy bear      11.99
RGAN01        Raggedy Ann              4.99
RYL01         King doll                9.49
RYL02         Queen dool               9.49

四、检索所有列

除了指定所需的列外(如上所述,一列或多列),SELECT 语句还可以检索所有的列而不必逐个列出它们。在实际列名的位置使用星号(*)通配符可以做到这点,如下所示。

1
2
SELECT *
FROM Products;

如果给定一个通配符(*),则返回表中所有列。列的顺序一般是表中出现的物理顺序,但并不总是如此。

不过,SQL 数据很少直接显示(通常,数据返回给应用程序,根据需要进行格式化,再表示出来)。因此,这不应该造成什么问题。

五、检索不同的值

如前所述,SELECT 语句返回所有匹配的行。但是,如果你不希望每个值每次都出现,该怎么办呢?例如,你想检索 Products 表中所有产品供应商的 ID

1
2
SELECT vend_id
FROM Products;

输出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
vend_id
----------
BRS01
BRS01
BRS01
DLL01
DLL01
DLL01
DLL01
FNG01
FNG01

SELECT 语句返回 9 行(即使表中只有 3 个产品供应商),因为 Products 表中有 9 种产品。那么如何检索出不同的值?

办法就是使用 DISTINCT 关键字,顾名思义,它指示数据库只返回不同的值。

输入:

1
2
SELECT DISTINCT vend_id
FROM Products;

SELECT DISTINCT vend_id 告诉 DBMS 只返回不同(具有唯一性)的 vend_id 行,所以正如下面的输出,只有 3 行。

如果使用 DISTINCT 关键字,它必须直接放在列名的前面。

输出:

1
2
3
4
5
vend_id
----------
BRS01
DLL01
FNG01

六、限制结果

SELECT 语句返回指定表中所有匹配的行,很可能是每一行。如果你只想返回第一行或者一定数量的行,该怎么办呢?这是可行的,然而遗憾的是,各种数据库中的这一 SQL 实现并不相同。

在 SQL Server 中使用 SELECT 时,可以用 TOP 关键字来限制最多返回多少行,如下所示:

1
2
SELECT TOP 5 prod_name
FROM Products;

输出:

1
2
3
4
5
6
7
prod_name
-----------------
8 inch teddy bear
12 inch teddy bear
18 inch teddy bear
Fish bean bag toy
Bird bean bag toy

上面代码使用 SELECT TOP 5 语句,只检索前 5 行数据。

如果你使用的是 DB2,就得使用下面这样的 DB2 特有的 SQL 语句:

1
2
3
SELECT prod_name
FROM Products
FETCH FIRST 5 ROWS ONLY;

FETCH FIRST 5 ROWS ONLY 就会按字面的意思去做的(只取前 5 行)。

如果你使用 Oracle,需要基于 ROWNUM(行计数器)来计算行,像这样:

1
2
3
SELECT prod_name
FROM Products
WHERE ROWNUM <=5;

如果你使用 MySQL、MariaDB、PostgreSQL 或者 SQLite,需要使用 LIMIT 子句,像这样:

1
2
3
SELECT prod_name
FROM Products
LIMIT 5;

上述代码使用 SELECT 语句来检索单独的一列数据。LIMIT 5 指示 MySQL 等 DBMS 返回不超过 5 行的数据。这个语句的输出参见下面的代码。

为了得到后面的 5 行数据,需要指定从哪儿开始以及检索的行数,像这样:

1
2
3
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;

LIMIT 5 OFFSET 5 指示 MySQL 等 DBMS 返回从第 5 行起的 5 行数据。第一个数字是检索的行数,第二个数字是指从哪儿开始。这个语句的输出是:

1
2
3
4
5
6
prod_name
-------------------
Rabbit bean bag toy
Raggedy Ann
King doll
Queen doll

所以,LIMIT 指定返回的行数。LIMIT 带的 OFFSET 指定从哪儿开始。在我们的例子中,Products 表中只有 9 种产品,所以 LIMIT 5 OFFSET 5 只返回了 4 行数据(因为没有第 5 行)。

七、使用注释

可以看到,SQL 语句是由 DBMS 处理的指令。如果你希望包括不进行处理和执行的文本,该怎么办呢?为什么你想要这么做呢?原因有以下几点。

  • 我们这里使用的 SQL 语句都很短,也很简单。然而,随着 SQL 语句变长,复杂性增加,你就会想添加一些描述性的注释,这便于你自己今后参考,或者供项目后续参与人员参考。

    这些注释需要嵌入在 SQL 脚本中,但显然不能进行实际的 DBMS 处理。(相关示例可以参见 学习 SQL 所用到的样例表脚本 中使用的 create.sql 和 populate.sql。)

  • 这同样适用于 SQL 文件开始处的内容,它可能包含程序描述以及一些说明,甚至是程序员的联系方式。(相关示例也可参见 学习 SQL 所用到的样例表脚本 中的那些.sql 文件。)

  • 注释的另一个重要应用是暂停要执行的 SQL 代码。如果你碰到一个长 SQL 语句,而只想测试它的一部分,那么应该注释掉一些代码,以便 DBMS 略去这些注释。

很多 DBMS 都支持各种形式的注释语法。我们先来看行内注释:

1
2
SELECT prod_name    -- 这是一条注释
FROM Products;

注释使用 -- (两个连字符)嵌在行内。-- 之后的文本就是注释,例如,这用来描述 CREATE TABLE 语句中的列就很不错。

下面是另一种形式的行内注释(但这种形式有些 DBMS 不支持)。

1
2
3
# 这是一条注释
SELECT prod_name
FROM Products;

在一行的开始处使用 #,这一整行都将作为注释。你在 学习 SQL 所用到的样例表脚本 提供的脚本 create.sql 和 populate.sql 中可以看到这种形式的注释。

你也可以进行多行注释,注释可以在脚本的任何位置停止和开始。

1
2
3
4
/* SELECT prod_name, vend_id
FROM Products; */
SELECT prod_name
FROM Products;

注释从 /* 开始,到 */ 结束,/**/ 之间的任何内容都是注释。

这种方式常用于把代码注释掉,就如这个例子演示的,这里定义了两个 SELECT 语句,但是第一个不会执行,因为它已经被注释掉了。

八、小结

本文介绍了如何使用 SQL 的 SELECT 语句来检索单个表列、多个表列以及所有表列。也介绍了如何返回不同的值,如何注释代码。

同时不好的消息是,复杂的 SQL 语句往往不够通用。

如何使用 ORDER BY 根据需要排序检索出的数据 介绍如何使用 SELECT 语句的 ORDER BY 子句,对检索出的数据进行排序

(完)