常见SQL语句及其函数集锦2

第八天(操作数据)
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码的文本文件,尽管SQL语言没有这个功能,SQL不会做得比从一个空数据库开始更好。
注:从外部数据源中导入和导出数据看不懂看不懂。

第九天(创建和操作表)
当一个开发人员在建立数据库时必须要考虑一些事情。第一件事情是你的权限级别,如果你使用的关系型数据库管理系统支持权限,你必须确认你是否具有系统管理设置权限或系统管理员已经允许你有创建数据库的权限。
许多因素会对你设计数据库造成影响,如下边的:
1、安全问题;2、磁盘的可用空间;3、数据检索及响应的速度;4、数据更新的数度;5、多表归并返回数据的速度;6、RDBMS对临时表的支持。
当你在进行代码和数据库的结构设计时将你的数据结构与你当时的意图进行详细的记录是非常重要的,这被称为数据字典。
大多数RDBMS中都提供了生成数据字典的工具包或有说明来告诉你如何安装它。
主关键字和外关键字,主键唯一性,外键关联其它表字段。
建表基本语法:
create table table_name (field1 datatype[NOT NULL],
field2 datatype[NOT NULL],
field3 datatype[NOT NULL]...);
建表时oracle所支持的数据类型:
char:可以存储长度为1~255个字符的字符串,空格会被填充到字符串的右边以保证其内容满足定义的长度。
date:包括日期的世纪、年、月、日、时、分、秒。
long:可以支持长达2G的字符串。
long raw:可以存储长达2G的二进制内容。
number:零、正值或负值的定点或浮点数。
raw:可以存储长不过255个字节的二进制代码。
rowid:用一个十六进制的数来标明当前行在表内的唯一地址。
varchar2:变长的字母或数字,长度可以从1到2000。
注: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来指定事务的开始,如果你想检查bill 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命令,那么将会取消当前的事务而不会有任何的改变。

猜你喜欢

转载自fangguanhong.iteye.com/blog/1836247