瑞星卡卡安全论坛技术交流区系统软件 【推荐】SQL 21 日自学通-2

12345   1  /  5  页   跳转

【推荐】SQL 21 日自学通-2

【推荐】SQL 21 日自学通-2

第二周概貌
这一周都讲些什么
在第一周我们讲了使用SELECT 语句进行SQL 的最基本的查询从最简单的SELECT
语句开始我们学习了如何从数据库中取得数据然后我们学习了SQL 中的函数它们在
的用处很大例如在转换数据的格式或财务领域然后你很快就学到了用不同的方法从数
据库中取得数据子句如WHERE ORDER BY 和GROUP BY 允许你对查询进行定制以
返回有特定要求的数据记录你学习了归并操作以从不同的表中返回数据当你需要运行
多个查询且每个查询都需要前一个查询返回的内容时子查询是特别有用处的
在第二周我们将进一步地学习SQL 的使用
l 第8 天教你如何修改数据库中的数据你也许很害怕向数据库中录入数据但是
手工输入数据并不总是必须的现代的数据库系统大多都支持你从其它的数据库
格式中导入或导出数据此外SQL 还提供了几个很有用的语句使你可以熟练地
操纵数据库中的数据
l 第9 天你将学习如何建立和维护数据库中的表你也将学习如何建立数据库和管
理数据库的磁盘空间
l 第10 天将学习如何建立维护使用数据库的视图和索引
l 第11 天将涉及事务处理对数据库进行处理以及撤消对它的改动它对于在线事
务处理程序非常有用
l 第12 天的重点是数据库的安全性拥有数据库安全性知识可以让你更有效地管理
数据库
l 第13 天将学习如何在大型的应用程序中使用SQL 内嵌型SQL 常常运行于宿主
语言如C 或COBOL 上此外开放数据联接ODBC 可以让你在应用程序中
写出在通过数据库驱动在不同的数据库系统上运行的代码也将会提到一些SQL
的高级特性
l 在第14 天将会讨论如何使用动态SQL 并用几个例子来演示如何在应用程序中
使用SQL
最后编辑2006-02-11 19:26:04
分享到:
gototop
 

第八天操作数据
目标
今天我们来讨论一下数据操作问题在今天中我们将学习以下内容
l 如何使用INSERT UPDATE 和DELETE 来处理数据
l 在操作数据时使用WHERE 子句的重要性
l 从外部数据源中导入和导出数据的基本方法
gototop
 

数据操作语句
到现在为止我们已经学习了从数据库出取得数据的每一种可能的操作当获得数据以
后你可以在应用程序中使用或编辑它在第一周主要讨论获得数据但是可能你会对
如何向数据库中输入数据感兴趣你也可能会很想知道如何来编辑数据今天我们将讨
论三个关于如何对数据库中的表中的数据进行操作的三条语句这三条语句是
INSERT 语句
UPDATE语句
DELETE 语句
在过去你也许使用过基于PC 机的数据库系统如ACCESS dBASE IV 和FOXPRO
这些产品提供了很好的输入编辑和删除数据的工具这就是SQL 为什么提供了对数据进
行编辑的基本语句可又允许用户使用应用程序自带的工具进行编辑的原因SQL 的程序员
应该具有将数据送入数据库中的能力此外大型的数据库系统常常不能按照数据库设计
和编程人员的意图来进行设计因为这些数据库系统是为大容量和多用户环境准备的所
以它的设计重点放在了如何优化查询和数据引擎上了
大多数商业化的数据库系统都提供了导入导出数据的工具数据被存储在有分隔符的
文本文件之中格式化的文本文件常常存储着与表相关的信息相关的工具如ORACLE 的
SQL*Loader SQL Server's bcp bulk copy 以Microsoft Acces 的导入和导出数据的工具都
将在今天提到
注今天的例子是用Personal Oracle7 做的请注意它与其它的命令解释器在语句上和数据
返回的形式上的不同之处
gototop
 

插入语句
INSERT 语句允许你向数据库中输入数据它有两种写法
INSERT VALUES 和INSERT SELECT
gototop
 

INSERT VALUES 语句
该语句每次向表中输入一条记录如何操作的规模小只有几条语句需要输入时它是
非常有用的该语句的语法形式如下
SYNTAX
INSERT INTO table_name (col1, col2...) VALUES (value1, value2...)
该语句的作用是向表中加以一个新的记录其数值为你所指定的数值使用该语句向
表中插入数据时你必须遵循以下三条规则
l 你所要插入的数值与它所对应的字段必须具有相同的数据类型
l 数据的长度必须小于字段的长度例如你不能向一个长40 个字符的字段中插入
一个长80 个字符的字符串
l 插入的数值列表必须与字段的列表相对应也就是说第一个数值在第一个字段
第二个数值在第二个字段
gototop
 

