第四章:SQL Server2019数据库 之 综合案例练习、 使用SQL语句插入数据、更新和删除数据

学前必备知识

  1. 第一章:SQL Server 数据库环境搭建与使用
  2. 第二章:SQL Server2019 数据库的基本使用之图形化界面操作
  3. 第三章:SQL Server2019数据库 之 开启 SQL 语言之旅

一、综合案例:数据表的基本操作

第三章: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. 案例操作过程

  1. 创建数据库 Market。
  2. 创建数据表 customers,在 c_num 字段上添加主键约束和自增,在 c_name 字段上添加唯一约束,在 c_age 字段上添加 check 约束(年龄在 0~120之间),在 c_birth 字段上添加非空约束。
  3. 查看数据表的信息以及查看数据表的行数和存储空间。
  4. 将 c_name 字段数据类型改为 VARCHAR(70)。
  5. 将 c_contact 字段改名为 c_phone。
  6. 增加 c_gender 字段,数据类型为 CHAR(1)。
  7. 将表名修改为 customers_info。
  8. 删除字段 c_city。
  9. 删除表 customers_info。

二、插入数据

SELECT 是最常用的 SQL 语句。除此之外,还有其他三个常用的 SQL 语句,分别是 INSERT 插入语句、UPDATE 更新语句和 DELETE 删除语句。笔者首先对 SQL 中的 INSERT 插入语句进行介绍。

1. 插入单行数据

在 SQL 中,使用 INSERT 语句可以向数据表中插入数据。向数据表中插入数据有三种形式:一是插入完整的一行数据,二是插入一行数据的一部分,三是一次向表中插入多行数据。本小节将详细介绍如何向数据表中插入单行数据。

1.1 INSERT 语句基本语法

INSERT 语句语法如下:

INSERT [INTO] table_or_view [(column_list)] VALUES (value_list)

参数说明:

  1. table_or_view:表名或视图的名称。
  2. column_list:由逗号分隔的列名列表。
  3. 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. 插入多行数据

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 字段为自增的主键,在插入的时候要保证该字段值的唯一性,如果不能确定,可以插入的时候忽略该字段,只插入其他字段的值。

3. 表中数据的复制

在 SQL Server 中,可以使用 SELECT INTO 语句将已存在的数据表中的信息复制到所要创建的数据表中。INSERT SELECT 可以将数据添加到一个已经存在的表中,而 SELECT INTO 则可以将数据复制到一个新表中。使用 SELECT INTO 语句的语法格式如下:

SELECT [select_list]
INTO new_table
FROM table_name
WHERE search_condition

参数说明:

  1. select_list:所要查询字段名称的列表。
  2. new_table:新创建的数据表的名称,该数据表必须不存在。
  3. table name:数据表的名称,该数据表必须已经存在。
  4. 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 删除语句进行介绍。

1. UPDATE 语句

UPDATE 语句用来修改表中的数据,使用 UPDATE 语句通常有两种形式:一种是更新表中指定的行,另一种是更新表中的所有行。

1.1 UPDATE 语句基本语法

UPDATE 语句的基本语法如下:

UPDATE table_name
SET column1=value1, column2=value2,...
WHERE search_condition

参数说明:

  1. table_name:要更新的数据表的名称。
  2. column:要更新的列名。
  3. value:更新后的值。
  4. 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 语句查看执行结果:
在这里插入图片描述

2. DELETE 语句

DELETE 语句用来删除表中的数据,使用 DELETE 语句通常有两种形式:一种是删除表中指定的行;另一种是删除表中的所有行。

2.1 DELETE 语句基本语法

DELETE 语句语法格式如下:

DELETE [FROM]
{table_name | view_name}
[WHERE search_conditions]

参数说明:

  1. table_name:指定要删除数据的数据表的名称。
  2. view_name:指定要删除数据的视图的名称。
  3. 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 子句的重要性。通过本节的学习,读者可以掌握如何对数据表中的数据进行更新或者删除的操作。

猜你喜欢

转载自blog.csdn.net/xw1680/article/details/114876592