
5.2 数据操作语句
数据操作语句(Data Manipulation Language,DML)是使用户能够查询数据库及操作已有数据库中数据的语句,其中包括数据库插入语句、数据更改语句、数据删除语句和数据查询语句等。本节将介绍这些内容。
5.2.1 数据的插入——INSERT
向已创建好的数据表中插入记录,可以一次插入一条记录,也可以一次插入多条记录。插入表中的记录中的值必须符合各个字段值数据类型及相应的约束。INSERT语句基本语法格式如下:

- table_name:指定要插入数据的表名。
- column_list:指定要插入数据的那些列。
- value_list:指定每个列对应插入的数据。
提示
使用该语句时字段列和数据值的数量必须相同,value_list中的这些值可以是DEFAULT、NULL或者是表达式。DEFAULT表示插入该列在定义时的默认值;NULL表示插入空值;表达式将插入表达式计算之后的结果。
在演示插入操作之前,将数据库的名称company重新修改为test_db,语句如下:

准备一张数据表,这里定义名称为teacher的表,可以在test_db数据库中创建该数据表,创建表的语句如下:

执行操作后刷新表节点,即可看到新添加的teacher表,如图5-2所示。

图5-2 添加teacher表
【例5.8】向teacher表中插入一条新记录,输入语句如下。

执行语句后,结果如图5-3所示。

图5-3 向teacher表中插入一条记录
插入操作成功,可以从teacher表中查询出一条记录。
【例5.9】向teacher表中插入多条新记录,T-SQL代码如下。

执行结果如图5-4所示。

图5-4 向teacher表中插入多条记录
对比插入前后的查询结果,可以看到现在表中已经多了3条记录,插入操作成功。
5.2.2 数据的更改——UPDATE
表中有数据之后,接下来可以对数据进行更新操作,SQL Server使用UPDATE语句更新表中的记录,可以更新特定的行或者同时更新所有的行。UPDATE语句的基本语法结构如下:

column_name1,column_name2,……,column_nameN为指定更新的字段的名称;value1,value2,……,valueN为相对应的指定字段的更新值;condition指定更新的记录需要满足的条件。更新多个列时,每个“列=值”对之间用逗号隔开,最后一列之后不需要逗号。
1.指定条件修改
【例5.10】在teacher表中,更新id值为1的记录,将birthday字段值改为‘1980-8-8’,将cellphone字段值改为‘0018600’,输入语句如下。

对比执行前后的结果如图5-5所示。

图5-5 指定条件修改记录
对比前后的查询结果,可以看到,更新指定记录成功。
2.修改表中所有记录
【例5.11】在teacher表中,将所有老师的电话都修改为‘01008611’,输入语句如下。

代码执行后的结果如图5-6所示。

图5-6 同时修改teacher表中所有记录的cellphone字段
由结果可以看到,现在表中所有记录的cellphone字段都有相同的值,修改操作成功。
5.2.3 数据的删除——DELETE
数据的删除将删除表的部分或全部记录,删除时可以指定删除条件从而删除一条或多条记录;如果不指定删除条件,DELETE语句将删除表中所有的记录,清空数据表。DELETE语句的基本语法格式如下:

- table_name为执行删除操作的数据表。
- WHERE子句指定删除的记录要满足的条件。
- condition为条件表达式。
1.按指定条件删除一条或多条记录
【例5.12】删除teacher表中id等于1的记录,输入语句如下。

执行结果如图5-7所示。

图5-7 按指定条件删除一条记录
由结果可以看到,代码执行之后,SELECT语句的查询结果为空,删除记录成功。
2.删除表中所有记录
使用不带WHERE子句的DELETE语句可以删除表中的所有记录。
【例5.13】删除teacher表中所有记录,输入语句如下。

执行结果如图5-8所示。

