SQL必知必会学习笔记 15-22
第15课 插入数据
15.1 数据插入
INSERT
:用来将行插入(或添加到数据库表)。
插入有几种方式:
- 插入完整的行;
- 插入行的一部分;
- 插入某些查询的结果。
注意:使用INSERT
语句可能需要客户端/服务器DBMS中的特定安全权限。
15.1.1 插入完整的行
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES('1000000006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA', NULL, NULL);
15.1.2 插入部分行
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country)
VALUES('1000000006','Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA');
可以省略列,只给某些列提供值,给其他列不提供值。省略的列必须满足以下条件:
- 该列定义为允许NULL值(无值或空值),如果不允许却省略,DBMS会产生错误,导致无法成功插入相应行;
- 在表定义中给出默认值,即不给出值时将使用默认值。
15.1.3 插入检索出的数据
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country)
SELECT cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country
FROM CustNew;
在本例中,
- 首先创建和填充CustNew表,结构与Customers表相同;
- 在填充CustNew表时,不应该使用已经在Customers中用过的cust_id值(如果主键值重复,后续的INSERT操作将会失败);
- 如果CustNew表为空,则没有行被插入(也不产生错误,因为操作仍然是合法的);
- 本例中在
INSERT
和SELECT
语句中使用了相同的列名,但实际上并不要求列名匹配,DBMS使用的是列的位置,即SELECT
中的第一列(不管其列名)将用来填充表列中指定的第一列,第二列将用来填充表列中指定的第二列,如此类推。 SELECT
语句可以包含WHERE
子句以过滤插入的数据。
15.2 从一个表复制到另一个表
SELECT INTO
在MySQL中,SQL语句为:
CREATE TABLE CustCopy AS
SELECT*
FROM Customers;
创建一个新表CustCopy,将表Customers复制过去。
- 任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY;
- 可利用联结从多个表中插入数据;
- 不管从多少个表中检索数据,数据都只能插入到一个表中。
- 先用SELECT INTO进行复制,可在复制的数据上测试SQL代码,而不会影响实际的数据。
在Access上也尝试了一下
SELECT *
INTO CustCopy
FROM Customers;
可以发现CustCopy表出现在了左侧的表里。
第16课 更新和删除数据
16.1 更新数据 UPDATE
UPDATE
语句:
- 更新表中的特定行;
- 更新表中的所有行。
基本的UPDATE
语句由三部分组成:
- 要更新的表;
- 列名和它们的新值;
- 确定要更新哪些行的过滤条件。(在使用
UPDATE
时一定要细心,不注意过滤条件会更新表中的所有行)
1. 更新单个列
【例16-1-1】客户1000000005 现在有了电子邮件地址kim@thetoystore.com,需要对其记录进行更新。
(涉及表:Customers;涉及列:cust_id,cust_email)
UPDATE Customers
SET cust_email = 'kim@thetoystore.com'
WHERE cust_id = '1000000005';
UPDATE...SET
SET
语句用来赋值,将新值赋给被更新的列。
没有WHERE
子句,DBMS将会用这个电子邮件地址更新Customers表中的所有行。
2. 更新多个列
【例16-1-2】更新客户1000000006的联系人(cust_contact)和电子邮件地址(cust_email),将联系人更新为‘Sam Roberts’,将邮件地址更新为‘sam@toyland.com’
UPDATE Customers
SET cust_contact = 'Sam Roberts',
cust_email = 'sam@toyland.com'
WHERE cust_id = '1000000006';
更新多个列时,只需要使用一条SET
命令,每个“列=值”对之间用逗号分隔(最后一列之后不用逗号)。
3. 删除某个列的值
【例16-1-3】去除客户1000000005的电子邮件记录。
UPDATE Customers
SET cust_email = NULL
WHERE cust_id = '1000000005';
要删除某个列的值,可设置其为NULL
(假如表定义允许NULL
值)。
设置NULL
值和保存空字符串不同,空字符串用’ '表示,是一个值,而NULL
表示没有值。
注意:
-
UPDATE
语句中可以使用子查询,使得能用SELECT
语句检索出的数据更新列数据。 - 有个SQL实现支持在
UPDATE
语句中使用FROM
子句,用一个表的数据更新另一个表的行。
16.2 删除数据 DELETE
- 从一个表中删除(去掉)数据,使用
DELETE
语句。 - 有两种使用
DELETE
的方式:- 从表中删除特定的行;