所谓查询就是让数据库服务器根据客户端的要求搜寻出用户所需要的信息资料,并按用户规定的格式进行整理后返回给客户端。查询语句SELECT在任何一种 SQL语言中,都是使用频率最高的语句。可以说SELECT语句是SQL语言的灵魂。SELECT语句具有强大的查询功能,有的用户甚至只需要熟练掌握 SELECT语句的一部分,就可以轻松地利用数据库来完成自己的工作。
本章将主要介绍一下SELECT语句的基本结构,以及一些简单的查询操作。
4.1 SELECT语句的结构与执行
SELECT语句由一系列灵活的子句组成,这些子句共同确定检索哪些数据。用户使用SELECT语句除可以查看普通数据库中的表格和视图的信息外,还可以查看SQL Server的系统信息。在介绍SELECT语句的使用之前,有必要对SELECT语句的基本语法结构及执行过程作一下介绍。
4.1.1 SELECT语句的语法结构
虽然SELECT语句的完整语法较复杂,但其主要子句可归纳如下:
SELECT select_list
[ INTO new_table]
FROM table_source
[ WHERE search_condition]
[ GROUP BY group_by_expression]
[ HAVING search_condition]
[ ORDER BY order_expression [ ASC|DESC ] ]
必需的子句只有SELECT子句和FROM子句,其他的子句都是可选的。各子句具体含义如下:
— SELECT子句:指定由查询返回的列。
— INTO子句:将检索结果存储到新表或视图中。
— FROM子句:用于指定引用的列所在的表或视图。如果对象不止一个,那么它们之间必须用逗号分开。
— WHERE子句:指定用于限制返回的行的搜索条件。如果SELECT语句没有WHERE子句,DBMS假设目标表中的所有行都满足搜索条件。
— GROUP BY子句:指定用来放置输出行的组,并且如果SELECT子句<select list>中包含聚合函数,则计算每组的汇总值。
— HAVING子句:指定组或聚合的搜索条件。HAVING通常与GROUP BY子句一起使用。如果不使用GROUP BY子句,HAVING的行为与WHERE子句一样。
— ORDER BY子句:指定结果集的排序。ASC关键字表示升序排列结果,DESC关键字表示降序排列结果。如果没有指定任何一个关键字,那么ASC就是默认的关键字。如果没有ORDER BY子句,DBMS将根据输入表中的数据的存放位置来显示数据。
4.1.2 SELECT各子句的顺序及功能
SELECT语句中的子句顺序非常重要。可以省略可选子句,但这些子句在使用时必须按适当的顺序出现。它们在SELECT查询语句中的排列顺序及主要作用如表4.1所示。
表4.1 SELECT查询语句各子句的顺序及作用
顺序序号 |
子句关键词 |
子句功能 |
1 |
SELECT |
从指定表中取出指定列的数据 |
2 |
FROM |
指定要查询操作的表 |
3 |
WHERE |
用来规定一种选择查询的标准 |
4 |
GROUP BY |
对结果集进行分组,常与聚合函数一起使用 |
5 |
HAVING |
返回选取的结果集中行的数目 |
6 |
ORDER BY |
指定分组的搜寻条件 |
如果在同一个SELECT查询语句中,用到了表4.1中所示的一些查询子句,则各查询子句的排列就依照它们的顺序序号由低到高的顺序。
4.1.3 SELECT语句各子句的执行
为了让DBMS显示表中的值,最简单的就是执行带有FROM子句的SELECT语句即可。而在实践中,几乎所有的SELECT语句都包括强制输出数据满足某种标准的WHERE子句;另外,许多SELECT语句涉及从多个表中选择列的问题。
当执行SELECT语句时,DBMS的执行步骤可表示如下:
首先执行FROM子句,组装来自不同数据源的数据,即根据FROM子句中的一个或多个表创建工作表。如果在FROM子句中有两个或多个表,DBMS将执行CROSS JOIN运算对表进行交叉连接,作为工作表。
如果有WHERE子句,实现基于指定的条件对记录行进行筛选,即DBMS将WHERE子句列出的搜索条件作用于第步中生成的工作表。DBMS将保留那些满足搜索条件的行,删除那些不满足搜索条件的行。
如果有GROUP BY子句,它将把数据划分为多个分组。DBMS将第步生成的结果表中的行分成多个组,每个组中所有行的group_by_expression字段具有相同的值。接着,DBMS将每组减少到单行,而后将其添加到新的结果表中,用以代替第步的工作表。
★ 注意 ★
DBMS将NULL值看作是相等的,而且把所有NULL值都放入其自己的组中。
如果有HAVING子句,它将筛选分组。DBMS将HAVING子句列出的搜索条件作用于第步生成的“组合”表中的每一行。DBMS将保留那些满足搜索条件的行,删除那些不满足搜索条件的行。
将SELECT子句作用于结果表。删除结果表中不包含在select_list中的列。如果SELECT子句包含DISTINCT关键字,DBMS将从结果中删除重复的行。
如果有ORDER BY子句,则按指定的排序规则对结果进行排序。
对于交互式的SELECT语句,在屏幕上显示结果,对于嵌入式SQL,使用游标将结果传递给宿主程序中。
以上就是SELECT语句的基本执行过程。对于初学者来讲,可能很难理解。之所以在这里就提出,是为了让读者对SELECT语句有一个整体的了解。下面就开始从简单的查询开始,详细讲解SELECT查询语句的具体使用。