ç¬?…«å¤?操作数据)
insertè¯?�¥ä¸?•°字和空å?¼不éœ?要引号,而字符型数据则需要引号ã??
insert valueè¯?�¥在向表中插入几个数据的时候非常有ç”?¼Œ但显然这æ˜?¸�够的。å?果你想向表中插入25000行数æ�?—¶怎么办?在这种情况下insert selectè¯?�¥就非常有效ã?‚它允è?程序员拷贝一ä¸?ˆ–ä¸?组表的信æ�?ˆ°另一ä¸?¡¨ä¸??‚你å�?»¥在下边这几ç?情况下使用è?è¯?�¥。需要查询的表经常产生利润的增加、需要查询的表可以从多个数据库或表中获得外部数据,由于å?ä¸?¡¨的查询è?比单ä¸?表的查è?速度慢得多因此å?单个表的查è?速度要远远高于å?杂è?Œ缓慢的多个表查è¯??‚在服务å™?客户机系统上éœ?要查询的表的数据经常存储在å?户机上以减少网络ä¸?š„数据传输速度ã€?
并不æ˜?‰€有的数据库ç?理系统都æ”?Œ�临时表ã?‚è?æ£?查你的数æ�?º“系统的文档,看看它是否支持临时表
insert selectè¯?�¥的è?法格式å?下:
insert into table_name (col1,col2...) select col1,col2... from tablename where search_condition
æœ?´¨上来说它æ˜?°†ä¸?个selectè¯?�¥的输出结果在输入到另ä¸?ä¸?¡¨格中去,在insert valueä¸?š„规则也é?‚用于insert selectè¯?�¥ã€?
insert selectè¯?�¥要求你遵å¾??下è?则:
1、selectè¯?�¥不能从è?插入数据的表ä¸??‰择行ã??
2、insert intoä¸?š„列数必须与selectè¯?�¥返回的列数相等ã??
3、insert intoä¸?š„数据类型要与selectè¯?�¥返回的数æ�?±»型相å�?
insert selectè¯?�¥的另外一ä¸?”¨处是当你éœ?要å?表进行重新定义时对表进è?备份。这时需要你通过选择原å?表中的所有数æ�?¹¶将其插入到一ä¸?¸´时表ä¸?�¥完成ã€?
例å?:insert into copy_table select * from origina_table;然后你就å�?»¥放心地å?原å?表进行变更了ã€?
几乎æ‰?有的数据库系统都å�?»¥导入或å?出ASCLL码的文本文件,尽ç®?QLè¯?¨€没有这个功能,SQL不会做得比从ä¸?ä¸?©º数据库开始更好ã??
æ³?¼š从å?部数æ�?º�ä¸??入和导出数据看不懂看不懂ã€?
ç¬?¹�å¤?创建和操作表)
当一ä¸?¼€发人员在建立数据库时必须要è?ƒ虑ä¸?些事情ã?‚ç?ä¸?件事情是你的权限级别,å?果你使用的关系型数据库ç?理系统支持权限,你必须确认你æ˜?�¦具有系统管理设置权限或系统ç?理员已经允è?你有创建数据库的权限ã€?
许å?因素会å?你è?计数æ�?º“造成影响,å?下边的:
1、安全问题;2、ç?盘的å�?”¨空间ï¼?、数æ�??索及响应的é?Ÿ度ï¼?、数æ�?›´新的数度ï¼?、å?表归并返回数æ�?š„速度ï¼?、RDBMS对临时表的支持ã??
当你在进行代码和数据库的结构设è?时将你的数据结构与你当时的意图进行è?细的记录æ˜?�ž常重要的,这è¢?§°为数æ�?—典ã??
大å?数RDBMSä¸?ƒ½提供了生成数æ�?—典的工具包或有è?明来告诉你å?何安装它ã€?
主关é”?—和å?关键字,主键å”?¸€性,外键关联其它表字段ã??
建表基本è¯?³•ï¼?
create table table_name (field1 datatype[NOT NULL],
field2 datatype[NOT NULL],
field3 datatype[NOT NULL]...);
建表时oracleæ‰?æ”?Œ�的数æ�?±»型:
char:可以存储长度为1~255ä¸?—符的字ç?串,空格会è?å¡?……到字符串的右边以保证其内容满足定义的长度ã€?
date:包æ‹?—¥期的世纪、年、月、日、时、分、ç?ã€?
long:可以支持长è¾?G的字符串ã€?
long raw:可以存储长è¾?G的二进制内å?ã€?
number:零、æ?值或负å?¼的定点或浮点数ã€?
raw:可以存储长不过255ä¸?—节的二进制代码ã??
rowid:用ä¸?ä¸?��å…?¿›制的数来标明当前行在表内的唯ä¸?地址ã€?
varchar2:变长的字母或数字,长度å�?»¥ä»?åˆ?000ã€?
æ³?¼šlong数据类型在其它的数据库系统中常è?称为备注类型,它主è?用于存储大量的可以在稍后返回的文æœ?†…容ã??
long raw类型在其它数æ�?º“系统ä¸?¸¸è¢?§°为大二进制类åž?blob),它å�?»¥用来存储图形,声音ã?�è?频数æ�?¼Œ尽ç?关系型数æ�?º“管理系统æœ?初不æ˜?¸º它们而è?计的,但æ˜??媒体数据å�?»¥存储在blob类型的字段内ã€?
rowid常用在可以将你的表中的每ä¸?条è?录加以唯ä¸?的标识的场合,è?多关系型数据库ç?理系统用counter(如access)或identity(sql server)来表达这ä¸??念ã??
nullå�?˜¯ä¸?ä¸?¿®饰,因为如果ä¸?ä¸?—段的内å?为null的话实际上是说这ä¸?—段中ä»?么东西也没有。在建立表的时å?™,大å?数数æ�?º“管理系统允è?你用not null来指明字段是否为飞空属æ?§,not null的意思就æ˜?œ¨当前表的该字段中不能有任何è?录存在空值ã??
在é?‰择主关é”?—段时有几ä¸?œ€要注意的é—??,我ä»?›¾近è?过,oracle提供了一个rowid字æ?,它对于每一行均会自动é?’å?。因此默认情况下它æ?»是ä¸?ä¸?”¯ä¸?的数值,将rowid字æ?作为主关é”?—有很多理由ã??
用一ä¸?·²经存在的表来建表ï¼?
使用的情况:
1、当你å?表进行临时改动需要将数据选出时这种方法是很有用的ã€?
2、当你è?创建的表与已有的表类似并且其内å?页类似时ã€?
è¯?³•ï¼?
create table new_table(field1,field2,field3)
as(select field1,field2,field3
from old_table <where ...>);
alert tableè¯?�¥å�?»¥å¸?Š©你做两件事:
1、加入一列到已经存在的表ä¸???
2、修改已经存在的表中的某ä¸?列ã??
è¯?³•格式如下ï¼?
alter table table_name <add column_name data_type;|
modify column_name data_type;>
想把某一列由not null改变为nullå�?»¥使用下边的è?法:
alter table table_name modify(column_name data_type null);
如果想把ä¸?列由null改变为not null,你必须经过ä¸?下æ?骤:
1、确认è?改变的列ä¸?œ‰没有null值ã??
2、删掉你æ‰?发现的任何nullå€?删除、更新这ä¸?çº?½•等等)ã€?
3、使用alter table命令ã€?
DROP TABLEå�?»¥从数æ�?º“ä¸?ˆ 除一ä¸?Œ‡定的表以及与之相关联的索引和视图ã€?
推荐使用drop table owner.new_bills;
ç¬?��å¤?创建视图和索å¼?ï¼?
视图常常è¢?§°为虚è¡?¼Œ它是用create viewè¯?�¥建立的,在使用è?图以后你å�?»¥对è?图采用å?下命令:select,insert,input,update,delete
索引æ˜?¸Ž磁盘上数æ�?š„存储方式不同的另外一种组织数æ�?š„方法,索引的特例æ˜?¡¨ä¸??录依æ�?…¶在ç?盘上的存储位ç½?˜¾示,索引å�?»¥在表内创建一ä¸?ˆ—或列的组合,当应用索引以后,数据会按照你使用create indexè¯?�¥æ‰?定义的排序方式返回给用户,é?š过对æ?ç¡?š„、特定的两个表的归并字æ?进è?索引å�?»¥获得明显的好处ã??
当表ä¸?š„数据改变以后,你将会在查询è?图时发现相应的改变,视图并不占用数据库或表的物理空间ã€?
è¯?³•格式如下ï¼?
create view <view_name> [(column1,column2...)] as select <table_name column_names> from <table_name>
当创建è?图后,它实际上是ä¸?ä¸?™š表ã??
例å?:create view creditcard_debts as select * from debts where account_id=4;创建了索å¼?
然后查è?è¯?�¥select * from creditcard_debts;等同于select * from debts where account_id=4;
create view也允许你从表ä¸??‰择特定的列到è?图中,例如create view company_info (name,state) as select * from company;然后查è?的时候就å�?˜¾示name和stateä¸?
列ã??
如果数据量较大,创建索引以后查è?数据的é?Ÿ度会比直接查è?å¿?¾ˆ多ã??
å�?»¥ç”?号将几组数据组合起来,然后自己命名è?图名称,例å?:create view envelope (company,mailing_address) as select name,address+" "+city+","+state
from company;
sql在执行过程中,é?先会查找æ‰?查è?的是不是è¡?¼Œ如果找不到表,然后它就会去è?图里面去找看有没有ã??
比较复杂点的视图创建ï¼?
create view example(state,total_bills,total_amount) as select distinct company.state,count(bills.name),sum(bills.amount) from bills,company group by company.state having bills.name = company.name;
在è?图的selectè¯?�¥ä¸?½¿用约束是必然的,在使用selectè¯?�¥ä¸?�¯以应用下边这两个规则ï¼?
1、你不能用union操作ã€?
2、你不能使用order by子句,但æ˜?œ¨视图ä¸?½¿用group by子句å�?»¥有order by子句相同的功能ã??
你可以在数据库的ä¸?ä¸?ˆ–多个表中使用视图,也å�?»¥在SQL和数æ�?º“应用程序ä¸?½¿用虚表ã?‚创建è?图以后,你可以用insert,update,deleteè¯?�¥来更新ã?�插入ã?�删除è?图中的数æ�???
下边例子显示了å?何在视图ä¸?“�作数æ�?¼š
create view late_payment as select * from bills;创建视图
update late_payment set amount = amount*1.10;更新视图
delete from late_payment where account_id = 4;从è?图中删除ä¸?è¡?
update late_payment set new_total = new_total + 10 where new_total > 100;更新视图
如果你在创建视图时使用了dintinct子句,那么你就不能插入或更新这个视图ä¸?š„记录ã€?
视图对于实现数据库的安全有相当大的用处ã??
在单位换算中使用视图:例如加拿大的用户不想é?繁的进è?美元与加拿大元之间的è½?�¢工作ï¼?
create view canadian_bills(name,can_amount) as select name,amount/1.10 from bills;
当把ä¸?ä¸?Ÿ¥询分解成几个视图以后,最后的查è?就非常简单了,当然,使用ä¸?ä¸??图也经常æ˜?¿…须的ã€?
删除视图:drop view vie_name;
æ³?¼šdrop view命令会使æ‰?有与drop视图相关联的视图不能正常运è?,一些数数据库系统甚至将æ‰?有与要drop的è?图相关联的è?图也删除掉ã??
你可以删除一ä¸??图è?Œ不影响任何ä¸?ä¸?œŸ实的è¡?¼Œ这也就是为什么我ä»?°†视图称为虚表的原因ã??
在数æ�?º“ä¸?½¿用索引可以è?SQL使用直接访问方式。SQL采用树形结构来存储和返回索引数据,用以指示的数据存储在树的最æœ??(也就æ˜?�¶å?,它ä»??称为结点(也可以叫叶子)。每ä¸?ä¸?»“点中有一ä¸?Œ‡向其它结点的指针,结点左边的值只æ˜?®ƒ的双亲结点,结点右边的å?¼则æ˜??子结点或叶子ã€?
索引è¯?³•ï¼?
create index index_name on table_name(column_name1[column_name2],...);
不同的数æ�?º“创建索引è¯?�¥基本都不同,但是æ‰?有解释器有几点是相同的,它们的基æœ?¼€始è?句都æ˜?¼š
create index index_name on table_name(column_name,...);
例å?在一ä¸?¡¨里面的某ä¸?—段创建了索引,那么查询出来的数据都是按æ?字æ?排序的ã??
有了索引排序为什么还éœ?要order by排序å‘?¼Ÿ不同之å?在于当你使用order by子句时每次运行它都需要重新进行排序,而当你使用索引的时å?™,数据库会建立ä¸?ä¸?‰©理索引å?è±?就是前边提到的树结构),è?Œ在你每次运行查询时都è?é—?�Œä¸?ä¸?´¢引ã??
1、å?于小表来说,使用索引对于性能不会有任何提高ã??
2、当你的索引列中有极多的不同的数æ�?’Œ空å?¼时索引会使性能有极大的提高ã€?
3、不要在经常éœ?要更新或ä¿?”¹的字段创建索引,更新索引的开é”?会降低你æ‰?期望获得的æ?§能ã€?
sql也允许你对å?ä¸?—段进行索引,这ç?索引è¢?§°为å?合索引,例å?:create index id_cmpd_index on bills(account_id,amount);
当使用å?合索引时,è?把最å�?ƒ½选择的字段放在前边,也就æ˜??,把你最经常在查è¯?¸使用的字段放在最前边ã€?
在bills表中创建ä¸?ä¸?´¢引以对amount字æ?进è?降序排列:create index desc_amount on bills(amount desc);通常情况下å?果不指明,默认会按升序排列ã??
视图æ˜?¸€种虚è¡?¼Œ视图æ˜?��供给用户的数æ�?¸Ž其在数据库的真实面貌不相同的ä¸?种方法ã?‚你å�?»¥将è?图è?为一ä¸?¸¸规的表来执è?插入、删除ã?�更新和选择操作ã€?
ç¬?��ä¸?å¤?事物处理控制)
事务æ˜?Œ‡在é?»辑上必须完成的ä¸?命令序列的单位,单位工作期是指事务的å¼?始和结束时期。å?果在事务ä¸?º§生的错è?,那么整ä¸?¿‡程可以根æ�?œ€要è?终æ?,å?果每ä¸?件事都是正确的,那么结果将会è¢?¿�存到数据库中ã€?
æ‰?有支持事务å?理的系统都必须以ä¸?种准ç¡?š„è¯?³•来告诉系统一项事务是如何å¼?始的(不è?忘è?事务处理å�?˜¯工作的é?»辑分组,它有自己的å¼?始和结束),在使用oracle7时,它的è¯?³•形式如下ï¼?
set transaction {read only | use rollback segment segment}
在è?多情况下载一ä¸?·¥作过程中必须要求数据保持有效,è?Œ不仅仅æ˜??单个è¯?�¥。oracle允è?用户用set transaction来指定事务的å¼?始,如果你想æ£?æŸ?ill tuner的信æ�?¹¶且è?保证数据在这之中æ˜?¸�能改变的,那么你å�?»¥使用如下è¯?�¥ï¼?
set transaction tead only;
select * from customers where name='Bill Turner';
commit;
在oracleè¯?³•ä¸?»“束事务å?理è?句的è¯?³•如下ï¼?
commit[work] [comment 'text' | force 'text'[,integer]];
commit命令将保存在ä¸?项事务中æ‰?进è?的所有的改变,在å¼?始一项事务之前è?先运行commit命令以确保在之前没有事务è¢?¡®认ã??
例å?ï¼?
commit;
set transaction read only;
select * from customers where name='Bill Turner';
commit;
在一ä¸?º‹务å?理的过程ä¸?¼Œ常常会运行一些错è¯??查以ç¡??在过程中æ˜?�¦è¯?�¥æ˜?¿�行成功ã?‚你å�?»¥使用rollbackè¯?�¥来撤é”?事务ä¸?‰€做的每一项工作,即便工作æ˜?ˆ�功的你也å�?»¥撤销。但æ˜?¼Œ这必须是在commit之前,rollbackè¯?�¥必须在一ä¸?º‹务之ä¸?¿�行,它可以一直撤é”?到事务的å¼?始,也就æ˜??,数æ�?º“会一直返回到事务处理刚开始的状æ?�ã?‚oracke7ä¸?š„è¯?³•如下ï¼?
rollback[work] [to[savepoint] savepoint | force 'text']
例å?ï¼?
set transaction;
insert into customers values ('Bubba MacDowell','222 Blue Lake Way','Austin','TX',39874,8);
rollback;
select * from customers;
rollbackè¯?�¥将会终æ?整个事务,当存在嵌å?事务时,rollback将会终æ?掉全部事务,系统将会返回到事务开始的æœ?初状态ã?‚å?果当前没有活动的事务时,rollback或commitè¯?�¥将不会å?数据库产生任何作ç”?你可以è?为这æ˜?¸€ä¸?— 效的命令)ã€?
在事务使用中rollbackå�?»¥取消整个æ˜?º‹务,但是你也å�?»¥在你的事务当ä¸?½¿用è?句进行â?œ部分地ç¡??”ã?‚在Sybase和Orackeä¸?ƒ½允è?你在当前事务ä¸??ä¸?ä¸?¿�存点,从这一点开始,如果你使用了rollback命令,那么系统将会回到保存点时的状æ?�,而在保存点之前的è¯?�¥将会得到ç¡??,在oracleä¸?ˆ›建一ä¸?¿�存点的è?法格式å?下:
savepoint savepoint_name;
例å?ï¼?
set transaction;
update balances set curr_bal = 25000 where account_id=5;
savepoint save_it;
delete from balances where account_id=5;
rollback to savepoint save_it;
commit;
select * from balances;
在上边的例子ä¸?ˆ›建了ä¸?ä¸?�«save_it的保存点,updateè¯?�¥更新了结算平衡表ä¸?š„curr_bal列,你在其后设置了一ä¸?¿�存点,在保存之后,你又运行了delete命令,系统é??回到了保存点处,之后你å?事务用commit命令进è?了确认,结果æ‰?有的保存点之前的命令得到了确认ã?‚å?果你在其后又使用了rollback命令,那么将会取消当前的事务而不会有任何的改变ã??