学前必备知识
在 第三章:SQL Server2019数据库 之 开启 SQL 语言之旅 全面介绍了 SQLServer 数据库中数据表的各种操作,如创建表、添加各类约束、查看表结构,以及修改和删除表。读者应该掌握这些基本的操作,为以后的学习打下坚实的基础。在这里,给出一个综合案例,让读者全面回顾一下上一章的知识要点,并通过这些操作来检验是否已经掌握了数据表的常用操作。
1. 案例目的
创建、修改和删除表,掌握基本数据表的操作。
创建数据库 Market,在 Market 中创建数据表 customers。customers 表结构如下表所示,按要求进行操作。
字段名 | 数据类型 | 主键 | 外键 | 非空 | 唯一 | 自增 |
---|---|---|---|---|---|---|
c_num | INT | 是 | 否 | 是 | 是 | 是 |
c_name | NVARCHAR(50) | 否 | 否 | 否 | 是 | 否 |
c_age | INT | 否 | 否 | 是 | 否 | 否 |
c_height | FLOAT | 否 | 否 | 否 | 否 | 否 |
c_contact | NVARCHAR(50) | 否 | 否 | 否 | 否 | 否 |
c_city | NVARCHAR(50) | 否 | 否 | 否 | 否 | 否 |
c_birth | DATETIME | 否 | 否 | 是 | 否 | 否 |
2. 案例操作过程
SELECT 是最常用的 SQL 语句。除此之外,还有其他三个常用的 SQL 语句,分别是 INSERT 插入语句、UPDATE 更新语句和 DELETE 删除语句。笔者首先对 SQL 中的 INSERT 插入语句进行介绍。
在 SQL 中,使用 INSERT 语句可以向数据表中插入数据。向数据表中插入数据有三种形式:一是插入完整的一行数据,二是插入一行数据的一部分,三是一次向表中插入多行数据。本小节将详细介绍如何向数据表中插入单行数据。
1.1 INSERT 语句基本语法
INSERT 语句语法如下:
INSERT [INTO] table_or_view [(column_list)] VALUES (value_list)
参数说明:
说明:在某些 SQL 实现中,INSERT 之后的 INTO 关键字是可选的。但是最好还是提供这个关键字,这样有利于 SQL 代码在 DBMS 之间的可移植性。
1.2 为表的所有字段插入数据
用户有时会给数据表的所有列都插入值,即 VALUES 后要包含所有列的值。而表名后的 column_list 参数有两种情况:一种是依次列出所有的列名;另一种是省略列名列表。尽管采用第二种情况输入起来更快,但采用第一种情况更易于理解和维护。为了后续的操作,笔者先在自己的 amo 数据库下新建一个 person 表,SQL 语句如下:
CREATE TABLE person(
[id] INT PRIMARY KEY NOT NULL IDENTITY(1,1),
[name] VARCHAR(50) NOT NULL DEFAULT '',
[age] INT NOT NULL CHECK(age > 0 AND age < 120),
[occupation] VARCHAR(50) NULL
)
SET IDENTITY_INSERT person ON;
创建表之后,应用 SELECT 语句查询 person 表中的人信息,输入:
SELECT * FROM person;
输出如下图所示:
【示例01】在 person 表中,插入一条新纪录,id 值为1,name 值为 Amo,age 值为18,occupation 值为 teacher。输入:
INSERT INTO person
([id],[name],[age],[occupation])
VALUES(1,'Amo',18, 'teacher');
输出,如下图所示:
在向数据表中插入数据之后,同样使用 SELECT 语句查询 person 表中人的信息,查看数据插入是否成功。输入:
SELECT * FROM person;
输出,如下图所示:
可以看到插入记录成功。在插入数据时,指定了 person 表的所有字段,因此将为每一个字段插入新的值。INSERT 语句后面的列名称顺序可以不是 person 表定义时的顺序。即插入数据时,不需要按照表定义的顺序插入,只要保证值的顺序与列字段的顺序相同就可以。
【示例02】在 person 表中,插入一条新纪录,id 值为2,name 值为 Paul,age 值为22,occupation 值为 dancer。输入:
INSERT INTO person
([age],[name],[id],[occupation])
VALUES(22,'Paul',2, 'dancer');
语句执行完毕,使用 SELECT 语句查看执行结果:
由结果可以看到,INSERT 语句成功插入了一条记录。
注意:插入各值的数据类型必须与表中对应列的数据类型一致,否则系统将输出错误提示。如下:
使用 INSERT 插入数据时,允许列名称列表 column_list 为空,此时,值列表中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同。紧接着笔者在自己的 amo 数据库下新建了一个 teacher 表,SQL 语句如下:
CREATE TABLE teacher( -- 创建teacher信息表
教师编号 int,
教师姓名 varchar(10),
教师年龄 int,
所教课程 varchar(30),
);
【示例03】在 teacher 表中,插入一条新纪录,教师编号 值为1,教师姓名 值为 Mary,教师年龄 值为24,所教课程值为人工智能导论。输入:
INSERT INTO teacher
VALUES(1,'Mary',24, '人工智能导论');
语句执行完毕,使用 SELECT 语句查看执行结果:
可以看到插入记录成功。数据库中增加了一条 id 为 1 的记录,其他字段值为指定的插入值。【示例03】的 INSERT 语句中没有指定插入列表,只有一个值列表。在这种情况下,值列表为每一个字段列指定插入值,并且这些值的顺序必须和 teacher 表中字段定义的顺序相同。
总结:最好在定义 INSERT 语句时明确给出列名列表,这样做的优点是,即使表的结构发生了变化,这条 INSERT 语句仍有可能正确执行。不管使用哪种 INSERT 语法,VALUES 值列表中的数目都必须正确。如果不提供列名,则必须给表中的每一个列提供一个值。如果提供列名,则必须给列出的每个列提供一个值。否则就会产生一条错误信息,相应的数据不能成功插入。
1.3 为表的指定字段插入数据
为表的指定字段插入数据,就是在 INSERT 语句中只向部分字段中插入值,而其他字段的值为表定义时的默认值。
【示例04】在 person 表中,插入一条新纪录,name 值为 Willam,age 值为20,occupation 值为 sportsman。输入:
SET IDENTITY_INSERT person OFF;
INSERT INTO person
([name],[age],[occupation])
VALUES('Willam',20, 'sportsman');
使用 SELECT 查询表中的记录,查询结果如下:
可以看到记录插入成功。在这里的 id 字段,如查询结果显示,该字段自动添加了一个整数值 3。在这里 id 字段为表的主键,不能为空,系统会自动为该字段插入自增的序列值。在插入记录时,如果某些字段没有指定插入值,SQLServer 将插入该字段定义时的默认值。下面例子说明在没有指定列字段时,插入默认值。
【示例05】在 person 表中,插入一条新纪录,name 值为 Jason,age 值为25。输入:
INSERT INTO person
([name],[age])
VALUES('Jason',25);
语句执行完毕,使用 SELECT 语句查看执行结果:
可以看到,在【示例05】插入语句中,没有指定 occupation 字段,查询结果显示,occupation 字段在定义时默认为 NULL,因此系统自动为该字段插入控制。
2.1 通过 VALUES 关键字插入多行数据
INSERT 语句可以同时向数据表中插入多条记录,插入时指定多个值列表,每个值列表之间用逗号分隔开,基本语法格式如下:
INSERT [INTO] table_or_view [(column_list)]
VALUES (value_list1),(value_list2),...,(value_listn);
(value_list1),(value_list2),…,(value_listn) 分别表示第 n 个插入记录的字段的值列表。
【示例06】在 person 表中,在 name、age 和 occupation 字段指定插入值,同时插入 3 条新纪录,输入:
INSERT INTO person
([name],[age],[occupation])
VALUES ('Evans',27,'secretary'),
('Dale',22,'cook'),('Edison',28,'singer');
输出,如下图所示:
语句执行完毕,使用 SELECT 语句查看执行结果:
由结果可以看到,INSERT 语句执行后,person 表中添加了 3 条记录,其中 name、age 和 occupation字段分别为指定的值,id 字段为 SQLServer 添加的默认的自增值。
【示例07】在 teacher 表中,不指定插入列表,同时插入两条新纪录,输入:
INSERT INTO teacher
VALUES(2,'Harry',21, '数据库技术'),(3,'Harriet',19, '市场营销');
2.2 将查询结果插入到表中
INSERT 语句用来给数据表插入记录时,指定插入记录的列值。INSERT 还可以将 SELECT 语句查询的结果插入到表中,如果想要从另外一个表中合并个人信息到 person 表,不需要把每一条记录的值一个一个输入,只需要使用一条 INSERT 语句和 一条 SELECT 语句组成的组合语句,即可快速地从一个或多个表中向一个表中插入多个行。基本语法格式如下:
INSERT INTO table_name1 (column_list1)
SELECT (column_list2) FROM table_name2 WHERE (condition)
table_name1 指定待插入数据的表;column_list1 指定待插入表中要插入数据的哪些列;table_name2 指定插入数据是从哪个表中查询出来的; column_list2 指定数据来源表的查询列,该列表必须和 column_list1 列表中的字段个数相同,数据类型相同;condition 指定 SELECT 语句的查询条件。
【示例08】从 person_old 表中查询所有的记录,并将其插入到 person 表中。
首先,创建一个 person_old 的数据表,其表结构与 person 结构相同,SQL 语句如下:
CREATE TABLE person_old(
[id] INT PRIMARY KEY NOT NULL IDENTITY(1,1),
[name] VARCHAR(50) NOT NULL DEFAULT '',
[age] INT NOT NULL CHECK(age > 0 AND age < 120),
[occupation] VARCHAR(50) NULL
);
向 person_old 表中添加两条记录:
SET IDENTITY_INSERT person_old ON;
INSERT INTO person_old
([id],[name],[age],[occupation])
VALUES(8,'Harry',20,'student'),(9,'Beckham',31,'police');
语句执行完毕,使用 SELECT 语句查看执行结果:
可以看到,插入记录成功,person_old 表中现在有两条记录。接下来将 person_old 表中所有的记录插入到 person 表中,SQL 语句如下:
SET IDENTITY_INSERT person ON;
SET IDENTITY_INSERT person_old OFF;
INSERT INTO person
([id],[name],[age],[occupation])
SELECT [id],[name],[age],[occupation] FROM person_old;
语句执行完毕,使用 SELECT 语句查看执行结果:
由结果可以看到,INSERT 语句执行后,person 表中多了两条记录,这两条记录和 person_old 表中的记录完全相同,数据转移成功。这里的 id 字段为自增的主键,在插入的时候要保证该字段值的唯一性,如果不能确定,可以插入的时候忽略该字段,只插入其他字段的值。
在 SQL Server 中,可以使用 SELECT INTO 语句将已存在的数据表中的信息复制到所要创建的数据表中。INSERT SELECT 可以将数据添加到一个已经存在的表中,而 SELECT INTO 则可以将数据复制到一个新表中。使用 SELECT INTO 语句的语法格式如下:
SELECT [select_list]
INTO new_table
FROM table_name
WHERE search_condition
参数说明:
【示例09】从 person 表中查询所有 id 小于 6 的记录,并将其插入到新表 new_person 表中。SQL 语句如下:
SELECT [id],[name],[age],[occupation]
INTO new_person
FROM person
WHERE id < 6;
在向新的数据表中插入数据之后,应用 SELECT 语句对新表进行查询。如下图所示:
小结:本节主要介绍了如何将数据插入到数据库表中。其中介绍了使用 INSERT 插入语句的几种方法。通过本节的学习,读者可以对插入单行数据和多行数据等有一定的了解。
有时候需要对数据表中的一行数据进行更新,或者对某些数据进行删除操作,这时就需要用到 SQL 中的 UPDATE 更新语句和 DELETE 删除语句。本节将会对 SQL 中的 UPDATE 更新语句和 DELETE 删除语句进行介绍。
UPDATE 语句用来修改表中的数据,使用 UPDATE 语句通常有两种形式:一种是更新表中指定的行,另一种是更新表中的所有行。
1.1 UPDATE 语句基本语法
UPDATE 语句的基本语法如下:
UPDATE table_name
SET column1=value1, column2=value2,...
WHERE search_condition
参数说明:
注意:UPDATE 语句中的 WHERE 子句规定哪条记录或者哪些记录需要更新,如果省略了 WHERE 子句,表中的所有记录都将被更新。
1.2 使用 UPDATE 语句更新列值
更新数据表中的列值通常有两种情况:一种是只更新一行数据(包含 WHERE子句);另一种是更新表中的所有数据(不包含 WHERE 子句)。
更新一行数据单个列
【示例10】从 new_person 表中,更新 id 值为 5 的记录,将 age 字段值改为 15。SQL 语句如下:
UPDATE new_person SET [age] = 15 WHERE id = 5;
更新操作执行前可以使用 SELECT 语句查看当前的数据:
UPDATE 语句执行完毕,查看执行结果:
由结果可以看出,id 等于 5 的记录中的 age 字段的值已经成功被修改为指定的值。
更新一行数据多个列
【示例11】从 new_person 表中,更新 id 值为 4 的记录,将 age 字段值改为 28,将 occupation 字段的值改为 developers。SQL 语句如下:
UPDATE new_person SET [age]=28, [occupation]='developers' WHERE id = 4;
UPDATE 语句执行完毕,使用 SELECT 语句查看执行结果:
更新所有行的列值
【示例12】将 new_person 表中所有 age 字段的值改为 18。SQL 语句如下:
UPDATE new_person SET [age]=18;
UPDATE 语句执行完毕,使用 SELECT 语句查看执行结果:
依据外表值更新数据
虽然 UPDATE 语句只允许改变单个表中的列值,但在 UPDATE 语句的 WHERE 子句中可以使用任何可用的表。因此可根据其他表中的相关值来决定目标表中要更新的数据行。
【示例13】应用 UPDATE 语句对 new_person 中 id 为 person 表中 name 为 Amo 对应记录的 id 的 age 字段进行更新。SQL 语句如下:
UPDATE new_person
SET [age]=19
WHERE id=(SELECT id FROM person WHERE name = 'Amo');
UPDATE 语句执行完毕,使用 SELECT 语句查看执行结果:
DELETE 语句用来删除表中的数据,使用 DELETE 语句通常有两种形式:一种是删除表中指定的行;另一种是删除表中的所有行。
2.1 DELETE 语句基本语法
DELETE 语句语法格式如下:
DELETE [FROM]
{table_name | view_name}
[WHERE search_conditions]
参数说明:
DELETE 不需要列名或通配符,使用 DELETE 删除的是整行而不是删除列,如果要删除指定的列值,可以使用 UPDATE 语句。
注意:DELETE 语句中的 WHERE 子句规定哪条记录或者哪些记录需要被删除,如果省略了 WHERE 子句,表中的所有记录都将被删除。
删除数据表中的数据通常有三种情况:第一种是只删除表中的一行数据(包含 WHERE 子句);第二种是删除表中的多行数据(包含 WHERE 子句);第三种是删除表中的所有数据(不包含 WHERE 子句)。执行操作前,使用 SELECT 语句查看当前 person 表中的所有记录。
【示例14】在 person 表中,删除 id 等于 9 的记录。SQL 语句如下:
DELETE FROM person WHERE id=9;
执行完 DELETE 语句后,使用 SELECT 语句查看如下:
【示例15】在 person 表中,删除 age 字段在 19~22 之间的记录。SQL 语句如下:
DELETE FROM person WHERE age BETWEEN 19 AND 22;
执行完 DELETE 语句后,使用 SELECT 语句查看如下:
【示例16】删除 person 表中所有记录。SQL 语句如下:
DELETE FROM person;
执行完 DELETE 语句后,使用 SELECT 语句查看如下:
注意,当使用 DELETE 语句删除表中所有数据之后,重新插入数据,id 的值是在原来的基础递增的,如下:
TRUNCATE TABLE 语句也可以用来删除表中的所有行。如果要删除表中的所有数据,与 DELETE 语句相比,使用 TRUNCATE TABLE 语句不但删除了数据,而且所删除的数据在事务处理日志中还会做相应的记录。TRUNCATE TABLE 语句的语法格式如下:
TRUNCATE TABLE table_name;
其中,table_name 为数据表的名称。
【示例16】使用 TRUNCATE TABLE 语句删除 new_person 表中所有记录。SQL 语句如下:
TRUNCATE TABLE new_person;
同样,使用 TRUNCATE TABLE 语句删除表中所有数据之后,重新插入数据,id 的值则是从 1 从新开始的,如下:
说明:TRUNCATE TABLE 语句实现的结果等同于不带 WHERE 子句的 DELETE 语句。如果要删除表中的所有行,建议使用 TRUNCATE TABLE 语句,因为 TRUNCATE TABLE 语句的效率比 DELETE 语句的效率更高。
总结:本节主要介绍了如何使用 UPDATE 语句更新表中的数据,以及如何使用 DELETE 语句删除表中的数据,并了解了在 UPDATE 语句和 DELETE 语句中使用 WHERE 子句的重要性。通过本节的学习,读者可以掌握如何对数据表中的数据进行更新或者删除的操作。