用一个已经存在的表来建表
CREATE TABLE 是最为通用的建表的方法然而在一些数据库管理系统中提供了一
种可供选择的方法— — 使用已经存在的表中的格式和数据当你对表进行临时改动需要将
数据选出时这种方法是很有用的当你要创建的表与已有的表类似并且其内容也类似时它
也非常有用你不必须重新输入这些信息在ORACLE 中它的语法如下
SYNTAX
CREATE TABLE NEW_TABLE(FIELD1, FIELD2, FIELD3)
AS (SELECT FIELD1, FIELD2, FIELD3
FROM OLD_TABLE <WHERE...>
它的语法允许你建立一个字段类型与已有表中选出的字段类型相同的新表你也可以
对新表中的字段进行重命名
INPUT/OUTPUT
SQL> CREATE TABLE NEW_BILLS(NAME, AMOUNT, ACCOUNT_ID)
AS (SELECT * FROM BILLS WHERE AMOUNT < 50);
Table created.
分析
上边的语句用BILL 表中AMOUNT 小于50 的记录创建了一个新表
在一些数据库系统中你也可以使用下边的语法
SYNTAX
SQL 21 日自学通(V1.0) 翻译人笨猪
187
INSERT NEW_TABLE
SELECT <field1, field2... | *> from OLD_TABLE <WHERE...>
上边的语法格式将会严格地按照原有表的字段格式和数据建立一个新表下边用SQL
Server 的Transact-SQL 来对它进行举例
INPUT
INSERT NEW_BILLS
1> select * from BILLS where AMOUNT < 50
2> go
go 语句在SQL SERVER 中是处理SQL 缓冲区内指令的命令它的作用等同于在
ORACLE 中的分号
ALTER TABLE 语句
没有道理为每件事对你的数据库进行多次的设计但又确实需要对数据库和应用程序
进行改动那么ALTER TABLE 语句可以让数据库的设计者或设计人员在表创建以后修改
它的结构
ALTER TABLE 语句可以帮助你做两件事
l 加入一列到已经存在的表中
l 修改已经存在的表中的某一列
ALTER TABLE 语句的语法如下
SYNTAX
ALTER TABLE table_name <ADD column_name data_type; |
MODIFY column_name data_type;>
下边的命令会将BILL 表中的NAME 字段改为长度40 个字符
INPUT/OUTPUT
SQL> ALTER TABLE BILLS MODIFY NAME CHAR(40);
Table altered.
注你可以增加或减少某一列的长度但是你不能将它减少到使修改后的长度小于其中的
已有数据长度
下边的语句是向NEW_BILLS 表中加入一个新列
SQL 21 日自学通(V1.0) 翻译人笨猪
188
INPUT/OUTPUT
SQL> ALTER TABLE NEW_BILLS
2 ADD COMMENTS CHAR(80);
Table altered.
分析
这条语句会加入一个叫COMMENTS 的长度为80 个字符的字段该字段会加在已有
字段的右边
在使用ALTER TABLE 时会有许多限制你不能用它来对一个数据库增加或删除字段
它可以将一个列由NOT NULL改变为NULL而不必使用其它方法但是如果想把列由NULL
改变为NOT NULL 时则要求指定的字段中不能有NULL 值想把某一列由NOT NULL 改
变为NULL 可以使用下边的语法
SYNTAX
ALTER TABLE table_name MODIFY (column_name data_type NULL)
如果想把一列由NULL 改变为NOT NULL 你必需经过以下步骤
1 确认要改变的列中有没有NULL 值
2 删掉你所发现的任何NULL 值删除该记录更新这一记录等等
3 使用ALTER TABLE 命令
注在一些数据库管理系统中允许使用MODIFY 子句另外一些则不可以而又有
一些在ALTER TABLE 中加入了其它的子句在ORACLE 中你甚至可以修
改表的存储参数请检查你的解释器以找出它对ALTER TABLE 的确实用法
DROP TABLE 语句
SQL 提供了一个可以从数据库去彻底地移去某个表的命令DROP TABLE 可以从数据
库中删除一个指定的表以及与之相关联的索引和视图在第10 天会进行更详细的讨论
一旦这个命令发出以后就没有办法可以彻消它它最常用在你创建一个临时表并且已
经进行完毕了你的全部计划工作的时候DROP TABLE 语句的语法格式如下
SYNTAX
DROP TABLE table_name
下边是如何删掉一个叫NEW_BILLS 表的实例
SQL 21 日自学通(V1.0) 翻译人笨猪
189
INPUT/OUTPUT
SQL>DROP TABLE NEW_BILLS
Table dropped.
分析
请注意系统没有给出你提示该命令不会问你Are you sure? Y/N 但是删除操作
已经执行表已经永远地删除了
警告
如果你执行了
SQL> DROP TABLE NEW_BILLS
如果你想正确地删除一个表那么在删除表的时候最好给出它的所有都所属的数据
库或工程的名字推荐的使用方法如下
SQL> DROP TABLE OWNER.NEW_BILLS
我只所以强调这种使用方法是因为我曾经挽救过一个被错误删除了的表格它被删除
的原因是因为没有准确地给出其所属工程的名字修复那个数据库用了八个小时我们一
直工作到了深夜
DROP DATABASE 语句
一些数据库管理系统也提供了删除数据库DROP DATABASE 的语句它的使用方
法与DROP TABLE 相同语法如下
DROP DATABASE database_name
请不要删掉BILLS 数据库我们在今天的后边还要用它而且在第10 天也要用
注不同的关系数据库解释器提供了不同的删除数据库的方法在数据库被删除以后我
们需要清理掉操作系统用以构建数据库的文件
练习9.2
创建一个数据库并在其中创建一个表试验DROP TABLE 和DROP DATABASE 命令
数据库系统是否会允许你这样做单文件的数据库系统如ACCESS 是不支持这个命令的
数据库包含在一个单一的文件中如果想建立一个数据库你必须用系统提供的菜单选项
如果想删掉它只需简单地从系统中删掉这个文件就可以了
SQL 21 日自学通(V1.0) 翻译人笨猪
190
总结
第9 天讲述了数据处理语言DML 的主要内容具体说来是你学习了五个新的语句
CREATE DATABASE CREATE TABLE ALTER TABLE DROP TABLE DROP DATABASE
在今天的课程中我们也讨论了一个好的数据库设计方案的重要性
当你在创建并设计一个数据库的时候数据字典是一个重要的文档资料字典中有对数
据库的详细的描述包括表字段视图索引存储过程触发机制等等一个完备
的数据字典中应该有对数据库中的每一个内容的详细注释每当你对数据库进行过修改以
后你都应及时的更新数据字典
在使用数据库处理语句时设计一个好的数据库是非常重要的把数据分组逻辑组并
建立主关键字以使其它的逻辑组正确地识别它可以使用外部关键字来指向该表的主关键
字或在该表中用外部关键字与其它的表相关联
我们已经知道了建立数据库语句不是一个数据库系统的必需内容因为不同的数据库
供应商有不同的数据库组织形式每一种解释器都有它们自己的特点和选项从而导致了
建立数据库语句的截然不同只使用CREATE DATABASE database_name 可以在大多数系
统中用默认的参数来创建一个默认的数据库而DROP DATABASE 语句则可以永久地删
除一个数据库
使用CREATE TABLE 语句可以建立一个新的表使用该命令你可以建立字段并定义
它们的数据类型在一些数据库管理系统中你还可以指定字段的其它属性例如是否它可
以接受空值以及它的内容是否在本表中应该是唯一的而ALTER TABLE 语句可以对已存
在的表的结构进行修改DROP TABLE 语句可以永久地删除一个表格
问与答
问为什么CREATE DATABASE语句在不同的数据库中使用方法是不同的
答这是因为不同的数据库系统在建立数据库时的实际过程是不同的基于PC 机的
小型数据库系统通常依赖文件来建立某些应用程序而在大型服务器上运行的分
布式数据库中的需用数据库文件通常是分布在多个磁盘驱动器上的当你的代码
访问数据库的时候运行于电脑上的数据库程序不会像访问你的磁盘上的文件那
样直接更大的数据库系统还要对磁盘的空间进行估算以支持一些特性如安全性
SQL 21 日自学通(V1.0) 翻译人笨猪
191
传输控制以及内嵌于数据库的存储过程当你的程序访问数据库时数据库的服
务程序通常需要对你的请求通常与其它的请求一起经过复杂的中间过程才会
返回数据这一主题将在第3 周讨论现在你应该知道为什么不同的数据库系
统建立和管理数据库的方法不同的
问我能否建立一个临时表并且的工作完成后它会自动地删除
答可以许多数据库管理支持临时表的概念该类型的表可以在你的过程运行结束或你
使用DROP TABLE 语句后删除我们将在第14 天的动态应用SQL 中讨论临时表
问我是否可以用ALTER TABLE 语句来删除一个表
答不行该语句只可以用来增加或修改表中的某一列如果你想删除一列你可以建立
一个新表并将旧表中的数据有选择地复制到新表中然后再删除旧表
校练场
1 ALTER DATABASE 语句经常用在修改已有表的结构上对不对
2 DROP TABLE 语句与DELETE FROM <table_name>的作用是相同的对不对
3 可以使用CREATE TABLE 命令向数据库中加入一个新表对不对
4 为什么下边的语句是错误的
INPUT
CREATE TABLE new_table (
ID NUMBER
FIELD1 char(40)
FIELD2 char(80)
ID char(40)
5 为什么下边的语句是错误的
INPUT
ALTER DATABASE BILLS (
COMPANY char(80))
6 当一个表建立时谁是它的所有者
7 如果字符型列的长度在不断变化如何才能做出最佳的选择
8 表名是否可以重复
SQL 21 日自学通(V1.0) 翻译人笨猪
192
练习
1 用你喜欢的格式向BILLS 数据库中加入两个表名字分别叫BANK 和
ACCOUNT_TYPE BANK 表中应该包含有BANK_ACCOUNT 表中BANK 字段
的信息ACCOUNT_TYPE 表中也应该包含有BANK_ACCOUNT 表中
ACCOUNT_TYPE字段的信息试着尽可以地减少数据的数量
2 使用你已经创建的五个表BILLS BANK_ACCOUNTS COMPANY BANK
ACCOUNT_TYPE 改为表的结构以用整数型字段作为关键字以取代字符型字段
作为关键字
3 使用你所知道的SQL 的归并知识见第6 天表的归并写几个查询来归并BILLS
数据库中的几个表