SQL组合查询、插入数据、更新和删除数据

组合查询

SQL允许执行多个查询(多条SELECT语句),并将结果作为一个查询结果集返回。这些组合查询通常称为并(union)或复合查询(compound query)。
主要有两种情况需要使用组合查询:
a、在一个查询中从不同的表返回结构数据;
b、对一个表执行多个查询,按一个查询返回数据。

使用UNION

可用UNION操作符来组合数条SQL查询。

SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL', 'IN', 'MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All';
使用UNION规则

a、UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔。
b、UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过,各个列不需要以相同的次序列出)。
c、列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含转换的类型(例如,不同的数值类型或不同的日期类型)。

包含或取消重复的行

UNION从查询结果集中自动去除了重复的行!!即,它与一条SELECT语句中使用多个WHERE子句条件一样。
如果想要返回所有的匹配行,可使用UNION ALL而不是UNION。

对组合查询结果排序

在用UNION组合查询时,只能使用一条ORDER BY子句,它必须位于最后一条SELECT语句之后。对于结果集,不存在用一种方式排序一部分,而又用另一种方式排序另一部分的情况,所以不允许使用多条ORDER BY子句。
DBMS会用ORDER BY子句来排序所有SELECT语句返回的所有结果。

插入数据

数据插入

INSERT用来将行插入(或添加)到数据库表。
插入有几种方式:
a、插入完整的行
b、插入行的一部分
c、插入某些查询的结果

插入完整的行
INSERT INTO Customers
VALUES('1000000006',
	   'Toy Land',
	   '123 Any Street',
	   'New York',
	   'NY',
	   '11111',
	   'USA',
	   NULL,
	   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必须以其指定的次序匹配指定的列名,不一定按各列出现在表中的实际次序。其优点是,即使表的结构改变,这条INSERT语句仍然能正确工作。
注:VALUES的数目必须正确。如果不提供列名,则必须给每个表列提供一个值;如果提供列名,则必须给列出的每个列一个值。否则,就会产生一条错误信息,相应的行不能成功插入。

插入部分行
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这两列提供值。这表示没必要在INSERT语句中包含它们。因此,这里的INSERT语句省略了这两列及其对应的值。
注意:省略列
省略的列必须满足以下某个条件:
a、该列定义为允许NULL值
b、在表定义中给出默认值。这表示如果不给出值,将使用默认值
如果表中不允许有NULL值或者默认值,这是却省略了表中的值,DBMS就会产生错误信息,相应的行不能成功插入。

插入检索出的数据

利用INSERT可以将SELECT语句的结果插入表中,即INSERT SELECT。

INSERT INTO Customers(cust_id,
					  cust_name,
					  cust_address,
					  cust_city,
					  cust_state,
					  cust_zip,
					  cust_country,
					  cust_contact,
					  cust_email)
SELECT cust_id,
	   cust_name,
	   cust_address,
	   cust_city,
	   cust_state,
	   cust_zip,
	   cust_country,
	   cust_contact,
	   cust_email
FROMCustNew;

INSERT通常只插入一行,要插入多行,必须执行多个INSERT语句。
INSERT SELECT是个例外,它可以用一条INSERT插入多行,不管SELECT语句返回多少行,都将被INSERT插入。

从一个表复制到另一个表
CREATE TABLE CustCopy AS
SELECT * FROM Customers;

它与INSERT SELECT的区别是,它是导出数据,而INSERT SELECT是插入数据。
注意:
a、任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY
c、可利用联结从多个表插入数据
c、不管从多少个表中检索数据,数据都只能插入到一个表中
这种方法可以用来试验新SQL语句,因为在试验前可以对表进行复制。

更新和删除数据

更新数据

UPDATE语句,有两种使用方式:
a、更新表中的特定行
b、更新表中的所有行
注意:不要省略WHERE子句!
基本的UPDATE语句由三部分组成:
a、要更新的表
b、列名和它们的新值
c、确定要更新哪些行的过滤条件
假设客户10000005现在有了电子邮件地址,因此他的记录需要更新:

UPDATE Customers
SET cust_email = '[email protected]'
WHERE cust_id = '10000005';

如果没有WHERE子句,DBMS会用这个电子邮件地址更新Customers表中的所有行。

UPDATE Customers
SET cust_contact = 'Sam Roberts',
	cust_email = '[email protected]'
WHERE cust_id = '10000006';

在更新多个列时,只需要使用一条SET命令,每个“列=值”对之间用逗号分隔(最后一列不用逗号)。
UPDATE语句中可以使用子查询,使得能用SELECT语句检索出的数据更新列数据。
要删除某个列的值,可设置它为NULL(假设表定义允许NULL值):

UPDATE Customers
SET cust_email = NULL
WHERE cust_id = '10000005';

其中NULL用来去除cust_email列中的值。这与保存空字符串很不同(空字符串用‘’表示 ,是一个值),而NULL表示没有值。

删除数据

DELETE语句。有两种使用DELETE的方式:
a、从表中删除特定的行
b、从表中删除所有行
注意:不要省略WHERE子句!

DELETE FROM Customers
WHERE cust_id = '10000006';

DELETE FROM要求指定从中删除数据的表名,WHERE子句过滤要删除的行。
DELETE不需要列名或者通配符。DELETE删除整行而不是删除列。要删除指定的列,需要使用UPDATE语句。
DELETE语句从表中删除行,甚至是删除表中所有行。但是,DELETE不删除表本身。
如果想要删除表中所有行,不要使用DELETE,可以使用TRUNCATE TABLE,效果相同,但效率更高(因为不记录数据的变动)。

一些重要原则

a、慎用不带WHERE子句的UPDATE或DELETE语句,除非是要更新和删除每一行。
b、保证每个表都有主键。
c、在UPDATE和DELETE语句使用WHERE子句时,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确。
d、使用强制实施引用完整性的数据库,这样DBMS将不允许删除其数据与其他表相关联的行。
e、有的DBMS允许数据库管理员施以约束,防止执行不带WHERE子句的UPDATE和DELETE语句。如果采用的DBMS支持这个特性,应该使用它。

你可能感兴趣的:(SQL)