SELECT 语句基本语法简介

  从 SQL Server 数据库中提取所需的数据,这是用户日常的重要操作。

  SELECT语句是 T-SQL 中最重要的查询语句。SELECT 语句可能返回一行记录(record),也可能返回一个结果集(result set)。

  SELECT语句可以包含多个子句,从而构成复杂的查询。常用的基本子句有以下几个:

1. SELECT 子句,定义返回哪些列。

2. FROM 子句,定义查询哪些表。

3. WHERE 子句,使用谓词对行进行过滤。

4. GROUP BY 子句,对行进行分组。

5. HAVING 子句,使用谓词对分组后的行进行过滤。

6. ORDER BY 子句,对输出进行排序。


一、SELECT 子句

1. 语法解释

  SELECT 子句与其它子句(至少包含 FROM 子句)组成一个查询,SELECT 子句用于筛选需要输出的列或者表达式。最多可以返回4096列,列名(或表达式)之间用逗号分隔。

(1)返回指定的列

  例如,从 table1 表中仅返回 ColumnA、ColumnB 列的结果:

SELECT ColumnA, ColumnB  FROM table1


(2)使用通配符,返回所有的列

  例如,从 table1 表中返回所有结果:

SELECT *  FROM table1


(3)使用表达式

  可以使用表达式,例如,返回 ColumnA 与ColumnB 列之和。

SELECT ColumnA + ColumnB FROM table1


(4)使用别名

  返回的列可以使用别名,例如:

SELECT ColumnA + ColumnB AS ColumnAB  FROM table1


2. 参数

  还可以选用以下两组参数来过滤返回的记录行。

(1) ALL 或 DISTINCT

  ALL 用于指定在结果集中返回所有行,因此可以包含重复行。两者只能任选其一,ALL 是默认值。

  DISTINCT 用于指定在结果集中删除重复的数据,对于重复的记录行,返回的结果只能包含唯一行。

注意:由于 Null 不能进行相互比较,所以对于 DISTINCT 来说,Null 值是相等的。


(2) TOP

  TOP用于指示从查询结果集返回指定数目的行。


3. 其它事项

  SELECT 子句可以直接列出常量、变量或者算术表达式,从而返回一个运算结果。

  例如,下面的语句返回整数值为14。

SELECT 7 * LOG(20 + 80 , 10)



二、FROM 子句

1. 语法解释

  FROM子句用于指定SELECT语句中使用的表源。

(1)表源

  表源可以是一个或多个表、视图、表变量、派生表、联接表等,一个SELECT语句中最多可以使用256个表源。如果引用了太多的表源,查询性能会受到影响。

  表源在FROM子句中的顺序不影响返回的结果集。


(2)别名

  如果多次引用同一个表源,此时将出现重复的名称,SQL Server 会报错,例如:“FROM 子句中的对象 "table1" 和 "table1" 具有相同的表现名称。请使用相关名称来区分它们。”

  此时,可以为表源使用别名。示例:

SELECT * FROM table1, table1 as t1


2. 参数

  为了提升查询性能,可以使用优化器提示,用于指定查询优化器对此表和此语句使用优化或锁定策略。例如,放置一个显式共享表锁,并且该锁将在整个事务中被持有。示例:

SELECT * FROM table1 WITH (TABLOCK, HOLDLOCK)



三、WHERE 子句

1. 语法解释

  WHERE 子句用于指定行的搜索条件,从而限制 SELECT 语句返回的行数。


2. 参数

  搜索条件可以是 AND、OR 和 NOT 的一个或多个谓词的组合。可以使用括号来指定其组合的顺序。例如:

SELECT * FROM table1 WHERE ( ColumnA = 'ABCD' OR ColumnB = 'EFGH' )  AND ColumnC > 0


其中:

  AND 用于组合两个条件,并在两个条件都为 TRUE 时取值为 TRUE。

  OR 用于组合两个条件,并在任何一个条件为 TRUE 时取值为 TRUE。

  NOT 对谓词指定的布尔表达式求反。

  谓词是指返回 TRUE、FALSE 或 UNKNOWN 的表达式。



四、GROUP BY 子句

1. 语法解释

  GROUP BY 子句用于将一个或多个列(或表达式)按照某一组选定行进行组合,然后针对每一组返回一行。例如:

SELECT ColumnA, ColumnB FROM T GROUP BY ColumnA, ColumnB


2. 其它事项

  执行任何分组操作之前,不满足 WHERE 子句中条件的行将被删除。执行分组之后,不满足 HAVING 子句中条件的行将被删除。
  如果组合列包含 Null 值,则所有的 Null 值都将被视为相等,并会置入一个组中。



五、HAVING 子句

1. 语法解释

  HAVING 子句用于指定组或聚合的搜索条件。HAVING 只能与 SELECT 语句一起使用。例如:

SELECT ColumnA, ColumnB, SUM(ColumnC) AS SubTotal FROM T

WHERE ColumnC > 100

GROUP BY ColumnA, ColumnB

HAVING COUNT(*) > 1

  从上例中可以看出,WHERE 子句对单个行进行筛选(上例中,筛选条件为 ColumnC > 100),最后 HAVING 子句再次对分组后的结果进行筛选(上例中,筛选条件为:COUNT(*) > 1,即分组后的结果中行数大于1的组)。

  由于 HAVING 子句是在行分组后被处理,所以可以在 HAVING 子句中的表达式中使用聚合函数等。例如:

SELECT ColumnA, SUM(ColumnB) AS SubTotal FROM T

GROUP BY ColumnA

HAVING SUM(ColumnB) > 100


2. 其它事项

  HAVING 通常在 GROUP BY 子句中使用。 如果不使用 GROUP BY 子句,则 HAVING 的行为与 WHERE 子句一样。

  在 HAVING 子句中不能使用 text、image 和 ntext 数据类型。


六、ORDER BY 子句

1. 语法解释

  ORDER BY 子句用于指定在 SELECT 语句返回的列中所使用的排序顺序。在处理 SELECT 语句时,ORDER BY 子句是被最后处理的子句,因此可以在 ORDER BY 子句中引用 SELECT 子句中的列别名。


2. 参数

  ORDER BY子句有两组参数:

(1)COLLATE

  用于指定排序规则,仅适用于字符类型的列。例如:

SELECT * FROM table1 ORDER BY ColumnA COLLATE Latin1_General_CI_AS ASC


(2)ASC 或 DESC

  ASC 指定按升序,从最低值到最高值对指定列中的值进行排序。DESC 指定按降序,从最高值到最低值对指定列中的值进行排序。例如:

SELECT * FROM table1 ORDER BY ColumnA ASC, ColumnB DESC

  对于每一个列的排序,两者只能任选其一。ASC 是默认排序。


3. 其它事项
  空值(NULL)被视为最低的可能值。

  对 ORDER BY 子句中的列数没有限制。但是,排序操作所需的中间工作表的行大小限制为 8060 个字节。这限制了在 ORDER BY 子句中指定的列的总大小。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值