一、数据的插入
1、插入的关键字:INSERT INTO,在某些SQL实现中,可以去掉INTO关键字,不过最好还是提供INTO这个关键字,保证SQL代码可移植性。
2、插入的方式:
- 插入完整的行
示例代码如下:
INSERT INTO table_name VALUES(''column1_value, 'column2_value', 'column3_value', 'column4_value');
存储在table_name表中每一列的数据在VALUES子句中给出,必须给每一列提供一个值,如果某列没有值,那么应该使用NULL值(需要该列支持空值);这里需要注意了,各列必须以它们在表中定义中出现的次序填充,这样的语句高度依赖表中列的定义次序,并不安全,迟早会出问题的,最好不要这样使用。我们可以指出全部的列名,来达到安全性,不过比较繁琐,示例代码如下:
INSERT INTO table_name(column1, column2, column3, column4) VALUES('column1_value', 'column2_value', column3_value'', 'column4_value')
这种方式的优点就是,即使表的结构改变,该语句也能正确工作;此外,因为提供了列名,VALUES必须以其指定的次序匹配指定的列名,不一定按各列出现在表中的实际次序。
- 插入行的一部分:这种方式就是指给出表中部分的列,此时省略的列必须满足以下两个条件中的任一个:
- 该列定义为允许NULL值(无值或空值)
- 在表中定义中给出默认值。
- 插入某些查询的结果
通过INSERT SELECT,可以实现将SELECT语句的结果插入表中,同时也是实现了一条INSERT语句插入多行的功能,因为INSERT通常只插入一行,要是插入多行的,那么必须执行多个INSERT语句。示例代码如下:
INSERT INTO table_name1(t1_column1, t1_column2, t1_column3, t1_column4) SELECT t2_column1, t2_column2, t2_column3, t2_column4 FROM table_name2
在使用INSERT SELECT时,若从SELECT检索出来的数据中包含了主键值,那么必须保证相同的主键值行数据在INSERT插入的表中是没有数据的,否则会导致后续的INSERT操作失败。
INSERT插入的列与SELECT检索出的列,列名出可以不用保持一致,因为它们之间是通过列位置来关联的,也就是SELECT检索出来的第一列,在INSERT插入中就是第一列,以此类推。
二、数据的导出
前面说的的内容都是通过INSERT语句来实现数据插入表格中,其实还有另外一种方式,也可以实现数据复制,这就是SELECT INTO语句。示例代码如下:
SELECT * INTO table_1 FROM table_2;
上述语句的含义是将table_2表中的数据复制到table_1表中。在某些DBMS中可以覆盖已存在表,所以要特别注意。该语句在实现复制表格数据是很好用的工具,例如开发人员可以在复制的数据上进行SQL代码测试,不用担心影响实际的数据。
有关SELECT INTO语句,需要了解的事项:
- 任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY;
- 可以利用联结,从多个表中插入数据;
- 不管从多少个表中检索数据,数据都只能插入到一个表中。
三、INSERT SELECT和SELECT INTO的差异
- INSERT SELECT之前必须要创建好INSERT将要插入的表,而SELECT INTO不需要事先创建表,它会在运行过程中创建新表;
- INSERT SELECT语句是插入数据,而SELECT INTO语句是复制数据、导出数据,某些熟悉不会复制过来,比如主键信息。