SQL查询的艺术
上QQ阅读APP看书,第一时间看更新

第2章 主要的关系数据库与SQL

SQL Server是目前应用最广泛的大型关系数据库系统。本章主要介绍它们的基本概念以及执行SQL语句的交互环境,最后简单介绍一下SQL Server对SQL的扩展语言。

2.1 SQL Server

SQL Server是一个后台数据库管理系统,它功能强大,操作简便,日益为广大数据库用户所喜爱,越来越多的开发工具提供了SQL Server的接口。作为微软公司的产品之一,SQL Server能够很好地与微软的其他产品集成,如Office下的Excel、Access等,都可以用表的形式转换到SQL Server数据库中。

2.1.1 SQL Server的结构

SQL Server采用单进程多线程的系统结构、客户端/服务器体系结构,并且支持分布式数据库结构。

1.单进程多线程的系统结构

SQL Server采用单进程、多线程结构,由执行核心即线程来分配多用户对数据库的存取,这样减少了多进程方式对数据库存取时的协调时间,提高了执行效率。由于是单进程,它就不需要进程之间的通信机制。线程的操作由数据库引擎来指定,在执行时把这些指令发送给操作系统。SQL Server单进程多线程的系统结构如图2-1所示。

图2-1 SQL Server单进程多线程的系统结构

2.客户端/服务器体系结构

SQL Server是按客户端/服务器体系结构设计的。需要用户频繁干预的任务,如输入、显示数据等,由客户端完成;而对于数据库的存取和控制任务,则由服务器完成。当用户需要读取数据库中的数据时,就会通过网络向服务器提出申请,服务器对客户端的数据库请求做出相应的处理,然后仅将结果传给客户端,这样就大大减少了网络流量。

在SQL Server中,有一个包含1024个工作线程的线程池,用以响应用户的连接请求。SQL Server为不同的用途准备了不同的线程池,包括磁盘备份管理、用户连接等。

3.支持分布式数据库结构

一个网络中可以有多个SQL Server,用户可以将数据分别存放在各个SQL Server上,成为分布式数据库结构。客户端可以分别或同时向多个SQL Server存取数据,这样可以降低单个SQL Server的处理负担,提高系统的执行效率。

2.1.2 数据库访问标准化接口——ODBC

SQL Server是按客户端/服务器体系结构设计的,客户端可以通过ODBC与SQL Server连接。

ODBC(Open Database Connection,开放数据库互连标准),实际上是一个数据库的访问库,适用于客户端/服务器体系结构,定义客户程序用于连接到数据库系统和发出SQL命令的API。

ODBC有一个驱动程序管理器,驱动程序管理包含在ODBC.DLL中,可连接到所有的应用程序中,它负责管理应用程序中ODBC函数与DLL中函数的绑定。对于大型的客户端/服务器数据库管理系统,其支持的ODBC驱动程序并不直接访问数据库,这些驱动程序实际上是数据库用于远程操作网络通信协议的一个界面,如图2-2所示。

图2-2 ODBC与数据库的连接

2.1.3 使用查询分析器执行SQL语句

在SQL Server中,我们可使用查询分析器(Query Analyzer)来执行SQL Server支持的任何SQL语句。查询分析器具有图形用户界面(GUI),可用来提出交互式的查询,并向SQL Server发送SQL命令。下面我们说明如何使用查询分析器执行SQL语句。

1.启动查询分析器

当用户单击查询分析器运行程序时,Windows将显示连接SQL Server对话框,如图2-3所示。在SQL Server连接对话框中,我们键入想要连接的SQLServer名称、设定登录方式后,单击“确定”按钮,即可进入查询分析器的查询窗口,如图2-4所示。

图2-3 连接SQL Server对话框

图2-4 查询分析器的查询窗口

在安装SQLServer时,安装程序创建了几个数据库,如图2-4查询窗口工具栏右侧的DB下拉列表所示。在使用查询分析器向SQL Server发送SQL语句之前,我们必须选择一个数据库。

2.查询分析器执行SQL语句

假设在msdb数据库中有一个数据库表TEACHER,我们要查询表中的所有数据,步骤如下。

(1)单击DB下拉列表,从列表中选择要操作的数据库,这里选择“msdb”。

(2)在查询分析器查询窗口中键入SQL语句,这里键入的内容是“SELECT * FROM TEACHER”,可以在一行键入,也可以使用“Enter”键将其分成多行。

注意

多行键入时,每行的结果不要加任何符号。

(3)执行SQL语句。SQL语句可以通过单击“查询”|“执行”菜单命令执行,也可以通过快捷键F5或Ctrl+E来实现。查询分析器将在查询窗口下面的窗格中显示SQL语句的执行结果,如图2-5所示。

图2-5 查询分析器执行SQL语句及结果显示