图5-8 删除表中所有记录
对比删除前后的查询结果,可以看到,执行DELETE语句之后,表中的记录被全部删除,所以第二条SELECT语句的查询结果为空。
5.2.4 数据的查询——SELECT
对于数据库管理系统来说,数据查询是执行频率最高的操作,是数据库中非常重要的部分。T-SQL中使用SELECT语句进行数据查询,SELECT语句的基本语法结构如下:

- ALL:指定在结果集中可以包含重复行。
- DISTINCT:指定在结果集中只能包含唯一行。对于DISTINCT关键字来说,NULL值是相等的。
- {* | <字段列表>}:包含星号通配符和字段列表,“*”表示查询所有的字段,“字段列表”表示查询指定的字段,字段列至少包含一个子段名称,如果要查询多个字段,多个字段之间用逗号隔开,最后一个字段后不要加逗号。
- FROM table_name | view_name:表示查询数据的来源。table_name表示从数据表中查询数据,view_name表示从视图中查询。对于表和视图,在查询时均可指定单个或者多个。
- WHERE <condition>:指定查询结果需要满足的条件。
- GROUP BY <字段名>:该子句告诉SQL Server显示查询出来的数据时,按照指定的字段分组。
- [ORDER BY <字段名>]:该子句告诉SQL Server按什么样的顺序显示查询出来的数据,可以进行的排序有:升序(ASC)、降序(DESC)。
为了演示本节介绍的内容,可以在指定的数据库中建立下面的数据表,并插入记录数据。

执行语句后,查看stu_info表的数据,结果如图5-9所示。

图5-9 创建stu_info表
1.基本SELECT查询
【例5.14】查询stu_info表中的所有学生信息,输入语句如下。

执行结果如图5-10所示。

图5-10 查询stu_info表中所有学生信息
可以看到,使用星号(*)通配符时,将返回所有列,列按照定义表的时候的顺序显示。
2.查询记录中指定字段
有时候,并不需要数据表中的所有字段的值,此时,可以指定需要查询的字段名称,这样不仅显示的结果更清晰,而且能提高查询的效率。
【例5.15】查询stu_info数据表中学生的姓名和成绩,输入语句如下。

代码执行结果如图5-11所示。

图5-11 查询stu_info数据表中学生的姓名和成绩字段
3.在查询结果中使用表达式
【例5.16】不修改数据表,查询并显示所有学生的成绩降低5分后的结果,输入语句如下。

代码执行结果如图5-12所示。

图5-12 在查询结果中使用表达式
这里s_score-5表达式后面使用了AS关键字,该关键字表示为表达式列指定一个用于显示的字段名称,这里AS为一个可选参数,也可以不使用。
提示
这里的s_score-5表达式中减号为英文状态下输入的符号,如果在中文状态下输入,运行将会报错。
4.显示部分查询结果
当数据表中包含大量的数据时,可以通过指定显示记录数限制返回的结果集中的行数,方法是在SELECT语句中使用TOP关键字,其语法格式如下:

TOP后面有两个可选参数,n表示从查询结果集返回指定的n行,PERCENT表示从结果集中返回指定的百分比数目的行。
【例5.17】查询stu_info中所有的记录,但只显示前3条,输入语句如下。

代码执行结果如图5-13所示。

图5-13 返回stu_info表中前3条记录
5.带限定条件的查询
数据库中如果包含大量的数据,根据特殊要求,可能只须查询表中的指定数据,即对数据进行过滤。在SELECT语句中通过WHERE子句,对数据进行过滤。
【例5.18】查询stu_info表中所有性别为‘男’的学生的信息,输入语句如下。

代码执行结果如图5-14所示。

图5-14 带限定条件的查询
由返回结果可以看到,返回了4条记录,这些记录有一个共同的特点,就是其s_sex字段值都为‘男’。
相反的,可以使用关键字NOT来查询与条件范围相反的记录。
【例5.19】查询stu_info表中所有性别不为‘男’的学生的信息,输入语句如下。

