0 D( a7 x: s! p5 _" |to_char(日期数据,格式)2 d/ w% H/ ]1 Q. t1 e2 E$ ?. a
% j4 H7 b) U* c' c" K! a
public String to_char(Date d, String style){5 {7 W: _3 G) m0 V# @
//SimpleDateFormat把d按照style的格式转变为字符串: O" L5 b4 e+ i$ [
return 字符串; V$ w! ?6 V4 d' e} 4 C& y. M9 ]! u, ]/ c/ X" J$ N
9 M& r1 [5 V2 w+ r' s: @1 k+ r
select to_char(sysdate, 'yyyy/mm/dd')% G5 J% d" D3 ]) N. E9 ~
from dual; ' V- v; T( @1 @& T : |+ G# W* _+ v/ c+ C. Pyyyy: 四位数字年 2011 l; n- o- A1 C- H+ c7 O" {& |, m8 i
year:全拼的年 twenty eleven 2 u7 T7 X/ x8 a8 z1 j' l2 Amonth: 全拼的月 november 中文:11月 8 X+ {: m9 Q) u( Y! C. a* ?" v( r- qmm: 两位数字月 11 . Y6 R+ d7 @3 S! J' a9 R4 Vmon:简拼的月 nov0 n+ Q& V5 O; Y# A# z- |1 C
dd:两位数字日+ I' H }; |6 R4 B( K( B
day:全拼的星期 tuesday; E" \2 A0 c4 n% ^3 g3 x' x
dy: 简拼的星期 tue& Z3 N& g5 V. \, I z+ e/ K2 D
am: 上午/下午 am/pm 6 V1 S. z- ^. b4 b6 a m/ }1 ^! s5 a7 U" z3 \/ ?( Asqlplus中日期的默认格式是:DD-MON-RR ; e/ C! s1 l2 f* |# e现在的时间是2011年% C( L- ^+ y$ n" g2 W
YY RR3 ~# g- } }! T3 K# L) X8 F
05年 2005 2005 i+ P) V9 t7 j' e$ {98年 2098 19981 W, w j! ]$ t% n
1 k2 ~: _* A2 y( b假设现在的时间是1998年 7 t6 t9 A, K& f1 f* n05年 1905 2005 b8 R8 d, e$ J3 T* K
95年 1995 1995 + }# n! C* j$ X- f
! \7 M5 r+ g% D7 r3 ^% Ninsert into emp_ning(empno, ename, hiredate) ! q( u/ o1 y$ p5 H3 F+ yvalues(1012, 'amy', sysdate);; c B1 F# Q3 M' v( t1 ?/ v4 S
--实际入职时间是2011-10-107 N' |5 ?3 U, i
insert into emp_ning(empno, ename, hiredate): l# Z- m3 ?" R! i, q
values(1012, 'amy', '10-OCT-11'); # ^& w* R" Q/ K1 T7 @ - F( w( ` |' m! b- ]" Ainsert into emp_ning(empno, ename, hiredate) ! p `( M7 T" g) y0 V1 p% {" Evalues(1012, 'amy', & j7 ^0 \/ d5 `5 o+ z. V
to_date('2011-10-10','yyyy-mm-dd')); , P$ }; D8 m; v# U4 ~; y I4 e/ E$ Q) y4 t+ v显示员工姓名和入职时间,显示格式为:2 I$ |; E: m) S' d. s: R! a
amy 2011-10-10 - A3 X& ~- W1 K % O$ }) |3 Z7 I) i5 y( F$ k, M to_date5 C' f) v6 X4 z3 k7 W5 d1 [; A
字符串 ---------> 日期' _ j" J* P8 }3 b. P4 o
<---------7 ?; z. b, E7 T9 [
to_char 9 h' w1 C; a3 A; h6 v; z% s) j" f5 |; w1 d4 p
3.计算员工入职多少天?1 ]5 Q* n6 ?! l; z4 ?8 X
select ename, hiredate, (sysdate - hiredate) days! N: r, f) M6 r, N/ S7 M7 j: s/ ^6 q
from emp; & f7 M5 y3 |0 d. {$ l- b9 c, H4 Z* v/ U- y
日期数据相减,得到两个日期之间的天数差。. E2 L: ~& q# x* s; z$ \
不足一天用小数表示。$ U9 P# D; E2 c' E2 J% ] x
/ V/ X+ k2 y: r( ~: t
select ename, hiredate, / {6 y @! T( H
round(sysdate - hiredate) days 5 R4 G2 n# h6 N3 P: W, Yfrom emp; + e7 ?% V+ e0 v* B( G+ ]6 X- M2 O; b9 t
4.计算员工入职多少个月?用整数表示。 ^6 b% }! d8 ?select ename, hiredate, 2 m& a- u& O2 m* hmonths_between(sysdate, hiredate) months - I8 K6 H+ T! z- r; b: l8 Qfrom emp_ning;3 N1 ^0 P3 e/ ?% l0 [" p
, L* x* T) S" @& M6 g
select ename, hiredate,7 i% x0 l3 s! }# E4 R
round(months_between(sysdate, hiredate)) months% H' M2 s. @( ], e( ^
from emp_ning; - M+ e- W* J5 L7 h; M! n1 N& ~ }! F3 I t! O
f3(f2(f1(p1,p2),p3),p4) : 函数的嵌套' G$ l+ x2 Y8 ^) P1 a* \" l
3 n: i! d6 |) I: O8 S$ q4 x5.计算员工的年终奖金' L: \: i* G2 _3 w% @
bonus不是null,发bonus的数字。 8 l: U. I' W3 K4 [- m: _bonus是null,发salary * 0.5. T0 n9 v2 t* T% P2 G* R' m5 i7 I
salary还是null, 100.; c/ Y) Q# M; |/ ~; H8 n. ]
# h1 r& u+ k }
public double calculate(double bonus, / S9 t6 m$ Z6 g1 p% ^/ G, k6 r1 [, p+ g double salary, ' e F, W8 H) B5 z' F double comm){ 5 ?5 r: |) B2 [7 F* u' Q if (bonus != null) return bonus;3 ?% K9 o3 ]3 N( W8 s
if (salary != null) return salary * 0.5; ' q+ ]. l& v9 i/ `5 p3 V return comm; ! h8 Z b+ _+ b} 3 F8 U1 Y, Y( I( ^, E( Q--返回参数列表中第一个非空数据1 t+ r+ X5 p: {$ U0 K
--最后一个参数通常是常量。( m- j; }' N9 ?& d8 v
select ename, bonus, salary, + N! ], N5 D7 s
coalesce(bonus, salary*0.5, 100) bonus" R6 y4 E9 y+ X. Z& L
from emp_ning; f) `9 F2 z/ V/ ]9 B! y ! @5 ]2 s+ U- I$ o6.根据员工的职位,计算加薪后的薪水数据:+ j: L& X4 x: i' z7 Q" a5 ?
Analyst: 10% * O* L$ n7 w% q1 ?Programmer: 5% 7 L! I, ]) y- P* @7 V- T W7 vclerk: 2% e" J2 l5 F+ q+ @& e1 z: Q* K
其他职位:不变。 0 v* ~" N; ]' Z; I. R" U5 v' {) s( x* D: |
case语句:6 u4 e a& z4 z/ |$ ~$ Y
select ename, salary, job, % C3 `, W% I( z; [# T8 ucase job when 'Analyst' then salary * 1.1 + y' h7 W8 k+ \' u% x1 c4 n+ y when 'Programmer' then salary * 1.058 c" [7 _1 a( {
when 'clerk' then salary * 1.02 : e# ]- ?$ o8 V% Belse salary 5 ~9 B' m3 [6 o$ P6 J; o% |% Pend new_salary ( c2 B& t% Q# mfrom emp_ning; 7 c1 C5 k" z$ ^! e& s' S) H+ T% u2 \7 q* h& Z: C
select ename, salary, job,' b! V9 {: N' T# U! y8 F
decode(job, 'Analyst', salary * 1.1,& e, Q" U g" l4 V+ d z
'Programmer', salary * 1.05, 4 {6 r2 W5 R4 I 'clerk', salary * 1.02,2 ?" @. ^/ ~( d' A1 ~ k; {) l0 d
salary) new_salary - p/ F2 R1 ^$ ]7 nfrom emp_ning;4 Z; K( `( {( Z* v2 q7 v) e
3 I3 r% i G9 t' ~% e+ O5 j7.薪水由低到高排序 % X- i! A, I+ B5 h0 h6 R6 rselect ename, salary from emp_ning 4 d7 t' B! g3 q* j) |. Oorder by salary;. i0 M2 o! y8 U
# h( V* } D. W5 `
select ename, salary from emp_ning) A, a2 ]% K) T/ K
order by salary desc; --倒序排列 descend& n1 m7 e& {' o" x+ l9 @
& b1 H* F& |% Z& ]: n `. L8 zdesc emp_ning; --查看表结构 describe w& u6 t9 s1 I. d6 w5 g, S2 P
8 {: p1 h9 L) t' c; R4 G) t8.按入职时间排序,入职时间越早排在前面。0 t. w3 ^4 U. C3 R% m/ q3 S
select ename, hiredate# e) z: X' ]6 g( W# S X
from emp_ning. ?3 d3 m. h! f5 T- N% g e( x
order by hiredate; ( ^- f" K) \- Y& h0 s- } 9 g/ \' h1 U3 q9.按部门排序,同一部门按薪水由高到低排序: X7 i) Y+ }: `2 s8 `4 Y+ S/ `
select ename, deptno, salary 4 }* d$ ]$ J- J/ u: W6 cfrom emp_ning/ O) o9 T3 f7 c3 r' u
order by deptno, salary desc;7 k! O5 A- U9 g3 W* I
" [1 x2 [% t8 k- g" S5 d
10.员工表中有多少条记录? ) G) X4 y( Y7 L4 Y2 _# Bselect count(*) from emp_ning; : L& s9 A- x- A5 C5 ~ 3 f1 ]% [* b1 iopenlab帐户下有多少个表? ) F+ p3 d! K( H: ]7 P: Y7 gselect count(*) from user_tables;' g2 }8 g' |! @5 L
2 [$ O' e7 K4 Q- S2 Vopenlab帐户下有多少个名字中包含emp的表? 3 f, z' k+ t0 B7 a4 ^& q! v- Mselect count(*) from user_tables, a6 X% J# I- c+ a5 A2 {
where table_name like '%emp%';6 H( e2 f. g0 m8 F t/ I: w
8 Z' d v8 B. V- b--表名默认大写5 X& B2 Q, M5 X2 G2 ~- x
select count(*) from user_tables7 c) G5 K: @& U" c0 t% h
where table_name like '%EMP%';, t# g0 ]$ v0 b1 V) k" [! C3 Y
4 K% ~' o* B8 k; y. t2 j
--入职时间不是null的数据总数。. |7 c; T$ v5 e j8 E; x
--count函数忽略空值。% z; k( z3 J/ \6 l0 P- f- u9 c
select count(hiredate) from emp_ning; 6 ], A0 j8 I7 i0 O0 x, R& p ; C: w7 ~2 i& S6 l; a2 f. e9 V" B) s11.计算员工的平均薪水和薪水总和是多少?- o5 Q5 n, k! X8 o# K) F! {/ z( _
select avg(salary) avg_sal, 5 t/ ^% x# h5 ~: m$ @
sum(salary) sum_sal% E5 \5 Y" k7 }/ p( L& n
from emp_ning; / x: B1 \8 T" c' Y5 a6 @& H$ Y 8 { ~5 P) O7 m9 \8 l5 Bavg(salary) = sum(salary) / count(salary) ) I* m( Z) r9 c. |3 f 68500 / 10 = 6850 ' q! P9 y# N# [& D w) C--纠正逻辑上的错误 9 _, e) l: A7 x7 Wselect sum(salary)/count(*) avg_sal, + y3 E5 H U. Z/ t
sum(salary) sum_sal/ b: g9 M+ U/ c2 j: P
from emp_ning;2 J3 Y3 p/ t+ |8 I4 }$ u* C
3 E6 f. l# _- A" C z8 s9 c ~
select avg(nvl(salary,0)) avg_sal," r* [. d# ?8 g; h/ j7 i
sum(salary) sum_sal 2 y8 Z# r; D) ~! _, n( C1 G: A! j9 R0 bfrom emp_ning; 9 a# V( ]) y3 U6 a9 r3 l6 y" | ) H' J0 ]! m9 J/ z0 l12.计算员工的最高薪水和最低薪水 % J9 N! L# J0 i* K0 f1 h: M* Tselect max(salary) max_sal, " G9 E- R/ O6 ?5 T* Y. F6 F min(salary) min_sal) f f4 ^4 ?0 U% D) ?# H
from emp_ning; + M3 K8 H" f& T; n ~3 A' q. ~& f1 g# P
组函数:count / avg / sum / max / min 忽略空值) g- i; r% K7 p) w6 b
其中:avg / sum 针对数字的操作。 T5 r* \: T% W& q" z* z
max / min 对所有数据类型都可以操作。 % C" q' J. j0 ]: ?3 |3 A: C& u' D: D" I
13.计算最早和最晚的员工入职时间。 0 E7 n7 q; P( l1 N: j& X+ t8 Uselect max(hiredate) max_hiredate, 4 ]: r; z- w j: G min(hiredate) min_hiredate . A5 {) U: |: h# Xfrom emp_ning; % o. M0 b Z4 n3 n0 Y5 ^5 Z3 Q4 o# |
14.按部门计算每个部门的最高和最低薪水分别是多少? D3 z- f7 a& t6 v6 W) O. l, O
格式如下: 5 t8 G) N. B( @: h5 w8 K0 D10 4500 3000 1 N2 |! j" w' b$ }20 15000 8000 \ l$ i6 ^" \1 s
30 10000 5000# v( D7 b) m8 @ V; W+ }- l
9 H- t1 a: F' Q+ W: `2 I) P--group by 列名 : 表示按哪个列分组 : Q% N2 ^9 Z4 w$ h/ U3 b3 w. aselect deptno, max(salary) max_s, min(salary) min_s# A o1 ^8 B0 T1 q
from emp_ning6 B! }3 L2 G8 U- \0 s" z7 ~ P
group by deptno;2 I9 D9 P( B# l# o6 M/ Q
; b9 a2 z1 X- Y- _" R q# v5 `/ q9 y. E15.计算每个部门的薪水总和和平均薪水? + [7 u/ ]2 o9 y# c, y* T' }select deptno, sum(salary) sum_s,6 b" Q+ b. j% Z6 u( j" Z% h
avg(nvl(salary,0)) avg_s ! g; w( y2 I8 v& p' T7 p" |( efrom emp_ning / j- f/ i/ a0 g( \; I0 Q4 r, H2 lgroup by deptno;. i/ n; V! u2 U5 b X8 Z
0 c/ q) j. n/ u# m2 W0 H
16.每个部门的统计信息:格式如下: ; h3 b; @# q: K8 q, {deptno max_s min_s sum_s avg_s emp_num4 |( u/ M! f/ ^; ^8 A+ m
10 10000 5000 23000 6789 3$ m5 B! O( E2 q* b# d& v) Q
.... $ u; u, D3 z2 T; V4 h) N. M) `select deptno, max(salary) max_s,7 }+ U2 J- d% {4 v4 t1 f
min(salary) min_s,' @/ P) s" s7 ?5 [
sum(salary) sum_s, ! j. Z( @) H) W5 @# {( I avg(nvl(salary,0)) avg_s,8 K+ }6 L/ F {* _! _9 f
count(*) emp_num- m- G4 @" |& u. O. |6 r( e9 T) d
from emp_ning . ^+ B/ o$ D! v, Y) ggroup by deptno; 4 {. k; ^# K8 u) S% w$ M ( f$ {4 e/ m) z2 w' z" s5 b# e% Dselect后出现的列,凡是没有被组函数处理的列,必须% i0 H0 {5 G& E+ h
出现在group by 短语中。 : `) i% z' o; g' D, s " g G7 l8 m$ O$ p- `/ [按职位分组,每个职位的最高、最低薪水和人数? ) C4 c* k8 {$ T% W$ Fselect job, max(salary) max_s, * E P/ s/ ]' C9 f- t: k min(salary) min_s," e5 _$ s: @3 V2 P
count(*) emp_num4 n/ J/ u' a/ G3 W" r
from emp_ning3 F- _: F1 C, T. j- V5 \% |
group by job! a4 ^2 N9 X- M2 e% l. {
order by emp_num; 2 `% o" K2 O, K# N6 Y# f( l17.平均薪水大于5000元的部门数据? & A6 i( @1 o' c! o% T* l# e$ Jselect deptno, avg(nvl(salary,0)) avg_s " o6 i: m) B I. I1 Efrom emp_ning7 B9 S, k& [' z3 s9 a" H
where deptno is not null6 o6 e) |1 e9 X
group by deptno : f8 s4 M( w% x9 X% b/ X2 Q; _having avg(nvl(salary,0)) > 5000;7 k( w1 Q) n. o1 h$ ]
% ?+ l. [+ O; k0 Q( p. A18.薪水总和大于20000元的部门数据? 4 F+ Z2 h- h+ S. u( U- Z& N6 v. `$ Fselect deptno, sum(salary) sum_s8 L% n. z, S2 Z1 p0 o/ B
from emp_ning + Y2 Q1 t8 Q, v- J7 r! f2 uwhere deptno is not null 6 X+ r, Z7 u" b" X8 e( b' Sgroup by deptno% o+ U i4 n" `; Y, u
having sum(salary) > 20000;, T$ n3 K& V% ] h0 I
3 K: W7 j% k# j H5 Q19.哪些职位的人数超过2个人?4 `$ c0 F. G7 ]' E
select job, count(*) emp_num , _7 } ^/ @' g7 u4 efrom emp_ning& C, h0 g& d. w* M) n
where job is not null$ C* u9 m" Z$ b* W
group by job, K# Q3 Z4 `/ {3 I" V
having count(*) > 28 l7 q7 S, u! i0 b2 o
order by emp_num; % q6 Q9 O5 ?% B* c, P1 y5 n! w8 ]1 ~ N5 i2 `' q