Transact-SQL语法基础
8-1 Transact-SQL 表达式
8-2 Transact-SQL 数据类型
8-3 Transact-SQL 函数
8-4 Query Analyzer工具程序
8-5 Transact-SQL 语句
8-6 数据处理语法(DML)
在正式介绍 Transact-SQL 语句的语法之前,笔者先利用较短的篇幅,简单介绍有关Transact-SQL表达式、数据类型以及函数等。并且希望让从未接触过SQL语句设计的读者,可以有一些Transact-SQL的运行概念;同时也可以让已经使用过Transact-SQL语句设计的读者,作为相关查询的数据来源。
8-1 Transact-SQL 表达式
表达式是用来在“列与列之间”或者“在变量之间”进行比较以及数学运算的符号。在MS-SQL Server中,表达式共具有“数学表达式”、“字符串表达式”、“比较式”以及“逻辑表达式”等四种表达式的类型;下面就对这些表达式类型进行详细的说明。
8-1-1 数学表达式
数学表达式可以用在各种数字类型变量的运算。这些数字类型变量的数据类型共有:INT,SMALLINT,TINYINT,FLOAT,REAL,MONEY或者SMALLMONEY。而数学表达式的符号共有:加(+)、减(-)、乘(*)、除(/)和求余数(%)。其具体说明如表8-1所示。
表8-1
符号 |
功能 |
可以操作用的数据类型 |
+ |
加 |
INT,SMALLINT,TINYINT,FLOAT,REAL,MONEY或者SMALLMONEY |
- |
减 |
INT,SMALLINT,TINYINT,FLOAT,REAL,MONEY或者SMALLMONEY |
* |
乘 |
INT,SMALLINT,TINYINT,FLOAT,REAL,MONEY或者SMALLMONEY |
/ |
除 |
INT,SMALLINT,TINYINT,FLOAT,REAL,MONEY或者SMALLMONEY |
% |
取余数 |
INT,SMALLINT,TINYINT |
注意事项 数学表达式只能在数字变量或者数字型数组中进行运算。
取余数只能使用在INT,SMALLINT和TINYIINT数据类型。
8-1-2 字符串表达式
字符串是由字符、符号以及数字所组成,并且字符串表达式是使用于字符串运算与操作的一种运算方式。在SQL Server的字符串表达式中,字符串是可以使用数学表达式的“+”,达到字符串的相加、结合的目的。在SQL Server的数据类型中,可以适用于字符串加法的数据类型计有:“Char”、“VarChar”、“Nvarchar”、“Text”,以及可以转换为“Char”或是“VarChar”数据类型的数据类型。例如:“ASP ”、“&”以及“SQL 2000”三个字符串相加的表达式如下所示:
Interval = “ASP ” + “&” + “ SQL 2000”
这三个字符串、字符相加之后的结果“Interval”,其内容则为“ASP & SQL 2000”。
8-1-3 比较表达式
比较表达式是用来对两个表达式进行比较。在MS-SQL Server中,可以使用的比较表达式符号如表8-2所示。
表8-2 较表达式符号
表达式符号 |
功 能 | |||
= |
等于 | |||
> |
大于 | |||
< |
小于 | |||
>= |
大于或者等于 | |||
<= |
小于或者等于 | |||
<> 或 != |
不等于 | |||
|
!> |
不大于 |
| |
|
!< |
不小于 |
| |
|
( ) |
优先级控制符 |
| |
此外,比较表达式的执行优先级如同数学表达式一样,可以使用“( )”来设置运算的优先级。
8-1-4 逻辑表达式
在Transact-SQL的逻辑表达式中,共具有“AND”、“OR”以及“NOT”三种逻辑表达式。以下是这三种逻辑表达式的功能说明:
· “AND”表达式:当所有的条件式在运算之后,只有全部的返回值都是“真”的情况下,其逻辑运算值才会返回“真”;反之,如果有一个返回值是“假”时,其逻辑运算值即为“假”。
· “OR”表达式:只要有一个条件式的返回值是“真”,其逻辑运算值即返回“真”。
· “NOT”表达式:逻辑表达式“反向”。即逻辑运算值为“真”时,其返回值即为“假”。
同时在优先级方面,其优先级为“NOT”、“AND”、“OR”。并且逻辑表达式可以使用的数据类型如表8-3所示。
表8-3 逻辑表达式可以使用的数据类型
左操作数 |
右操作数 |
binary,varbinary |
int,smallint,tinyint |
int,smallint,tinyint |
int,smallint,tinyint,binary |
bit |
int,smallint,tinyint,binary |
8-1-5 表达式的优先级
通常在一个Transact-SQL的表达式中,可能会包含许多不同类型的表达式。Transact-SQL在执行的过程中,根据下列的原则定义表达式的先后执行顺序:
· 括号:“()”
· 反向表达式:“~”
· 乘、除、取余数表达式:“*”、“/”、“%”
· 加减表达式:“+”、“-”
· XOR表达式:“^”
· AND表达式:“&”
· OR表达式:“|”
· NOT连接
· AND连接
· OR连接
如果具有相同的优先级时,则按照“由左而右”的规则进行运算。
8-2 Transact-SQL数据类型
数据类型是“信息”类型的表现方式;对于每一种程序设计语言来说,它们都各自具有对“信息”类型的不同定义方式。在MS-SQL Server中共提供了25种不同的数据类型,以下是这些数据类型的分类与说明。
表8-4 数据类型的分类与说明
类 型 |
数据类型 |
说 明 |
二进制数据类型 |
其数据内容是由“二进制”表示方式所组成的 | |
|
Binary[(n)] |
可以是固定长度,也可以是变化长度。Binary[(n)] 是n位数固定长度的二进制数据。n的范围是从1到8000,所使用的存储空间大小为n+4个字节 |
|
Varbinary[(n)] |
n为变动长度的二进制数据。n的范围是1到8000,所使用的存储空间大小为n+4个字节 |
|
Image |
用于存储影像文件数据用。 |
字符数据类型 |
字符数据是由字符、数字以及符号所组合而成的数据 | |
|
Char[(n)] |
固定长度字符串,最大为8192字符 |
|
VarChar[(n)] |
变动长度字符数据,长度不超过8192字符 |
|
Text |
可以存储超过8192字符的数据 |
日期和时间数据类型 |
数据内容是以“日期格式”或者是“时间格式”的方式所存储的数据类型 | |
|
DateTime |
存储的日期从1753年1月1日到9999年12月31日,每一个数值要求8个字节的存储空间 |
续表
|
类 型 |
数据类型 |
说 明 | ||
|
|
Smalldatetime |
存储的日期从1900年1月1日到2079年12月31日,每一个数值要求4个字节的存储空间 | ||
|
Unicode数据类型 |
用以存储 Unicode字符的数据类型 | |||
|
|
Nchar |
行的长度固定不变,最多可以存储4000个字符 | ||
|
|
Nvarchar |
可变动行的长度,最多可以存储4000个字符 | ||
|
|
Ntext |
可以存储超过4000个字符 | ||
|
数值数据类型 |
数值数据类型包括正数、负数、小数和浮点数 | |||
|
Int |
数值存储的范围从–2,147,483,648 到 2,147,483,647,每个数值要求 4 个字节的存储空间 |
| ||
|
SmallInt |
存储的范围是–32,768 到 32,767,每个数值要求2个字节的存储空间 |
| ||
|
TinyInt |
存储范围从0到255,每个数值要求1个字节存储空间 |
| ||
|
Decimal,Numeric |
精确小数,数值范围从–1038–1到1038–1 |
| ||
|
Float |
浮点数值,数值范围从–1.79E + 308 到 1.79E + 308 |
| ||
|
Real |
双精度浮点数值,数值范围从 –3.40E+38 到 3.40E+38,要求的存储空间为4个字节 |
| ||
货币数据类型 |
用以表示货币数量的数据类型 |
| |||
|
Money |
要求8个字节的存储空间 |
| ||
|
Smallmoney |
要求4个字节的存储空间 |
| ||
特殊数据类型 |
|
|
| ||
续表
|
类 型 |
数据类型 |
说 明 | |
|
TimeStamp |
以二进制的格式,表示SQL Server活动的先后顺序 |
| |
|
Bit |
以“0”或是“1”所组成的数据类型,使用Bit的数据类型可以表示“真”、“假”、“ON”或者是“OFF” |
| |
|
Uniqueidentifier |
以十六进制的方式,表示一个全域唯一的识别码 |
| |
8-3 Transact-SQL 函数
在数据库的“日常维护”、“管理”、“数据查询”等方面,函数可以说使用得非常频繁。通过Transact-SQL函数的使用,可以在“系统的相关信息”、“数学运算”、“查询”以及“统计”等方面,提供非常大的帮助。在MS-SQL Server中,常用的函数有:“字符串函数”、“日期时间函数”、“数学函数”、“转换函数”、“系统函数”以及“聚合函数”等。以下是这些函数的列示与说明。
1. 字符串函数
表8-5 字符串函数
函数名称 |
参 数 |
功 能 |
+ |
expr expr |
字符串加法 |
ASCII |
char_expr |
返回 ASCII 的数值 |
CHAR |
interger_expr |
返回 ASCII 的字符 |
CHARINDEX |
“pattern” , expr |
取得 Pattern 的起始位置 |
DIFFERENCE |
char_expr1 , char_expr2 |
字符串比较 |
LTRIM |
char_expr |
删除字符串左方的空格 |
LOWER |
char_expr |
将字符串的内容全部转换成小写字母 |
续表
函数名称 |
参 数 |
功 能 | |
PATINDEX |
“%pattern” , expr |
取得 Pattern的起始位置,其中,“%”为 MS-SQL Server 专用的“万用字符” |
|
REPLICATE |
char_expr,integer_expr |
根据指定的数值,产生重复的字符串内容 |
|
RIGHT |
char_expr,interger_expr |
返回字符串右边指定的字符内容 |
|
REVERSE |
char_expr |
反向表达式 |
|
RTRIM |
char_expr |
去除字符串右边的空格 | |
SOUNDEX |
char_expr |
返回一个四位程序代码,用以比较两个字符串的相似性 | |
SPACE |
interger_expr |
产生指定数量的空格 | |
STUFF |
char_expr1,start,length,char_expr2 |
在char_expr 字符串中,从start开始,长度为length的字符串,以 char_expr2 取代 | |
SUBSTRING |
expr,start,length |
返回 expr 字符串中,从 start开始,长度为length 的字符串 | |
STR |
float[,length[,decimal]] |
将数值转换为字符串的函数。Length为总长度,decimal是小数点之后的长度 | |
UPPER |
char_expr |
将字符串中全部的字符转换为大写字母 |
2. 日期与时间函数
表8-6 日期与时间函数
函数名称 |
参 数 |
功 能 |
GETDATE |
( ) |
返回系统目前的日期与时间 |
DATEDIFF |
(datepart,date1,date2) |
以datepart 指定的方式,返回date2 与date1两个日期之间的值 |
续表
函数名称 |
参 数 |
功 能 |
DATEADD |
(datepart,number,date) |
以datepart指定的方式,返回date ,加上number之后的日期 |
DATEPART |
(datepart,date) |
返回日期date中,datepart指定部分所对应的整数值 |
DATENAME |
(datepart,date) |
返回日期date中,datepart指定部分所对应的字符串名称 |
以下所列的是在日期与时间函数中,与datepart 相关“字段名称”、“缩写”以及“数值范围”的列表。
表8-7 日期与时间函数相关列表
字段名称 |
缩 写 |
数值范围 |
Year |
Yy |
1753 ~ 9999 |
Quarter |
Qq |
1 ~ 4 |
Month |
Mm |
1 ~ 12 |
Day of year |
Dy |
1 ~ 366 |
Day |
Dd |
1 ~ 31 |
Week |
Wk |
0 ~ 51 |
Weekday |
Dw |
1 ~ 7 |
Hour |
Hh |
0 ~ 23 |
Minute |
Mi |
0 ~ 59 |
Second |
Ss |
0 ~ 59 |
Millisecond |
Ms |
0 ~ 999 |
3. 数学函数
表8-8 数学函数
函数名称 |
参 数 |
功能说明 |
ABS |
Numeric_expr |
返回 Numeric_expr 的绝对值 |
ASIN、ACOS、ATAN |
Float_expr |
返回Float_expr 浮点数值的反正弦、反余弦、反正切 |
续表
函数名称 |
参 数 |
功能说明 |
SIN、COS、TAN |
Float_expr |
返回 Float_expr 的正弦、余弦、正切 |
CEILING |
Numeric_expr |
返回大于或等于指定数值的最小整数 |
EXP |
Float_expr |
返回 Float_expr 数值的指数 |
DEGREES |
Numeric_expr |
把 Numeric_expr 弧度转换为角度 |
FLOOR |
Numeric_expr |
返回小于或等于指定数值的最大整数 |
POWER |
Numeric_expr |
返回指定数值的次幂值 |
LOG |
Float_expr |
返回 Float_expr 的自然对数 |
SQRT |
Float_expr |
返回 Flot_expr 的平方根 |
RAND |
[seed] |
返回介于 0 到 1之间的随机数 |
PI |
( ) |
圆周率Pi值,3.141592653589793 |
ROUND |
Numeric_expr,length |
将Numeric_expr 以指定的长度(Length) 进行四舍五入的运算 |
SIGN |
Numeric_expr |
依据 Numeric_expr 的数值,判断是否为“正”、“负”以及“零”,并且返回“1”、“-1”以及“0” |
LOG10 |
Float_expr |
返回 Float_expr 以 10 为底的自然对数 |
RANIANS |
Numeric_expr |
把 Numeric_expr 角度转换为s弧度 |
4. 转换函数
转换函数是用来在表达式格式之间,进行数据类型转换的一种函数,其语法格式如下所示:
CONVERT(datatype[(length),expression[,style]])
其中datatype是参数expression转换之后的数据类型。转换之后的数据类型只能是SQL Server系统默认的数据类型,而不能是用户自定义的数据类型。其中length表示转换之后的数据长度,系统默认值为“30”,最大值则为“255”。
转换函数如果是使用在将DateTime或者SmallDateTime格式转换为字符类型时,则必须以Style作为转换之后的字符格式,其参数与对应的日期格式如表8-9所示。
表8-9 转换后的参数与对应的日期格式
不具“公元”的格式 |
具“公元”的格式 |
转换后的字符串格式 |
(默认的) |
0或者100 |
mon dd yy hh:mi AM(或PM) |
1 |
101 |
mm/dd/yy |
2 |
102 |
yy.mm.dd |
3 |
103 |
dd/mm/yy |
4 |
104 |
dd.mm.yy |
5 |
105 |
dd-mm-yy |
6 |
106 |
dd mon yy |
7 |
107 |
mon dd,yy |
8 |
108 |
hh:mi:s |
|
9或是109 |
mon dd,yyyy hh:mi:ss:msAM(或是PM) |
10 |
110 |
mm-dd-yy |
11 |
111 |
Yy/mm/dd |
12 |
112 |
Yymmdd |
|
13 或是113 |
dd mon yy hh:mi:ss:ms (24小时制) |
14 |
114 |
hh:mi:ss:ms(24小时制) |
5. 系统函数
MS-SQL Server 中,提供可以显示“SQL Server服务器”、“数据库”以及“与帐号有关”的系统函数。系统函数可以使用在表达式之中,并且使用格式、常用的系统函数如下所示:
system_function(argument)
表8-10 常用的系统函数
函数名称 |
参 数 |
结 果 |
COALESCE |
expr1,expr2,…,exprn |
返回第一个非空白的表达式 |
COL_NAME |
“table_id”, “col_id” |
返回指定的表以及数据行识别码所对应的数据行名称 |
COL_LENGTH |
“table_name” , “col_name” |
返回指定的数据行长度 |
DB_ID |
[“database_name”] |
返回数据库的ID识别码 |
DB_NAME |
[“database_name”] |
返回数据库的名称 |
DATALENGTH |
“expr” |
返回任意数据类型表达式的实际长度 |
GETANSINULL |
[“database_name”] |
返回数据库 NULL 的默认值 |
HOST_ID |
( ) |
返回主机的 ID 识别码 |
HOST_NAME |
( ) |
返回主机的名称 |
IDENT_INCR |
“table or view” |
返回指定的表或View 中,IDENTITY 行的增量值 |
IDENT_SEED |
“table or view” |
返回指定的表或 View 中,IDENTITY 行的初始值 |
ISDATE |
“variable or col_name” |
检查变量或数据行是否具有有效的日期格式。如果是具有有效的日期格式时,则返回值为“1”;如果不是具有有效的日期格式时,返回值为“0” |
ISNULL |
“expr,value” |
用指定的值代替表达式中的 NULL 值 |
INDEX_COL |
“table_name”,index_id,key_id |
返回做为索引的数据行名称 |
ISNUMERIC |
“variable or col_name” |
检查变量或数据行是否具有有效的数字格式,如果具有有效的数字格式时,则返回值为“1”;如果不是具有有效的数字格式,则返回值为“0” |
续表
函数名称 |
参 数 |
结 果 |
NULLIF |
expr1,expr2 |
如果两个表达式在比较之后是“相等”的情况,则返回NULL |
OBJECT_ID |
“object_name” |
返回数据库对象的名称 |
OBJECT_NAME |
“object_id” |
返回数据库对象的ID识别码 |
SUSER_ID |
[“server_user_name”] |
返回在服务器中用户的帐号名称 |
SUSER_NAME |
[“server_user_id”] |
返回在服务器中用户的ID 识别码 |
USER_NAME |
[“user_id”] |
返回用户的ID识别码 |
USER_ID |
[“user_name”] |
返回用户的帐号名称 |
STATS_DATE |
table_id,index_id |
返回最后一次修改索引的日期 |
6. 聚合函数
聚合函数可以返回“整个”、“数个数据行”或者“单一数据行”的总计信息。通常聚合函数都是配合SELECT语句查询行的统计信息。在MS-SQL Server中,常用的聚合函数计有:“AVG”、“SUM”、“COUNT”、“MAX”和“MIN”等。通常这些聚合函数都是与GROUP BY语句搭配使用的。在使用聚合函数时,有一点非常重要,“不能用于SELECT语句以及WHERE语句之中”。常用的聚合函数以及参数、说明如表8-11所示。
表8-11 常用的聚合函数
聚合函数 |
参 数 |
功 能 |
AVG |
[ALL|DISTINCT|expr] |
返回表达式的平均值 |
COUNT |
[ALL|DISTINCT|expr] |
返回在某个表达式中,数据值的大小。如果搭配DISTINCT关键词使用,将会自动删除重复的数值 |
COUNT |
(*) |
计算所有的行数,不能使用DISTINCT关键词 |
MAX |
Expr |
返回表达式中的最大值 |
MIN |
Expr |
返回表达式中的最小值 |
SUM |
[ALL|DISTINCT|expr] |
返回表达式所有数值的总和 |
8-4 Query Analyzer工具程序
在正式介绍Transact-SQL语句的语法之前,笔者必须要先为读者介绍测试Transact-SQL语法的工具程序——“Query Analyzer”。这是SQL Server所提供的工具程序,并且以互动的方式,输入Transact-SQL语句与程序的一种工具程序。以下是执行Query Analyzer的步骤:
(1)选择“程序”|Microsoft SQL Server|“查询分析器”命令。
(2)建立与MS-SQL Server的连接,如图8-2所示。
(3)选择希望连接的MS-SQL Server命名管道的名称,如图8-3所示。
(4)输入SQL Server上的帐号与密码。
完成与SQL Server连接的查询分析器。
在完成了与SQL Server连接之后,接着笔者将以本书范例系统所用的数据库“Trade”为范例,直接进行SQL Query的测试;测试步骤如下所示:
(1)改变数据库名称,将数据库更改为“Trade”,如图8-6所示。
(2)输入希望执行的SQL Query程序代码,如图8-7所示。
(3)SQL Query 执行之后的结果如图8-8所示。
(4)检查在SQL Query执行之后,系统所产生的信息内容,如图8-9所示。
同样的道理,当您的SQL Query程序内容有误时,系统会将错误的信息显示在“Messages”窗口内,作为修正SQL Query程序的参考。
8-5 Transact-SQL 语句语法
SQL是Structure Query Language结构化查询语言的缩写,通过SQL语句的执行,可以对数据库内容(表及记录)进行修改或查询。由于在许多数据库程序语言内都会支持SQL语言,因此对SQL语法有基本的认识非常重要。
不过并非每一个SQL语句在任何数据库软件中都可以运行,其实大部分的数据库软件都是属于部分支持SQL语言,而非完全支持。且每个软件所支持的范围也不一定相同,因此在使用特殊的SQL语句前,最好先确定数据库软件是否支持该语句。
基本上SQL语言可分为两类,一类是与数据定义有关的称为DDL (Data Define Language),另一类则是与表内的记录存取有关的称为 DML(Data Manipulation Language:将在下一节详细说明)。
SQL的DDL(Data Define Language)语言,是处理与数据库内数据有关的语句。它的指令范围包含自定义数据类型、新增表、修改表、建立表索引、设置Primary Key等动作。
不过一般来说,有关数据库的设置,通常是在数据库建立时直接在数据库软件中设置完成,反而较少会采用这种利用SQL DDL语言执行的方式,而且这些DDL无法通过Microsoft Jet数据库引擎来完成。
常用的DDL语言包含有Create Table语句、Drop Table语句及Alter Table语句。
8-5-1 Create Table语句
Create Table语句是在数据库内新增一个表;同时,也可设置表的索引。其语法格式如下所示:
CREATE TABLE
[ 数据库名称.[ 拥有人 ] . | 拥有人. ] 表名称
( { < 字段定义 >
| 字段名称 AS computed_column_expression
| < table_constraint > ::= [ CONSTRAINT constraint_name ] }
| [ { PRIMARY KEY | UNIQUE } [ ,...n ]
)
Create Table 表名称
(字段名称 数据类型 [(字段长度)] [NOT NULL] [With COMPRESSION|With COMP] [索引]
[,字段名称 数据类型 [(字段长度)] [NOT NULL][索引]]
[, CONSTRAINT 多字段索引]
范例程序:EX08-01.sql
例如:您可以利用下列的SQL语言,在数据库中建立一个名为“产品基本信息”的表。
请注意,在Create Table执行完成之后,上图中左方的“Object Browser”窗口并不会自动更新。因此,如果希望立即看到新增之后的结果时,请先选择“Trade”数据库,并且按下“F5”键,更新“Object Browser”窗口的内容。
程序内容
CREATE TABLE 产品基本信息
(产品代号 VARCHAR(5) NOT NULL,
产品名称 VARCHAR(10) NOT NULL,
产品类别 VARCHAR(5) NOT NULL ,
Constraint pk_product Primary Key (产品代号) )
程序说明
上述范例程序的内容部分,其数据字段说明如下。
表8-12 范例程序的数据说明
字段名称 |
数据类型 |
数据长度 |
允许空白 |
索引 |
产品代号 |
Varchar |
5 |
不允许 |
主索引 |
产品名称 |
Varchar |
10 |
不允许 |
无 |
产品类别 |
Varchar |
5 |
不允许 |
无 |
8-5-2 Alter Table语句
如果表的内容不符合规划者的要求,可以使用Alter Table语句,对数据库内现存的表内容进行修改。一般来说这个语句可以执行的功能包含了“增加表字段”、“修改表的索引设置”以及“Primary Key(Foreign Key)设置”等;使用的语法格式如下所示。
ALTER TABLE 表名称
{ [ ALTER COLUMN 字段名称
{ 新的数据类型 [ ( precision [ , scale ] ) ]
[ COLLATE < collation_name > ]
[ NULL | NOT NULL ]
| {ADD | DROP } ROWGUIDCOL }
]
| ADD
{ [ < column_definition > ]
| column_name AS computed_column_expression
} [ ,...n ]
| [ WITH CHECK | WITH NOCHECK ] ADD
{ < table_constraint > } [ ,...n ]
| DROP
{ [ CONSTRAINT ] constraint_name
| COLUMN column } [ ,...n ]
| { CHECK | NOCHECK } CONSTRAINT
{ ALL | constraint_name [ ,...n ] }
| { ENABLE | DISABLE } TRIGGER
{ ALL | trigger_name [ ,...n ] }
}
范例程序:EX08-02.sql
在“产品基本信息”表中,增加一个字段“产品单位”。
程序内容
alter table 产品数据 add 产品单位 char(6)
程序说明
新增字段名称之后,原有的表内容将更改为如表8-13所示的数据结构。
表8-13 改变后的表内容
字段名称 |
数据类型 |
数据长度 |
允许空白 |
索 引 |
产品代号 |
文字 |
5 |
不允许 |
主索引 |
产品名称 |
文字 |
10 |
不允许 |
无 |
产品类别 |
文字 |
5 |
不允许 |
无 |
产品单位 |
文字 |
6 |
允许 |
无 |
范例程序:EX08 -03.sql
将上述范例程序“EX08-02.sql”中,将产品单位的数据类型,从char(6)更改为varchar(16)。
程序内容
alter table 产品基本信息 alter column 产品单位 varchar(16)
程序说明
在执行本段程序代码之后,会将原来的字段属性(char(6))更改为Varchar数据类型并且长度设置为16个字符。
范例程序:EX08-04.sql
删除一个已经存在的字段名称。
程序内容
alter table 产品基本信息 drop column 产品单位
程序说明
字段名称之后,原有的表内容将更改为如表8-14所示的数据结构。
表8-14 更改后的表内容
字段名称 |
数据类型 |
数据长度 |
允许空白 |
索 引 |
产品代号 |
文字 |
5 |
不允许 |
主索引 |
产品名称 |
文字 |
10 |
不允许 |
无 |
产品类别 |
文字 |
5 |
不允许 |
无 |
8-5-3 Drop Table语句
Drop Table语句的功能是将一个现存于数据库内的表删除,其所使用的语法与格式如下所示:
Drop Table 表名称
范例程序:EX08-05.sql
删除“Trade”数据库中的“产品基本信息”表。
在执行上述的Drop Table语句之后,Query Analyzer将会从“Trade”数据库中删除一个名为“产品基本信息”的表,这段语句执行结果如图8-19所示。
程序内容
drop table 产品基本信息
8-6 数据处理语法(DML)
SQL的DML(Data Manipulation Language)语言主要是处理数据库中与记录内容有关的动作;同时,根据执行的指令动作是否会更改表存储的记录内容,可将DML指令分为两类。
一种是会使表内的记录产生异动的,如记录的添加、修改及删除等动作,这种会更改表记录内容的SQL语法又称为Active Query Language,执行Active Query Language时只能作用于单一表上,且不会返回信息。
常用的Active Query Language包含有Insert语句、Delete语句以及Update语句。
另一种则是不会更改表记录内容的指令,如查询动作,常用的指令有Select语句。不同于Active Query Language只能作用于单一表,执行这种查询指令可以同时作用于多个表中,而且执行完毕后,会返回符合查询条件的结果记录集合(Recordset)。
8-6-1 Select语句
Select语句是最常使用到的SQL语言,利用Select语句的执行可以对表的记录作查询、统计。Select语句的语法如下:
SELECT [predicate] { * | table.* | [table.]field1 [AS alias1] [, [table.]field2 [AS alias2] [, ...]]}
FROM tableexpression [, ...] [IN externaldatabase]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]
[WITH OWNERACCESS OPTION]
其中各部分说明如表8-15所示。
表8-15 语句中各部分的说明
部 分 |
语 句 |
Predicate |
以下所列语句之一:ALL,DISTINCT,DISTINCTROW或TOP。可以使用predicate来限制返回的记录的数量,如果没有指定语句,其默认值为ALL |
* |
从特定的单个或多个表中选取全部的字段 |
Table |
表的名称,此表中包含已被选取的记录的字段 |
field1, field2 |
包含了要撷取数据字段的名称。如果数据包含一个以上的字段,它们将被依序撷取 |
alias1, alias2 |
使用作为字段名的名称,以代替在table中原有的字段名 |
Tableexpression |
包含了要撷取的数据的单个或以上的表的名称 |
externaldatabase |
包含了tableexpression中的表的数据库的名称,如果这些表不存在于目前的数据库中 |
由上述的Select语句可以发现可用的关键词非常多,必须先了解这些关键词所代表的意义以及使用方式,才能善用这些关键词查询所需的数据。
1. FROM子句
指定表或查询,且该表或查询包含了存放在SELECT语句中的字段。因此,From子句与Select语句的搭配,可以说是最精简的Select语句,通过Select及From两个关键词的设置来取得表中的数据。
Select 字段名称 [,字段名称]
From 表名称
其中,From关键词是设置来源表名称,这是Select语句执行的第一步,使用时可以设置使用一个或多个表,而表名称间以逗号分隔。
Select关键词是设置要取得数据的字段名称,这个关键词会在Select语句的最后一步执行,在搜寻结果中取出所需的字段内容,设置的字段名称以逗号分隔,如果要取得表上的所有字段,可直接用“*”表示。
范例程序:EX08-06.sql
通过执行下列的Select 语句之后,可以从“Trade”数据库中将“产品基本信息”表的所有记录,同时取出“产品名称”以及“产品类别”两个字段的内容。程序代码与执行结果如下所示:
程序内容
SELECT 产品名称, 类别编号
FROM 产品基本数据;
2. Select All与Select Distinct
在Select 之后可加上一个关键词ALL或DISTINCT,ALL(默认)代表显示所有符合的记录内容,而Distinct则是采用非重复显示数据的模式。例如在“Trade”数据库中,执行下列查询指令,可以从“产品基本信息”表中取出“类别编号”字段的内容。
范例程序:EX08-07.sql
使用“Select ALL”取得字段内所有的内容,会返回2条记录。
SELECT ALL 类别编号
FROM 产品基本信息;
使用Select Distinct语句,将不重复取得字段内的数据,故只会返回1条记录。
程序内容
SELECT DISTINCT 类别编号
FROM 产品基本信息;
3. Select As
用Select取得的查询字段名称是使用来源表所设置的名称,若要修改取得数据的字段名称或是要增加虚拟的字段,可以利用AS关键词来设置别名。
范例程序:EX08-08.sql
在“Trade”数据库中执行下列查询语句时,可以从“产品基本信息”表中,取出“产品代号”以及“产品名称”两个字段的内容,同时在查询中建立一个虚拟字段“金额”,用以存储“单价”与“币别”汇率的乘积。
程序内容
SELECT 产品代号, 产品名称, 单价*35 AS 金额
FROM 产品基本信息;
4. Join子句
前面曾提到Select语句可作用于多个表,使用时将表名输入在关键词From之后,并以逗号分开,不过使用这种方式,表间并不具有任何的关联。如果表间具有关联性,则可以在表间加上Join关键词,产生数据连接。
范例程序:EX08-09.sql
从“产品基本信息”以及“产品类别”两个表中,分别取出“产品名称”以及“类别名称”字段的内容。
程序内容
SELECT 产品基本信息.产品名称, 产品类别.类别名称 FROM 产品基本信息, 产品类别
由于在“产品基本信息”以及“产品类别”两个表之间,并未以任何的方式产生关联性。因此,在执行上述Select语句之后,会将“产品基本信息”以及“产品类别”两个表中所有的记录全部列出,因而产生了如图8-23所示的6条记录。
· 如果利用了JOIN语句时,可以改善这类缺点。
· 如果利用JOIN关键词,在数据库查询中输入下列指令。
范例程序:EX08-10.sql
SELECT 产品基本信息.产品名称, 产品类别.类别名称
FROM 产品类别 INNER JOIN 产品基本信息
ON 产品基本信息.类别编号=产品类别.类别编号;
这时“产品基本信息”与“产品类别”两个表之间,将会以“类别编号”字段的内容作为关联。因此“产品基本信息”内的记录只会与“产品类别”内有相同的“类别编号”字段记录产生连接。
如果在查询中使用多个表时,如果表内有相同的字段名称,使用时必须指定表名称。指定的方式是在字段名称前加上表名称,并以“.”分隔,例如,“产品基本信息.产品名称”。
5. Where关键词
Where关键词是设置查询记录条件,用以取得所有符合设置条件内容的记录。在条件设置中可以使用 > 、<、=等比较符号,而对于多项条件的判断也可以利用AND,OR等逻辑操作数来连接。
范例程序:EX08-11.sql
我们可以利用下列语句查询“产品基本信息”表内“类别编号”字段等于“0001”的记录。
程序内容
SELECT *
FROM 产品基本信息
WHERE 产品代号='0001000002'
范例程序:EX08-12.sql
在Where条件式中,也可以利用Like关键词来进行模糊搜寻。当执行下列指令,会得到“产品代号”中所有产品代号以“0001”开头的记录。
程序内容
select *
from 产品基本信息
Where 产品代号 like '0001%'
如果使用Like条件式必须注意,SQL Server 是以“%”作为万用字符。如果希望搜寻的字符串是位于记录的中间时,则上述程序代码应以下列方式编写:
select *
from 产品基本信息
Where 产品代号 like '%0001%'
范例程序:EX08-13.sql
此外,还可以利用IN关键词作为数据集合条件的设置,可以利用下列指令取出“产品代号”为“0001000001”的记录。
程序内容
SELECT *
FROM 产品数据
WHERE 产品代号 in ('01001','02002','03003');
6. Order By关键词
Order By是设置查询的结果会以哪个字段的内容做数据排序,在使用时可以设置一个或多个字段,并在字段间用逗号分隔。若设置以多字段排序,则会按输入字段的顺序,设置排序的优先等级。
对于每个排序字段可以设置排序的方式(递增或递减),系统默认是以递增排列(ASC),若要设置字段为递减排列,则可在字段名称后加上关键词DESC。
范例程序:EX08-14.sql
我们可以利用下列查询指令对“产品数据”表的内容先以“类别”字段进行递增排序,再以“产品代号”进行递减排序。
程序内容
SELECT *
FROM 产品基本信息
ORDER BY 类别编号, 产品代号 DESC;
7. 数据群组-Group By关键词
Group By关键词的作用是对数据的内容进行群组化,使用的方式是将做群组化动作所依据的字段名称定义在Group By关键词后,如果定义使用多个字段名称,则必须设置的字段内容都相同,才会合并在一起。
范例程序:EX08-15.sql
例如,在执行下列所示的程序代码之后,会将“产品基本信息”表中的“类别编号”字段的内容以群组的方式显示出来。
程序内容
Select 类别编号
From 产品基本信息
Group By 类别编号
8. Select into语句
Select Into语句是将Select结果存储在一个新的表内,使用的语法与Select语句相似,只是在From关键词前加上Into关键词及新的表名称,这个语句通常被用来备份数据。
范例程序:EX08-16.sql
在执行下列所示的程序代码之后,会将“产品基本信息”表中的所有纪录,建立并且存储在“产品信息备份”的表中。
程序内容
Select *
Into 产品信息备份
From 产品基本信息
Into关键词后面所接的是新表名称,在使用时必须确定该名称不存在,否则执行该SQL语句会发生错误。使用Select Into语句所建立的新表会继承来源数据库的字段属性,但不包括索引(Index,Primary Key及Foreign Key)设置。
图8-30 执行Select Into 语句之后的数据库状态
8-6-2 Active Query - Insert语句
Insert语句是在表中加入记录,使用时表的字段名称与设置的内容必须能相互对应,也就是字段个数必须等于内容值个数,内容值的数据类型必须与字段设置的数据类型相同,使用的语法格式如下所示:
多重记录新增查询:
INSERT INTO target [(field1[, field2[, ...]])] [IN externaldatabase]
SELECT [source.]field1[, field2[, ...] FROM tableexpression
单一记录新增查询:
INSERT INTO target [(field1[, field2[, ...]])] VALUES (value1[, value2[, ...]]
以上语句的说明如表8-16所示。
表8-16 语句的具体说明
部 分 |
语 句 |
Target |
欲添加记录的表或查询的名称 |
field1, field2 |
如果其后为target自变量,指欲添加数据的字段名称;如果其后为source自变量,则指欲从其取得数据的字段名称 |
续表
部 分 |
语 句 |
externaldatabase |
至外部数据库的路径有关路径的信息,请参阅IN子句 |
source |
复制记录的来源表或查询的名称 |
tableexpression |
欲插入数据至其中的一个或多个表的名称,此自变量可为单一表名称、一个已存储的查询,或由INNER JOIN、LEFT JOIN或RIGHT JOIN合成的结果 |
value1, value2 |
欲插入至添加记录的特定字段值,每一个值将按照排列中的位置顺序插入至相关字段中: value1将被插入至添加记录的field1之中,value2插入至field2,依此类推。必须使用逗点将这些值分隔,并且将文字字段用引号 (' ')括起来。 |
可以使用INSERT INTO语句来添加一个单一记录至一个表中,如以上所示使用单一记录添加查询语法。在这种例子中,程序代码指定了每一字段的记录名称和值,您必须指定想要分配每一记录字段的值以及在此字段的值。如果没有指定每一个字段时,默认值或Null值将被插入至没有数据的字段中,这些记录将被添加至表的尾部。
您也可以使用INSERT INTO从其他的表新添加一组记录,或使用 SELECT来查询FROM子句,如以上所示的多重记录新增查询语法。也可以从另一表或查询使用INSERT INTO添加一组记录。在这个范例中,SELECT子句将指定新增字段至指定的target 表中。
source或target表可以指定一个表或查询。如果指定查询,Microsoft Jet数据库引擎会将记录添加到任何被此查询所指定的表。INSERT INTO是选择性的,但当使用时,请置于SELECT语句之前。
如果目的表包含一个主索引,确定添加至主索引字段的值是唯一且不为空值;如果没有这样做,Microsoft Jet 数据库引擎将不会添加记录。
如果使用自动编号字段添加记录至一个表中,并且要将添加记录重新编号,则不要包含自动编号字段在查询之中。如果要保持字段中的原始值,请将自动编号加在查询之中。
如果希望建立一个新的表,使用SELECT...INTO语句建立产生表查询。如果希望在执行添加查询之前找出哪些记录是被添加的,首先执行和查看一个使用相同选取范围准则的选取查询所获得的结果。
除了从另一表中来添加现存的记录,还可以指定在单一添加记录之中使用VALUES子句来指定对每一字段的值。如果省略字段清单,VALUES 子句在表中必须包含每一字段的值;否则,INSERT运算将会失败。使用额外的INSERT INTO语句与一个VALUES子句来建立每一个额外的记录。
范例程序:EX08-17.sql
例如,希望在“产品基本信息”表中,添加一条记录时,可以输入如下所示的Insert语句内容,并且在正常执行之后,将会见到如图8-31所示的画面。
程序内容
Insert Into 产品基本信息(产品代号, 产品名称, 类别编号,
产品简述, 单价, 币别, 交货期, 新上市, 备注 )
Values('00010000003', '多功能电源插座', '0001',
'多功能电源插座', 3.2, 'US', '30~40', 1, '功能详述如下')
8-6-3 Active Query - Delete 语句
如果希望从指定的表中删除记录,则可以通过使用Delete语句From 子句的协助,从一个或多个表中删除记录。以下是Delete语句的语法格式:
DELETE [table.*]
FROM table_name
WHERE criteria
DELETE 语句可分为以下几个部分:
表8-17 Delete 语句的说明
部 分 |
说 明 |
table |
从其删除记录的表的选择性名称 |
Table_name |
希望删除记录的表名称 |
准则 |
一个条件表达式,用以决定应该删除的记录 |
可以使用DELETE语句,进行多条记录删除。同时,也可以使用DROP语句,从数据库中删除整个表。不过,如果以此方法删除表,将会失去表的结构。与Drop语句不同的地方是,当您使用 DELETE,仅只有数据会被删除,表的结构以及表的所有属性仍然保留,例如字段及索引的属性。
可以使用DELETE从表中删除记录,且该表与其他表有一对多的关联。当在一个查询中删除与其他表有对应关联的记录时,串接删除运算将会删除在表之中与此删除记录有关的多方面关联。例如:“产品基本信息”与“产品类别”表之间的关联,“产品类别”是属于关联的一方,且“产品基本信息”表是存在另外多方的关联。如果指定使用串接删除,从“产品类别”表中删除一条记录时,相对应的“产品基本信息”表内的记录也会被删除。
删除查询不只删除指定字段之中的数据,也可以删除全部的记录。如果要删除在一个特定字段中的值,请建立一个更新查询,将值改为空。
特别说明 当您使用删除查询删除记录之后,无法恢复此运算。如果想要知道哪些记录已被删除,首先使用相同的准则检验选取查询的结果,然后执行删除查询。
随时将数据作维护复制备份。如果误删除记录,可以从备份中将数据挽救回来。
范例程序:EX08-18.sql
例如:希望删除在“产品基本信息”表中“产品代号”字段具有“0002”的记录内容时,所使用的Delete语句程序以及执行结果如下所示。
程序内容
Delete
From 产品基本信息
Where 产品代号 Like '%0002%';
Select *
From 产品基本信息;
8-6-4 Active Query - Update 语句
如果希望更新表中记录的内容,可以使用Update语句来建立一个更新查询,并且更改特定准则的特定表中的字段值。当用户在建立 Update语句的同时,如果忽略了Where条件式的输入,则代表修改表内所有记录的内容,Update 语句的语法格式如下所示。
UPDATE table SET newvalue WHERE criteria;
UPDATE 语句可分为以下几个部分:
表8-18 UPDATE语句说明
部 分 |
语 句 |
table |
在其中包含了要修改的数据的表名称 |
newvalue |
一个表达式用以决定在更新记录中要插入在特定字段的值 |
准则 |
一个表达式用以决定要被更新的记录,只有满足表达式条件的计录才会被更新 |
特别说明 UPDATE 不产生结果数据集。并且,当使用更新查询更新记录之后,便无法恢复这项操作。如果想知道哪些记录已被更新,首先检验使用相同准则的选取查询结果,然后执行更新查询。
范例程序:EX08-19.sql
如果希望修改上一节中使用Insert Into 语句添加记录的“产品代号”时,程序的编写以及执行的结果如下所示:
程序内容
Update 产品基本信息
Set 产品代号='000100000035'
where 产品代号='00010000003';
Select *
From 产品基本信息;