第三章 SQL Server 数据管理
从本章开始,就接触到了SQL语句的使用,首先介绍使用SQL语句进行数据插入、修改和删除操作。 3.1 SQL简介 在进行数据管理时,如果每次创建数据库、表或者从数据库中读取数据,都需要手动在SQL Server Management Studio中进行的话,不但管理不方便,而且存储
从本章开始,就接触到了SQL语句的使用,首先介绍使用SQL语句进行数据插入、修改和删除操作。
3.1 SQL简介
在进行数据管理时,如果每次创建数据库、表或者从数据库中读取数据,都需要手动在SQL Server Management Studio中进行的话,不但管理不方便,而且存储在数据库中的数据也根本无法提供给程序使用。所以,数据库也需要一套指令集,能够识别指令、执行相应的操作并为程序提供数据。
目前标准的指令集就是SQL。
3.1.1 SQL和T-SQL
SQL语言是1974年由Boyce和Chamberlin提出来的,1975-1979年IBM公司研制的关系数据库管理系统原形系统SystemR实现了这种语言,经过多年的发展,SQL语言已成为关系数据库的标准语言。
SQL语言不同于Java、C#这样的程序设计语言,它只是数据库能够识别的指令;但是在程序中,可以组织SQL语句发送给数据库,数据库再执行相应的操作,例如:在C#程序中要得到SQL Server数据库表中的记录,可以在C#程序中编写SQL查询语句,然后发送到数据库,网站空间,数据库根据查询的SQL语句进行查询,再把查询的结果返回给C#程序。
T-SQL(Transact-SQL)是标准SQL的加强版,除了标准的SQL命令之外,还对SQL命令做了许多扩充,提供类似于Java语言的基本功能,如变量说明、流程控制、功能函数等。
3.1.2 T-SQL的组成
T-SQL语言主要由以下几个部分组成。
DML(数据操作语言):用来查询、插入、删除和修改数据库中的数据,如 SELECT、Insert、Update及Delete等。
DCL(数据控制语言):用来控制数据库组件的存取许可、存取权限等,如Grant、Revoke等。
DDL(数据定义语言):用来建立数据库、数据库对象和定义其列,大部分是以Create开头的命令,如Create Table、Create View及Drop Table等。
除此之外,T-SQL还包括变量说明、内嵌函数以及其他的命令等。
3.2 T-SQL中的条件表达式和逻辑运算符
与Java语言一样,表达式是符号和运算符的组合,并且可以对它求值得到单个数据值。简单表达式可以是一个常数、变量、列或标量函数,可以用运算符把两个或多个简单表达式连接成一个复杂表达式。
3.2.1 条件表达式
SQL Server中的表达式可以包含下列一个或多个参数。
常量:表示单个指定数据值的符号。一个常量由一个或多个字母、数字字符(字母a~z、A~Z、数字0~9)或符号(!、@、#等)组成。字母和DateTime需要用引号括起来,而二进制字符串和数字常量则不需要。
列名:表中列的名称,表达式中仅允许使用列的名称。
{一元运算符}:仅有一个操作数的运算符,其中“+”表示正数,“-”表示负数,“~”表示补数运算符。
{二元运算符}:将两个操作数组合执行操作的运算符。二元运算符可以是算术运算符、赋值运算符(=)、位运算符、比较运算符、逻辑运算符、字符串串联(或连接)运算符(+)或一元运算符。比较运算符及其含义如图。
运算符 含义
= 等于
> 大于
>= 大于或等于
不等于
! 非
可以用这些运算符组成条件表达式。例如:我们可以编写以下代码:
PRICE > 100
Name Like '李%'
GRADE '3'
某些T-SQL语句中还可以使用图中的通配符运算符。
通配符 解释 示例
'_' 一个字符 A Like 'C_'
% 任意长度的字符串 B Like 'CO_%'
[] 括号中所指定范围内的一个字符 C Like '9W0[1-2]'
[^] 不再括号中所指定范围内的任意一个字符 D LIKE like '9W0[^1-2]'
通配符经常与Like关键字一起配合使用,例如可以使用Like和通配符来完成对表的一些特殊约束,例如,要求表中的电话号码列输入的格式为11位手机号、可以编写以下的约束:
TelCode Like '13[5-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
在查询中也经常会用到Like语句。
3.2.2 逻辑表达式
T-SQL支持的逻辑运算符有And、OR和Not。
And和Or运算符连接条件,Not否定条件。And连接条件,并且仅当两个条件都为真时才返回True。OR也连接两个条件,但只要其中任意一个为真就返回True。
当一个语句中使用了多个逻辑运算符时,首先求Not的值,然后求And的值,最后再求Or的值。
例如采购订单表中的付款方式是信用卡,约束要求只能是牡丹卡、金穗卡、龙卡或者阳光卡,可以编写如下的约束表达式:
Not (付款方式 = '信用卡') OR (信用卡 IN ('牡丹卡','金穗卡','龙卡','阳光卡'))
IN关键字用来限制范围。在查询中也经常会用到逻辑表达式。
3.3 使用T-SQL插入数据
已经了解了如何创建表,修改表的结构和添加约束,现在需要了解一下如何向表中添加数据。
在SQL Server Management中插入数据比较简单,只要选择表,然后在快捷菜单中选择“打开表”选项,就可以向表中直接输入数据行。
使用T-SQL可以想表中添加新数据,也可以将现有表中的数据添加到新创建的表中。
3.3.1 使用Insert插入数据行
使用Insert语句一行一行地插入数据是最常用的方法,其语法格式如下:
Insert [Into] [列名] Values
其中:
[Into] 是可选的,可以省略。
表名是必需的,表的列名是可选的,如果省略,将依次插入。
多个列名和多个值列表用逗号分隔。
例如以下的语句,向学员表中插入一行数据
Insert into Students (Name, Address, Grade, Email, Sex) Values ('张三', '上海', 6, '123@163.com', 0)
SQL语句的执行一般在查询窗口中进行。
检验SQL语句是否正确执行,可以再打开表查看数据项是否正确添加。
在插入数据的时候,需要注意以下事项。
每次插入一整行数据,不可能只插入半行或者几列数据,如果违反字段的非空约束,那么插入语句会检验失败。
数据值的数目必须与列数相同,每个数据值的数据类型、精度和小数位数也必须与相应的列匹配。
Insert语句不能为标识列指定值,因为它的数字是自动增长的。
对于字符类型的列,当插入数据的时候,最好用单引号将其引起来,因为字符中包含了数字的时候特别容易出错。
尽管可以不指定列名,但是最好明确指定插入的列和对应的值,以做到“心中有数”。
如果在设计表的时候指定某列不允许为空,则该列必须插入数据,香港虚拟主机,否则将报告错误信息。
插入的数据项,要求符合检查约束的要求,例如我们在前面设置了Email字段必须包含一个字符@,如果插入的语句修改为:
Insert into Students (Name, Address, Grade, Email, Sex) Values ('张三', '上海', 6, '123', 0)
执行该语句后,将提示与表的约束相冲突,插入失败。
还有一个问题就是如果指定了列名,如何为具有默认值的列插入数据? 例如以上学员信息表中的地址信息是具有默认值的。这个时候可以使用Default(默认)关键字来代替插入的数值,插入语句如下:
Insert into Students (Name, Address, Grade, Email, Sex) Values ('张三', Default, 6, '123', 0)
3.3.2 一次插入多行数据
一次插入多行数据有三种方法,下面分别讲解。
1. 通过Insert Selete语句将现有表中的数据添加到新表中。
例如,如果创建一张新表来存储本班的通讯录信息,则可以从学员表中提取相关的数据,SQL语句如下:
Insert into TongXunLu (姓名,地址,电子邮件) Select Name, Address, Email From Students
Select语句用于查询,上面的SQL用来把学员信息表中已经存在的姓名、地址和E-mail信息插入到新的TongXunLu表,避免了录入大量重复的数据项。
需要注意以下两点。
(1)查询得到的数据个数、顺序、数据类型等,必须与插入的项保持一致。
(2)TongXunLu表必须预先创建好,并且具有姓名、地址和电子邮件三个字段。
2. 通过Select Into语句将现有表中的数据添加到新表中。
与上面的Insert into 类似,Select Into语句也是从一个表中选择一些数据插入到新表中,香港空间,所不同的是,这个新表是执行查询语句的时候创建的,不能够预先存在。
例如,以下的T-SQL语句:
Select Students.Name, Students.Address, Student.Email Into TongXunLu From Students
将创建新表TongXunLu,把Students表中的Name、Address、Email作为TongXunLu表的新列,并且把查询到的数据全部插入到新表中。
在向一个新表插入数据的时候,又会牵涉到一个新的问题:如何插入标识列?
因为标识列的数据是不允许指定的,因此我们可以创建一个新的标识列,语法如下。
Select IDENTITY (数据类型,标识种子,标识增长量) AS 列名 Into 新表 From 原始表
上面的语句可以修改为:
Select Students.Name, Students.Address, Students.Email, IDENTITY(int, 1, 1) AS StudentID Into TongXunLu From Students
3. 通过Union 关键字合并数据进行插入
Union 语句用于将两个不同的数据或查询结果组合成一个新的结果集。
当然,不同的数据或查询结果,也要求数据个数、顺序、数据类型都一致,因此,当向表中重复插入多次数据的时候,可以使用Select···Union来简化操作。
例如,以下的T-SQL语句。
Insert Students (Name, Grade, Sex) Select '张三', 7, 1 Union Select '李四', 3, 2 Union Select '王五', 5, 5 Union Select '刘六', 6, 6
这样的效果其实与上面Insert···Select的效果是一样的,只不过多行数据是手写的,然后用Union合并组合成多行,最后把这些多行数据一起插入。
3.4 使用T-SQL更新数据
数据更新是经常发生的事情,使用T-SQL可以进行数据更新。
使用T-SQL更新表中某行的语法如下:
UPDATE Set [WHERE ]
其中:
Set 后面可以紧随多个数据列的更新值,不限一个。
Where 子句是可选的,用来限制条件。如果不限制,则整个表的所有数据行将被更新。
需要注意的是,使用Update语句,可能更新一行数据,也可能更新多行数据,也可能不会更新任何数据。
例如,在学员信息表中,要把所有学员的性别都改为0(女性)。
Update Students Set Sex = 0
学员的地址如果不输入默认值都为“北京女子职业技术学校”,如果这个班级改为学院,则需要按照条件进行更新。
Update Students Set Address = '北京女子职业技术学院' where Address = '北京女子职业技术学校'