代码执行结果如图5-15所示。

图5-15 NOT限定条件查询
可以看到,返回的结果集中,所有记录的s_sex字段值为非‘男’,即查询女同学的信息。当然,这里只是为了说明NOT运算符的使用方法,读者也可以在WHERE子句中直接指定查询条件为s_sex=‘女’。
6.带AND的多条件查询
使用SELECT查询时,可以增加查询的限制条件,这样可以使查询的结果更加精确。SQL Server在WHERE子句中使用AND操作符,限定必须满足所有查询条件的记录才会被返回。可以使用AND连接两个甚至多个查询条件,多个条件表达式之间用AND分开。
【例5.20】查询stu_info表中性别为‘男’并且成绩大于80的学生信息,输入语句如下。

代码执行结果如图5-16所示。

图5-16 带AND运算符的查询
返回查询结果中所有记录的s_sex字段值为‘男’,其成绩都大于80,同时满足这两个查询条件。
7.带OR的多条件查询
与AND相反,在WHERE声明中使用OR操作符,表示只需要满足其中一个条件的记录即可返回。OR也可以连接两个甚至多个查询条件,多个条件表达式之间用OR分开。
【例5.21】查询stu_info表中成绩大于80,或者年龄大于18的学生信息,输入语句如下。

代码执行结果如图5-17所示。

图5-17 带OR运算符多条件查询
由返回结果可以看到,第1条和第4条记录满足WHERE子句中的第一个大于80分的条件,第2条和第3条记录虽然其s_score字段值不满足大于80分的条件,但是其s_age年龄字段满足了WHERE子句中第二个年龄大于18岁的条件,因此也是符合查询条件的。
8.使用LIKE运算符进行匹配查询
前面介绍的各种查询条件中,限定条件是确定的,但是某些时候,不能明确地指明查询的限定条件,此时,可以使用LIKE运算符进行模式匹配查询,在查询时可以使用如下的几个通配符,如表5-2所示。
表5-2 各种通配符的含义

【例5.22】在stu_info数据表中,查询所有姓‘马’的学生信息,输入语句如下。

代码执行结果如图5-18所示。

图5-18 查询所有姓名以“马”开头同学的记录
数据表中只有一条记录的s_name字段值以字符‘马’开头,符合匹配字符串‘马%’。
【例5.23】查询stu_info表中所有姓“张”、姓“王”、姓“李”的学生信息,输入语句如下。

代码执行结果如图5-19所示。

图5-19 查询所有姓名以“张”、“王”或“李”开头同学的记录
由返回结果可以看到,这里返回的3条记录的s_name字段值分别是以张、王或者李这3个姓中的某一个开头的,只要是以这3个姓开头的,不管后面还有多少个字符都是满足LIKE运算符中匹配条件的。
9.使用BETWEEN AND进行查询
BETWEEN AND运算符可以对查询值限定一个查询区间。
【例5.24】查询stu_info表中成绩大于50小于90的学生信息,输入语句如下。

代码执行结果如图5-20所示。

图5-20 使用BETWEEN AND运算符查询
由返回结果可以看到,这里3条记录的s_score字段的值都是大于50小于90,满足查询条件。
10.对查询结果排序
在说明SELECT语句语法时介绍了ORDER BY子句,使用该子句可以根据指定的字段的值,对查询的结果进行排序,并且可以指定排序方式(降序或者升序)。
【例5.25】查询stu_info表中所有学生信息,并按照成绩由高到低进行排序,输入语句如下。

代码执行结果如图5-21所示。

图5-21 对查询结果排序
查询结果中返回了stu_info表的所有记录,这些记录根据s_score字段的值进行了一个降序排列。ORDER BY子句也可以对查询结果进行升序排列,升序排列是默认的排序方式,在使用ORDER BY子句升序排列时,可以使用ASC关键字,也可以省略该关键字。读者可以自己编写升序排列的代码,对比这里的结果。