??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲熟女少妇一区二区,亚洲1区2区3区精华液,国产精品无码亚洲精品2021http://www.tkk7.com/zhangzhong1018/category/21195.htmlstudy ruby on railszh-cnWed, 01 Aug 2007 19:01:37 GMTWed, 01 Aug 2007 19:01:37 GMT60debian mysql remote access http://www.tkk7.com/zhangzhong1018/articles/133777.htmlleolileoliWed, 01 Aug 2007 04:19:00 GMThttp://www.tkk7.com/zhangzhong1018/articles/133777.htmlhttp://www.tkk7.com/zhangzhong1018/comments/133777.htmlhttp://www.tkk7.com/zhangzhong1018/articles/133777.html#Feedback0http://www.tkk7.com/zhangzhong1018/comments/commentRss/133777.htmlhttp://www.tkk7.com/zhangzhong1018/services/trackbacks/133777.htmlGRANT ALL PRIVILEGES ON *.* TO admin@localhost IDENTIFIED BY 'something' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON *.* TO admin@% IDENTIFIED BY 'something' WITH GRANT OPTION;

INSERT INTO user VALUES('localhost','admin',PASSWORD('something'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')

INSERT INTO user VALUES('%','admin',PASSWORD('something'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')

W一句增加了一个admin用户授权通过本地机(localhost)讉KQ密?#8220;something”。第二句则是授与admin用户从Q何其它主机发L讉KQ通配W%Q?br>
当没有用?admin  mysql 会自动添加此用户



leoli 2007-08-01 12:19 发表评论
]]>
sql 不错 Qhttp://www.lzbk.com/blog/vista/index.htmlQ?/title><link>http://www.tkk7.com/zhangzhong1018/articles/112181.html</link><dc:creator>leoli</dc:creator><author>leoli</author><pubDate>Fri, 20 Apr 2007 05:39:00 GMT</pubDate><guid>http://www.tkk7.com/zhangzhong1018/articles/112181.html</guid><wfw:comment>http://www.tkk7.com/zhangzhong1018/comments/112181.html</wfw:comment><comments>http://www.tkk7.com/zhangzhong1018/articles/112181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhangzhong1018/comments/commentRss/112181.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhangzhong1018/services/trackbacks/112181.html</trackback:ping><description><![CDATA[<a ><u><font color=#800080>http://lzbk.com/blog/vista/asm.rar</font></u></a>  (asm)<br><br> <li><span style="COLOR: #ff0000">说明Q复制表(只复制结?源表名:a 新表名:b) </span><br>select * into b from a where 1<>1<br><br> <li><span style="COLOR: #ff0000">说明Q拷贝表(拯数据,源表名:a 目标表名Qb)</span><br>insert into b(a, b, c) select d,e,f from b;<br><br> <li><span style="COLOR: #ff0000">说明Q显C文章、提交h和最后回复时?/span><br>select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b<br><br> <li><span style="COLOR: #ff0000">说明Q外q接查询(表名1Qa 表名2Qb)</span><br>select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c<br><br> <li><span style="COLOR: #ff0000">说明Q日E安排提前五分钟提醒</span><br>select * from 日程安排 where datediff('minute',f开始时?getdate())>5<br> <li><span style="COLOR: #ff0000">说明Q?- </span><br>select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and pdU?'"&strdepartmentname&"' and 专业名称='"&strprofessionname&"' order by 性别,生源?高考Ll? <li><span style="COLOR: #ff0000">一个SQL语句的问?行列转换</span><br>select * from v_temp<br>上面的视囄果如?<br>user_>-------------------------<br>pȝ理?理?<br>feng 理?<br>feng 一般用?<br>test 一般用?<br>xl果变成q样:<br>user_>---------------------------<br>pȝ理?理?<br>feng 理?一般用?<br>test 一般用?br>===================<br>create table a_test(>insert into a_test values('?,'理?)<br>insert into a_test values('?,'理?)<br>insert into a_test values('?,'一般用?)<br>insert into a_test values('?,'一般用?)<br><br>create function join_str(@content varchar(100))<br>returns varchar(2000)<br>as<br>begin<br>declare @str varchar(2000)<br>set @str=''<br>select @str=@str+','+rtrim(role2) from a_test where [name]=@content<br>select @str=right(@str,len(@str)-1)<br>return @str<br>end<br>go<br><br>--调用Q?br>select [name],dbo.join_str([name]) role2 from a_test group by [name]<br><br>--select distinct name,dbo.uf_test(name) from a_test<br><br> <li><span style="COLOR: #ff0000">快速比较结构相同的两表</span><br>l构相同的两表,一表有记录3万条左右Q一表有记录2万条左右Q我怎样快速查找两表的不同记录Q?br>============================<br>l你一个测试方法,从northwind中的orders表取数据?br>select * into n1 from orders<br>select * into n2 from orders<br><br>select * from n1<br>select * from n2<br><br>--d主键Q然后修改n1中若q字D늚若干?br>alter table n1 add constraint pk_n1_id primary key (OrderID)<br>alter table n2 add constraint pk_n2_id primary key (OrderID)<br><br>select OrderID from (select * from n1 union select * from n2) a group by OrderID having count(*) > 1<br><br>应该可以Q而且不同的记录的ID昄出来?br>下面的适用于双方记录一L情况Q?br><br>select * from n1 where orderid in (select OrderID from (select * from n1 union select * from n2) a group by OrderID having count(*) > 1) <br>至于双方互不存在的记录是比较好处理的<br>--删除n1,n2中若q条记录<br>delete from n1 where orderID in ('10728','10730')<br>delete from n2 where orderID in ('11000','11001')<br><br>--*************************************************************<br>-- 双方都有该记录却不完全相?br>select * from n1 where orderid in(select OrderID from (select * from n1 union select * from n2) a group by OrderID having count(*) > 1)<br>union<br>--n2中存在但在n1中不存的?0728,10730<br>select * from n1 where OrderID not in (select OrderID from n2)<br>union<br>--n1中存在但在n2中不存的?1000,11001<br>select * from n2 where OrderID not in (select OrderID from n1)<br><br> <li><span style="COLOR: #ff0000">四种Ҏ取表里n到m条纪录:</span><br><br>1.<br>select top m * into 临时?或表变量) from table>set rowcount n<br>select * from 表变?order by column><br><br>2.<br>select top n * from (select top m * from table><br><br>3.如果tablename里没有其他identity列,那么Q?br>select identity(int) id0,* into #temp from tablename<br><br>取n到m条的语句为:<br>select * from #temp where id0 >=n and id0 <= m<br><br>如果你在执行select identity(int) id0,* into #temp from tablenameq条语句的时候报?那是因ؓ你的DB中间的select into/bulkcopy属性没有打开要先执行Q?br>exec sp_dboption 你的DB名字,'select into/bulkcopy',true<br><br><br>4.如果表里有identity属性,那么单:<br>select * from table><br> <li><span style="COLOR: #ff0000">如何删除一个表中重复的记录Q?/span><br>create table a_dist(id int,><br>insert into a_dist values(1,'abc')<br>insert into a_dist values(1,'abc')<br>insert into a_dist values(1,'abc')<br>insert into a_dist values(1,'abc')<br><br>exec up_distinct 'a_dist','id'<br><br>select * from a_dist<br><br>create procedure up_distinct(@t_>--f_key表示是分l字D﹐即主键字D?br>as<br>begin<br>declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer<br>select @sql = 'declare cur_rows cursor for select '+@f_key+' ,count(*) from ' +@t_>exec(@sql)<br>open cur_rows <br>fetch cur_rows into @id,@max <br>while @@fetch_status=0 <br>begin <br>select @max = @max -1 <br>set rowcount @max <br>select @type = xtype from syscolumns where id=object_id(@t_name) and >if @type=56<br>select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+ @id <br>if @type=167<br>select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+''''+ @id +'''' <br>exec(@sql)<br>fetch cur_rows into @id,@max <br>end <br>close cur_rows <br>deallocate cur_rows<br>set rowcount 0<br>end<br><br>select * from systypes<br>select * from syscolumns where id = object_id('a_dist')<br><br> <li><span style="COLOR: #ff0000">查询数据的最大排序问题(只能用一条语句写Q?</span><br>CREATE TABLE hard (qu char (11) ,co char (11) ,je numeric(3, 0)) <br><br>insert into hard values ('A','1',3)<br>insert into hard values ('A','2',4)<br>insert into hard values ('A','4',2)<br>insert into hard values ('A','6',9)<br>insert into hard values ('B','1',4)<br>insert into hard values ('B','2',5)<br>insert into hard values ('B','3',6)<br>insert into hard values ('C','3',4)<br>insert into hard values ('C','6',7)<br>insert into hard values ('C','2',3)<br><br><br>要求查询出来的结果如下:<br><br>qu co je <br>----------- ----------- ----- <br>A 6 9<br>A 2 4<br>B 3 6<br>B 2 5<br>C 6 7<br>C 3 4<br><br><br>是要按qu分组Q每l中取je最大的?位!Q?br>而且只能用一句sql语句Q!Q?br>select * from hard a where je in (select top 2 je from hard b where a.qu=b.qu order by je) <br><br> <li><span style="COLOR: #ff0000">求删除重复记录的sql语句Q?</span><br>怎样把具有相同字D늚U录删除Q只留下一条?br>例如Q表test里有id,name字段<br>如果有name相同的记?只留下一条,其余的删除?br>name的内容不定,相同的记录数不定?br>有没有这Lsql语句Q?br>==============================<br>A:一个完整的解决ҎQ?br><br>重复的记录记入temp1?<br>select [标志字段id],count(*) into temp1 from [表名]<br>group by [标志字段id]<br>having count(*)>1<br><br>2、将不重复的记录记入temp1?<br>insert temp1 select [标志字段id],count(*) from [表名] group by [标志字段id] having count(*)=1<br><br>3、作一个包含所有不重复记录的表Q?br>select * into temp2 from [表名] where 标志字段id in(select 标志字段id from temp1)<br><br>4、删除重复表:<br>delete [表名]<br><br>5、恢复表Q?br>insert [表名] select * from temp2<br><br>6、删除时表:<br>drop table temp1<br>drop table temp2<br>================================<br>B:<br>create table a_dist(id int,><br>insert into a_dist values(1,'abc')<br>insert into a_dist values(1,'abc')<br>insert into a_dist values(1,'abc')<br>insert into a_dist values(1,'abc')<br><br>exec up_distinct 'a_dist','id'<br><br>select * from a_dist<br><br>create procedure up_distinct(@t_>--f_key表示是分l字D﹐即主键字D?br>as<br>begin<br>declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer<br>select @sql = 'declare cur_rows cursor for select '+@f_key+' ,count(*) from ' +@t_>exec(@sql)<br>open cur_rows <br>fetch cur_rows into @id,@max <br>while @@fetch_status=0 <br>begin <br>select @max = @max -1 <br>set rowcount @max <br>select @type = xtype from syscolumns where id=object_id(@t_name) and >if @type=56<br>select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+ @id <br>if @type=167<br>select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+''''+ @id +'''' <br>exec(@sql)<br>fetch cur_rows into @id,@max <br>end <br>close cur_rows <br>deallocate cur_rows<br>set rowcount 0<br>end<br><br>select * from systypes<br>select * from syscolumns where id = object_id('a_dist')<br><br> <li><span style="COLOR: #ff0000">行列转换--普?</span><br><br>假设有张学生成W?CJ)如下 <br>>张三 语文 80 <br>张三 数学 90 <br>张三 物理 85 <br>李四 语文 85 <br>李四 数学 92 <br>李四 物理 82 <br><br>惛_?<br>姓名 语文 数学 物理 <br>张三 80 90 85 <br>李四 85 92 82 <br><br>declare @sql varchar(4000) <br>set @sql = 'select Name' <br>select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']' <br>from (select distinct Subject from CJ) as a <br>select @sql = @sql+' from test group by name' <br>exec(@sql) <br><br>行列转换--合ƈ <br><br>有表A, <br>id pid <br>1 1 <br>1 2 <br>1 3 <br>2 1 <br>2 2 <br>3 1 <br>如何化成表B: <br>id pid <br>1 1,2,3 <br>2 1,2 <br>3 1 <br><br>创徏一个合q的函数 <br>create function fmerg(@id int) <br>returns varchar(8000) <br>as <br>begin <br>declare @str varchar(8000) <br>set @str='' <br>select @str=@str+','+cast(pid as varchar) from 表A where id=@id <br>set @str=right(@str,len(@str)-1) <br>return(@str) <br>End <br>go <br><br>--调用自定义函数得到结?<br>select distinct id,dbo.fmerg(id) from 表A <br><br> <li><span style="COLOR: #ff0000">如何取得一个数据表的所有列?</span><br><br>Ҏ如下Q先从SYSTEMOBJECTpȝ表中取得数据表的SYSTEMID,然后再SYSCOLUMN表中取得该数据表的所有列名?<br>SQL语句如下Q?<br>declare @objid int,@obj>set @obj>select @objid = id from sysobjects where id = object_id(@objname) <br>select 'Column_name' = ><br>?br><br>SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_><br> <li><span style="COLOR: #ff0000">通过SQL语句来更改用L密码 </span><br><br>修改别h?需要sysadmin role <br>EXEC sp_password NULL, 'newpassword', 'User' <br><br>如果帐号为SA执行EXEC sp_password NULL, 'newpassword', sa<br><br> <li><span style="COLOR: #ff0000">怎么判断Z个表的哪些字D不允许为空Q?</span><br><br>select COLUMN_><br> <li><span style="COLOR: #ff0000">如何在数据库里找到含有相同字D늚表? </span><br>a. 查已知列名的情况 <br>SELECT b.>From syscolumns a INNER JOIN sysobjects b <br>ON a.id=b.id <br>AND b.type='U' <br>AND a.><br> <li><span style="COLOR: #ff0000">未知列名查所有在不同表出现过的列?</span><br>Select o.>From syscolumns s1, sysobjects o <br>Where s1.id = o.id <br>And o.type = 'U' <br>And Exists ( <br>Select 1 From syscolumns s2 <br>Where s1.>And s1.id <> s2.id <br>) <br><br> <li><span style="COLOR: #ff0000">查询Wxxx行数?</span><br><br>假设id是主键: <br>select * from (select top xxx * from yourtable) aa where not exists(select 1 from (select top xxx-1 * from yourtable) bb where aa.id=bb.id) <br><br>如果使用游标也是可以?<br>fetch absolute [number] from [cursor_name] <br>行数为绝对行?<br><br> <li><span style="COLOR: #ff0000">SQL Server日期计算 </span><br>a. 一个月的第一?<br>SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) <br>b. 本周的星期一 <br>SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) <br>c. 一q的W一?<br>SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) <br>d. 季度的第一?<br>SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) <br>e. 上个月的最后一?<br>SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)) <br>f. d的最后一?<br>SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) <br>g. 本月的最后一?<br>SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) <br>h. 本月的第一个星期一 <br>select DATEADD(wk, DATEDIFF(wk,0, <br>dateadd(dd,6-datepart(day,getdate()),getdate()) <br>), 0) <br>i. 本年的最后一?<br>SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))?/li> <img src ="http://www.tkk7.com/zhangzhong1018/aggbug/112181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhangzhong1018/" target="_blank">leoli</a> 2007-04-20 13:39 <a href="http://www.tkk7.com/zhangzhong1018/articles/112181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设?http://www.tkk7.com/zhangzhong1018/articles/107970.htmlleolileoliMon, 02 Apr 2007 06:31:00 GMThttp://www.tkk7.com/zhangzhong1018/articles/107970.htmlhttp://www.tkk7.com/zhangzhong1018/comments/107970.htmlhttp://www.tkk7.com/zhangzhong1018/articles/107970.html#Feedback0http://www.tkk7.com/zhangzhong1018/comments/commentRss/107970.htmlhttp://www.tkk7.com/zhangzhong1018/services/trackbacks/107970.html数据库的设计有很多技巧,以下׃l其中的几种Q是许多人在大量的数据库分析与设计实践中Q逐步ȝ出来的。对于这些经验的q用Q读者不能生帮硬套,死记背Q而要消化理解Q实事求是,灉|掌握。ƈ逐步做到Q在应用中发展,在发展中应用?

    1. 原始单据与实体之间的关系

    可以是一对一、一对多、多对多的关pR在一般情况下Q它们是一对一的关p:即一张原始单据对应且只对应一个实体。在Ҏ情况下,它们可能是一对多或多对一的关p,即一张原始单据对应多个实体,或多张原始单据对应一个实体。这里的实体可以理解为基本表。明这U对应关pdQ对我们设计录入界面大有好处?

    〖例1〗:一份员工历资料,在h力资源信息系l中Q就对应三个基本表:员工基本情况表、社会关p表、工作简历表。这是“一张原始单据对应多个实?#8221;的典型例子?

    2. 主键与外?/strong>

    一般而言Q一个实体不能既无主键又无外键。在EQR 图中, 处于叶子部位的实? 可以定义主键Q也可以不定义主?因ؓ它无子孙), 但必要有外?因ؓ它有父亲)?

    主键与外键的设计Q在全局数据库的设计中,占有重要C。当全局数据库的设计完成以后Q有个美国数据库设计专家_“键,到处都是键,除了键之外,什么也没有”Q这是他的数据库设计经验之谈,也反映了他对信息pȝ核心(数据模型)的高度抽象思想。因为:主键是实体的高度抽象Q主键与外键的配对,表示实体之间的连接?

    3. 基本表的性质

    基本表与中间表、时表不同Q因为它h如下四个Ҏ:

    (1) 原子性。基本表中的字段是不可再分解的?

    (2) 原始性。基本表中的记录是原始数据(基础数据Q的记录?

    (3) 演绎性。由基本表与代码表中的数据,可以z出所有的输出数据?

    (4) E_性。基本表的结构是相对E_的,表中的记录是要长期保存的?

    理解基本表的性质后,在设计数据库Ӟp基本表与中间表、时表区分开来?

    4. 范式标准

    基本表及其字D之间的关系, 应尽量满第三范式。但是,满W三范式的数据库设计Q往往不是最好的设计。ؓ了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余Q达CI间换时间的目的?

    〖例2〗:有一张存攑֕品的基本表,如表1所C?#8220;金额”q个字段的存在,表明该表的设计不满W三范式Q因?#8220;金额”可以?#8220;单h”乘以“数量”得到Q说?#8220;金额”是冗余字Dc但是,增加“金额”q个冗余字段Q可以提高查询统计的速度Q这是以空间换旉的作法?

    在Rose 2002中,规定列有两种cdQ数据列和计列?#8220;金额”q样的列被称?#8220;计算?#8221;Q?#8220;单h”?#8220;数量”q样的列被称?#8220;数据?#8221;?

    ? 商品表的表结?

    商品名称 商品型号 单h 数量 金额

    电视?29?2,500 40 100,000

    5. 通俗地理解三个范?/strong>

    通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中Qؓ了更好地应用三个范式Q就必须通俗地理解三个范?通俗地理解是够用的理解,q不是最U学最准确的理?Q?

    W一范式Q?NF是对属性的原子性约束,要求属性具有原子性,不可再分解;

    W二范式Q?NF是对记录的惟一性约束,要求记录有惟一标识Q即实体的惟一性;

    W三范式Q?NF是对字段冗余性的U束Q即M字段不能由其他字D|生出来,它要求字D|有冗余?

    没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时Z提高q行效率Q就必须降低范式标准Q适当保留冗余数据。具体做法是Q在概念数据模型设计旉守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字D,允许冗余?

    6. 要善于识别与正确处理多对多的关系

    若两个实体之间存在多对多的关p,则应消除q种关系。消除的办法是,在两者之间增加第三个实体。这P原来一个多对多的关p,现在变ؓ两个一对多的关pR要原来两个实体的属性合理地分配C个实体中厅R这里的W三个实体,实质上是一个较复杂的关p,它对应一张基本表。一般来Ԍ数据库设计工具不能识别多对多的关p,但能处理多对多的关系?

    〖例3〗:?#8220;图书馆信息系l?#8221;中,“图书”是一个实体,“读?#8221;也是一个实体。这两个实体之间的关p,是一个典型的多对多关p:一本图书在不同旉可以被多个读者借阅Q一个读者又可以借多本图书。ؓ此,要在二者之间增加第三个实体Q该实体取名?#8220;借还?#8221;Q它的属性ؓQ借还旉、借还标志(0表示借书Q?1表示q书)Q另外,它还应该有两个外?“图书”的主键,“读?#8221;的主?Q它能?#8220;图书”?#8220;读?#8221;q接?

    7. 主键PK的取值方?/strong>

    PK是供E序员用的表间q接工具Q可以是一无物理意义的数字? q序自动加1来实现。也可以是有物理意义的字D名或字D名的组合。不q前者比后者好。当PK是字D名的组合时Q徏议字D늚个数不要太多Q多了不但烦引占用空间大Q而且速度也慢?

    8. 正确认识数据冗余

    主键与外键在多表中的重复出现, 不属于数据冗余,q个概念必须清楚Q事实上有许多hq不清楚。非键字D늚重复出现, 才是数据冗余Q而且是一U低U冗余,即重复性的冗余。高U冗余不是字D늚重复出现Q而是字段的派生出现?

    〖例4〗:商品中的“单h、数量、金?#8221;三个字段Q?#8220;金额”是?#8220;单h”乘以“数量”z出来的,它就是冗余,而且是一U高U冗余。冗余的目的是ؓ了提高处理速度。只有低U冗余才会增加数据的不一致性,因ؓ同一数据Q可能从不同旉、地炏V角色上多次录入。因此,我们提倡高U冗?z性冗?Q反对低U冗?重复性冗??

    9. EQR图没有标准答?/strong>

    信息pȝ的EQR图没有标准答案,因ؓ它的设计与画法不是惟一的,只要它覆盖了pȝ需求的业务范围和功能内容,是可行的。反之要修改EQR图。尽它没有惟一的标准答案,q不意味着可以随意设计。好的EQ图的标准是Q结构清晰、关联简z、实体个数适中、属性分配合理、没有低U冗余?

    10. 视图技术在数据库设计中很有?/strong>

    与基本表、代码表、中间表不同Q视图是一U虚表,它依赖数据源的实表而存在。视图是供程序员使用数据库的一个窗口,是基表数据综合的一UŞ? 是数据处理的一U方法,是用h据保密的一U手Dcؓ了进行复杂处理、提高运速度和节省存储空? 视图的定义深度一般不得超q三层。若三层视图仍不够用, 则应在视图上定义临时? 在时表上再定义视图。这样反复交q定? 视图的深度就不受限制了?

    对于某些与国家政沅R经、技术、军事和安全利益有关的信息系l,视图的作用更加重要。这些系l的基本表完成物理设计之后,立即在基本表上徏立第一层视图,q层视图的个数和l构Q与基本表的个数和结构是完全相同。ƈ且规定,所有的E序员,一律只准在视图上操作。只有数据库理员,带着多个人员共同掌握?“安全钥匙”Q才能直接在基本表上操作。请读者想惻Iq是Z么?

    11. 中间表、报表和临时?

    中间表是存放l计数据的表Q它是ؓ数据仓库、输出报表或查询l果而设计的Q有时它没有主键与外?数据仓库除外)。时表是程序员个h设计的,存放临时记录Qؓ个h所用。基表和中间表由DBAl护Q时表q序员自己用程序自动维护?

    12. 完整性约束表现在三个斚w

    域的完整性:用Check来实现约束,在数据库设计工具中,对字D늚取D围进行定义时Q有一个Check按钮Q通过它定义字D늚值城?

    参照完整性:用PK、FK、表U触发器来实现?

    用户定义完整性:它是一些业务规则,用存储过E和触发器来实现?

    13. 防止数据库设计打补丁的方法是“三少原则”

    (1) 一个数据库中表的个数越越好。只有表的个数少了,才能说明pȝ的EQR囑ְ而精Q去掉了重复的多余的实体QŞ成了对客观世界的高度抽象Q进行了pȝ的数据集成,防止了打补丁式的设计Q?

    (2) 一个表中组合主键的字段个数少好。因Z键的作用Q一是徏主键索引Q二是做为子表的外键Q所以组合主键的字段个数了Q不仅节省了q行旉Q而且节省了烦引存储空_

    (3) 一个表中的字段个数少好。只有字D늚个数了Q才能说明在pȝ中不存在数据重复Q且很少有数据冗余,更重要的是督促读者学?#8220;列变?#8221;Q这样就防止了将子表中的字段拉入C表中去,在主表中留下许多IZ的字Dc所?#8220;列变?#8221;Q就是将主表中的一部分内容拉出去,另外单独Z个子表。这个方法很单,有的人就是不习惯、不采纳、不执行?

    数据库设计的实用原则是:在数据冗余和处理速度之间扑ֈ合适的q炏V?#8220;三少”是一个整体概念,l合观点Q不能孤立某一个原则。该原则是相对的Q不是绝对的?#8220;三多”原则肯定是错误的。试惻I若覆盖系l同L功能Q一百个实体(׃千个属? 的EQR图,肯定比二百个实体(׃千个属?的EQR图,要好得多?

    提?#8220;三少”原则Q是叫读者学会利用数据库设计技术进行系l的数据集成。数据集成的步骤是将文gpȝ集成为应用数据库Q将应用数据库集成ؓ主题数据库,主题数据库集成为全局l合数据库。集成的E度高Q数据共享性就强Q信息孤岛现象就少Q整个企业信息系l的全局E—R图中实体的个数、主键的个数、属性的个数׃少?

    提?#8220;三少”原则的目的,是防止读者利用打补丁技术,不断地对数据库进行增删改Q企业数据库变成了随意设计数据库表?#8220;垃圾?#8221;Q或数据库表?#8220;大杂?#8221;Q最后造成数据库中的基本表、代码表、中间表、时表杂ؕ无章Q不计其敎ͼD企事业单位的信息pȝ无法l护而瘫痪?

    “三多”原则M人都可以做到Q该原则?#8220;打补丁方?#8221;设计数据库的歪理学说?#8220;三少”原则是少而精的原则,它要求有较高的数据库设计技巧与艺术Q不是Q何h都能做到的,因ؓ该原则是杜绝?#8220;打补丁方?#8221;设计数据库的理论依据?

    14. 提高数据库运行效率的办法

    在给定的pȝg和系lY件条件下Q提高数据库pȝ的运行效率的办法是:

    (1) 在数据库物理设计Ӟ降低范式Q增加冗? 用触发? 多用存储q程?

    (2) 当计非常复杂、而且记录条数非常巨大?例如一千万?Q复杂计要先在数据库外面,以文件系l方式用C++语言计算处理完成之后Q最后才入库q加到表中去。这是电信计费系l设计的l验?

    (3) 发现某个表的记录太多Q例如超q一千万条,则要对该表进行水q_剌Ӏ水q_割的做法是,以该表主键PK的某个gؓ界线Q将该表的记录水q_割ؓ两个表。若发现某个表的字段太多Q例如超q八十个Q则垂直分割该表Q将原来的一个表分解Z个表?

    (4) Ҏ据库理pȝDBMSq行pȝ优化Q即优化各种pȝ参数Q如~冲Z数?

    (5) 在用面向数据的SQL语言q行E序设计Ӟ量采取优化法?

    MQ要提高数据库的q行效率Q必M数据库系l优化、数据库设计U优化、程序实现优化Q这三个层次上同时下功夫?