例8.1:
假定你有一个COLLECTION 的表中存储着你所收集的材料你可以用下边的语句来
查看其中的内容
INPUT
SQL> SELECT * FROM COLLECTION
OUTPUT
ITEM WORTH REMARKS
NBA ALL STAR CARDS 300 SOME STILL IN BIKE SPOKES
MALIBU BARBIE 150 TAN NEEDS WORK
STAR WARS GLASS 5.5 HANDLE CHIPPED
LOCK OF SPOUSES HAIR 1 HASN'T NOTICED BALD SPOT YET
如果你想向表中加入一个新记录你可以像这样写
SQL 21 日自学通(V1.0) 翻译人笨猪
160
INPUTOUTPUT
SQL> INSERT INTO COLLECTION (ITEM, WORTH, REMARKS)
VALUES('SUPERMANS CAPE', 250.00, 'TUGGED ON IT')
1 row created.
你可以用一个简单的SELECT 语句来验证插入的结果
INPUT/OUTPUT
SQL>SELECT * FROM COLLECTION
ITEM WORTH REMARKS
NBA ALL STAR CARDS 300 SOME STILL IN BIKE SPOKES
MALIBU BARBIE 150 TAN NEEDS WORK
STAR WARS GLASS 5.5 HANDLE CHIPPED
LOCK OF SPOUSES HAIR 1 HASN'T NOTICED BALD SPOT YET
SUPERMANS CAPE 250 TUGGED ON IT
分析
INSERT 语句并不需要列的名字如果列的名字没有给出SQL 会把数据添入对应的
列号中也就是说SQL 会把第一个值插入到第一列中把第二个值插入到第二列中依
此类推
gototop
 

例8.2
下边的语句将会像例8.1 中的表中插入数值
INPUT
SQL>INSERT INTO COLLECTION VALUES
2 ('STRING',1000.00,'SOME DAY IT WILL BE VALUABLE');
1 row created
分析
为了表明它与例8.1 的效果是相同的你可以用下边的例子来对其进行验证
INPUT
SQL> SELECT * FROM COLLECTION;
OUTPUT
ITEM WORTH REMARKS
NBA ALL STAR CARDS 300 SOME STILL IN BIKE SPOKES
MALIBU BARBIE 150 TAN NEEDS WORK
SQL 21 日自学通(V1.0) 翻译人笨猪
161
ITEM WORTH REMARKS
STAR WARS GLASS 5.5 HANDLE CHIPPED
LOCK OF SPOUSES HAIR 1 HASN'T NOTICED BALD SPOT YET
SUPERMANS CAPE 250 TUGGED ON IT
STRING 1000 SOME DAY IT WILL BE VALUABLE
gototop
 

插入空值
在第几天的建立和操作表中你将会学到如何使用SQL 的CREATE TABLE 语句来
创建一个表现在你需要知道的是当一个列被创建以后它可能一定的规则限制其中之
一就是它应该或不应该包含空值的存在空值的意思就是该处数值为空但不是零—
— 这属于整数范畴或是空格— — 这属于字符串范畴而是说在空值处根本就没有数据存
在如果列被定义为NOT NULL 这时列中不允许有空值存在则当你使用INSERT 语
句时必须在此列插入一个数值如果你违反了这个规则那么你将收到一个错误的信息
警告你可以在对应的空值列规则上不允许为空值插入空格它不会被看为空值而
且看起来该处并没有数据
INPUT
SQL> insert into collection values
2 ('SPORES MILDEW FUNGUS', 50.00, ' ');
OUTPUT
1 row inserted.
分析
在使用空格来代替空值以后你可以在选择语句中使用空格
INPUT/OUTPUT
SQL> select * from collection
2 where remarks = ' ';
ITEM WORTH REMARKS
SPORES MILDEW FUNGUS 50.00
分析
返回的结果就好像在那里有一个空值一样只从输出上区别这里是空格还是空值是不
太可能的
SQL 21 日自学通(V1.0) 翻译人笨猪
162
如果REMARKS 列被定义为不允许空值那么当输入下边的语句
INPUT/OUTPUT
SQL> INSERT INTO COLLECTION
2 VALUES('SPORES MILDEW FUNGUS',50.00,NULL);
你将会得到一个错误信息
INSERT INTO COLLECTION
*
ERROR at line 1:
ORA-01400: mandatory (NOT NULL) column is missing or NULL during insert
注请注意语法数字和空值不需要引号而字符型数据则需要引号
gototop
 

