??xml version="1.0" encoding="utf-8" standalone="yes"?>
刚刚看了下racle单行函数Q主要是字符Q数字,日期Q{换,通用五个斚w?br />
1>字符处理
upper(str)---字W串str全部转换成大?br />lower(str)---字W串str全部转换成小?br />initcap(str)---字W串中每个单词的首字母大?br />concat(str1,str2)---字W串str1与str2q接h(也可以通过'||'L接相q?
substr(str,a,b)---取字W串str中的指定字符Q从位置a开始取长度为b的字W串Q假如a为正则从左边开始,否则从右边开?br />instr(str,'z')---取得str字符串中从左边开始每一ơ出现z字符的下标位|?下标?开?
lpad(str,12,'*')---左填充,卛_字符串str长度填充?2Q假如其不12位则在左边以*号填?br />rpad(str,12,'*')---叛_充,同上
length(str)---计算字符串str的长?br />
2>数字函数
round(45.926,2)---前一C留指定的数位,q四舍五?45.93)Q假如指定位是负数则意ؓ在小数点左边保留指定?如round(45.923,-1)=50,rount(45.923,0)=46,round(45.93,-2)=0,round(55.93,-2)=100
trunc(45.926,2)---同上Q得不四舍五?45.92)
mod(1600,300)---求余(100)
3>日期型函?br />
oracle中默认的格式是:DD-MON-RR?br />oracle中有个到当前pȝ旉--sysdateQ如Q?br />select sysdate from dual
可对日期q行自述q算Q?br />select (sysdate-mybirthday)/7 from person
months_between('01-sep-95','11-jan-94')---取得二个日期之间的间隔月?19.6774194)
add_months('11-jan-94',6)---l指定日期加上指定的月䆾后得C个新的日?11-jul-94)
next_day('01-sep-85','friday')---取得当前日期中下个周五的日期(01-jul-95)
last_day('01-feb-95')---取得当前日期中月份的最后一?28-feb-95)
roundq行四舍五入Qtrunc则否,以下是我的操作结果:
sysdate为:
SYSDATE
----------
28-7?-06
select
round(sysdate,'month') RM,
round(sysdate,'year') RY,
trunc(sysdate,'month') TM,
trunc(sysdate,'year') TY
from dual;
RM RY TM TY
---------- ---------- ---------- ----------
01-8?-06 01-1?-07 01-7?-06 01-1?-06
4>转换函数
隐式转换:pȝ自动转换,如:
varchar2 or char to number
varchar2 or char to date
number to varchar2
date to varchar2
昑ּ转换QhZ函数加以转换
日期Q字W,数据三者之间可以相互{?日期<-->字符<-->数据
日期格式:YYYY
日期-->字符
select to_char(sysdate,'yyyy-mm-dd') ch from dual
CH
----------
2006-07-28
数字-->字符
to_char(number,'format_model'),oramat_model有如下:
9---用对应数字表C?br />0---强制用0表示
$---加一$W号
L---前加本地货币单位表示
.---十进制点
,---千进制点
select to_char(0917,'l9999.99') local from dual
LOCAL
------------------
RMB917.00
字符-->日期
tselect to_date('19830917','yyyy-mm-dd') bir from dual
BIR
----------
17-9?-83
字符-->数字
select to_number('19821217','999999999') mybr from dual
MYBR
----------
19821217
注:所有函数均可以嵌套使用
5>通用函数
nvl(expr1,expr2)---expr1为空则显Cexpr2,否则昄expr1
nvl2(expr1,expr2,expr3)---expr1为空则显Cexpr2,否则昄expr3
nullif(expr1,expr2)---二个相等则显C空W?否则昄expr1
coalesce(expr1,expr2,...,exprn)---从expr1开始依ơ找C为空的exprQ找到就昄Q直到最后,否则?/p>
Cexprn
case表达式,如下?
6>多表查询
Ҏ通的多表查询Q也是不加where条g的时候实际上查询l果是各表的W卡集
外连接:oracle实现外连接时?L二边?号就OKQ当+在左ҎUCؓ双接,反之为左q接,它常常用来当要求未受限制对象的表数据也要求显C时Q如下:
select * from student
ID NAME ADDRESS
-------------------- --------------
1 zhangshan zhejiang
3 lishi hangzhou
7 lily guangzhou
select * from person
ID NAME ADDRESS
- -------------------- -----------
1 zhangshan zhejiang
3 lishi hangzhou
7 lily guangzhou
select p.id,p.sex,s.id,s.name,s.address from person p ,student s where p.id(+) = s.id
ID SEX ID NAME ADDRESS
-- ---- ---------- -------------------- ------------
1 boy 1 zhangshan zhejiang
3 girl 3 lishi hangzhou
7 lily guangzhou
select p.id,p.sex,s.id,s.name,s.address from person p ,student s where p.id = s.id(+)
ID SEX ID NAME ADDRESS
-- ---- ---------- -------------------- --------------
1 boy 1 zhangshan zhejiang
2 girl
3 girl 3 lishi hangzhou
4 boy
5 girl
self-joinQ就是同一张表q接Q用自连接的时候要注意排除重复的记录(自nQ@环重复等Q,比如说找出student表中所有住在同一个地方的人?br />select * from student
ID NAME ADDRESS
--- -------------------- ---------
1 zhangshan zhejiang
3 lishi hangzhou
7 lily guangzhou
2 name2 guangzhou
4 name4 guangzhou
5 name5 hangzhou
6 name6 shanghai
8 name8 shanghai
没有排除重复记录时的l果Q?br /> select t1.name,t2.name
from student t1, student t2
where t1.address = t2.address
NAME NAME
-------------------- --------------
lily lily
name2 lily
name4 lily
lily name2
name2 name2
name4 name2
lily name4
name2 name4
name4 name4
lishi lishi
name5 lishi
NAME NAME
-------------------- --------------
lishi name5
name5 name5
name6 name6
name8 name6
name6 name8
name8 name8
zhangshan zhangshan
已选择18?/p>
排除重复与@环记录之后:
select t1.name,t2.name,t1.address
from student t1, student t2
where t1.address = t2.address
and t1.id > t2.id
NAME NAME ADDRESS
-------------------- -------------------- -------------------
lily name2 guangzhou
name4 name2 guangzhou
lily name4 guangzhou
name5 lishi hangzhou
name8 name6 shanghai
cross join,无条件连接,实际上跟不带where时一样得到的是笛卡尔?/p>
natural joinQ也可以直接CjoinQ,Ҏ表中同名栏位来连接记?若表中可能出现多个同名栏位,则用using(col_name)来指定所栏位。colname不能指定表的别名Q限制条件用on来指?br />select id,p.sex,id,s.name from person p join student s using(id);
ID SEX ID NAME
---- ---- ---------- --------------------
1 boy 1 zhangshan
2 girl 2 name2
3 girl 3 lishi
4 boy 4 name4
5 girl 5 name5
在sql标准语法???q接用left(right) out join,限制条g用on可以了?/p>
full out join完全外连?思义是左外q接与右外连接都?br />select id,p.sex,id,s.name from person p full join student s using(id);
ID SEX ID NAME
---- ---- ---------- ------------------
1 boy 1 zhangshan
3 girl 3 lishi
2 girl 2 name2
4 boy 4 name4
5 girl 5 name5
8 8 name8
6 6 name6
7 7 lily
ORACLE没有自动增长的数据类型,需要徏立一个自动增长的序列P插入记录时要把序列号的下一?br />D于此字段?/font>
CREATE SEQUENCE 序列L名称 (最好是表名+序列h? INCREMENT BY 1 START WITH 1
MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按字段的长度来? 如果定义的自动增长的序列?NUMBER(6) , 最大gؓ999999
INSERT 语句插入q个字段gؓ: 序列L名称.NEXTVAL
?可以用如下的操作来对其进行操?
================================================================================
?SELECT SEQUENCE_NAME FROM USER_SEQUENCES;可以查看序列!
================================================================================
在PL/SQL Developer?OR PL/SQL)的描qC:
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)))
================================================================================
在Oracle中显C日期,诸如Q?br />select to_char(last_day(current_date),'yyyy-mm')||'-'||'01' "本月初日?, to_char(last_day(current_date),'yyyy-mm-dd') "本月末日? from dual;
昄l果Q?br />
本月初日?本月末日?br />---------- ----------
2006-01-01 2006-01-31
================================================================================
单行字符串函数用于操作字W串数据Q他们大多数有一个或多个参数Q其中绝大多数返回字W串
ascii()
c1是一字符Ԍq回c1W一个字母的ascii码,他的逆函数是chr()
select ascii(''a'') big_a,ascii(''z'') big_z from empbig_a big_z65 122
chr(QiQ?[nchar_cs]
i是一个数字,函数q回十进制表C的字符
select chr(65),chr(122),chr(223) from empchr65 chr122 chr223a z b
concat(,)
c1,c2均ؓ字符Ԍ函数c2q接到c1的后面,如果c1为null,返回c2.如果c2为null,则返回c1Q如果c1、c2都ؓnullQ则q回null。他和操作符||q回的结果相?br />select concat(''slobo '',''svoboda'') username from dualusernameslobo syoboda
initcap()
c1Z字符丌Ӏ函数将每个单词的第一个字母大写其它字母小写返回。单词由I格Q控制字W,标点W号限制?br />select initcap(''veni,vedi,vici'') ceasar from dualceasarveni,vedi,vici
instr(,[,QiQ[,]])
c1,c2均ؓ字符Ԍi,j为整数。函数返回c2在c1中第jơ出现的位置Q搜索从c1的第i个字W开始。当没有发现需要的字符时返?,如果i敎ͼ那么搜烦从叛_左进行,但是位置的计还是从左到叻Ii和j的缺省gؓ1.
select instr(''mississippi'',''i'',3,3) from dualinstr(''mississippi'',''i'',3,3)11select instr(''mississippi'',''i'',-2,3) from dualinstr(''mississippi'',''i'',3,3)2
instrb(,[,i[,j])
与instrQ)函数一P只是他返回的是字节,对于单字节instrb(){于instr()
length()
c1为字W串Q返回c1的长度,如果c1为nullQ那么将q回null倹{?br />select length(''ipso facto'') ergo from dualergo10
lengthb()
与length()一Pq回字节?/p>
lower()
q回c的小写字W,l常出现在where子串?br />select lower(colorname) from itemdetail where lower(colorname) like ''%white%''colornamewinterwhite
lpad(,QiQ[,])
c1,c2均ؓ字符Ԍi为整数。在c1的左侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ单空|参见rpad?br />select lpad(answer,7,'''') padded,answer unpadded from question;padded unpadded yes yesno nomaybe maybe
ltrim(,)
把c1中最左边的字W去掉,使其W一个字W不在c2中,如果没有c2Q那么c1׃会改变?br />select ltrim(''mississippi'',''mis'') from dualltrppi
rpad(,QiQ[,])
在c1的右侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ单空?其他与lpad怼
rtrim(,)
把c1中最双的字W去掉,使其W后一个字W不在c2中,如果没有c2Q那么c1׃会改变?/p>
replace(,[,])
c1,c2,c3都是字符Ԍ函数用c3代替出现在c1中的c2后返回?br />select replace(''uptown'',''up'',''down'') from dualreplacedowntown
stbstr(,QiQ[,])
c1Z字符Ԍi,j为整敎ͼ从c1的第i位开始返回长度ؓj的子字符Ԍ如果j为空Q则直到串的N?br />select substr(''message'',1,4) from dualsubsmess
substrb(,QiQ[,])
与substr大致相同Q只是i,j是以字节计算?/p>
soundex()
q回与c1发音怼的词
select soundex(''dawes'') dawes soundex(''daws'') daws, soundex(''dawson'') from dualdawes daws dawsond200 d200 d250
translate(,,)
c1中与c2相同的字W以c3代替
select translate(''fumble'',''uf'',''ar'') test from dualtextramble
trim([[]] from c3)
c3串中的第一个,最后一个,或者都删除?br />select trim('' space padded '') trim from dual trimspace padded
upper()
q回c1的大写,常出现where子串中select name from dual where upper(name) like ''ki%''nameking