- v) [6 n* K; z9 E显示员工姓名和入职时间,显示格式为: / P0 _5 n% W- w9 q: z2 ^) famy 2011-10-106 F' x$ C. ~0 Y' R* r
1 F* F! ~4 G4 q/ X2 f to_date6 u# {& q" S8 q- _: A! Q4 h
字符串 ---------> 日期 * N; H% J9 R, ~3 Z <---------9 ~$ f X3 q+ A4 G
to_char4 i; _/ b, y9 I, p- |. n% F
" g3 a. R6 Q& `: D9 V: x
3.计算员工入职多少天? / M& b* u% d/ rselect ename, hiredate, (sysdate - hiredate) days7 d8 x+ |5 I1 [3 U1 F
from emp; 2 v; @; y7 d! c: K 8 } d4 v& C1 |8 s2 G! z日期数据相减,得到两个日期之间的天数差。( h/ c6 _! `* d
不足一天用小数表示。 ) v# H4 B2 u7 k0 c 4 } ? o, p$ O! a1 G0 f+ q/ a% ?select ename, hiredate, ) z. w6 H6 g, n- i! L @round(sysdate - hiredate) days ! A0 }! c: j- v6 B7 o E( cfrom emp; ( i& z6 i7 z1 c7 S 8 @ v" k/ r, ?4.计算员工入职多少个月?用整数表示。 / M! k) V! n5 `- \/ Q& b. Eselect ename, hiredate,6 `: E' g- D" w# P: v% }
months_between(sysdate, hiredate) months) I) W/ Z0 ?& k% z3 |$ v
from emp_ning;% s/ _( Y) }/ X. b
. |( z( w9 G d4 R# ]
select ename, hiredate, 7 q( u. v9 A0 h3 u- r- r& fround(months_between(sysdate, hiredate)) months6 z0 r# N5 g5 Y$ ?! e
from emp_ning;! x' I. a6 m" |6 {! k/ Q
9 R* Z% V4 O/ u5 x/ }0 ^: |1 o
f3(f2(f1(p1,p2),p3),p4) : 函数的嵌套; Z3 n Z9 N( X
* J8 Y8 h% p9 U6 Q1 F* d5.计算员工的年终奖金 # x% ?& Q3 c" I' q2 c0 D0 Ibonus不是null,发bonus的数字。 / `1 ~6 Z2 |. T f, `. y. W7 Gbonus是null,发salary * 0.5./ n; q3 r" _! m2 g
salary还是null, 100. + D: t* s/ l; o! x" j 3 J/ R1 \) L3 X1 i+ |public double calculate(double bonus, o: k- u1 \2 D double salary,6 A8 `* q/ k$ x
double comm){ - G' h' Y0 q! A) W if (bonus != null) return bonus;# g& e# d$ i4 o7 f2 l$ I9 i* C
if (salary != null) return salary * 0.5; ! e, m% Q: C6 ^, N; c return comm; 4 G! Q% b' h( a1 [0 X
}' h, P8 `# g* v' C5 K
--返回参数列表中第一个非空数据0 ^7 j! X) r& X
--最后一个参数通常是常量。 % _0 n7 x* k( _- `( rselect ename, bonus, salary, 7 u- m4 }$ k2 J: A5 A9 xcoalesce(bonus, salary*0.5, 100) bonus7 A# C' x$ d, V! a7 {
from emp_ning;7 L( [- n* ~4 z+ s" e* ^
6 t# Y- M7 l$ W% j. X9 @6.根据员工的职位,计算加薪后的薪水数据: - K) w* ?9 w* f! T7 DAnalyst: 10%$ k& M) t; o; C0 G; N! d" P
Programmer: 5% 7 {) ]6 X* z0 u6 u/ s6 bclerk: 2%6 ^2 [& `; Z* X' ? n
其他职位:不变。 2 ~' M4 K4 n0 I5 Y$ W ! K6 u2 q! B- M* w! h$ T* Gcase语句: 6 n: T6 F9 J7 o! S q, i; w2 Xselect ename, salary, job, 9 o2 o% N& G- G3 |" ^5 {' lcase job when 'Analyst' then salary * 1.1" E( G0 W7 [6 B5 K
when 'Programmer' then salary * 1.05 - F; a+ \4 g) J7 |! B7 }% l when 'clerk' then salary * 1.02 $ X$ g3 B; M7 j6 O- Q' Z- X4 S" aelse salary 1 _! A) ?# i" K7 `- Uend new_salary0 k( t' O0 x, ?, j2 w5 V
from emp_ning;" M' L. }- l3 [0 m6 B, F1 E p- x
/ S/ o( }+ Q: N1 tselect ename, salary, job,5 z# n: o, \; p7 Q" d+ S6 V
decode(job, 'Analyst', salary * 1.1, # j7 W3 d8 ^+ Q: o, c 'Programmer', salary * 1.05, 7 D( J: Y3 m3 E2 P: @ 'clerk', salary * 1.02, % X; `* [( _& i! o salary) new_salary , o2 P, F7 K/ r7 m( Z1 {+ {from emp_ning; ( K! k2 b! i4 [( d! M' p, ^" a9 ]/ ^: P0 s# J) k8 c. M# e R
7.薪水由低到高排序4 [0 Z1 u- ?) r
select ename, salary from emp_ning4 b5 f* \" n& l
order by salary;& H5 y" O8 [: q) p" U
! C! ^' a9 i3 ?select ename, salary from emp_ning8 c# {5 M" K3 Y3 \" q
order by salary desc; --倒序排列 descend8 b! A( k) f4 ^1 ~2 @7 _9 m( m- m
" @/ ^- I1 f, t7 ]$ S# e7 pdesc emp_ning; --查看表结构 describe ) `: h. L2 X5 c5 Q8 x/ T4 m, o$ v* B+ G$ p9 p, y
8.按入职时间排序,入职时间越早排在前面。 2 V2 p8 z6 R( a% @# w" J/ F$ X& [select ename, hiredate . v0 b% m" L$ e( F- N$ O/ Pfrom emp_ning' T" D9 V. l# y. b' ]4 s
order by hiredate;/ I! g: ]* E4 ], y5 D; z3 F, t
% N1 V g) M- F& K6 J9.按部门排序,同一部门按薪水由高到低排序 & L: a/ P h5 H: v5 e% sselect ename, deptno, salary 7 k% ~% }+ U; h2 Qfrom emp_ning + c9 Y( S; d% J) z* T, ?order by deptno, salary desc; " I4 w9 R, B& g- k, `1 _5 B" a5 @ 3 X" K; N; t+ [$ f8 B$ q, h( I% v3 t10.员工表中有多少条记录? 5 P4 X0 x) z* H0 oselect count(*) from emp_ning;- i/ u" M) w6 Y" S, P. @
5 K* e+ k/ \6 y; s. u9 l A0 b8 n
openlab帐户下有多少个表? 2 V# a( \% \& Xselect count(*) from user_tables; 9 t- U6 d, Z, W' f6 G M; H. q4 Y* [/ ? _9 L
openlab帐户下有多少个名字中包含emp的表? $ a4 M1 o* P$ M8 J0 M4 F0 ?select count(*) from user_tables" O+ Z+ M, t! T3 Y7 T
where table_name like '%emp%';7 o# P0 L7 I1 E8 E( v' ~
9 p) H# @4 f7 i; W# z--表名默认大写 0 ?4 x- ~$ ] B- ~ F1 q/ }select count(*) from user_tables% C/ N) ]! g+ r- f; ?! V# g: P* G
where table_name like '%EMP%'; + q! S; v9 \4 w$ x% ~5 L: D7 v0 p5 j& A/ `2 B5 F
--入职时间不是null的数据总数。 P' s8 C" V- r; ?/ }, D7 P--count函数忽略空值。 # l3 J; Y0 {9 n( R; G5 @: sselect count(hiredate) from emp_ning;- ~% M+ F* @# I& o: c: p/ o
" { o+ K6 N5 z# Y
11.计算员工的平均薪水和薪水总和是多少? * z3 y O" y3 e1 n; C; ~+ Aselect avg(salary) avg_sal, " V: ]3 O9 W5 u1 a9 G3 z" f sum(salary) sum_sal 6 W" ?( \* P7 A1 wfrom emp_ning;' f/ `2 c' v, h, P. X
1 v/ K% D: P4 }5 @avg(salary) = sum(salary) / count(salary) 2 }1 F6 |/ Y2 F3 @$ z 68500 / 10 = 6850 + y. L5 c; r `! M3 b8 j j% y3 x, G--纠正逻辑上的错误, l" {) f' R; {3 Z
select sum(salary)/count(*) avg_sal, % g. } v. l- U. v `! v% h* I
sum(salary) sum_sal : _; v& O4 a1 z1 J; l, nfrom emp_ning;+ p7 F# W3 a& J7 d
) v \# s9 `) R5 J
select avg(nvl(salary,0)) avg_sal,. {) }$ u' [8 S, S- H
sum(salary) sum_sal 0 h2 G/ g8 W3 j9 \& u2 \# Gfrom emp_ning;) Y+ \5 j/ e! Z
7 @% X$ i- ?$ e8 U12.计算员工的最高薪水和最低薪水 2 [' {8 I# }( q$ u* _select max(salary) max_sal,! j( r8 g" q+ p2 e. ?+ Q
min(salary) min_sal' }. V; E4 @. D4 _, y
from emp_ning; ! o, w6 M( i( v) X0 x5 Y+ q3 p7 l3 \$ ?* F3 p* ]2 r8 E. o. {
组函数:count / avg / sum / max / min 忽略空值 0 D* z, Y$ s4 i9 c' P& q/ t其中:avg / sum 针对数字的操作。 : o0 j" L. K! G max / min 对所有数据类型都可以操作。( o! U2 `5 U0 Y* V1 L( ?' W+ n
3 _. Q7 T! D/ p3 _5 s! p! p; a13.计算最早和最晚的员工入职时间。 1 n, R4 i* d3 Q* u4 b Cselect max(hiredate) max_hiredate,7 C; u4 O# k2 ~. x) V$ X) n
min(hiredate) min_hiredate! h* r1 u! M& t, s* w# x' ~! e
from emp_ning;5 Z: n/ p: Q" s2 `
/ f6 S2 \7 |2 }+ f, ?5 v
14.按部门计算每个部门的最高和最低薪水分别是多少? - q, t4 r) r) W: W1 [格式如下:( s3 Z9 y* T4 v- G8 C' E' n
10 4500 30007 V* H; {/ Y( y; X6 y
20 15000 8000 9 a- j% g( _! }7 ^$ }" Q0 B' V) v% t6 U30 10000 5000+ c+ E2 m6 w" y. \0 L P* D& n% Y& d0 y
% u0 [7 c1 {8 \" n& o1 J--group by 列名 : 表示按哪个列分组! q) y$ U7 Z% R/ i* R( E
select deptno, max(salary) max_s, min(salary) min_s $ h2 U4 ~+ X# w7 J. ifrom emp_ning* b& ?# H7 ~; U1 x8 Z
group by deptno; ( W0 J5 V7 @ Q- x; x( X" a+ O" Y' o/ J
15.计算每个部门的薪水总和和平均薪水?9 B3 f }, Y |- y' ~& s# @" p, G4 f
select deptno, sum(salary) sum_s, 9 r: d8 z# [+ G4 g; a. P$ D' K avg(nvl(salary,0)) avg_s , G5 t" d( r. o( H" }from emp_ning ; v p5 ~* J$ S7 Kgroup by deptno;0 x: z' ^5 y. c, B
( M- F5 d' q$ G3 w$ I4 M2 l7 |) q16.每个部门的统计信息:格式如下:! ]4 k1 C( \; ]" f: ]
deptno max_s min_s sum_s avg_s emp_num ; S2 r4 I& t& F# v10 10000 5000 23000 6789 34 |% \( u2 R$ g$ F8 W/ y. X) @
.... 2 `+ L, E2 R4 y& P" @+ Eselect deptno, max(salary) max_s,) W# b5 t3 \4 R, t, n0 r2 d
min(salary) min_s,8 C; l/ b& J t2 x1 u7 Y
sum(salary) sum_s, $ Z" m9 [5 Y0 T) u9 | avg(nvl(salary,0)) avg_s,: D& A: L! t9 |( _* R. U' y" A1 i
count(*) emp_num2 u1 b. w4 O! x5 n% H
from emp_ning! _% m( `/ N7 y- n0 Y5 N
group by deptno;) p) O4 T+ @# n* E7 b" [& N% v! W
0 G# v+ i: {# z' K9 O, D$ i
select后出现的列,凡是没有被组函数处理的列,必须 * U+ o2 H' n) m) F+ j/ ?7 U% p* N出现在group by 短语中。 1 t. ^& P- n; m- H9 w ; S ?9 A5 ~6 Q0 |7 T0 `0 N- Y按职位分组,每个职位的最高、最低薪水和人数? 9 [( o" i$ N: ~- V- p7 \6 Zselect job, max(salary) max_s, 1 J) E% I9 c3 {, s+ h# Q min(salary) min_s, 6 A: y! {/ A% P/ ?; n9 |* i5 l count(*) emp_num+ p3 L0 ~. p% h! T) d$ H6 K% g
from emp_ning- \8 F/ @6 K8 f9 r% _, M0 Q
group by job- Q: }6 o' X! l; |5 `
order by emp_num;8 G' @: ?8 E0 o- h
17.平均薪水大于5000元的部门数据? - H0 J. z! v" O$ z" s9 lselect deptno, avg(nvl(salary,0)) avg_s % l( P# Z3 f. `/ I! bfrom emp_ning" G- a: L3 ]0 e t0 `' F
where deptno is not null0 L8 K, P8 F9 {: I; x; N, C
group by deptno0 L, w0 o. g o) B* K
having avg(nvl(salary,0)) > 5000;( F N; f3 B% E: R+ x6 _7 Y8 o
4 S& a" M; i( h, N* d7 d
18.薪水总和大于20000元的部门数据? 5 p B& L8 ~- D0 m6 k+ _select deptno, sum(salary) sum_s5 @& T# ?# }# A) ?
from emp_ning " r3 @! s+ F9 L+ e1 R* @- i7 p* D) awhere deptno is not null 6 k v7 q, J0 z agroup by deptno; y, H4 {+ s% r0 h `
having sum(salary) > 20000;5 N Z: Q" U0 R( d4 M6 @% n' }
& ^8 _5 n w1 \19.哪些职位的人数超过2个人? T, t$ n' b8 b. |- n3 r/ Q
select job, count(*) emp_num 9 p. J1 J9 i) C- @from emp_ning5 F$ B1 {" `2 e& a, z
where job is not null ' i7 N* @2 Z% T3 i( m( ~- H6 Kgroup by job6 a- Q5 {% A6 z8 [2 l K
having count(*) > 2 " y% S% W5 v# C( r1 R' ?order by emp_num;6 x; J. ] g. k, D$ P
5 u- v5 a" ~. ?+ i8 c