SQL必知必会——检索数据

1、SELECT语句

SQL语句是由简单的英语单词构成的。这些单词称为关键字,每个SQL语句都是由一个或多个关键字构成的。最经常使用的SQL语句大概就是SELECT语句了。它的用途是从一个或多个表中检索信息。

关键字(keyword)作为SQL组成部分的保留字。关键字不能用作表或列的名字。

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

2、检索单个列

SELECT prod_name
FROM Products;

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

如果你自己试验这个查询,可能会发现显示输出的数据顺序与这里的不同。出现这种情况很正常。如果没有明确排序查询结果(下一课介绍怎样指定顺序)​,则返回的数据没有特定的顺序。返回数据的顺序可能是数据被添加到表中的顺序,也可能不是。只要返回相同数目的行,就是正常的。

请注意,SQL语句不区分大小写,因此SELECT与select是相同的。同样,写成Select也没有关系。许多SQL开发人员喜欢对SQL关键字使用大写,而对列名和表名使用小写,这样做代码更易于阅读和调试。不过,一定要认识到虽然SQL是不区分大小写的,但是表名、列名和值可能有所不同(这有赖于具体的DBMS及其如何配置)​。

3、检索多个列

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

SELECT prod_id, prod_name, prod_price
FROM Products;

这条语句使用SELECT语句从表Products中选择数据。在这个例子中,指定了3个列名,列名之间用逗号分隔。此语句的输出如下:
在这里插入图片描述

SQL语句一般返回原始的、无格式的数据,不同的DBMS和客户端显示数据的方式略有不同(如对齐格式不同、小数位数不同)​。数据的格式化是表示问题,而不是检索问题。因此,如何表示一般会在显示该数据的应用程序中规定。通常很少直接使用实际检索出的数据(没有应用程序提供的格式)​。

4、检索所有列

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

SELECT *
FROM Products;

在这里插入图片描述

如果给定一个通配符(*)​,则返回表中所有列。列的顺序一般是表中出现的物理顺序,但并不总是如此。不过,SQL数据很少直接显示(通常,数据返回给应用程序,根据需要进行格式化,再表示出来)​。因此,这不应该造成什么问题。

5、检索不同的值

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

SELECT vend_id
FROM Products;

在这里插入图片描述

SELECT语句返回9行(即使表中只有3个产品供应商)​,因为Products表中有9种产品。那么如何检索出不同的值?办法就是使用DISTINCT关键字,顾名思义,它指示数据库只返回不同的值。

SELECT DISTINCT vend_id
FROM Products;

在这里插入图片描述

SELECT DISTINCT vend_id告诉DBMS只返回不同(具有唯一性)的vend_id行,所以正如下面的输出,只有3行。如果使用DISTINCT关键字,它必须直接放在列名的前面。

注意:不能部分使用DISTINCT
DISTINCT关键字作用于所有的列,不仅仅是跟在其后的那一列。例如,你指定SELECT DISTINCT vend_id,prod_price,则9行里的6行都会被检索出来,因为指定的两列组合起来有6个不同的结果。

6、限制结果

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

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

SELECT TOP 5 prod_name
FROM Products;

    prod_name
    -----------------
    8 inch teddy bear
    12 inch teddy bear
    18 inch teddy bear
    Fish bean bag toy
    Bird bean bag toy

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

SELECT prod_name
FROM Products
FETCH FIRST 5 ROWS ONLY;

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

SELECT prod_name
FROM Products
WHERE ROWNUM <=5;

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

SELECT prod_name
FROM Products
LIMIT 5;

在这里插入图片描述

上述代码使用SELECT语句来检索单独的一列数据。LIMIT 5指示MySQL等DBMS返回不超过5行的数据。这个语句的输出参见下面的代码。为了得到后面的5行数据,需要指定从哪儿开始以及检索的行数,像这样:

SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;

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

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

注意:第0行:第一个被检索的行是第0行,而不是第1行。因此,LIMIT 1 OFFSET 1会检索第2行,而不是第1行。

MySQL、MariaDB和SQLite捷径:MySQL、MariaDB和SQLite可以把LIMIT 4 OFFSET 3语句简化为LIMIT 3,4。使用这个语法,逗号之前的值对应OFFSET,逗号之后的值对应LIMIT(反着的,要小心)​。

7、使用注释

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

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

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

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

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

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

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

/SELECT prod_name, vend_id
FROM Products;/
SELECT prod_name
FROM Products;

注释从/*开始,到*/结束,/*和*/之间的任何内容都是注释。这种方式常用于把代码注释掉,就如这个例子演示的,这里定义了两个SELECT语句,但是第一个不会执行,因为它已经被注释掉了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值