本篇重点为大家讲解创建和操纵表、使用视图相关内容。
01 创建和操纵表
创建表
SQL不仅用于表数据操纵,而且还用来执行数据库和表的所有操作,包括表本身的创建和处理。
创建表的两种常用方法:
?交互式创建和管理数据库表的工具;
?用SQL语句操纵。
1、表创建基础
用程序创建表,可以使用SQL的CREATE TABLE语句。利用CREATE TABLE创建表,必须给出下列信息:
?在关键字CREATE TABLE之后给出新表的名字,;
?表列的名字和定义,用逗号分隔;
?有的DBMS还要求指定表的位置。
示例:
CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8,2) NOT NULL,
prod_desc VARCHAR(1000) NULL
)
分析:从上面的例子可以看到,表名紧跟CREATE TABLE关键字。实际的表定义(所有列)括在圆括号之中,各列之间用逗号分隔。
2、使用NULL值
NULL值就是没有值或缺值。允许NULL值的列也允许在插入行时不给出该列的值。不允许NULL值的列不接受没有列值的行,换句话说,在插入或更新行时,该列必须有值。
示例:
CREATE TABLE Orders
(
order_num INTEGER NOT NULL,
order_date DATETIME NOT NULL,
cust_id CHAR(10) NOT NULL
)
分析:这条语句创建本书中所用的Orders表。包含三列:订单号、订单日期和顾客ID。这三列都需要,因此每一列的定义都含有关键字NOT NULL,这就会阻止插入没有值的列。如果插入没有值的列,将返回错误,且插入失败。
如何创建混合NULL和NOT NULL列的表,如下:
CREATE TABLE Vendors
(
vend_id CHAR(10) NOT NULL,
vend_name CHAR(50) NOT NULL,
vend_address CHAR(50) ,
vend_city CHAR(50) ,
vend_state CHAR(5) ,
vend_zip CHAR(10) ,
vend_country CHAR(50)
)
分析:这条语句使用的Vendors表。供应商ID和供应商名字列是必需的,因此指定为NOT NULL。其余五列全都允许NULL值,所以不指定NOT NULL。NULL为默认设置,如果不指定NOT NULL,就认为指定的是NULL。
3、指定默认值
SQL允许指定默认值,在插入行时如果不给出值,DBMS将自动采用默认值。默认值在CREATE TABLE语句的列定义中用关键字DEFAULT指定。
示例:
CREATE TABLE OrderItems
(
order_num INTEGER NOT NULL,
order_item INTEGER NOT NULL,
prod_id CHAR(10) NOTNULL,
quantity INTEGER NOT NULL DEFAULT 1,
item_price DECIMAL(8,2) NOT NULL
)
分析:这条语句创建OrderItems表,包含构成订单的各项(订单本身存储在Orders表中)。quantity列为订单中每个物品的数量。在这个例子中,这一列的描述增加了DEFAULT 1,指示DBMS,如果不给出数量则使用数量1。
更新表
更新表可以使用ALTER TABLE语句,使用ALTER TABLE语句时需要注意以下几点:
?不要在表中包含数据时对其进行更新。在表的设计过程中应充分考虑未来可能的需求,避免今后对表的结构做大改动。
?所有的DBMS都允许给现有的表增加列,不过对所增加列的数据类型(以及NULL和DEFAULT的使用)有所限制。
?许多DBMS不允许删除或更改表中的列。
?多数DBMS允许重新命名表中的列。
?许多DBMS限制对已经填有数据的列进行更改,对未填有数据的列几乎没有限制。
使用ALTER TABLE更改表结构:
ALTER TABLE Vendors ADD vend_phone CHAR(20)
分析:这条语句给Vendors表增加一个名为vend_phone的列,其数据类型为CHAR。
更改或删除列、增加约束或增加键:
ALTER TABLE Vendors DROP COLUMN vend_phone
复杂的表结构更改一般需要手动删除过程,它涉及以下步骤:
(1) 用新的列布局创建一个新表;
(2) 使用INSERT SELECT语句从旧表复制数据到新表。可以使用转换函数和计算字段;
(3) 检验包含所需数据的新表;
(4) 重命名旧表或删除;
(5) 用旧表原来的名字重命名新表;
(6) 根据需要,重新创建触发器、存储过程、索引和外键。
删除表
删除表使用DROP TABLE语句。
DROP TABLE CustCopy
分析:删除表没有确认步骤,也不能撤销,执行这条语句将永久删除该表。
重命名表
每个DBMS对表重命名的支持有所不同。对于这个操作,不存在严格的标准。DB2、MariaDB、MySQL、Oracle和Postgre SQL用户使用RENAME语句,SQL Server用户使用sp_rename存储过程,SQLite用户使用ALTER TABLE语句。
02 使用视图
视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询。下面我们来看一个例子:
SELECT cust_name, cust_contact
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.Cust_id
AND OrderItems.Order_num =Orders.order_num
AND prod_id = 'RGANO1'
分析:此查询用来检索订购了某种产品的顾客。任何需要这个数据的人都必须理解相关表的结构,知道如何创建查询和对表进行连接。检索其他产品的相同数据,必须修改最后的WHERE子句。
假如可以把整个查询包装成一个名为Product Customers的虚拟表,则可以如下轻松地检索出相同的数据:
SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = 'RGANO1'
为什么使用视图
? 重用SQL语句。
? 简化复杂的SQL操作。
? 使用表的一部分而不是整个表。
? 保护数据。可以授予用户访问表的特定部分的权限,而不是整个表的访问权限。
? 更改数据格式和表示。可以对视图执行SELECT操作,过滤和排序数据,将视图连接到其他视图或表,甚至添加和更新数据。
视图的规则和限制
这些限制随不同的DBMS而不同,下面是关于视图创建和使用的一些最常见的规则和限制。
? 与表一样,视图必须唯一命名。
? 对于可以创建的视图数目没有限制。
? 创建视图,必须具有足够的访问权限。这些权限通常由数据库管理人员授予。
? 视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造视图。所允许的嵌套层数在不同的DBMS中有所不同。
? 许多DBMS禁止在视图查询中使用ORDER BY子句。
? 有些DBMS要求对返回的所有列进行命名,如果列是计算字段,则需要使用别名。
? 视图不能索引,也不能有关联的触发器或默认值。
? 有些DBMS把视图作为只读的查询,这表示可以从视图检索数据,但不能将数据写回底层表。
03 创建视图
视图用CREATE VIEW语句来创建。与CREATE TABLE一样,CREATE VIEW只能用于创建不存在的视图。
利用视图简化复杂的连接
一个最常见的视图应用是隐藏复杂的SQL,通常涉及连接。
示例:
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
分析:这条语句创建一个名为ProductCustomers的视图,它连接三个表,返回已订购了任意产品的所有顾客的列表。如果执行SELECT*FROM Product Customers,将列出订购了任意产品的顾客。
用视图重新格式化检索出的数据
视图的另一常见用途是重新格式化检索出的数据。
示例:
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
AS vend_title
FROM Vendors
ORDER BY vend_name
用视图过滤不想要的数据
视图对于应用普通的WHERE子句也很有用。可以定义CustomerEMailList视图,过滤没有电子邮件地址的顾客。
示例:
CREATE VIEW CustomerEMailList AS
SELECT cust_id, cust_name, cust_email
FROM Customers
WHERE cust_email IS NOT NULL
使用视图与计算字段重命名表
在简化计算字段的使用上,视图也特别有用。下面是一条SELECT语句,检索某个订单中的物品,计算每种物品的总价格。
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008

要将其转换为一个视图,如下进行:
CREATE VIEW OrderItemsExpanded AS
SELECT order_num,
prod_id,
quantity,
item_price,
quantity*item price AS expanded price
FROM OrderItems
检索订单20008的详细内容,如下进行:
SELECT *
FROM OrderItemsExpanded
WHERE order_num = 20008

视图非常容易创建,而且很好使用。正确使用,视图可极大地简化复杂数据的处理。
以上就是今天分享的全部内容,下期为大家带来SQL练习相关内容,我们下期见!
整理不易,点赞、收藏帮忙点一下!