第三章 SQL Server 数据管理

  从本章开始,就接触到了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 = '北京女子职业技术学校'

  前面已经提到,在T-SQL表达式中,可以使用列名和数值。如果学员在考试时,有一道题目的标准答案错了,导致评分失误,事后需要在成绩表中更新成绩,所有低于95分的都在原来的基础上加5分,更新的SQL语句如下:

  Update Scores Set Scores = Scores + 5 where Scores <= 95

3.5 使用T-SQL删除数据

  删除数据行也是经常会用到的操作,使用SQL语句来操作相对比较简单。

3.5.1 使用Delete删除数据

  使用T-SQL删除表中的数据,语法格式为:

  Delete From <表名> [Where <删除条件>]

  在学员信息表中删除姓名为“张三”的SQL语句如下:

  Delete from Students where name = '张三'

  还有一种情况是,如果要删除的行的主键值被其他表引用,例如分数表中的StudentID引用了学员信息表中的Scode字段,那么删除被引用的行时:

  Delete from Students where Scode = 22

  SQL Server 将报告与约束冲突的错误信息。

3.5.2 使用Truncate Table删除数据

  Truncate Table 用来删除表中的所有行,功能上它类似于没有Where子句的Delete语句。

  例如,要删除学员信息表中的所有记录行,可以使用:

  Truncate Table Students

  但Truncate Table比Delete 执行速度快,而且使用的系统资源和事务日志资源更少。

  Truncate Table 删除表中的所有行,但是表的结构、列、约束、索引等不会被改动,Truncate Table 不能用于有外键约束引用的表,这种情况下,需要使用Delete语句。

  

 

posted @ 2013-06-02 21:45  Emotiona°  阅读(565)  评论(0编辑  收藏  举报