Mysql从入门到入魔——7. 插入、更新和删除
1. 插入数据
1.1 插入完整行
1.2 插入部分行
1.3 插入检索出的数据
1.4从一个表复制到另一个表
2.更新数据
2.1 更新单行单列
2.2 更新单行多列
2.3 更新所有行
2.4 删除列中的值
3. 删除数据
3.1 删除单行
3.2 删除所有行
❤ 系列内容 ❤
Mysql从入门到入魔——1. 数据准备(起航篇)
Mysql从入门到入魔——2. 操纵数据库和表
Mysql从入门到入魔——3. 查询、排序、WHERE过滤
Mysql从入门到入魔——4. 通配符、计算字段、函数
Mysql从入门到入魔——5. 聚集、分组、子查询
Mysql从入门到入魔——6. 表联结、组合查询
Mysql从入门到入魔——7. 插入、更新和删除
Mysql从入门到入魔——8. 视图、存储过程、事务处理
Mysql从入门到入魔——9. 游标、高级SQL特性(待更新…)
Mysql从入门到入魔——10. 知识点速记(完结)(待更新…)
本篇主要内容
插入数据的几种方式,更新数据和删除数据。如果对文中表结构不理解的可以查看系列首页。话不多说,进入正题!
1. 插入数据
1.1 插入完整行
使用 INSERT 插入完整行它要求指定表名和插入到新行中的值。
mysql> INSERT INTO Customers
-> VALUES('1000000006',
-> 'Toy Land',
-> '123 Any Street',
-> 'New York',
-> 'NY',
-> '11111',
-> 'USA',
-> NULL,
-> NULL);
Query OK, 1 row affected (0.54 sec)
注意:
必须每列提供一个值,空值使用 NULL
各列必须以它们在表定义中出现的次序填充
1.2 插入部分行
INSERT 推荐的插入方法是明确给出表的列名。这样还可以省略列,即只给某些列提供值,给其他列不提供值。
省略的列必须满足以下某个条件:
该列定义为允许 NULL 值(无值或空值)。
在表定义中给出默认值(如果不给出值,将使用默认值)。
如果表中不允许有 NULL 值或者默认值,这时却省略了表中的值, DBMS 就会产生错误消息,相应的行不能成功插入。
现在同样在 Customers 表中插入一行。
mysql> INSERT INTO Customers(cust_id,
-> cust_name,
-> cust_address,
-> cust_city,
-> cust_state,
-> cust_zip,
-> cust_country)www.meimeitu8.com
-> VALUES('1000000006',
-> 'Toy Lnad',
-> '123 Any Street',
-> 'New York',
-> 'NY',
-> '11111',
-> 'USA');
Query OK, 1 row affected (0.24 sec)
不管使用哪种INSERT 语法,VALUES 的数目都必须正确。如果不提供列 名,则必须给每个表列提供一个值;如果提供列名,则必须给列出的每个列一个值。否则,就会产生一条错误消息,相应的行不能成功插入。
1.3 插入检索出的数据
INSERT 还存在另一种形式,可以利用它将 SELECT 语句的结果插入表中。
首先创建一个新 New_Customers 表。
-- 创建表
CREATE TABLE New_Customers
(
cust_id char(10) NOT NULL ,
cust_name char(50) NOT NULL ,
cust_address char(50) NULL ,
cust_city char(50) NULL ,
cust_state char(5) NULL ,
cust_zip char(10) NULL ,
cust_country char(50) NULL ,
cust_contact char(50) NULL ,
cust_email char(255) NULL
);
-- 插入数据
INSERT INTO new_customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES
('1000000001', 'Village Toys', '200 Maple Lane', 'Detroit', 'MI', '44444', 'USA', 'John Smith', 'sales@villagetoys.com'),
('1000000006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA', NULL, NULL);
现在把 New_Customers 表中的顾客列合并到 Customers 表中。
mysql> INSERT INTO Customers(cust_id,
-> cust_contact,
-> cust_email,
-> cust_name,
-> cust_address,
-> cust_city,
-> cust_state,
-> cust_zip,
-> cust_country)
-> SELECT cust_id AS id,
-> cust_contact,
-> cust_email,
-> cust_name,
-> cust_address,
-> cust_city,
-> cust_state,
-> cust_zip,
-> cust_country
-> FROM New_Customers
-> WHERE New_Customers.cust_id NOT IN (SELECT cust_id FROM Customers);
Query OK, 1 row affected (0.16 sec)
Records: 1 Duplicates: 0 Warnings: 0
时, 不应该使用已经在 Customers 中用过的 cust_id( PRIMARY KEY ) 值,上面使用子查询的方式过滤掉重复的 cust_id 。插入时并不关注 SELECT 返回的列名,而是使用列的位置,所以可以使用别名。
1.4从一个表复制到另一个表
有一种数据插入不使用 INSERT 语句。要将一个表的内容复制到一个全新的表(运行中创建的表)。
mysql> CREATE TABLE CustomersCopy AS
-> SELECT * FROM Customers;
Query OK, 6 rows affected (0.59 sec)
Records: 6 Duplicates: 0 Warnings: 0
任何 SELECT 选项和子句都可以使用,包括 WHERE 和 GROUP BY。
可利用联结从多个表插入数据。
不管从多少个表中检索数据,数据都只能插入到一个表中。
主要用途:它是试验新 SQL 语句前进行表复制的很好工具。先进行复制,可在复制的数据上测试 SQL 代码,而不会影响实际的数据。
2.更新数据
使用 UPDATE 语句,更新(修改)表中的数据。
有两种使用 UPDATE 的方式:
更新表中的特定行
更新表中的所有行
使用时要明确是 更新特定行 还是 更新所有行。
UPDATE 语句中可以使用子查询,使得能用 SELECT 语句检索出的数据 更新列数据。
2.1 更新单行单列
将客户 1000000005 的电子邮件地址更新为 kim@thetoystore.com
mysql> UPDATE Customers
-> SET cust_email = 'kim@thetoystore.com'
-> WHERE cust_id = '1000000005';
2.2 更新单行多列
在更新多个列时,只需要使用一条 SET 命令,每个“列=值”对之间用逗号分隔(最后一列之后不用逗号)。
mysql> UPDATE Customers
-> SET cust_contact = 'Sam Roberts',
-> cust_email = 'sam@toyland.com'
-> WHERE cust_id = '1000000005';
2.3 更新所有行
不使用 WHERE 限制条件,即更新表中所有行。
mysql> UPDATE Customers
-> SET cust_contact = 'Sam Roberts',
-> cust_email = 'sam@toyland.com';
2.4 删除列中的值
假如表定义允许 NULL 值,要删除某个列的值,可设置它为 NULL。(要注意删除列值(保留列结构)和删除列(完全删除)的区别)
mysql> UPDATE Customers
-> SET cust_email = NULL
-> WHERE cust_id = '1000000005';
3. 删除数据
使用 DELETE 语句,删除表中的数据。
有两种使用 DELETE 的方式:
删除表中的特定行
删除表中的所有行
使用时要明确是 删除特定行 还是 删除所有行。
3.1 删除单行
删除 Customers 表中 cust_id 为 1000000006 的行。
mysql> DELETE FROM Customers
-> WHERE cust_id = '1000000006';
3.2 删除所有行
删除 Customers 中的所有行。不删除表本身。
mysql> DELETE FROM Customers;
如果想从表中删除所有行,推荐使用 TRUNCATE TABLE 语句,它完成相同的工作,而速度更快(因为不记录数据的变动)。
但要注意: TRUNCATE 属于数据定义语言( DDL ),且 TRUNCATE 命令执行后无法回滚,使用 TRUNCATE 命令之前最好对当前表中的数据做备份。
mysql> TRUNCATE TABLE Customers;
————————————————