资源描述
第 7章 基 本 SQL语 句Transact-SQL语言是Microsoft为SQL Server开发的一种标准化SQL语言的实现,也是SQL Server的核心。不过,Transact-SQL并非严格按照标准化SQL语言实现,而是对标准化SQL语言进行了一定程度上的裁剪和拓展。本章主要介绍Transact-SQL语言的基本语句。 7.1 Transact-SQL语 言Transact-SQL语言是对标准SQL语言的实现。不过,由于不同的数据库系统,厂商实现的SQL语言并不相同,这就导致了数据库的具体SQL语言间存在一定程度上的差异。所以,用户在使用SQL语言时,一定要明确特定SQL语言的特殊性,而且应尽量使用标准化SQL语句,而不要去使用那些特殊性的SQL语句。 7.2 数 据 定 义 语 言Transact-SQL语言是一种数据定义语言。所谓数据定义语言,是指用于定义数据格式的语言。这里所说的数据格式是存储数据的结构以及所存储数据项之间的关系。数据格式定义包括创建格式、删除格式、更改格式,而对应的语句分别为CEATE语句、DROP语句、ALTER语句。REVOKE语句是处理权限的主要语句。CEATE语句、DROP语句、ALTER语句和REVOKE等语句并不是一个语句,而是一组语句。 7.2.1 CREATE语 句 : 创 建 数 据 库CREATE语句主要用于数据定义,包括定义数据的格式,以及其他属性。其中,数据定义的格式和属性限制了插入数据库中的数据的格式。所以,在数据库设计时,数据定义阶段的工作很重要。为了做好数据定义工作,在定义数据结构前,用户需要对企业的常用数据的格式进行分析。 7.2.2 DROP语 句 : 删 除 数 据 库在SQL Server里,DROP语句和CREATE语句是对应的,二者甚至在形式和数目上都很相同。如CREATE DATABASE语句对应于DROP DATABASE语句。不过,DROP语句一般都是较为简单的,不像CREATE语句那样具有复杂的语法结构。一般情况下,DROP语句的格式如下。DROP 对象 对象名 7.2.3 ALTER语 句 : 修 改 数 据 库从ALTER语句的含义来看,ALTER语句是很友好的。因为ALTER语句能够在定义对象后,对对象进行修改。不过,实际的情况却并不如想象中那么好。在对象设计阶段,可以使用ALTER修改,但是在现实工作中,用户最好不要使用ALTER语句。该语句可能造成数据的丢失或数据精度的降低。 7.2.4 REVOKE语 句 : 安 全 性 语 句上面介绍的语句都是关于数据库对象的,这里的REVOKE语句则是关于安全性的。REVOKE语句、GRANT语句以及DENY等语句定义了对象的权限。关于权限,将在后文中叙述。这里只是强调说明权限也是数据定义的一部分。 7.3 数 据 操 纵 语 言在使用数据定义语言(DDL)定义了数据存储的格式和位置后,用户就可以使用数据操纵语言(DML)来操作定义的对象。数据操纵语言主要包括数据查询与数据更新,其中,数据查询主要是SELECT,而数据更新则包括插入(INSERT语句)、更新(UPDATE语句)、删除(DELETE语句)。这四类语句可以简称为“查增改删”。 7.3.1 SELECT语 句 : 查 询 数 据所有基于数据库的应用系统都会使用SELECT语句从数据库中提取数据,并将获得的数据按用户的要求输出给用户。根据用户使用具体SELECT语句的不同,数据库从不同角度向用户展示数据库中的数据。SELECT语句执行后,将返回一组记录,而这组记录就是记录集(结果集)。不过,SELECT语句是很复杂的。 7.3.2 INSERT语 句 : 插 入 数 据在SQL Server中,INSERT语句负责向数据库中插入记录。在获取一条新的记录后,就需要使用INSERT语句向数据库插入一个新行(记录)。 7.3.3 UPDATE语 句 : 更 新 数 据在使用INSERT语句向数据库中插入数据后,数据就保存到了数据库中。不过,如果外界数据发生变化,就需要对数据库中的数据进行更新。在SQL Server中,主要使用UPDATE语句更新数据库中的数据,特别是更新部分字段。与INSERT不同,这里并不插入新行(记录),而是修改原行(记录)。 7.3.4 Delete语 句 : 删 除 数 据如果表中的数据不再使用或已经备份完毕,那么为了释放服务器的资源,就需要及时删除表中的数据。 7.4 其 他 常 用 语 句上面介绍了SELECT、INSERT、UPDATE、DELETE等语句的基本形式。下面将介绍一些常用的子句,这些子句在与上述4个语句配合使用时,可以实现更加强大的数据操作功能。1带WHERE子句的SELECT语句2带WHERE子句的UPDATE语句3带WHERE子句的DELETE语句 7.4.1 WHERE子句:给出条件语句在SQL Server中,WHERE子句可以用于SELECT语句、DELETE语句、UPDATE语句中。1带WHERE子句的SELECT语句2带WHERE子句的UPDATE语句3带WHERE子句的DELETE语句 7.4.2 带 AND关 键 字 的 WHERE子 句在介绍AND关键字之前,需要介绍一下布尔表达式。所谓布尔表达式是指表达式的各成分由关系连接符连接,而且表达式的值为TRUE或FALSE。其中,用于连接布尔表达式的连接词有NOT(非)、AND(积)、OR(和)3个。这里将以AND为例,介绍这3个连接词。 7.4.3 GROUP BY子 句 : 分 组 语 句GROUP BY子句具有符合ISO的语法和不符合ISO的语法两种结构。在一条SELECT语句中只能使用一种语法样式,在这里,用户使用符合ISO的语法,因为不符合ISO语法的目的是为了实现向后兼容。这里仅介绍符合ISO的语法,如下。 1不带WHERE子句仅含GROUP BY子句的SELECT语句 2带WHERE子句和GROUP BY子句的SELECT语句 7.4.4 HAVING子 句 : 分 组 条 件HAVING子句通常在GROUP BY子句中使用。如果不使用GROUP BY子句,那么HAVING的行为与WHERE子句一样。不过,这种方式不推荐使用,因为有很多限制。HAVING子句的所有列都必须出现在SELECT语句的列表中。具体HAVING子句的用法大致分为以下几种情况。1带HAVING子句而不带WHERE子句的SELECT语句2带HAVING子句和WHERE子句的SELECT语句 7.4.5 ORDER BY子 句 : 排 序 语 句ORDER BY子句用在指定SELECT语句返回的结果集后,主要用于对结果集进行排序。在默认情况下,由SELECT语句返回结果集中的记录是按照表中记录的物理顺序排列的。 7.4.6 TOP子 句 : 查 看 前 几 条 记 录TOP表达式可用在SELECT、INSERT、UPDATE和DELETE语句中。不过,TOP表达式主要用于SELECT语句中,其表达式语法结构如下。TOP (Expression) PERCENT WITH TIES 7.4.7 DISTINCT子 句 : 去 掉 重 复 记 录提到关键字DISTINCT,就不得不提到关键字ALL。ALL是指结果集中可以包含重复行,而且它是默认值。而关键字DISTINCT可从SELECT语句的结果集中消除重复的行。不过,如果没有指定DISTINCT,将返回所有行(包括重复的行)。 7.4.8 BETWEEN子 句 : 指 定 范 围 条 件在SQL Server中,BETWEEN子句是较为重要的字句,用于指定一个范围条件,其语法结构如下。test_Expression BETWEEN BEGIN_Expression AND END_Expression其实,该子句相当于数学中的两个不等式:BEGIN_Expression=test_Expression =END_Expression 7.4.9 模 糊 查 询 LIKE子 句上面介绍WHERE子句时,说到了字符串比较的问题。不过,那种字符串比较主要是、=等关系运算符连接。在某种程度上,这些运算符都可以说是字符串的精确比较。在Transact-SQL中,还提供了LIKE子句用于字符串的模糊比较,即模糊匹配。 7.4.10 IN子 句 : 值 包 含 在 列 表 中在SQL Server中,IN语句主要用于确定指定列的值在子查询或列表中。IN语句的语法结构如下。test_Expression IN ( subquery | Expression , n ) 7.4.11 NOT IN子 句 : 值 不 包 含 在 列 表 中当然,IN语句与LIKE语句一样,也可以和NOT语句配合使用。NOT语句将IN语句的值取反,即如果IN语句为TRUE,那么NOT IN子句则为FALSE。这里之所以单独列出NOT IN,是因为用户经常用到NOT IN,便于用户查询本书。 7.4.12 COMPUTE子 句 : 用 于 生 成 统 计 信 息COMPUTE子句用于生成统计信息,并将统计信息显示在结果集的后面。COMPUTE子句的语法结构如下。 COMPUTE AVG | COUNT | MAX | MIN | STDEV | STDEVP | VAR | VARP | SUM ( Expression ) , n BY Expression , n 7.4.13 COMPUTE BY子 句 : 计 算 统 计 信 息COMPUTE BY子句与COMPUTE子句类似,也可能在未来版本中删除,所以不建议使用。如果使用COMPUTE BY,那么必须使用ORDER BY子句。表达式的列必须与在ORDER BY中的列相同或是其子集,并且顺序相同。例如,如果ORDER BY子句为ORDER BY a,b,c,那么COMPUTE子句的可用形式如下。COMPUTE BY a,b,c。COMPUTE BY a,b。COMPUTE BY a。 7.4.14 列 的 别 名前面的许多示例都用到了列的别名,而且在前面介绍其他类型时,笔者也介绍了列的别名类型。其实,列的别名在SELECT语句中经常用到。其中,列的别名类型主要由AS和=来命名。基于前面的介绍,下面将给出一个在查询中使用列别名的示例。如下SQL语句将查询数据库database_demo的表,并使用别名显示查询到的字段。 7.5 关 系 连 接在SELECT语句涉及到多个表时,可以用子查询解决。SQL Server还提供了一组关键字来处理多个表的查询,这组关键字组成了关系连接的核心。所谓关系连接,就是连接查询这是一种不同于子查询使用多个表的查询方式。可以说,前面介绍的SQL语句都是基础语句,在工作中较少用到那样简单的语句。连接查询是最常用、最重要的查询方式。 7.5.1 连 接 查 询 介 绍既然两个表可以用于连接查询,那么两个表必须要有联系两个表之间存在相同意义的列。 7.5.2 笛 卡 尔 乘 积上面介绍连接查询时提到过,SQL Server将参与连接查询的表的所有记录进行组合并形成笛卡尔积(交叉连接) 。根据上面介绍的连接查询的执行步骤,用户不难了解生成和实现笛卡尔积的方法:在连接查询中,将WHERE子句、GROUP BY子句、ORDER BY子句以及SELECT语句中的聚合函数等都省略,直接使用表中的记录组合形成笛卡尔积。 7.5.3 内 部 连 接内部连接( INNER JOIN)是相对于外部链接而言的,内部连接用来组合两个或多个表的记录。通常,内部连接按照连接条件,从生成的结果集中删除在其他表中没有被匹配的记录。根据内部连接使用比较方式的不同,内部连接可以分为等值连接、自然连接、不等连接。 7.5.4 使 用 表 别 名表的别名是连接查询中经常用到的处理表的方法。将表名定义为一个简单的别名,解决了编写SQL语句时语句过长的问题。其中,表别名的规则与前面介绍的列的别名相同。这里仅给出一个简单的SQL示例。USE database_demoGOSELECT tb1.* FROM table_1 AS tb1 7.5.5 外 部 连 接前面介绍的连接查询都是返回满足条件的记录。在工作中,用户可能遇到这种情况,即显示某一个表的全部内容(包括不符合连接条件的记录)。这个时候就需要用到外部连接,其可以使不符合条件的记录也出现在结果中。 7.5.6 自 连 接这里介绍的自连接是连接查询的一个特例。所谓自连接,就是表与自身的连接,是内部连接的一种。自连接可以使用户同时操作同一个表的不同行。它使用较少,但是很重要。自连接适用于如下场景:某班级学生表student中包含了该班学生今年选修的课程以及课程分数。现在,需要查看同一个学生的不同学科的成绩。 7.5.7 联 合 查 询 在Transact-SQL中,还有一类查询,叫联合查询。联合查询是以SELECT语句的结果集为基础的。与其说联合查询是一个查询,不如说联合查询是一个运算符。不过,这是一种使用起来不太灵活的查询方式。除非用户想将查询结果一次性输出,这时可以使用联合查询。许多联合查询都可以用连接查询替代,不推荐使用联合查询。 7.6 小 结本章是本书最为关键的一章,SQL语句是在实际应用中使用最多的部分,每一个DBA都应该十分熟练地掌握各种SQL语句。在实际应用中,数据操纵语言最为关键,由其是SELECT语句,十分灵活,体现了第四代计算机语言的特点。与其配合的各种常见语句,为准确查询到可用数据提供技术保障。
展开阅读全文