使用时我们需要注意:无论何时执行SQL语句,查询分析器都会向SQL Server发送查询窗口中的所有语句,以便处理。

如果在查询窗口中有多条语句,我们既可以删除那些不想执行的语句,也可以选中需要向SQL Server发送用于处理的语句,而后执行即可。

2.2 Transact-SQL

SQL属于第四代语言(4GL),其执行特点是非过程化,即不用指明执行的具体方法和途径,而是简单地调用相应语句来直接取得结果。显然,这种不关注任何实现细节的语言对于开发者来说有着极大的便利。然而,对于有些复杂的业务流程,又要求相应的程序来描述,那么4GL就有些无能为力了。

Transact-SQL是ANSI SQL的加强版语言,提供了标准的SQL命令,另外还对SQL命令做了许多扩充,提供类似BASID、Pascal、C等第三代语言的基本功能,如变量说明、程序流程控制语言、功能函数等。

2.2.1 Transact-SQL概述

Transact-SQL是一套定义完善的语言,开发人员可以通过这种语言来进行应用程序和数据库服务器之间的通信,并能够对数据库服务器进行编程处理。Transact-SQL是ANSI-SQL的一个超集,利用Transact-SQL,我们可以使服务器执行一些定制的事务逻辑处理。Transact-SQL由多种应用程序生成,包括以下几种。

通用办公生产应用程序。

使用图形用户界面(GUI)的应用程序,使用户得以选择包含要查看数据的表和列。

使用通用语言语句,确定用户所要查看数据的应用程序。

将其数据存储于SQL Server数据库中的商用应用程序。这些应用程序既可以是来自其他厂商的应用程序,也可以是内部编写的应用程序。

由开发系统,如Visual C++、Visual Basic或Visual J++等,使用数据库应用程序接口(API),如ADO、OLE DB以及ODBC等,创建的应用程序。

2.2.2 Transact-SQL的主要组成

在Transact-SQL中,标准的SQL语句畅通无阻。Transact-SQL也有类似于SQL语言的分类,不过做了许多扩充。Transact-SQL的分类如下。

数据定义语言(DDL,Data Definition Language)

数据操纵语言(DML,Data Manipularion Language)

数据控制语言(DCL,Data Control Language)

系统存储过程(System Stored Procedure)

一些附加的语言元素

数据定义语言、数据操纵语言和数据控制语言与第1章介绍的标准SQL的数据定义语言、数据操纵语言和数据控制语言相差不大,这里不再介绍。

系统存储过程在本书第15章存储过程中会有详细介绍。下面我们主要介绍一下附加的语言元素,主要包括以下几部分。

1.注释

注释是程序代码中不执行的文本字符串(也称为注解)。在SQL Server中,我们可以使用两种类型的注释字符,一种是ANSI标准的注释符“--”,用于单行注释;另一种是与C语言相同的程序注释符号,即“/* */”,可用于多行注释。

2.变量

变量是一种语言中必不可少的组成部分。Transact-SQL中有两种形式的变量,一种是用户自己定义的局部变量,另外一种是系统提供的全局变量。

局部变量是一个能够拥有特定数据类型的对象,它的作用范围仅限于程序内部。局部变量可以作为计数器来计算循环执行的次数,或是控制循环执行的次数。

全局变量是SQL Server系统内部使用的变量,作用范围并不仅仅局限于某一程序,而是任何程序都可以随时调用。全局变量通常存储一些SQL Server的配置设定值和统计数据。使用全局变量时,我们应该注意以下几点:

全局变量不是由用户的程序定义的,是在服务器级定义的。

用户只能使用预先定义的全局变量。

引用全局变量时,必须以标记符“@@”开头。

局部变量的名称不能与全局变量的名称相同,否则会在应用程序中出现不可预测的结果。

3.运算符

运算符是一些符号,能够用来执行算术运算、字符串连接、赋值以及在字段、常量和变量之间进行比较。在SQL Server中,运算符主要有以下6大类:算术运算符、赋值运算符、位运算符、比较运算符、逻辑运算符以及字符串串联运算符。

4.函数

在Transact-SQL中,函数用来执行一些特殊的运算以支持SQL Server的标准命令。Transact-SQL编程语言提供了3种函数。

行集函数:行集函数可以在Transact-SQL语句中当作表引用。

聚合函数:聚合函数用于对一组值执行计算并返回一个单一的值。

标量函数:标量函数用于对传递给它的一个或者多个参数值进行处理和计算,并返回一个单一的值。

5.流程控制语句

流程控制语句是指那些用来控制程序执行和流程分支的命令。在SQL Server中,流程控制语句主要用来控制SQL语句、语句块或者存储过程的执行流程。

2.2.3 Transact-SQL的一些重要命令

本节介绍几个Transact-SQL中常用的命令,这些命令在通用SQL语句中是不支持的。

