3.4 向表中插入、修改和删除数据
创建表的目的是利用表来存储和管理数据。实现数据存储的前提是向表中添加数据,没有数据的表只是一个空的表结构,没有任何实际意义。向表中添加数据后,可以根据需要修改和删除数据。
3.4.1 插入数据
向表中插入记录使用INSERT语句。向已建好的表中插入记录,可以一次插入一条记录,也可以一次插入多条记录。INSERT语句的语法格式为:
INSERT [ INTO ] table_name [ ( column_name [,…n] ) ]
VALUES ( expression | NULL | DEFAULT [,…n] )
其中:
INSERT:向表中插入数据时使用的关键字。
INTO:可选的关键字,使用INTO关键字可以增强语句的可读性。
table_name:要插入记录的表名。
(column_name[,…n]):指明要插入数据的字段名列表,为可选参数,当给表中所有字段插入值时,该字段名列表可以省略。
VALUES:关键字,该关键字后面指定要插入的数据列表值。
expression:与column_name对应的字段的值,插入字符型和日期型值时要加单引号。
1.插入单行数据
【例3.15】 向Category表中添加3行数据。
INSERT INTO Category(CategoryID,CategoryName,Description)
VALUES(1,'饮料','软饮料、咖啡、茶、啤酒和淡啤酒')
INSERT INTO Category(CategoryID,CategoryName,Description)
VALUES(2,'调味品','香甜可口的果酱、调料、酱汁和调味品')
INSERT INTO Category(CategoryID,CategoryName,Description)
VALUES(3,'点心','甜点、糖和面包')
表Category中有3个字段:CategoryID、CategoryName和Description,现在是对表中的所有字段插入数据,可以省略字段名列表,即上面3条INSERT语句可以简写成以下形式:
INSERT INTO Category
VALUES(1,'饮料','软饮料、咖啡、茶、啤酒和淡啤酒')
INSERT INTO Category
VALUES(2,'调味品','香甜可口的果酱、调料、酱汁和调味品')
INSERT INTO Category
VALUES(3,'点心','甜点、糖和面包')
这时需注意,必须保证VALUES后的各数据项位置同表定义时的顺序一致,否则系统会报错。
在插入数据时,对于允许为空的列,可使用NULL插入空值;对于具有默认值的列,可使用DEFAULT插入默认值。
【例3.16】 sales数据库中有一张销售员表Seller,表中包含SaleID、SaleName等8个字段。其中SaleID、SaleName字段不能为NULL,Sex字段有默认值‘男’,HireDate字段用系统当前日期作默认值,见图3-14。向Seller表中插入一行数据,性别Sex字段的默认值为“男”,HireDate、Address等字段取空值。
INSERT INTO Seller(SaleID,SaleName,Sex,Birthday,HireDate,Address,Telephone,Notes)
VALUES('s11','赵宇飞',DEFAULT,'1974-07-25',NULL,NULL,NULL,NULL)
因为是给表中的所有字段提供值,所以该INSERT语句也可简写成如下形式:
INSERT INTO Seller
VALUES('s11','赵宇飞',DEFAULT,'1974-07-25',NULL,NULL,NULL,NULL)
在插入数据时,也可以只提供部分字段的值,这时列名表不能缺省。例如:
INSERT INTO Seller(SaleID,SaleName,Birthday)
VALUES('s11','赵宇飞','1974-07-25')
Seller表中Sex、HireDate字段带有默认值,系统自动用默认值“男”以及系统当前日期来填充;Address、Telephone以及Notes没有默认值,但允许为NULL,系统自动用NULL值填充。
INSERT语句执行成功后,在“对象资源管理器”窗口中,用鼠标右键单击表Seller,在弹出的快捷菜单中选择“选择前1000行”命令,可以看到插入的数据,如图3-23所示。
该INSERT语句如果写成如下形式,即缺省了字段名列表,但是又没有给所有字段提供值,则系统会报错,如图3-24所示。
INSERT INTO Seller
VALUES('s11','赵宇飞','1974-07-25')
【例3.17】 sales数据库中有表OrderDetail,表结构如图3-25所示。向OrderDetail表中插入一行数据。
向OrderDetail表中插入数据的INSERT语句为:
INSERT INTO OrderDetail
VALUES(10254,'P01003',NULL)
或者
INSERT INTO OrderDetail (OrderID,ProductID)
VALUES(10254,'P01003')
这时,系统自动用NULL值填充Quan-tity字段。如果将INSERT语句写成如下形式,即缺省了字段名列表,但又没有给表中的所有字段提供值,则系统会报错。
INSERT INTO OrderDetail
VALUES(10254,'P01003') --系统报错
【例3.18】 向sales数据库的Orders表中插入一行数据。Orders表的结构如图3-26所示。其中,OrderID是标识列,OrderDate是带有默认值的列。
向Orders表中插入数据的INSERT语句为:
INSERT INTO Orders(CustomerID,SaleID)
VALUES('c01','s05')
这时,没有给字段OrderDate提供值,系统调用getdate()函数获取系统当前日期来填充该字段;而OrderID字段是标识列,其值由系统根据标识增量以及标识种子的值自动提供,用户在插入记录时不必提供该字段的值。
因此,使用INSERT语句时需注意:
不要向标识列中插入值。
若字段不允许为空,且未设置默认值,则必须为该字段提供数据值。
VALUES子句中给出的值的数据类型必须和列的数据类型相对应。
2.插入多行数据
使用INSERT语句也可以同时向数据表中插入多行记录,插入时指定多个值列表,每个值列表之间用逗号分隔开即可。
【例3.19】 sales数据库中有表Customer,表结构如图3-18所示。向Customer表中插入多行数据。
INSERT INTO Customer
VALUES
('c01','三川实业有限公司','刘小姐','大崇明路50号','343567','(030)30074321'),
('c02','东南实业','王先生','承德西路80号','234575','(030)35554729'),
('c03','坦森行贸易','王炫皓','黄台北路780号','985060','(0321)5553932');
语句执行之后的结果如图3-27所示。
还有一种非常有用的方法可以一次向数据表中插入多行记录,那就是在INSERT INTO语句中加入查询子句SELECT,通过SELECT子句从其他表中选出符合条件的数据,再将其插入指定的表中。其语法格式如下:
INSERT [ INTO ] dest_table_name [ ( column_name [,…n] ) ]
SELECT column_name [,…n]
FROM source_table_name
[ WHERE search_conditions ]
功能:先从source_table_name表中找出符合条件的所有数据,从中选择所需的列,将其插入dest_table_name表中。
注意
要插入数据的表dest_table_name必须是已经存在的,不能向不存在的表中插入数据。
要插入数据的表dest_table_name中的列和SELECT子句中列的数量、顺序和数据类型都要相同。
【例3.20】 创建Employee表,包含3个字段EmployeeID、EmployeeName和Address。将Seller表中的女销售人员的ID、姓名以及地址插入Employee表中。
CREATE TABLE Employee
(EmployeeID char(3),EmployeeName char(8),Address char(60))
GO
INSERT INTO Employee
SELECT SaleID,SaleName,Address
FROM Seller
WHERE Sex='女'
语句执行的结果如图3-28所示。
由结果可以看到,INSERT语句执行后,Employee表中多了2条记录,这两条记录和Seller表中女销售员的信息完全相同。
需注意,在该例中,由于是对Employee表中的所有列插入数据,因此可省略字段名列表。