leoli 2007-04-02 14:31 发表评论
]]>
数据库设?步骤http://www.tkk7.com/zhangzhong1018/articles/107969.htmlleolileoliMon, 02 Apr 2007 06:30:00 GMThttp://www.tkk7.com/zhangzhong1018/articles/107969.htmlhttp://www.tkk7.com/zhangzhong1018/comments/107969.htmlhttp://www.tkk7.com/zhangzhong1018/articles/107969.html#Feedback0http://www.tkk7.com/zhangzhong1018/comments/commentRss/107969.htmlhttp://www.tkk7.com/zhangzhong1018/services/trackbacks/107969.html 
数据库设?步骤

来源QSQL Anywhere User's Guide

译作者:Sarkuya


版权声明Q可以Q意{载,转蝲时请务必以超链接形式标明文章原始出处和作者信息及本声?br>原文地址:
http://www.matrix.org.cn/resource/article/43/43717_Database_Design.html
关键词: Database Design


1.定entities及relationships

a)设计宏观行ؓ。你用此数据库来做什么?比如Q希望管理雇员的信息?br>
b)定entities。对于一pd的行为,定所理信息所涉及到的主题范围。这变成table。比如,雇用员工Q指定具体部门,定技能等U?br>
c)定relationships。看着行ؓQ确定tables之间有何U关pR比如,在部门与雇员之间存在一U关pR给q种关系命名?br>
d)l化行ؓ。你从宏观行为开始,现在仔细查这些行为,看有哪些行ؓ能{为微观行为。比如,理雇员的信息可l化为:
?nbsp;       增加新员?br>?nbsp;       修改存在员工信息
?nbsp;       删除调走的员?br>
e)定业务规则。看着你的业务规则Q确定你要采取哪U。比如,可能有这样一U规则,一个部门有且只能有一个部门领对{这些规则将被设计到数据库的l构中?br>
范例Q?/strong>

ACME是一个小公司Q在5个地斚w设有办事处。当前,?5名员工。公司准备快速扩大规模,划分?个部门,每个部门都有光对{?br>为有助于L新的员工Qh事部门规划了68U技能,为将来h事管理作好准备。员工被招进Ӟ每一U技能的专业{都被定?br>
定义宏观行ؓ
一些ACME公司的宏观行为包括:
?nbsp;       招聘员工
?nbsp;       解雇员工
?nbsp;       理员工个h信息
?nbsp;       理公司所需的技能信?br>?nbsp;       理哪位员工有哪些技?br>?nbsp;       理部门信息
?nbsp;       理办事处信?br>
定entities及relationships
我们可以定要存放信息的主题领域(?及其关系Qƈ创徏一个基于宏观行为及描述的图表?br>我们用方框来代表tableQ用菱Ş代表relationship。我们可以确定哪些relationship是一对多Q一对一Q及多对多?br>q是一个E-R草图Q以后会l化?br>
image

l化宏观行ؓ
以下微观行ؓZ上面宏观行ؓ而Ş成:
?nbsp;       增加或删除一个员?br>?nbsp;       增加或删除一个办事处
?nbsp;       列出一个部门中的所有员?br>?nbsp;       增加一Ҏ?br>?nbsp;       增加一个员工的一Ҏ?br>?nbsp;       定一个员工的技?br>?nbsp;       定一个员工每Ҏ能的{
?nbsp;       定所有拥有相同等U的某项技能的员工
?nbsp;       修改员工的技能等U?br>
q些微观行ؓ可用来确定需要哪些table或relationship?br>
定业务规则
业务规则常用于确定一对多Q一对一Q及多对多关pR?br>相关的业务规则可能有Q?br>?nbsp;       现在?个办事处Q最多允许扩展到10个?br>?nbsp;       员工可以改变部门或办事处
?nbsp;       每个部门有一个部门领?br>?nbsp;       每个办事处至多有3个电话号?br>?nbsp;       每个电话L有一个或多个扩展
?nbsp;       员工被招q时Q每一U技能的专业{都被定?br>?nbsp;       每位员工拥有3?0个技?br>?nbsp;       某位员工可能被安排在一个办事处Q也可能不安排办事处?br>
2.定所需数据

要确定所需数据Q?br>1.        定支持数据
2.        列出所要跟t的所有数据。描qtable(主题)的数据回{这些问题:谁,什么,哪里Q何Ӟ以及Z?br>3.        为每个table建立数据
4.        列出每个table目前看v来合适的可用数据
5.        为每个relationship讄数据
6.        如果有,为每个relationship列出适用的数?br>
定支持数据

你所定的支持数据将会成为table中的字段名。比如,下列数据适用于表EmployeeQ表SkillQ表Expert In?br>
image

如果这些数据画成图表,像Q?br>
image

需要注意:
?nbsp;       在确定支持数据时Q请一定要参考你之前所定的宏观行为,以清楚如何利用这些数据?br>?nbsp;       比如Q如果你知道你需要所有员工的按姓氏排序的列表Q确保你支持数据分解ؓ名字与姓氏,q比单地提供一个名字会更好?br>?nbsp;       你所选择的名U最好保持一致性。这更易于l护数据库,也更易于阅读所输出的报表?br>?nbsp;       比如Q如果你在某些地方用了一个羃写名UEmp_statusQ你׃应该在另外一个地方用全?Empolyee_ID)。相反,q些名称应当是Emp_status及Emp_id?br>?nbsp;       数据是否与正的table相对应无关紧要,你可以根据自q喜好来定。在下节中,你会通过试Ҏ作出判断?br>
3.标准化数?/span>

标准化是你用以消除数据冗余及保数据与正的table或relationship相关联的一pd试。共?个测试。本节中Q我们将讨论l常使用?个?br>关于标准化测试的更多信息Q请参考有x据库设计的书c?br>
标准化格?/strong>
标准化格式是标准化数据的常用试方式。你的数据通过W一遍测试后Q就被认为是辑ֈW一标准化格式;通过W二遍测试,辑ֈW二标准化格式;通过W三遍测试,辑ֈW三标准化格式?br>
如何标准格式Q?br>1Q?nbsp;       列出数据
2Q?nbsp;       为每个表定臛_一个键。每个表必须有一个主键?br>3Q?nbsp;       定relationships的键。relationships的键是连接两个表的键?br>4Q?nbsp;       查支持数据列表中的计数据。计数据通常不保存在数据库中?br>5Q?nbsp;       数据放在第一遍的标准化格式中Q?br>6Q?nbsp;       从tables及relationships除去重复的数据?br>7Q?nbsp;       以你所除去数据创徏一个或更多的tables及relationships?br>8Q?nbsp;       数据放在第二遍的标准化格式中:
9Q?nbsp;       用多于一个以上的键确定tables及relationships?br>10Q?nbsp;       除去只依赖于键一部分的数据?br>11Q?nbsp;       以你所除去数据创徏一个或更多的tables及relationships?br>12Q?nbsp;       数据放在第三遍的标准化格式中:
13Q?nbsp;       除去那些依赖于tables或relationships中其他数据,q且不是键的数据?br>14Q?nbsp;       以你所除去数据创徏一个或更多的tables及relationships?br>
数据与键
在你开始标准化Q测试数据)前,单地列出数据Qƈ为每张表定一个唯一的主键。这个键可以׃个字D|几个字段Q连锁键Q组成?br>
主键是一张表中唯一区分各行的一l字DcEmployee表的主键是Employee ID字段。Works In relationship中的主键包括Office Code及Employee ID字段。给数据库中每一relationshipl出一个键Q从其所q接的每一个table中抽取其键生?br>image

数据放在第一遍的标准化格式中
?nbsp;       除去重复的组
?nbsp;       要测试第一遍标准化格式Q除去重复的l,q将它们放进他们各自的一张表中?br>?nbsp;        在下面的例子中,Phone Number可以重复。(一个工作h员可以有多于一个的电话L。)重复的l除去,创徏一个名为Telephone的新表。在Telephone?Office创徏一个名为Associated With的relationship?br>
数据放在第二遍的标准化格式?/strong>
?nbsp;       除去那些不依赖于整个键的数据?br>?nbsp;       只看那些有一个以上键的tables及relationships。要试W二遍标准化格式Q除去那些不依赖于整个键的Q何数据(l成键的所有字D)?br>?nbsp;        在此例中Q原Employee表有一个由两个字段l成的键。一些数据不依赖于整个键Q例如,department name只依赖于其中一个键QDepartment IDQ。因此,Department IDQ其他Employee数据q不依赖于它Q应U至一个名为Department的新表中Qƈ为Employee及Department建立一个名?Assigned To的relationship?br>image

数据放在第三遍的标准化格式?/strong>
?nbsp;       除去那些不直接依赖于键的数据?br>?nbsp;       要测试第三遍标准化格式,除去那些不是直接依赖于键Q而是依赖于其他数据的数据?br>?nbsp;        在此例中Q原Employee表有依赖于其键(Employee IDQ的数据。然而,office location及office phone依赖于其他字D,即Office Code。它们不直接依赖于Employee ID键。将q组数据Q包括Office CodeQ移至一个名为Office的新表中Qƈ为Employee及Office建立一个名为Works In的relationship?br>
image



4.考量关系

当你完成标准化进E后Q你的设计已l差不多完成了。你所需要做的,是考量关系?br>
考量带有数据的关p?/strong>
你的一些relationship可能集含有数据。这l常发生在多对多的关pM?br>
image

遇到q种情况Q将relationship转化Z个table。relationship的键依旧成ؓtable中的键?br>
考量没有数据的关p?/strong>
要实现没有数据的关系Q你需要定义外部键。外部键是含有另外一个表中主键的一个或多个字段。外部键使你能同时连接多表数据?br>
有一些基本原则能帮助你决定将q些键放在哪里:

一对多 在一对多关系中,“一”中的主键攑֜“?#8221;中。此例中Q外部键攑֜Employee表中?br>
image

一对一 在一对一关系中,外部键可以放qQ一表中。如果必要攑֜某一边,而不能放在另一边,应该攑֜必须的一辏V此例中Q外部键QHead IDQ在Department表中Q因是必需的?br>
image

多对?/strong> 在多对多关系中,用两个外部键来创Z个新表。已存的旧表通过q个新表来发生联pR?br>image


5.验设?/span>

在你完成设计之前Q你需要确保它满你的需要。检查你在一开始时所定义的行为,认你可以获取行为所需要的所有数据:
?nbsp;       你能扑ֈ一个\径来{到你所需要的所有信息吗Q?br>?nbsp;       设计是否满了你的需要?
?nbsp;       所有需要的数据都可用吗Q?br>如果你对以上的问题都回答是,你已l差不多完成设计了?br>
最l设?/strong>
最l设计看h像q样Q?br>
image


设计数据库的表属?/strong>
数据库设计需要确定有什么表Q每张表有什么字Dc此节讨论如何指定各字段的属性?br>
对于每一字段Q你必须军_字段名,数据cd及大,是否允许NULL|以及你是否希望数据库限制字段中所允许的倹{?br>
选择字段?/strong>
字段名可以是字母、数字或W号的Q意组合。然而,如果字段名包括了字母、数字或下划Uѝ或q不以字母打_或者它是个关键字(详见关键字表Q,那么当用字D名U时Q必ȝ双引hh?br>
为字D选择数据cd
SQL Anywhere支持的数据类型包括:
        整数Qint, integer, smallintQ?br>        数Qdecimal, numericQ?br>        点敎ͼfloat, doubleQ?br>        字符型(char, varchar, long varcharQ?br>        二进制数据类型(binary, long binaryQ?br>        日期/旉cdQdate, time, timestampQ?br>        用户自定义类?br>
关于数据cd的内容,请参?#8220;SQL Anywhere数据cd”一节。字D늚数据cd影响字段的最大尺寸。例如,如果你指定SMALLINTQ此字段可以容纳32,767的整数?INTEGER可以容纳2,147,483,647的整数。对CHAR来讲Q字D늚最大值必L定?br>
长二q制的数据类型可用来在数据库中保存例如图?如位?或者文字编辑文档。这些类型的信息通常被称Zq制大型对象Q或者BLOBS?br>
关于每一数据cd的完整描qͼ?#8220;SQL Anywhere数据cd”?br>
NULL与NOT NULL

如果一个字D值是必填的,你就此字段定义为NOT NULL。否则,字段值可以ؓNULL|卛_以有I倹{SQL中的默认值是允许I|你应该显C地字D定义ؓNOT NULLQ除非你有好理由其设ؓ允许I倹{?br>
关于NULL值的完整描述Q请?#8220;NULL value”。有兛_Ҏ用法Q见“Search conditions”?br>
选择U束

管字段的数据类型限制了能存在字D中的数据(例如Q只能存数字或日期)Q你或许希望更进一步来U束其允许倹{?br>
你可以通过指定一?#8220;CHECK”U束来限制Q意字D늚倹{你可以使用能在WHERE子句中出现的M有效条g来约束被允许的|管大多数CHECKU束使用BETWEEN或IN条g?br>
更多信息

有关有效条g的更多信息,?#8220;Search conditions”。有兛_何ؓ表及字段指定U束Q见“Ensuring Data Integrity”?br>
例子
例子数据库中有一个名为department的表Q字D|dept_id, dept_name, dept_head_id。其定义如下Q?br>image

注意每一字段都被指定?#8220;not null”。这U情况下Q表中每一记录的所有字D늚数据都必填?br>
选择主键及外部键
主键是唯一识别表中每一记录的字段。如何你的表已经正确标准化,主键应当成ؓ数据库设计的一部分?br>外部键是包含另一表中主键值的一个或一l字Dc外部键关系在数据库中徏立了一对一及一对多关系。如果你的设计已l正标准化Q外部键应当成ؓ数据库设计的一部分?

leoli 2007-04-02 14:30 发表评论
]]>
数据库设?http://www.tkk7.com/zhangzhong1018/articles/107968.htmlleolileoliMon, 02 Apr 2007 06:29:00 GMThttp://www.tkk7.com/zhangzhong1018/articles/107968.htmlhttp://www.tkk7.com/zhangzhong1018/comments/107968.htmlhttp://www.tkk7.com/zhangzhong1018/articles/107968.html#Feedback0http://www.tkk7.com/zhangzhong1018/comments/commentRss/107968.htmlhttp://www.tkk7.com/zhangzhong1018/services/trackbacks/107968.html以下是针对事务型数据库:
1.是否使用联合主键Q?/span>个h們֐于少采用联合主键。因样会降低索引的效率,联合主键一般都要用到至一个业务字D,往往是字W串型的Q而且理论上多字段的烦引比单字D늚索引要慢些。看上去g也不那么清爽?
在实际的设计中,我尽量避免用联合主键,有些时?#8220;不得?#8221;使用联合主键?

2.PK采用无意义的字段Q逻辑主键Q还是有意义的字D(业务主键Q?个h們֐?#8220;逻辑主键”Q理由是q样设计出的数据库模型结构清晰、关p脉l清楚,往往更符?#8220;W三范式”Q虽然不是故意的Q呵呵)。而且更容易避开“联合主键”Q而且可以使用索引效率高的字段cdQ比如int、long、number。缺Ҏ用无意义的字D徏立表间的关系Q跨表查询增多Q效率下降。(矛盾无处不在Q前面刚说完可以提高效率Q这里马上又降低效率Q?#8220;业务主键”可以提升查询~码的简z度和效率?
个h使用实际状况QM来说“逻辑主键”?#8220;业务主键”执行效率低,但不会低到无法满需求。采?#8220;逻辑主键”比采?#8220;业务主键”更利于数据库模型的结构、关pL晎ͼ也更便于l护?
对于分析型数据库Q如数据仓库Q千万不要这样做?

3.不要使用多对多关p?个h們֐于少使用多对多关pR这个问题其实不是数据库设计的问题了Q在数据库设计中Q多对多关系也仅仅存在于概念模型QE-RQ阶D,物理模型不在有多对多关系Q实际数据库中也不会?#8220;多对?#8221;关系。这是用ORM时的问题Q比如用HibernateQ多对多关系有时会ɾ~码看v来灵zM些,代h是效率的明显降低?
个h实际使用中,设计时基本不考虑多对多关p,但编码时M有小l成员用一些多对多关系Q自己徏立多对多的ORMQ自己~码方便些,用在数据量小的地方,影响不大。大数据量,?#8220;止使用”?

4.为每个表增加一个state字段Q?/span>我习惯在设计时给每个表设一个state字段Q取??Q默认gؓ1Q具体业务意义或操作上的意义可以自定义。可以作Z个状态控制字D,如查询、更新、删除条Ӟ单据是否有效Q业务单据对应的表会有业务意义上?#8220;?无效”?#8220;状?#8221;字段Q这U情况下Q我q是会再加一个state字段Q,甚至仅仅是控制一条数据是?#8220;有效”Q有效的意义你自己定Q。在数据q移Q如转入分析用的数据库)时也可能会发挥作用?

5.为每个表讄一些备用字D?没办法,我L设计不出“完美”的数据表Q给每个表加几个备用字段Q我一般用字符串型Q随你)可以应付“不时之需”Q尤其是需要长期维护的、业务可能有临时性变动的pȝ?

6.量不要在一个表中存入其兌表的字段Q?/span>不存Q这样做实可以提高查询效率Q但在一个有很多表,q且兌表多的情况下Q很难保持数据的一致性!数据库结构也比较p糕。而且不存Q也不会使效率十分低下?

7.不要ȝ接修Ҏ据库Q?/span>个h认ؓq点很重要,当需要修ҎQ应该先MҎ型,然后同步物理数据库,其是团队开发,否则要多做更多的事情来搞定,也可能会引入更多的错误?


leoli 2007-04-02 14:29 发表评论
]]>
Oralce中的to_date()函数http://www.tkk7.com/zhangzhong1018/articles/107967.htmlleolileoliMon, 02 Apr 2007 06:28:00 GMThttp://www.tkk7.com/zhangzhong1018/articles/107967.htmlhttp://www.tkk7.com/zhangzhong1018/comments/107967.htmlhttp://www.tkk7.com/zhangzhong1018/articles/107967.html#Feedback0http://www.tkk7.com/zhangzhong1018/comments/commentRss/107967.htmlhttp://www.tkk7.com/zhangzhong1018/services/trackbacks/107967.htmlOralce中的to_date()函数用于字W串转换为日期对象,具体使用格式为:
to_date( string,  [  format_mask  ] [  nls_language  ]  )

string1

要{换的字符?

format_mask 可选项Q日期{换格?

nls_language 可选项. 指定用于转换字符串的nls language.

其中 format_mask主要有以下几U格式:
Format Code Explanation
YEAR Year, spelled out
YYYY 4-digit year
MM Month (01-12; JAN = 01).
MON Abbreviated name of month.
MONTH Name of month, padded with blanks to length of 9 characters.
D Day of week (1-7).
DAY Name of day.
DD Day of month (1-31).
DDD Day of year (1-366).
DY Abbreviated name of day.
HH Hour of day (1-12).
HH12 Hour of day (1-12).
HH24 Hour of day (0-23).
MI Minute (0-59).
SS Second (0-59).
SSSSS Seconds past midnight (0-86399).

[问题]

ORA-01810: format code appears twice
可能是像Java那样指定日期格式Q比如:
to_char('2006-06-01 18:00:00' 'yyyy-mm-dd hh:MM:ss')
而在Oracle中的日期格式是不区分大小写的,所?mm 出现了两ơ?br>正确的写法是Q?br>to_char('2006-06-01 18:00:00' 'yyyy-mm-dd hh:mi:ss')

ORA-01722: invalid number
可能是指定小时ؓhh,而hh取D围是 1-12,所以如果指定小时ؓ 0 点将出现q个异常Q比如:
to_char('2006-06-01 00:00:00' 'yyyy-mm-dd hh:MM:ss')
正确的写法是Q?br>to_char('2006-06-01 00:00:00' 'yyyy-mm-dd hh24:MM:ss')


leoli 2007-04-02 14:28 发表评论
]]>
oracle 存储q程http://www.tkk7.com/zhangzhong1018/articles/107965.htmlleolileoliMon, 02 Apr 2007 06:27:00 GMThttp://www.tkk7.com/zhangzhong1018/articles/107965.htmlhttp://www.tkk7.com/zhangzhong1018/comments/107965.htmlhttp://www.tkk7.com/zhangzhong1018/articles/107965.html#Feedback0http://www.tkk7.com/zhangzhong1018/comments/commentRss/107965.htmlhttp://www.tkk7.com/zhangzhong1018/services/trackbacks/107965.html1.基本l构
CREATE OR REPLACE PROCEDURE 存储q程名字
(
    参数1 IN NUMBER,
    参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN

END 存储q程名字

2.SELECT INTO STATEMENT
  select查询的结果存入到变量中,可以同时多个列存储多个变量中,必须有一?br>  记录Q否则抛出异?如果没有记录抛出NO_DATA_FOUND)
  例子Q?
  BEGIN
  SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
      xxxx;
  END;
  ...

3.IF 判断
  IF V_TEST=1 THEN
    BEGIN
       do something
    END;
  END IF;

4.while 循环
  WHILE V_TEST=1 LOOP
  BEGIN
 XXXX
  END;
  END LOOP;

5.变量赋?br>
  V_TEST := 123;

6.用for in 使用cursor

  ...
  IS
  CURSOR cur IS SELECT * FROM xxx;
  BEGIN
 FOR cur_result in cur LOOP
  BEGIN
   V_SUM :=cur_result.列名1+cur_result.列名2
  END;
 END LOOP;
  END;

7.带参数的cursor
  CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
  OPEN C_USER(变量?;
  LOOP
 FETCH C_USER INTO V_NAME;
 EXIT FETCH C_USER%NOTFOUND;
    do something
  END LOOP;
  CLOSE C_USER;

8.用pl/sql developer debug
  q接数据库后建立一个Test WINDOW
  在窗口输入调用SP的代?F9开始debug,CTRL+N单步调试



leoli 2007-04-02 14:27 发表评论
]]>
oracle 日期处理http://www.tkk7.com/zhangzhong1018/articles/107964.htmlleolileoliMon, 02 Apr 2007 06:26:00 GMThttp://www.tkk7.com/zhangzhong1018/articles/107964.htmlhttp://www.tkk7.com/zhangzhong1018/comments/107964.htmlhttp://www.tkk7.com/zhangzhong1018/articles/107964.html#Feedback0http://www.tkk7.com/zhangzhong1018/comments/commentRss/107964.htmlhttp://www.tkk7.com/zhangzhong1018/services/trackbacks/107964.html1、{换函?br>与date操作关系最大的是两个转换函数Qto_date(),to_char()
to_date() 作用字W类型按一定格式{化ؓ日期cdQ?br>具体用法:to_date('2004-11-27','yyyy-mm-dd'),前者ؓ字符Ԍ后者ؓ转换日期格式Q注意,前后两者要以一对应?br>?to_date('2004-11-27 13:34:43', 'yyyy-mm-dd hh24:mi:ss') 得到具体的旉

多种日期格式Q?br>
YYYYQ四位表C的q䆾 
YYYQYYQYQ年份的最后三位、两位或一位,~省为当前世U?nbsp;
MMQ?1~12的月份编?nbsp;
MONTHQ九个字W表C的月䆾Q右边用I格填补 
MONQ三位字W的月䆾~写 
WWQ一q中的星?nbsp;
DQ星期中的第几天 
DDQ月份中的第几天 
DDDQ年所中的W几?nbsp;
DAYQ九个字W表C的天的全称Q右边用I格补齐 
HHQHH12Q一天中的第几个时Q?2q制表示?nbsp;
HH24Q一天中的第几个时Q取gؓ00~23 
MIQ一时中的分钟 
SSQ一分钟中的U?nbsp;
SSSSQ从午夜开始过ȝU数 

to_char():日期{按一定格式换成字W类?br>SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') time from dual;

TIME
-------------------
2004-10-08 15:22:58

x当前旉按yyyy-mm-dd hh24:mi:ss格式转换成字W类?br>
在oracle中处理日期大?nbsp;

  TO_DATE格式  
Day:  
dd number 12  
dy abbreviated fri  
day spelled out friday  
ddspth spelled out, ordinal twelfth  
Month:  
mm number 03  
mon abbreviated mar  
month spelled out march  
Year:  
yy two digits 98  
yyyy four digits 1998  

24时格式下时间范围ؓQ?nbsp;0:00:00 - 23:59:59....  
12时格式下时间范围ؓQ?nbsp;1:00:00 - 12:59:59 ....  

[ZT]日期?????
1.  
日期和字W{换函数用法(to_date,to_charQ?nbsp; 

2.  
select to_char( to_date(222,'J'),'Jsp') from dual  

昄Two Hundred Twenty-Two  

3.  
求某天是星期?nbsp; 
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;  
星期一  
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;  
monday  
讄日期语言  
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';  
也可以这?nbsp; 
TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')  

4.  
两个日期间的天数  
select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;  

5. 旉为null的用?nbsp; 
select id, active_date from table1  
UNION  
select 1, TO_DATE(null) from dual;  

注意要用TO_DATE(null)  

6.  
a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')  
那么12?1号中?2点之后和12?L12点之前是不包含在q个范围之内的?nbsp; 
所以,当时间需要精的时候,觉得to_charq是必要?nbsp; 
7. 日期格式冲突问题  
输入的格式要看你安装的ORACLE字符集的cd, 比如: US7ASCII, date格式的类型就? '01-Jan-01'  
alter system set NLS_DATE_LANGUAGE = American  
alter session set NLS_DATE_LANGUAGE = American  
或者在to_date中写  
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;  
注意我这只是举了NLS_DATE_LANGUAGEQ当然还有很多,  
可查?nbsp; 
select * from nls_session_parameters  
select * from V$NLS_PARAMETERS  

8.  
select count(*)  
from ( select rownum-1 rnum  
from all_objects  
where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-  
02-01','yyyy-mm-dd')+1  
)  
where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )  
not  
in ( '1', '7' )  

查找2002-02-28?002-02-01间除星期一和七的天?nbsp; 
在前后分别调用DBMS_UTILITY.GET_TIME, 让后结果相?得到的是1/100U? 而不是毫U?.  

9.  
select months_between(to_date('01-31-1999','MM-DD-YYYY'),  
to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;  
1  

select months_between(to_date('02-01-1999','MM-DD-YYYY'),  
to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;  

1.03225806451613  
10. Next_day的用?nbsp; 
Next_day(date, day)  

Monday-Sunday, for format code DAY  
Mon-Sun, for format code DY  
1-7, for format code D  

11  
select to_char(sysdate,'hh:mi:ss') TIME from all_objects  
注意Q第一条记录的TIME 与最后一行是一L  
可以建立一个函数来处理q个问题  
create or replace function sys_date return date is  
begin  
return sysdate;  
end;  

select to_char(sys_date,'hh:mi:ss') from all_objects;  
12.  
获得时?nbsp; 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer  
SQL> select sysdate ,to_char(sysdate,'hh') from dual;  

SYSDATE TO_CHAR(SYSDATE,'HH')  
-------------------- ---------------------  
2003-10-13 19:35:21 07  

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;  

SYSDATE TO_CHAR(SYSDATE,'HH24')  
-------------------- -----------------------  
2003-10-13 19:35:21 19  

获取q月日与此类?nbsp; 
13.  
q月日的处理  
select older_date,  
newer_date,  
years,  
months,  
abs(  
trunc(  
newer_date-  
add_months( older_date,years*12+months )  
)  
) days  
from ( select  
trunc(months_between( newer_date, older_date )/12) YEARS,  
mod(trunc(months_between( newer_date, older_date )),  
12 ) MONTHS,  
newer_date,  
older_date  
from ( select hiredate older_date,  
add_months(hiredate,rownum)+rownum newer_date  
from emp )  
)  

14.  
处理月䆾天数不定的办?nbsp; 
select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual  

16.  
扑և今年的天?nbsp; 
select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual  

闰年的处理方?nbsp; 
to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )  
如果?8׃是闰q?nbsp; 

17.  
yyyy与rrrr的区?nbsp; 
'YYYY99 TO_C  
------- ----  
yyyy 99 0099  
rrrr 99 1999  
yyyy 01 0001  
rrrr 01 2001  

18.不同时区的处?nbsp; 
select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate  
from dual;  

19.  
5U钟一个间?nbsp; 
Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')  
from dual  

2002-11-1 9:55:00 35786  
SSSSS表示5位秒?nbsp; 

20.  
一q的W几?nbsp; 
select TO_CHAR(SYSDATE,'DDD'),sysdate from dual  
310 2002-11-6 10:03:51  

21.计算时,?U?毫秒  
select  
Days,  
A,  
TRUNC(A*24) Hours,  
TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,  
TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,  
TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds  
from  
(  
select  
trunc(sysdate) Days,  
sysdate - trunc(sysdate) A  
from dual  
)  



select * from tabname  
order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');  

//  
floor((date2-date1) /365) 作ؓq?nbsp; 
floor((date2-date1, 365) /30) 作ؓ?nbsp; 
mod(mod(date2-date1, 365), 30)作ؓ?  
23.next_day函数  
next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算赗?nbsp; 
1 2 3 4 5 6 7  
?nbsp;一 ?nbsp;?nbsp;?nbsp;?nbsp;?br>
oracle中有很多关于日期的函?br>
在oracle中有很多关于日期的函敎ͼ如: 
1、add_months()用于从一个日期值增加或减少一些月?nbsp;
date_value:=add_months(date_value,number_of_months) 
例: 
SQL> select add_months(sysdate,12) "Next Year" from dual; 

Next Year 
---------- 
13-11?04 

SQL> select add_months(sysdate,112) "Last Year" from dual; 

Last Year 
---------- 
13-3?nbsp;-13 

SQL> 

2、current_date()q回当前会放时区中的当前日期 
date_value:=current_date 
SQL> column sessiontimezone for a15 
SQL> select sessiontimezone,current_date from dual; 

SESSIONTIMEZONE CURRENT_DA 
--------------- ---------- 
+08:00 13-11?03 

SQL> alter session set time_zone='-11:00' 
  2 / 

会话已更攏V?nbsp;

SQL> select sessiontimezone,current_timestamp from dual; 

SESSIONTIMEZONE CURRENT_TIMESTAMP 
--------------- ------------------------------------ 
-11:00 12-11?03 04.59.13.668000 下午 -11: 
                00 

SQL> 

3、current_timestamp()以timestamp with time zone数据cdq回当前会放时区中的当前日期 
timestamp_with_time_zone_value:=current_timestamp([timestamp_precision]) 
SQL> column sessiontimezone for a15 
SQL> column current_timestamp format a36 
SQL> select sessiontimezone,current_timestamp from dual; 

SESSIONTIMEZONE CURRENT_TIMESTAMP 
--------------- ------------------------------------ 
+08:00 13-11?03 11.56.28.160000 上午 +08: 
                00 

SQL> alter session set time_zone='-11:00' 
  2 / 

会话已更攏V?nbsp;

SQL> select sessiontimezone,current_timestamp from dual; 

SESSIONTIMEZONE CURRENT_TIMESTAMP 
--------------- ------------------------------------ 
-11:00 12-11?03 04.58.00.243000 下午 -11: 
                00 

SQL> 

4、dbtimezone()q回时区 
varchar_value:=dbtimezone 
SQL> select dbtimezone from dual; 

DBTIME 
------ 
-07:00 

SQL> 

5、extract()扑և日期或间隔值的字段?nbsp;
date_value:=extract(date_field from [datetime_value|interval_value]) 
SQL> select extract(month from sysdate) "This Month" from dual; 

This Month 
---------- 
        11 

SQL> select extract(year from add_months(sysdate,36)) "3 Years Out" from dual; 

3 Years Out 
----------- 
       2006 

SQL> 

6、last_day()q回包含了日期参数的月䆾的最后一天的日期 
date_value:=last_day(date_value) 
SQL> select last_day(date'2000-02-01') "Leap Yr?" from dual; 

Leap Yr? 
---------- 
29-2?nbsp;-00 

SQL> select last_day(sysdate) "Last day of this month" from dual; 

Last day o 
---------- 
30-11?03 

SQL> 

7、localtimestamp()q回会话中的日期和时?nbsp;
timestamp_value:=localtimestamp 
SQL> column localtimestamp format a28 
SQL> select localtimestamp from dual; 

LOCALTIMESTAMP 
---------------------------- 
13-11?03 12.09.15.433000 
下午 

SQL> select localtimestamp,current_timestamp from dual; 

LOCALTIMESTAMP CURRENT_TIMESTAMP 
---------------------------- ------------------------------------ 
13-11?03 12.09.31.006000 13-11?03 12.09.31.006000 下午 +08: 
下午 00 

SQL> alter session set time_zone='-11:00'; 

会话已更攏V?nbsp;

SQL> select localtimestamp,to_char(sysdate,'DD-MM-YYYY HH:MI:SS AM') "SYSDATE" from dual; 

LOCALTIMESTAMP SYSDATE 
---------------------------- ------------------------ 
12-11?03 05.11.31.259000 13-11-2003 12:11:31 下午 
下午 

SQL> 

8、months_between()判断两个日期之间的月份数?nbsp;
number_value:=months_between(date_value,date_value) 
SQL> select months_between(sysdate,date'1971-05-18') from dual; 

MONTHS_BETWEEN(SYSDATE,DATE'1971-05-18') 
---------------------------------------- 
                              389.855143 

SQL> select months_between(sysdate,date'2001-01-01') from dual; 

MONTHS_BETWEEN(SYSDATE,DATE'2001-01-01') 
---------------------------------------- 
                              34.4035409 

SQL> 

9、next_day()l定一个日期|q回q二个参数指出的日子第一ơ出现在的日期|应返回相应日子的名称字符Ԍ

?周相?日期?

1.查询某周的第一?br>select trunc(decode(ww, 53, to_date(yy || '3112', 'yyyyddmm'), to_date(yy || '-' || to_char(ww * 7), 'yyyy-ddd')), 'd') last_day
from (select substr('2004-32', 1, 4) yy, to_number(substr('2004-32', 6)) ww
         from dual)

select trunc(to_date(substr('2003-01',1,5)||to_char((to_number(substr('2003-01',6)))*7),'yyyy-ddd'),'d')-6 first_day from dual

select min(v_date) from
  (select (to_date('200201','yyyymm') + rownum) v_date
  from all_tables
  where rownum < 370)
where to_char(v_date,'yyyy-iw') = '2002-49'

2.查询某周的最后一?br>select trunc(decode(ww, 53, to_date(yy || '3112', 'yyyyddmm'), to_date(yy || '-' || to_char(ww * 7), 'yyyy-ddd')), 'd') - 6 first_day
  from (select substr('2004-33', 1, 4) yy, to_number(substr('2004-33', 6)) ww
          from dual)
          
select trunc(to_date(substr('2003-01',1,5)||to_char((to_number(substr('2003-01',6)))*7),'yyyy-ddd'),'d') last_day from dual

select max(v_date) from
  (select (to_date('200408','yyyymm') + rownum) v_date
  from all_tables
  where rownum < 370)
where to_char(v_date,'yyyy-iw') = '2004-33'

3.查询某周的日?br>select min_date, to_char(min_date,'day') day from
(select to_date(substr('2004-33',1,4)||'001'+rownum-1,'yyyyddd') min_date 
        from all_tables
  where rownum <= decode(mod(to_number(substr('2004-33',1,4)),4),0,366,365)  
  union

  select to_date(substr('2004-33',1,4)-1||
         decode(mod(to_number(substr('2004-33',1,4))-1,4),0,359,358)+rownum,'yyyyddd') min_date 
        from all_tables          
          where rownum <= 7
  union

  select to_date(substr('2004-33',1,4)+1||'001'+rownum-1,'yyyyddd') min_date 
        from all_tables          
          where rownum <= 7                       
)
where to_char(min_date,'yyyy-iw') ='2004-33'



leoli 2007-04-02 14:26 发表评论
]]>
sql 语句http://www.tkk7.com/zhangzhong1018/articles/107963.htmlleolileoliMon, 02 Apr 2007 06:25:00 GMThttp://www.tkk7.com/zhangzhong1018/articles/107963.htmlhttp://www.tkk7.com/zhangzhong1018/comments/107963.htmlhttp://www.tkk7.com/zhangzhong1018/articles/107963.html#Feedback0http://www.tkk7.com/zhangzhong1018/comments/commentRss/107963.htmlhttp://www.tkk7.com/zhangzhong1018/services/trackbacks/107963.htmloRACLE函数 SQL中的单记录函?br>1.ASCII
q回与指定的字符对应的十q制?
SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;

        A         A      ZERO     SPACE
--------- --------- --------- ---------
       65        97        48        32


2.CHR
l出整数,q回对应的字W?
SQL> select chr(54740) zhao,chr(65) chr65 from dual;

ZH C
-- -
?nbsp;A

3.CONCAT
q接两个字符?
SQL> select concat('010-','88888888')||'?3'  高乾竞电?nbsp;from dual;

高乾竞电?br>----------------
010-88888888?3

4.INITCAP
q回字符串ƈ字W串的第一个字母变为大?
SQL> select initcap('smith') upp from dual;

UPP
-----
Smith


5.INSTR(C1,C2,I,J)
在一个字W串中搜索指定的字符,q回发现指定的字W的位置;
C1    被搜索的字符?br>C2    希望搜烦的字W串
I     搜烦的开始位|?默认?
J     出现的位|?默认?
SQL> select instr('oracle traning','ra',1,2) instring from dual;

INSTRING
---------
        9


6.LENGTH
q回字符串的长度;
SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst;

NAME   LENGTH(NAME) ADDR             LENGTH(ADDR)       SAL LENGTH(TO_CHAR(SAL))
------ ------------ ---------------- ------------ --------- --------------------
高乾?nbsp;           3 北京市v锭区                6   9999.99                    7



7.LOWER
q回字符?q将所有的字符写
SQL> select lower('AaBbCcDd')AaBbCcDd from dual;

AABBCCDD
--------
aabbccdd


8.UPPER
q回字符?q将所有的字符大写
SQL> select upper('AaBbCcDd') upper from dual;

UPPER
--------
AABBCCDD



9.RPAD和LPAD(_脓字符)
RPAD  在列的右边粘贴字W?br>LPAD  在列的左边粘贴字W?br>SQL> select lpad(rpad('gao',10,'*'),17,'*')from dual;

LPAD(RPAD('GAO',1
-----------------
*******gao*******
不够字符则用*来填?br>

10.LTRIM和RTRIM
LTRIM  删除左边出现的字W串
RTRIM  删除双出现的字W串
SQL> select ltrim(rtrim('   gao qian jing   ',' '),' ') from dual;

LTRIM(RTRIM('
-------------
gao qian jing


11.SUBSTR(string,start,count)
取子字符?从start开?取count?br>SQL> select substr('13088888888',3,8) from dual;

SUBSTR('
--------
08888888


12.REPLACE('string','s1','s2')
string   希望被替换的字符或变?br>s1       被替换的字符?br>s2       要替换的字符?br>SQL> select replace('he love you','he','i') from dual;

REPLACE('H
----------
i love you


13.SOUNDEX
q回一个与l定的字W串读音相同的字W串
SQL> create table table1(xm varchar(8));
SQL> insert into table1 values('weather');
SQL> insert into table1 values('wether');
SQL> insert into table1 values('gao');

SQL> select xm from table1 where soundex(xm)=soundex('weather');

XM
--------
weather
wether


14.TRIM('s' from 'string')
LEADING   剪掉前面的字W?br>TRAILING  剪掉后面的字W?br>如果不指?默认为空格符

15.ABS
q回指定值的l对?br>SQL> select abs(100),abs(-100) from dual;

ABS(100) ABS(-100)
--------- ---------
      100       100


16.ACOS
l出反余弦的?br>SQL> select acos(-1) from dual;

ACOS(-1)
---------
3.1415927


17.ASIN
l出反正弦的?br>SQL> select asin(0.5) from dual;

ASIN(0.5)
---------
.52359878


18.ATAN
q回一个数字的反正切?br>SQL> select atan(1) from dual;

  ATAN(1)
---------
.78539816


19.CEIL
q回大于或等于给出数字的最整?br>SQL> select ceil(3.1415927) from dual;

CEIL(3.1415927)
---------------
              4


20.COS
q回一个给定数字的余u
SQL> select cos(-3.1415927) from dual;

COS(-3.1415927)
---------------
             -1


21.COSH
q回一个数字反余u?br>SQL> select cosh(20) from dual;

COSH(20)
---------
242582598


22.EXP
q回一个数字e的nơ方?br>SQL> select exp(2),exp(1) from dual;

   EXP(2)    EXP(1)
--------- ---------
7.3890561 2.7182818


23.FLOOR
对给定的数字取整?br>SQL> select floor(2345.67) from dual;

FLOOR(2345.67)
--------------
          2345


24.LN
q回一个数字的Ҏ?br>SQL> select ln(1),ln(2),ln(2.7182818) from dual;

    LN(1)     LN(2) LN(2.7182818)
--------- --------- -------------
        0 .69314718     .99999999


25.LOG(n1,n2)
q回一个以n1为底n2的对?br>SQL> select log(2,1),log(2,4) from dual;

LOG(2,1)  LOG(2,4)
--------- ---------
        0         2


26.MOD(n1,n2)
q回一个n1除以n2的余?br>SQL> select mod(10,3),mod(3,3),mod(2,3) from dual;

MOD(10,3)  MOD(3,3)  MOD(2,3)
--------- --------- ---------
        1         0         2


27.POWER
q回n1的n2ơ方?br>SQL> select power(2,10),power(3,3) from dual;

POWER(2,10) POWER(3,3)
----------- ----------
       1024         27


28.ROUND和TRUNC
按照指定的精度进行舍?br>SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;

ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)
----------- ------------ ----------- ------------
         56          -55          55          -55


29.SIGN
取数字n的符?大于0q回1,于0q回-1,{于0q回0
SQL> select sign(123),sign(-100),sign(0) from dual;

SIGN(123) SIGN(-100)   SIGN(0)
--------- ---------- ---------
        1         -1         0


30.SIN
q回一个数字的正u?br>SQL> select sin(1.57079) from dual;

SIN(1.57079)
------------
           1


31.SIGH
q回双曲正u的?br>SQL> select sin(20),sinh(20) from dual;

  SIN(20)  SINH(20)
--------- ---------
.91294525 242582598


32.SQRT
q回数字n的根
SQL> select sqrt(64),sqrt(10) from dual;

SQRT(64)  SQRT(10)
--------- ---------
        8 3.1622777


33.TAN
q回数字的正切?br>SQL> select tan(20),tan(10) from dual;

  TAN(20)   TAN(10)
--------- ---------
2.2371609 .64836083


34.TANH
q回数字n的双曲正切?br>SQL> select tanh(20),tan(20) from dual;

TANH(20)   TAN(20)
--------- ---------
        1 2.2371609



35.TRUNC
按照指定的精度截取一个数
SQL> select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual;

   TRUNC1 TRUNC(124.16666,2)
--------- ------------------
      100             124.16



36.ADD_MONTHS
增加或减L?br>SQL> select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual;

TO_CHA
------
200002
SQL> select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual;

TO_CHA
------
199910


37.LAST_DAY
q回日期的最后一?br>SQL> select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual;

TO_CHAR(SY TO_CHAR((S
---------- ----------
2004.05.09 2004.05.10
SQL> select last_day(sysdate) from dual;

LAST_DAY(S
----------
31-5?nbsp;-04


38.MONTHS_BETWEEN(date2,date1)
l出date2-date1的月?br>SQL> select months_between('19-12?1999','19-3?1999') mon_between from dual;

MON_BETWEEN
-----------
          9
SQL>selectmonths_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.mm.dd')) mon_betw from dual;

MON_BETW
---------
      -60


39.NEW_TIME(date,'this','that')
l出在this时区=other时区的日期和旉
SQL> select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,to_char(new_time
  2  (sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual;

BJ_TIME             LOS_ANGLES
------------------- -------------------
2004.05.09 11:05:32 2004.05.09 18:05:32


40.NEXT_DAY(date,'day')
l出日期date和星期x之后计算下一个星期的日期
SQL> select next_day('18-5?2001','星期?) next_day from dual;

NEXT_DAY
----------
25-5?nbsp;-01



41.SYSDATE
用来得到pȝ的当前日?br>SQL> select to_char(sysdate,'dd-mm-yyyy day') from dual;

TO_CHAR(SYSDATE,'
-----------------
09-05-2004 星期?br>trunc(date,fmt)按照l出的要求将日期截断,如果fmt='mi'表示保留?截断U?br>SQL> select to_char(trunc(sysdate,'hh'),'yyyy.mm.dd hh24:mi:ss') hh,
  2  to_char(trunc(sysdate,'mi'),'yyyy.mm.dd hh24:mi:ss') hhmm from dual;

HH                  HHMM
------------------- -------------------
2004.05.09 11:00:00 2004.05.09 11:17:00



42.CHARTOROWID
字W数据类型{换ؓROWIDcd
SQL> select rowid,rowidtochar(rowid),ename from scott.emp;

ROWID              ROWIDTOCHAR(ROWID) ENAME
------------------ ------------------ ----------
AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH
AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN
AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD
AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES


43.CONVERT(c,dset,sset)
源字符?nbsp;sset从一个语a字符集{换到另一个目的dset字符?br>SQL> select convert('strutz','we8hp','f7dec') "conversion" from dual;

conver
------
strutz


44.HEXTORAW
一个十六进制构成的字符串{换ؓ二进?br>

45.RAWTOHEXT
一个二q制构成的字W串转换为十六进?br>


46.ROWIDTOCHAR
ROWID数据cd转换为字W类?br>


47.TO_CHAR(date,'format')
SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2004/05/09 21:14:41



48.TO_DATE(string,'format')
字W串转化为ORACLE中的一个日?br>

49.TO_MULTI_BYTE
字W串中的单字节字W{化ؓ多字节字W?br>SQL>  select to_multi_byte('?) from dual;

TO
--
?br>

50.TO_NUMBER
给出的字符转换为数?br>SQL> select to_number('1999') year from dual;

     YEAR
---------
     1999


51.BFILENAME(dir,file)
指定一个外部二q制文g
SQL>insert into file_tb1 values(bfilename('lob_dir1','image1.gif'));


52.CONVERT('x','desc','source')
x字段或变量的源source转换为desc
SQL> select sid,serial#,username,decode(command,
  2  0,'none',
  3  2,'insert',
  4  3,
  5  'select',
  6  6,'update',
  7  7,'delete',
  8  8,'drop',
  9  'other') cmd  from v$session where type!='background';

      SID   SERIAL# USERNAME                       CMD
--------- --------- ------------------------------ ------
        1         1                                none
        2         1                                none
        3         1                                none
        4         1                                none
        5         1                                none
        6         1                                none
        7      1275                                none
        8      1275                                none
        9        20 GAO                            select
       10        40 GAO                            none


53.DUMP(s,fmt,start,length)
DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2cd的?br>SQL> col global_name for a30
SQL> col dump_string for a50
SQL> set lin 200
SQL> select global_name,dump(global_name,1017,8,5) dump_string from global_name;

GLOBAL_NAME                    DUMP_STRING
------------------------------ --------------------------------------------------
ORACLE.WORLD                   Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D


54.EMPTY_BLOB()和EMPTY_CLOB()
q两个函数都是用来对大数据类型字D进行初始化操作的函?br>

55.GREATEST
q回一l表辑ּ中的最大?x较字W的~码大小.
SQL> select greatest('AA','AB','AC') from dual;

GR
--
AC
SQL> select greatest('?,'?,'?) from dual;

GR
--
?br>

56.LEAST
q回一l表辑ּ中的最?br>SQL> select least('?,'?,'?) from dual;

LE
--
?br>

57.UID
q回标识当前用户的唯一整数
SQL> show user
USER ?GAO"
SQL> select username,user_id from dba_users where user_id=uid;

USERNAME                         USER_ID
------------------------------ ---------
GAO                                   25



58.USER
q回当前用户的名?br>SQL> select user from  dual;

USER
------------------------------
GAO


59.USEREVN
q回当前用户环境的信?opt可以?
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE
ISDBA  查看当前用户是否是DBA如果是则q回true
SQL> select userenv('isdba') from dual;

USEREN
------
FALSE
SQL> select userenv('isdba') from dual;

USEREN
------
TRUE
SESSION
q回会话标志
SQL> select userenv('sessionid') from dual;

USERENV('SESSIONID')
--------------------
                 152
ENTRYID
q回会话人口标志
SQL> select userenv('entryid') from dual;

USERENV('ENTRYID')
------------------
                 0
INSTANCE
q回当前INSTANCE的标?br>SQL> select userenv('instance') from dual;

USERENV('INSTANCE')
-------------------
                  1
LANGUAGE
q回当前环境变量
SQL> select userenv('language') from dual;

USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
LANG
q回当前环境的语a的羃?br>SQL> select userenv('lang') from dual;

USERENV('LANG')
----------------------------------------------------
ZHS
TERMINAL
q回用户的终端或机器的标?br>SQL> select userenv('terminal') from dual;

USERENV('TERMINA
----------------
GAO
VSIZE(X)
q回X的大?字节)?br>SQL> select vsize(user),user from dual;

VSIZE(USER) USER
----------- ------------------------------
          6 SYSTEM



60.AVG(DISTINCT|ALL)
all表示Ҏ有的值求q_?distinct只对不同的值求q_?br>SQLWKS> create table table3(xm varchar(8),sal number(7,2));
语句已处理?br>SQLWKS>  insert into table3 values('gao',1111.11);
SQLWKS>  insert into table3 values('gao',1111.11);
SQLWKS>  insert into table3 values('zhu',5555.55);
SQLWKS> commit;

SQL> select avg(distinct sal) from gao.table3;

AVG(DISTINCTSAL)
----------------
         3333.33

SQL> select avg(all sal) from gao.table3;

AVG(ALLSAL)
-----------
    2592.59


61.MAX(DISTINCT|ALL)
求最大?ALL表示Ҏ有的值求最大?DISTINCT表示对不同的值求最大?相同的只取一?br>SQL> select max(distinct sal) from scott.emp;

MAX(DISTINCTSAL)
----------------
            5000


62.MIN(DISTINCT|ALL)
求最?ALL表示Ҏ有的值求最?DISTINCT表示对不同的值求最?相同的只取一?br>SQL> select min(all sal) from gao.table3;

MIN(ALLSAL)
-----------
    1111.11


63.STDDEV(distinct|all)
求标准差,ALL表示Ҏ有的值求标准?DISTINCT表示只对不同的值求标准?br>SQL> select stddev(sal) from scott.emp;

STDDEV(SAL)
-----------
  1182.5032

SQL> select stddev(distinct sal) from scott.emp;

STDDEV(DISTINCTSAL)
-------------------
           1229.951



64.VARIANCE(DISTINCT|ALL)
求协方差

SQL> select variance(sal) from scott.emp;

VARIANCE(SAL)
-------------
    1398313.9


65.GROUP BY
主要用来对一l数q行l计
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno;

   DEPTNO  COUNT(*)  SUM(SAL)
--------- --------- ---------
       10         3      8750
       20         5     10875
       30         6      9400



66.HAVING
对分l统计再加限制条?br>SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)>=5;

   DEPTNO  COUNT(*)  SUM(SAL)
--------- --------- ---------
       20         5     10875
       30         6      9400
SQL> select deptno,count(*),sum(sal) from scott.emp having count(*)>=5 group by deptno ;

   DEPTNO  COUNT(*)  SUM(SAL)
--------- --------- ---------
       20         5     10875
       30         6      9400


67.ORDER BY
用于Ҏ询到的结果进行排序输?br>SQL> select deptno,ename,sal from scott.emp order by deptno,sal desc;

   DEPTNO ENAME            SAL
--------- ---------- ---------
       10 KING            5000
       10 CLARK           2450
       10 MILLER          1300
       20 SCOTT           3000
       20 FORD            3000
       20 JONES           2975
       20 ADAMS           1100
       20 SMITH            800
       30 BLAKE           2850
       30 ALLEN           1600
       30 TURNER          1500
       30 WARD            1250
       30 MARTIN          1250
       30 JAMES            950 



leoli 2007-04-02 14:25 发表评论
]]>
վ֩ģ壺 ޹ҹ߲ | պƷһҳһ| aaëƬȫ | ޹AVӰԺ| һƵ| þþþƵ| ޳avƬ߿Ƭ| | պ伤Ƶ߲| պһƷ侫| þAAAƬ69| ƹƵӰԺ߹ۿ| һëƬaŮ˴̼Ƶ| ҹҹþ| Ļ| ߹ۿƵ| ؼëƬaaaaëƬ| ޾Ʒ| ޾Ʒ456| AëƬڵ| վƵwww| AVƷɫ| AVֻ߹ۿ| Ů˱Ƶվ| Ʒһvr| ޹˾þþƷţӰ| þҹɫƷAV̬ͼ| պѸƵ| ޴Ƭѹۿ| þþþŮʦһ| ˳վ999þþۺ| Ƶ߹ۿ| þþƷAV| ˬִ̼߳| һëƬѹۿ| Ӱۿ| ձĻѿ| պƷר| ޹91Ʒ| aƵƵ| Ļһ |