插入唯一值
在许多数据库管理系统中都允许你建立一个具有唯一值属性的列这个属性的意思就
是在当前的表中当前列的内容不得出现重复这个属性在当向一个已有的表中插入或更新
数据时可能会导致问题的产生见下例
INPUT
SQL> INSERT INTO COLLECTION VALUES('STRING', 50, 'MORE STRING');
OUTPUT
INSERT INTO COLLECTION VALUES('STRING', 50, 'MORE STRING')
*
ERROR at line 1:
ORA-00001: unique constraint (PERKINS.UNQ_COLLECTION_ITEM) violated
分析
在本例中你试图在COLLECTION 表的ITEM 列中插入另外一个叫STRING 的项目
由于ITEM 列已经被定义为一个唯一的值所以返回了一个错误结果对于这个问题ANSI
SQL 没有提供解决方法但许多商业化的解释器会对此进行扩充如下例
IF NOT EXISTS (SELECT * FROM COLLECTION WHERE NAME = 'STRING'
INSERT INTO COLLECTION VALUES('STRING', 50, 'MORE STRING')
这一例子在Sybase 系统中是支持的
SQL 21 日自学通(V1.0) 翻译人笨猪
163
一个正当的标准化的表中应该有一个唯一值列或关键字列这一字段在归并表格的
时候非常有用如果你使用索引的话它也可以大副度地提高你查询的速度见第10 天创
建视图和索引
注下边的这个插入语句将会向表中插入一个新的雇员
SQL> insert into employee_tbl values
('300500177', 'SMITHH', 'JOHN')
在按下回车键以后你发现你把SMITH 拼错了别担心你可以使用ROLLBACK 命
令来回溯操作而数据则并不会被插入关于ROLLBACK 语句的详细使用方法请参见第
11 天的事务处理控制
gototop
 

INSERT SELECT 语句
INSERT VALUE 语句在向表中插入几个数据的时候非常有用但显然这是不够的如
果你想向表中插入25,000 行数据时怎么办在这种情况下INSERT SELECT 语句就非常有
效它允许程序员拷贝一个或一组表的信息到另外一个表中你可以在下边这几种情况下
使用该语句需要查询的表经常产生利润的增加需要查询的表可以从多个数据库或表中
获得外部数据由于多个表的查询要比单一表的查询速度慢得多因此对单个表的查询速
度要远远高于复杂而缓慢的多个表查询在服务器/客户机系统上需要查询的表的数据经常
存储在客户机上以减少网络中的数据传输速度
见下例
INPUT
SQL> insert into tmp_tbl
2 select * from table;
OUTPUT
19,999 rows inserted.
分析
你可以将所有的数据都插入到一个临时表中
注并不是所有的数据库管理系统都支持临时表请检查你的数据库系统的文档看看它
是否支持临时表在第14 天中你将会知道对于它的更详细的内容
INSERT SELECT 语句的语法格式如下
SQL 21 日自学通(V1.0) 翻译人笨猪
164
语法
INSERT INTO table_name (col1, col2...)
SELECT col1, col2... FROM tablename WHERE search_condition
本质上来说它是将一个SELECT 语句的输出结果在输入到另一个表格中去在INSERT
VALUE 中的规则也适用于INSERT SELECT 语句如果想把表COLLECTION 中的内容复
制到另一个叫INVENTORY 的表中去你可以使用例8.3 中的语句
例8.3
本例将创建一个叫INVENTORY 的表
INPUT
SQL> CREATE TABLE INVENTORY
2 (ITEM CHAR(20),
3 COST NUMBER,
4 ROOM CHAR(20),
5 REMARKS CHAR(40));
OUTPUT
Table created.
下边的语句将向表中插入COLLECTION 表中的数据
INPUT/OUTPUT
SQL> INSERT INTO INVENTORY (ITEM, COST, REMARKS)
2 SELECT ITEM, WORTH, REMARKS
3 FROM COLLECTION;
6 rows created.
你可以使用SELECT 语句来检验INSERT 的结果
INPUT/OUTPUT
SQL> SELECT * FROM INVENTORY;
ITEM COSTROOM REMARKS
NBA ALL STAR CARDS 300 SOME STILL IN BIKE SPOKES
MALIBU BARBIE 150 TAN NEEDS WORK
STAR WARS GLASS 5.5 HANDLE CHIPPED
LOCK OF SPOUSES HAIR 1 HASN'T NOTICED BALD SPOT YET
SUPERMANS CAPE 250 TUGGED ON IT
SQL 21 日自学通(V1.0) 翻译人笨猪
165
ITEM COSTROOM REMARKS
STRING 1000 SOME DAY IT WILL BE VALUABLE
注数据已经出现在表中了可是在你使用COMMIT 语句之前它并不会真正生效事务
处理工作可以由COMMIT 确认或只是简单地放弃关于COMMIT 的详细内容可见第
11 天
分析
你已经成功了虽然有些费力但是你已经将COLLECTION 中的数据复制到了
INVERTORY 表中
INSERT SELECT 语句要求你遵循如下规则
l SELECT 语句不能从被插入数据的表中选择行
l INSERT INTO 中的列数必须与SELECT 语句返回的列数相等
l INSERT INTO 中的数据类型要与SELECT 语句返回的数据类型相同
INSERT SELECT 语句的另外一个用处是当你需要对表进行重新定义时对表进行备份
这时需要你通过选择原始表中的所有数据并将其插入到一个临时表中来完成例如
SQL> insert into copy_table
2 select * from original_table;
然后你就可以放心地对原始表进行变更了
注在今天的晚些时候你将会学习如何向一个表中导入其它数据库中的数据几乎每一种
商用的数据库都有它们自己的数据存储格式编程人员经常需要对其进行格式转换
你将学习有关这方法的通用方法
gototop
 
12345   1  /  5  页   跳转
页面顶部
Powered by Discuz!NT