SQL必知必会:高级数据过滤 WHERE AND OR IN NOT
SQL必知必会:汇总数据 AVG() COUNT() MAX() MIN() SUM()
SQL必知必会:创建和操纵表 CREATE ALTER DROP RENAME
1. 数据插入
INSERT 用来将行插入(或添加)到数据库表。插入有几种方式:
- 插入完整的行;
- 插入行的一部分;
- 插入某些查询的结果。
提示:插入及系统安全
使用INSERT 语句可能需要客户端/服务器DBMS 中的特定安全权限。
在你试图使用INSERT 前,应该保证自己有足够的安全权限。
1.1 插入完整的行
-- 插入完整的行
INSERT INTO Customers
VALUES
( '1000000006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA', NULL, NULL );
提示:INTO 关键字
在某些SQL 实现中,跟在INSERT 之后的INTO 关键字是可选的。但
是,即使不一定需要,最好还是提供这个关键字,这样做将保证SQL
代码在DBMS 之间可移植。
编写依赖于特定列次序的SQL 语句是很不安全
的,这样做迟早会出问题。
编写INSERT 语句的更安全(不过更烦琐)的方法如下:
-- 更安全的方法
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 );
下面的INSERT 语句填充所有列(与前面的一样),但以一种不同的次序填充。因为给出了列名,所以插入结果仍然正确:
-- 修改字段顺序
INSERT INTO Customers ( cust_id, cust_contact, cust_email, cust_name, cust_address, cust_city, cust_state, cust_zip )
VALUES
( '1000000006', NULL, NULL, 'Toy Land', '123 Any Street', 'New York', 'NY', '11111' );
提示:总是使用列的列表
不要使用没有明确给出列的INSERT 语句。给出列能使SQL 代码继续
发挥作用,即使表结构发生了变化。
注意:小心使用VALUES
不管使用哪种INSERT 语法,VALUES 的数目都必须正确。如果不提供列
名,则必须给每个表列提供一个值;如果提供列名,则必须给列出的每
个列一个值。否则,就会产生一条错误消息,相应的行不能成功插入。
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' );
注意:省略列
如果表的定义允许,则可以在INSERT 操作中省略某些列。省略的列
必须满足以下某个条件。
1.该列定义为允许NULL 值(无值或空值)。
2.在表定义中给出默认值。这表示如果不给出值,将使用默认值。
注意:省略所需的值
如果表中不允许有NULL 值或者默认值,这时却省略了表中的值,
DBMS 就会产生错误消息,相应的行不能成功插入。
1.3 插入检索出的数据
把另一表中的顾客列合并到Customers 表中。不需要每次读取一行再将它用INSERT 插入,可以如下进行:
-- 把另一个表中的顾客列表合并到表中
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;
提示:INSERT SELECT 中的列名
为简单起见,这个例子在INSERT 和SELECT 语句中使用了相同的列名。
但是,不一定要求列名匹配。事实上,DBMS 一点儿也不关心SELECT
返回的列名。它使用的是列的位置,因此SELECT 中的第一列(不管
其列名)将用来填充表列中指定的第一列,第二列将用来填充表列中
指定的第二列,如此等等。
提示:插入多行
INSERT 通常只插入一行。要插入多行,必须执行多个INSERT 语句。
INSERT SELECT 是个例外,它可以用一条INSERT 插入多行,不管SELECT
语句返回多少行,都将被INSERT 插入。
2. 从一个表复制到另一个表
SELECT
* INTO CustCopy
FROM
Customers;
-- 或者
CREATE TABLE CustCopy
AS SELECT
*
FROM
Customers;
在使用SELECT INTO 时,需要知道一些事情:
- 任何SELECT 选项和子句都可以使用,包括WHERE 和GROUP BY;
- 可利用联结从多个表插入数据;
- 不管从多少个表中检索数据,数据都只能插入到一个表中。
提示:进行表的复制
SELECT INTO 是试验新SQL 语句前进行表复制的很好工具。先进行复
制,可在复制的数据上测试SQL 代码,而不会影响实际的数据。