数据库 \ SQL Server \ SQL SELECT语句

SQL SELECT语句

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

       SQL语句是由简单的英语单词构成的。这些单词称为关键字,每个SQL语句都是由一个或多个关键字构成的。最经常使用的SQL语句大概就是SELECT语句了。它的用途是从一个或多个表中检索信息。为了使用SELECT检索表数据,必须至少给出两条信息——想选择什么,以及从什么地方选择。


检索单个列


SELECT prod_name

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


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上一条SELECT语句将返回表中的所有行。数据没有过滤(过滤将得出结果集的一个子集),也没有排序。


       多条SQL语句必须以分号(;)分隔。多数DBMS不需要在单条SQL语句后加分号,但也有DBMS可能必须在单条SQL语句后加上分号。当然,如果愿意可以总是加上分号。事实上,即使不一定需要,加上分号也肯定没有坏处。另外,SQL语句不区分大小写,因此SELECT与select是相同的。同样,写成Select也没有关系。对SQL关键字使用大写,而对列名和表名使用小写,这样做使代码更易于阅读和调试。不过,一定要认识到虽然SQL是不区分大小写的,但是表名、列名和值可能有所不同(这有赖于具体的DBMS及其如何配置)。


       在处理SQL语句时,其中所有空格都被忽略。SQL语句可以写成长长的一行,也可以分写在多行。下面这三种写法的作用是一样的:


SELECT prod_name

FROM Products;SELECT prod_name FROM Products;SELECT

prod_name

FROM

Products;检索多个列


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


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


prod_id prod_name prod_price

--------- -------------------- ----------

BNBG01 Fish bean bag toy 3.4900

BNBG02 Bird bean bag toy 3.4900

BNBG03 Rabbit bean bag toy 3.4900

BR01 8 inch teddy bear 5.9900

BR02 12 inch teddy bear 8.9900

BR03 18 inch teddy bear 11.9900

RGAN01 Raggedy Ann 4.9900

RYL01 King doll 9.4900

RYL02 Queen dool 9.4900从上述输出可以看到,SQL语句一般返回原始的、无格式的数据。数据的格式化是表示问题,而不是检索问题。因此,表示(如把上面的价格值显示为正确的十进制数值货币金额)一般在显示该数据的应用程序中规定。通常很少直接使用实际检索出的数据(没有应用程序提供的格式)。


检索所有列


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


SELECT *

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


       一般而言,除非你确实需要表中的每一列,否则最好别使用*通配符。虽然使用通配符能让你自己省事,不用明确列出所需列,但检索不需要的列通常会降低检索和应用程序的性能。


检索不同的值


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


SELECT vend_id

FROM Products;输出:


vend_id

----------

BRS01

BRS01

BRS01

DLL01

DLL01

DLL01

DLL01

FNG01

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


SELECT DISTINCT vend_id

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


vend_id

----------

BRS01

DLL01

FNG01DISTINCT关键字作用于所有的列,不仅仅是跟在其后的那一列。例如,你指定SELECT DISTINCT vend_id,prod_price,除非指定的两列完全相同,否则所有的行都会被检索出来。


限制结果


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


是,各种数据库中的这一SQL实现并不相同。


在SQL Server和Access中使用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上面代码使用SELECT TOP 5语句,只检索前5行数据。如果你使用的是DB2,很可能习惯使用下面这一DBMS特定的SQL语句,像这样:


SELECT prod_name

FROM Products

FETCH FIRST 5 ROWS ONLY;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行数据。第一个数字是指从哪儿开始,第二个数字是检索的行数。这个语句的输出是:


prod_name

-------------------

Rabbit bean bag toy

Raggedy Ann

King doll

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


使用注释


SELECT prod_name -- 这是一条注释

FROM Products;注释使用-- (两个连字符)嵌在行内。-- 之后的文本就是注释,例如,这用来描述CREA TE TA BLE语句中的列就很不错。下面是另一种形式的行内注释(虽然这种形式很少得到支持)。


# 这是一条注释

SELECT prod_name

FROM Products;在一行的开始处使用#,这一整行都将作为注释。你在本书提供的脚本create.sql和populate.sql中可以看到这种形式的注释。你也可以进行多行注释,注释可以在脚本的任何位置停止和开始。


/* SELECT prod_name,vend_id

FROM Products; */

SELECT prod_name

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

0人推荐

推荐文章

热门标签

意见反馈 常见问题 官方微信 返回顶部