数据插入
可以只用insert语句向数据表中插入新数据(添加行)
插入完整的行
INSERT INTO Customers
VALUES('1000000006','Toy Land','123 Any Street', 'New York','NY','11111','USA',NULL,NULL);
insert into values语句要确认需要插入的表名,以及需要插入的数据值
数据值values要按照对应列的顺序进行数据值填充,顺序不可以弄混,并且每一列都必须有对应值填充,如果没有值则用NULL填充
这种插入方法高度依赖于表中列的定义顺序,如果表的结构改变,这条插入语句就会出错
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);
这个代码中插入语法不变,但是在表后面用圆括号给出了表中各个列的列名
values中的值会按照给出的对应列顺序进行填充,VALUES中的第一个值对应于第一个列名,第二个值对应于第二个列名
因为提供了列名,VALUES必须以其指定的次序匹配指定的列名,不一定按各列出现在表中的实际次序
其优点是,即使表的结构改变,这条INSERT语句仍然能正确工作
在插入数据时一定要给出明确的列顺序,这样即使表的结构发生变化,insert语句也能正确工作
插入一行中部分值
在insert语句中明确给出插入的列名时,可以省略列,即只插入给出的列,省略的列不插入
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');
其中省略的cust_contact和cust_email列则不插入任何值,插入时忽略这两列
只对部分列插入的操作必须满足以下条件:
- 被忽略的列必须允许出现NULL值
- 被忽略的列能够给出默认值
如果被忽略的列既不允许NULL值,也没有默认值,则会报错
插入检索出的数据
利用insert into select语句可以将检索出的数据插入表格(可以用来完成两表合并)
INSERT INTO Customers(cust_id, cust_contact, cust_email, cust_name, cust_address, cust_city,
cust_state, cust_zip, cust_country)
SELECT cust_id, cust_contact, cust_email, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country
FROM CustNew;
相当于把Customers表和CustNew表进行上下合并
插入多少行取决于表CustNew一共有多少行,所有的数据行都会被插入
为简单起见,这个例子在INSERT和SELECT语句中使用了相同的列名。但是,不一定要求列名匹配。事实上它使用的是列的位置进行匹配,因此SELECT中的第一列(不管其列名)将用来填充表列中指定的第一列,第二列将用来填充 表列中指定的第二列
在insert select语句中,为避免列名冲突,可以使用完全限定列名
select语句中也可以包含where子句,对数据进行过滤之后再插入
INSERT通常只插入一行。要插入多行,必须执行多个INSERT语句。INSERT SELECT是个例外,它可以用一条INSERT插入多行,不管SELECT语句返回多少行,都将被INSERT插入。
从一个表复制到另一个表
如果要合并两个表A和表B,即将表B的内容复制到表A中
insert into A
select * from B;
可以合并所有列,也可以合并部分列
insert into A(a, b, c)
select a, b, c
from B;
insert select语句将select检索出的内容插入到已经存在的表
select into将检索出的内容复制到新建的表中
select *
into newTable
from Customers;
检索出Customers表中的所有列,复制到新建的表格newTable中,相当于创建了新表
如果只想复制部分列,只需要在select语句中明确列名即可
MySQL中没有select into,而是需要直接创建新表
create table newTable as
select * from Customers;
可以在select语句中添加任意子句如where,order by,group by,相当于对检索结果创建新表储存
可以利用联结从多个表中插入数据
不管从多少个表中检索数据,都只能复制到一个表中