一、插入数据
1、插入
本章节介绍如何利用SQL地INSERT语句将数据插入表中。
插入可以用几种方式使用:
- 插入完整的行
- 插入行的一部分
- 插入多行
- 插入某些查询的结果
2、插入完整的行
INSERT语句要求指定表名和被插入到新行中的值。
MariaDB [course]> INSERT INTO customers
-> VALUES(NULL,
'Kobe Bryant',
'Staples Center',
'Los Angeles',
'California',
'90046',
'USA',
'Mamba',
NULL);
Query OK, 1 row affected, 1 warning (0.00 sec)
存储到表列中的数据在VALUES子句中给出,对每个列必须提供一个值,没有则使用NULL。每个列必须以它们在表定义中出现的次填充。
上面的语法应尽量避免使用,因为其高度依赖于表中列的定义次序。编写依赖于特定列次序的SQL语句是很不安全的。
MariaDB [course]> INSERT INTO customers(cust_name,
-> cust_address,
-> cust_city,
-> cust_state,
-> cust_zip,
-> cust_country,
-> cust_contact,
-> cust_email)
-> VALUES('Lebron Jame','Staples Center','Los Angeles','California','90046','USA','KING','NULL');
Query OK, 1 row affected, 1 warning (0.01 sec)
此例在表后的括号里明确的给出了列名,在插入行时,将利用VALUES列表中的相应值填入列表中的对应项。即使表的结构改变,该INSERT语句仍然能正常工作。
使用明确列插入的语法,还可以省略列(cust_id),可以只给某些列提供值,给省略的列不用提供值。
省略列必须满足以下的条件其一:
- 该列 定义为允许NULL值
- 在表定义中给出默认值,如果不给出值则使用默认的值。
3、插入多个行
INSERT可以插入一行到一个表中,可以使用多条INSERT语句去插入多个行。甚至一次提交,每条语句用一个分号结束。
INSERT INTO customers(cust_name,
-> cust_address,
-> cust_city,
-> cust_state,
-> cust_zip,
-> cust_country,
-> cust_contact,
-> cust_email)
-> VALUES('Lebron Jame','Staples Center','Los Angeles','California','90046','USA','KING',NULL),
('Kobe Bryant','Staples Center','Los Angeles','California','90046','USA','Mamba',NULL);
其中单条INSERT语句有多组值,每组值用一对圆括号括起来,用括号分隔。
MySQL用单条INSERT语句处理多个插入比使用多条INSERT语句快。
4、插入检索出的数据
INSERT还可以将一条SELECT语句的结果插入表中,即INSERT SELECT
假如需要从另一张表中合并客户列表到你的customers表,这两个表的结构应该是一样的,以确保对应值插入时不会报错。
INSERT INTO customers(cust_name,
-> cust_address,
-> cust_city,
-> cust_state,
-> cust_zip,
-> cust_country,
-> cust_contact,
-> cust_email)
SELECT cust_name,
-> cust_address,
-> cust_city,
-> cust_state,
-> cust_zip,
-> cust_country,
-> cust_contact,
-> cust_email
FROM custnew;
SELECT语句从custnew检索出要插入的值,而不是列出它们,SELECT中列出的每个列对应于customers表后所跟的列表中的每个列。
INSERT SELECT
中SELECT语句
可包含WHERE子句
以过滤插入的数据。
二、更新和删除数据
本章节介绍利用UPDATE和DELETE语句进一步操作表数据。
1、更新数据
为了更新表中的数据,可使用UPDATE语句,可采用两种方式:
- 更新表中的特定行
- 更新表中的所有行
在使用UPDATE时不要省略WHERE子句,如果不适用就会更新表中的所有行。
UPDATE语句由3部分组成,要更新的表,列名和它们的新值,确定要更新行的过滤条件。
MariaDB [course]> UPDATE customers
-> SET cust_email = 'elmer@fudd.com'
-> WHERE cust_id = 10005;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
UPDATE语句总是要更新的表的名字开始,SET命令来将新值赋予被更新的列。
UPDATE语句以WHERE子句结束 ,它告诉MySQL更新哪一行,没有WHERE子句,将会更新customers表中的所有行,这一点需要牢牢记住。
更新多个列:
MariaDB [course]> UPDATE customers
-> SET cust_name = 'The Fudds',
-> cust_email='fudd@xupt.com'
-> WHERE cust_id = 10005;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
在更新多个列时,只需要使用单个SET命令,每个列值对之间用逗号分隔。
IGNORE关键字,如果使用UPDATE语句更新多行,并且在更新这些行中的一行或多行时出现一个错误,则整个UPDATE操作被取消。即使是发生错误,也要继续进行更新可使用IGNORE 关键字。 UPDATE IGNORE customers …
2、删除数据
为了从一个表中删除数据,使用DELETE语句,可以使用两种方法:
- 从表中删除特定的行
- 从表中删除所有行
不要省略WHERE子句:在使用DELETE一定要注意细心,如果忘记使用WHERE则会删除整张表的所有数据。
下面的语句删除custoemrs表的一行:
DELETE FROM customers
WHERE cust_id = 10006;
DELETE不需要列名或通配符,DELETE删除整行而不是删除列,为了删除指定的列,请使用UPDATE语句。
DELETE语句删除表的内容而不是表,其从表中删除行但是不删除表本身。
如果项从表中删除所有行,可使用TRUNCATE TABLE语句,它完成相同的工作,但是速度更快。
3、更新和删除的指导原则
- 除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句。
- 保证每个表都有主键,尽可能像WHERE子句那样用它。
- 在对UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防止编写的WHERE子句不正确。
- 使用强制实施引用完整性的数据库,这样MySQL将不允许删除具有其他表相关联的数据的行。