1.使用COMPUTE命令创建汇总报表

Transact-SQL也有创建数据库报表的机制,即使用COMPUTE命令。比如,我们要从Teacher表中产生一个报表,显示所有教师的姓名、工资以及平均工资信息,其报表生成代码可表示如下。

    SELECT      Name, Wage
    FROM        Teacher
    COMPUTE     AVG(Wage)

在该例中,COMPUTE命令将整个报表作为一个整体执行运算,而COMPUTE BY命令则在指定的组或整个报表上执行运算。

2.PRINT命令

PRINT命令向客户端返回一个用户自定义的信息,即显示一个字符串。显示字符串的最大长度为255个字符、局部变量或全局变量。如果变量值不是字符串,必须先用数据类型转换函数CONVERT将其转换为字符串。

语法表示如下。

    PRINT  'any ASCII text' | @local_variable | @@FUNCTION | string_expression

string_expression是可返回一个字符串的表达式,表达式的长度可以超过8000个字符,但超过8000的字符将不会显示。

3.DECLARE命令

DECLARE命令用于声明一个或多个局部变量、游标变量或表变量。在用DECLARE命令声明之后,所有的变量都被赋予初值NULL。我们需要用SELECT或SET命令来给变量赋值。变量类型可为系统定义的或用户定义的类型,但不能为TEXT、NTEXT、IMAGE类型。

语法表示如下。

    DECLARE {{ @local_variable data_type }| { @cursor_variable_name CURSOR }
    | { table_type_definition }} [ ...n]]

CURSOR指明变量是局部的游标变量。

4.EXECUTE/KILL命令

EXECUTE命令用来执行存储过程,KILL命令用于终止某一过程的执行,具体用法请参见第15章。

5.SQL Server的诊断工具—SET命令

Transact-SQL提供了一组SET命令,我们使用这些命令能设置某些选项,帮助分析Transact-SQL语句。这里我们介绍几个常用的SET命令。

SET STATISTICS IO ON:使服务器返回所请求的物理和逻辑页数。

SET STATISTICS TIME ON:使服务器显示一条SQL语句的执行时间。

SET SHOWPLAN ON:使服务器显示指定查询的执行计划。

SET NOEXEC ON:使服务器从语法上分析指定的查询,但不执行该查询。

SET PARSONLY ON:使服务器检查指定查询的格式(句法),但不执行该查询。Transact-SQL还具有下列控制查询结果显示方式的命令。

SET ROWCOUNT n:使服务器仅显示查询结果中的前n行,即在返回指定结果行后便停止查询处理。

SET NOCOUNT ON:使服务器不报告查询返回的结果的行数。

当然,我们可以通过SET…OFF命令取消选项的设置。下面我们以SET ROWCOUNT命令为例,介绍一下使用过程。

实例1 使用查询分析器

这里通过SET ROWCOUNT命令,使服务器仅显示查询结果中的前3行,在查询分析器中键入如下命令。

    SET ROWCOUNT 3
    SELECT * FROM Department

运行结果如图2-6所示。

图2-6 查询分析器运行结果

与图2-5对比不难发现,此时服务器确实只查询了3列信息就停止查询了。而如果要取消设置的SET ROWCOUNT命令,我们只需要执行SET ROWCOUNT 0即可。取消SET ROWCOUNT命令后的执行结果如图2-7所示。

图2-7 查询分析器运行结果

6.SHUTDOWN命令关闭数据库

SHUTDOWN命令用于停止SQL Server的执行。语法表示如下。

    SHUTDOWN  [WITH NOWAIT]

当使用NOWAIT参数时,SHUTDOWN命令立即停止SQL Server,在终止所有的用户过程并对每一现行的事务发生一个回滚后,退出SQL Server。当没有用NOWAIT参数时,SHUTDOWN命令将按以下步骤执行。

(1)终止任何用户登录SQL Server。

(2)等待尚未完成的Transact-SQL命令或存储过程执行完毕。

(3)在每个数据库中执行CHECKPOINT命令,将当前数据库中被更改过的数据页或日志页,从数据缓冲器中强制写入硬盘。

(4)停止SQL Server的执行。

7.USE命令

USE命令将当前使用的数据库为指定数据库。用户必须是目标数据库的用户成员,或目标数据库建有GUEST用户账号时,使用USE命令才能成功切换到目标数据库。

当然,Transact-SQL提供的命令远不只是这些,还包括BACKUP命令备份数据库,DBCC命令验证数据库完整性、查找错误、分析系统使用情况,READTEXT、WRITETEXT命令读写TEXT、NTEXT或IMAGE类型的数据等。

说明

本节只是对Transact-SQL作一下简单介绍,因为本书的一些章节要用到Transact-SQL的有关知识。关于Transact-SQL的详细信息,读者可参阅SQL Server数据库系统的手册。