注:这一系列的文章是《SQL必知必会》第四版的读书笔记。
14.组合查询
利用UNION操作符将多条SELECT语句组合成一个结果集。
14.1 组合查询
主要有两种情况需要使用组合查询:
(1)在一个查询中从不同的表返回结构数据
(2)对一个表执行多个查询,按一个查询返回数据
14.2 创建组合查询
14.2.1 使用UNION
给出每条SELECT语句,在各条语句之间放上关键字UNION。
输入:
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';
14.2.2 UNION规则
(1)UNION必须由两条及以上的SELECT语句组成,语句之间用关键字UNION分隔。
(2)UNION中的每个查询必须包含相同的列、表达式或聚集函数。
(3)列数据类型必须兼容。类型不必完全相同,但必须是DBMS可以隐含转换的类型。
14.2.3 包含或取消重复的行
UNION从查询结果集中自动去除了重复的行。若想返回所有的匹配行,可使用UNION ALL而不是UNION。
输入:
SELECT cust_name,cust_contact,cust_email
FROM Customers
WHERE cust_state IN ('IL','IN','MI')
UNION ALL
SELECT cust_name,cust_contact,cust_email
FROM Customers
WHERE cust_name='Fun4All';
14.2.4 对组合查询结果排序
在用UNION组合查询时,只能使用一条ORDER BY子句,必须位于最后一条SELECT语句之后。
输入:
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'
ORDER BY cust_name,cust_contact;
15.插入数据
利用SQL的INSERT语句将数据插入表中。
15.1 数据插入
15.1.1 插入完整的行
输入:
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);
使用列的列表更加安全。
15.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');
如果表的定义允许,可以在INSERT操作中省略某些列。省略的列必须满足以下某个条件:
(1)该列定义为允许NULL值
(2)在表定义中给出默认值。
15.1.3 插入检索出的数据
输入:
INSERT INTO Customers(cust_id,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country)
SELECT cust_id,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country
FROM CustNew;
15.2 从一个表复制到另一个表
以MySQL为例。
输入:
CREATE TABLE CustCopy AS
SELECT * FROM Customers;
16.更新和删除数据
利用UPDATE和DELETE语句进一步操作表数据。
16.1 更新数据
有两种使用UPDATE的方式:
(1)更新表中的特定行
(2)更新表中的所有行
要注意WHERE子句,避免错误的更新表中的所有行。
输入:
UPDATE Customers
SET cust_contact='Sam Roberts',cust_email='[email protected]'
WHERE cust_id='1000000006';
删除某个列的值,可设置它为NULL。
输入:
UPDATE Customers
SET cust_email=NULL
WHERE cust_id='1000000005';
16.2 删除数据
有两种使用DELETE的方式:
(1)从表中删除特定的行
(2)从表中删除所有行
同样要注意WHERE子句,避免误删除所有行。
输入:
DELETE FROM Customers
WHERE cust_id='1000000006';
DELETE删除整行,而不是删除列。DELETE能删除表中的所有行,但是DELETE不删除表本身。
16.3 更新和删除的指导原则
(1)除非确实打算更新或删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句。
(2)保证每个表都有主键。
(3)在UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确。
(4)使用强制实施引用完整性的数据库,这样DBMS将不允许删除其数据与其他表相关联的行。
(5)如果DBMS允许数据库管理员施加约束,防止执行不带WHERE子句的UPDATE或DELETE语句,则应该使用它。
17.创建和操纵表
创建、更改和删除表的基本知识。
17.1 创建表
一般有两种创建表的方法:
(1)多数DBMS都具有交互式创建和管理数据库表的工具。
(2)表也可以直接用SQL语句操纵。
输入:
CREATE TABLE Products{
prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(10) NOT NULL,
prod_price DECIMAL(8,2) NOT NULL,
prod_desc TEXT(1000) NULL
} ;
指定默认值:
输入:
CREATE TABLE OrderItems{
prod_id CHAR(10) NOT NULL,
order_num INTEGER NOT NULL,
order_item INTEGER NOT NULL,
quantity INTEGER NOT NULL DEFAULT 1,
item_price DECIMAL(8,2) NOT NULL
} ;
17.2 更新表
输入:
ALTER TABLE Vendors
ADD vend_phone CHAR(20);
17.3 删除表
输入:
DROP TABLE CustCopy;
18.使用视图
什么是视图,怎么工作,什么时候使用,利用视图简化SQL操作。
18.1 视图
视图是虚拟的表,只包含使用时动态检索数据的查询。
18.1.1 为什么使用视图
(1)重用SQL语句
(2)简化复杂的SQL操作
(3)使用表的一部分而不是整个表
(4)保护数据。
(5)更改数据格式和表示。
18.1.2 视图的规则和限制
(1)视图必须唯一命名
(2)创建视图必须具有足够的访问权限
(3)视图可以嵌套。
(4)许多DBMS禁止在视图查询中使用ORDER BY子句。
(5)有些DBMS要求对返回的所有列进行命名。
(6)视图不能索引,也不能有关联的触发器或默认值。
(7)有些DBMS把视图作为只读的查询。
18.2 创建视图
18.2.1 利用视图简化复杂的联结
输入:
CREATE VIEW ProductCustomers AS
SELECT cust_name,cust_contact,prod_id
FROM Customers,Orders,OrderItems
WHERE Customers.cust_id=Orders.cust_id
AND OrderItems.order_num=Orders.order_num;
SELECT cust_name,cust_contact
FROM ProductCustomers
WHERE prod_id='RGAN01';
18.2.2 用视图重新格式化检索出的数据
18.2.3 用视图过滤不想要的数据
输入:
CREATE VIEW CustomerEmailList AS
SELECT cust_id,cust_name,cust_email
FROM Customers
WHERE cust_email IS NOT NULL;
SELECT *
FROM CustomerEmailList;
18.2.4 使用视图与计算字段
输入:
CREATE VIEW OrderItemsExpanded AS
SELECT order_num,prod_id,quantity,item_price,quantity*item_price AS expanded_price
FROM OrderItems;
SELECT *
FROM OrderItemsExpanded
WHERE order_num=20008;