该用户从未签到
|
SQL*Plus ; T9 z4 U% d( O2 y9 t; P
sqlplus.exe
5 t C( {* S' L. ^; N/ `) l0 e$ n; v$ W2 x+ ]
1)数据定义语言:create / drop / alter / truncate! p! t1 ~: _( H2 P5 z0 D [
对数据结构起作用。* ^$ g" f$ \# U& v! D
********6 R4 J& x' ~ |3 d* }$ J0 h( n
Data Difinition Language: DDL- N3 L0 M# Z* I* V2 k. Q4 Z
2)数据操纵语言:insert / update / delete: ]: D. h j/ x: w1 ~
对数据起作用2 M: ?! H4 ]/ o, z! V0 P
***** p$ n0 i2 |1 C8 [1 Z
Data Manipulation Language: DML
2 @. {1 }6 Q; ~3)数据查询语言:select, Q1 J+ o$ {$ b4 S- F2 H: a5 K( }
****( D, _+ l6 o( l) m& g
Data Query Language: DQL2 f9 k9 L* ^0 W$ v$ |; e6 f
4)事务控制语句:commit / rollback
# f. j. k* P! {6 o对DML操作确认8 Y0 A3 T0 W3 h- U" d
/ W- W, Z. Q5 |2 i# G: k( h8 K一、学习单表查询语句。" J2 A+ ~2 E) _: F. e# A
1.计算金额的四舍五入?
1 I+ o/ e; E4 |9 o0 y. ]select ename, salary * 0.1234567 s1, b9 q( V" @& u5 D1 [ B
round(salary * 0.1234567, 2) s2,
9 c, T+ O2 p$ Z$ ground(salary * 0.1234567) s3,
3 @1 R% L* ?. U! d5 {8 Ntrunc(salary * 0.1234567, 2) s4
* d% z" M- d4 r3 f9 cfrom emp_ning;8 A6 C+ Y: h7 q6 T# {; L
1 s8 u7 D1 }$ J4 ^* A& U3 i
round(数字, 小数点后的位数):四舍五入/ M) e9 n8 z" U y- C3 G
如果没有第二个参数,默认是0.
1 c+ K% E. Y& A& z6 P+ S* D4 e6 g7 t ?; ~
trunc(数字,小数点后的位数):截取
4 P* p/ F+ G, H' ?% e2 p如果没有第二个参数,默认是0., c3 k" J0 }) `$ D4 P
/ I6 J# T/ h* @2.Oracle中的日期8 e S. H! ]* N
1)取系统时间的函数:sysdate5 ^+ M/ G4 J. f" s8 M
select sysdate from dual;# U! A0 n K3 j: e X1 n' o
: M. E6 F0 W; l8 F
2)把时间数据按指定格式输出) q, h7 Z' i9 L+ B! g e l
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
R0 ?0 W4 d8 E1 F2 e- ?/ K2 nfrom dual;
! Q, A3 u9 W$ \- L
4 j7 Z0 t, F% ?2 Pselect to_char(sysdate, 'year month dd day dy')
* |5 x# J9 { s* J# ?# R' Vfrom dual;
5 H8 k) r; {5 C! g* O4 T% ]7 s! w& g; L* U
to_char(日期数据,格式)% a4 Y0 ^. d) B- b" g# J, r# ? H: ^0 z
5 }. ?: L3 r# N; U& Z
public String to_char(Date d, String style){
% s1 j) H5 r& v- b: \7 @ //SimpleDateFormat把d按照style的格式转变为字符串/ W/ M7 u/ R+ y" {
return 字符串;
, P1 e1 E2 a7 z; `3 `! P} ' B1 W/ P! }3 a* S" ~/ l) o
1 A/ }7 U1 R# r! n0 v
select to_char(sysdate, 'yyyy/mm/dd')% X2 P9 n! G! p6 v+ N# W6 g
from dual;+ C6 f6 f) A! y8 y) u& u5 S T
& B4 P+ ^$ x: q) Oyyyy: 四位数字年 2011/ r% V) W5 L8 n) W
year:全拼的年 twenty eleven2 X1 J/ P0 Y3 q$ w4 E3 V7 \
month: 全拼的月 november 中文:11月5 m1 w. V4 J9 U9 V3 |0 T
mm: 两位数字月 11
0 I7 @ ]0 g$ j/ ]& U7 [mon:简拼的月 nov, ~ w( d' p8 b8 P- l; w9 x2 @
dd:两位数字日! k8 U/ {6 W& c- r2 l, p# j# \
day:全拼的星期 tuesday
& l$ s. S& T' H6 V: `6 H* q/ Q0 I0 pdy: 简拼的星期 tue5 `' v( T9 m3 E4 f
am: 上午/下午 am/pm* c8 Z/ H8 A3 X3 O9 G1 H& c1 R
+ ?! K$ M' m0 W8 T! ]
sqlplus中日期的默认格式是:DD-MON-RR! S) C m4 b& l: A' p
现在的时间是2011年
$ \4 g1 _ Q! z6 J YY RR
5 h/ l; L$ `$ L; p3 t7 r05年 2005 2005
) \; p1 `, d4 Y! j: P6 S98年 2098 19985 z# a. u" Y% p; F
; z: s" U6 A$ q4 g) A7 I
假设现在的时间是1998年* F0 R" `! ?9 j3 A$ i1 T. `6 \
05年 1905 2005! |' Z8 \& v0 ]# q& C9 d5 [4 E' o; C4 x8 E
95年 1995 1995 9 r, Y7 P7 ^& G: Q2 s% ]
: a. Y! J: a+ k% O3 V) T. F2 @1 f. C
insert into emp_ning(empno, ename, hiredate)
! J4 b" _, ~1 X# S8 ~( Ivalues(1012, 'amy', sysdate);; k( ? r9 A+ d5 W
--实际入职时间是2011-10-10, d& L' x1 h/ Z$ p7 M i
insert into emp_ning(empno, ename, hiredate) l) O" g* P2 Q+ d+ f6 F1 O
values(1012, 'amy', '10-OCT-11');
* j4 o- ]" V0 N9 V7 \: ~
|: c& n0 k) n4 \3 xinsert into emp_ning(empno, ename, hiredate)
) b0 p' G% K8 ovalues(1012, 'amy', _9 A) ~3 S8 `3 H
to_date('2011-10-10','yyyy-mm-dd'));
' A' m* t7 p/ \( A: T8 B- [- H2 V9 _' X9 ?; U& m+ c2 [* \
显示员工姓名和入职时间,显示格式为:$ `7 p" v& K3 @
amy 2011-10-10$ L& D8 m+ e# u
( I( s2 x2 L( }. H to_date; Y% p( O9 m5 ~. H3 L
字符串 ---------> 日期; Q" k p- z; N* q
<---------
; t, m5 r; a. ~! k! Q to_char- x7 r5 i$ r: Q7 j# x8 |( S- A
; X* O: Q/ _0 I
3.计算员工入职多少天?
. q$ d; ?% o( v% d- H- {select ename, hiredate, (sysdate - hiredate) days
( Y2 l' T& u" p1 Ufrom emp;
, j: I9 Z3 f) R: P( S$ U4 n8 h. b9 S& l* N
日期数据相减,得到两个日期之间的天数差。0 R+ h2 O( y, o' V) }; `
不足一天用小数表示。
+ L o* Q; _7 q( c2 J9 U) I! v3 X) L5 i1 P) M1 s* d
select ename, hiredate, . u1 b& P" H1 {3 d: V: J t5 A
round(sysdate - hiredate) days
- N( @9 u6 k$ h2 B/ R) Jfrom emp;* L8 C8 _$ O& N3 v
9 ?0 o" z9 x) j/ a5 l! P+ V4.计算员工入职多少个月?用整数表示。
' ?1 i4 J) \& v$ g1 {3 n- N: p5 Nselect ename, hiredate, t' p/ ^$ O; s9 e# g2 c8 J
months_between(sysdate, hiredate) months
$ m- k$ w, i- H3 Z3 Rfrom emp_ning;6 A; z! m1 x& s) k% O: T J
% d# L8 E6 w2 F2 }5 U2 G- i& |: Qselect ename, hiredate,
6 W! v# T$ O+ s1 hround(months_between(sysdate, hiredate)) months! G9 }7 S3 u( K. |
from emp_ning;0 O0 p p2 @) Z$ ], Y+ c
+ c+ N4 W0 O* b8 P
f3(f2(f1(p1,p2),p3),p4) : 函数的嵌套
L! Q# F' D0 M8 E* Q
; D+ ?% L5 X1 d, L4 h5.计算员工的年终奖金0 B4 D8 c) d2 z! e+ a, y: K
bonus不是null,发bonus的数字。: f2 L+ X1 X0 m& w
bonus是null,发salary * 0.5. j7 f* [9 ^6 Z2 D, f; S7 T- Q
salary还是null, 100.
% N; @* h4 y$ I( }0 _) `5 B& m. [
" q2 T% q: N5 k3 [5 M! lpublic double calculate(double bonus,
0 K: F6 V8 ?2 [3 N- b3 t+ p double salary,5 y$ w b- j ^8 J1 `% f
double comm){
3 l3 i+ l1 g; e7 \1 d3 l if (bonus != null) return bonus;
) Y. f- [8 \! S! ]9 C if (salary != null) return salary * 0.5;* Z. B3 ^/ V2 F
return comm; 5 v: \1 Q% i5 z8 I& z3 _
}3 G1 a. t, K, Z6 X, j4 R U: e& R# @! Z1 i, K
--返回参数列表中第一个非空数据
9 e' [/ G: D1 v- T# ^--最后一个参数通常是常量。% v' w9 Z: r2 ]" B% D, s
select ename, bonus, salary,
* R- C5 e. k5 i% O: ^1 Dcoalesce(bonus, salary*0.5, 100) bonus
* E0 S$ \3 D, w# S* gfrom emp_ning;
, m' W& R' a8 f/ B8 p$ b, X% m1 {- N
6.根据员工的职位,计算加薪后的薪水数据:& ]: l. z& { ?+ X0 Y. B$ O7 [
Analyst: 10%
9 S6 P1 k6 M+ ^, ZProgrammer: 5%: o2 `; P0 _3 C7 i' O* y9 e
clerk: 2%7 C: Q0 U6 B( @8 e9 A' z2 k9 B# D
其他职位:不变。
# r& Y. p1 c' j, s6 d% w8 ]6 p3 l3 S1 N$ M
case语句:
: d! s: y/ C3 ^) X% ^select ename, salary, job,' ?. K# l: i9 z$ J
case job when 'Analyst' then salary * 1.1
8 g( a) ~* n E1 w! c3 w+ S: A when 'Programmer' then salary * 1.05
9 k0 |+ @: _* b2 N: U% G% L% b when 'clerk' then salary * 1.023 ^8 p. s& D; U i0 F! I- |# ?
else salary
7 c. S: `6 o5 `end new_salary
: {) T& k; U5 p* L$ L rfrom emp_ning;
0 x; ]9 g5 B/ d
% t8 c) T) h( i! L$ Fselect ename, salary, job,
7 t+ T! p3 e: T9 H7 `/ E* ]: D& N- bdecode(job, 'Analyst', salary * 1.1,
: y# p% ^ B- K 'Programmer', salary * 1.05,
+ N; e8 G2 E- m2 `* h8 R7 O 'clerk', salary * 1.02,) V* J6 r" i& K
salary) new_salary0 o0 l4 h, ^; V, u8 T/ N8 e
from emp_ning;( j$ ]; C% L% L F' z5 F/ _
6 |/ F7 J2 \& `) o R4 L5 \
7.薪水由低到高排序7 `6 H4 w. c$ I* J
select ename, salary from emp_ning, H8 u* }2 p: q7 D7 A
order by salary;3 ?9 ]! B& u' O- {7 h4 H
8 l9 z& G4 _2 F5 Fselect ename, salary from emp_ning* n0 t) \' |( j. D; `; ^% f8 A
order by salary desc; --倒序排列 descend
0 g, b3 k# a5 ^ C( |+ J' T
* m$ Q, b+ c; c4 }( T* @: D6 F7 adesc emp_ning; --查看表结构 describe
0 t% G1 G$ e+ V, O+ R6 P
) D. ?+ ], b. ?" p9 j; y2 {8.按入职时间排序,入职时间越早排在前面。# B' N) @5 N$ T! T; o9 s9 X
select ename, hiredate
9 n( j g+ k/ W6 q- Pfrom emp_ning) n" }4 \4 b& ` X2 h
order by hiredate;
6 f' \8 Z8 Z C$ }) g# ^( ?# Y
3 w% w, g' u/ U& D7 M( f5 [9.按部门排序,同一部门按薪水由高到低排序
! }( L. M& u% m4 S3 `7 F C; sselect ename, deptno, salary% H$ @1 F2 E, z1 f$ _
from emp_ning
/ O/ `4 }7 e8 Y: E- ]: x" O% b! Zorder by deptno, salary desc;
- d5 X5 J- P! G' N3 L& B1 q) H
2 B* s5 x; v0 J# x) d/ h1 G10.员工表中有多少条记录?; i) c+ Q1 S- M; H
select count(*) from emp_ning;
& Q0 v+ h. K0 _, m2 O9 Z7 V4 K# j* L
openlab帐户下有多少个表?6 a( M8 j$ e. y6 O7 @3 V$ G3 ]; U! [
select count(*) from user_tables;' N X | b3 [5 s
2 j- y% z6 Z) t8 bopenlab帐户下有多少个名字中包含emp的表?+ r) d) j! m/ I. S0 B4 \* `+ Y
select count(*) from user_tables7 `# U5 n0 ^' {: D
where table_name like '%emp%';* C A+ `2 n$ x; u+ z7 n
- w3 D4 A _( g+ M
--表名默认大写
j9 W) P2 r" H& ~( M( t! iselect count(*) from user_tables1 }; ^& O4 l: z6 {
where table_name like '%EMP%';
2 R' y* R& u8 |/ `
' D; g0 }9 }5 ~& l& ?7 K--入职时间不是null的数据总数。# h; w: H% a, U; ^( |- w( v
--count函数忽略空值。
% [9 G& a/ x8 o7 ~; R! X: @# F9 R! l" Gselect count(hiredate) from emp_ning;) g' L. u& x/ n9 m5 G4 [+ d
* b1 l2 j' S2 M11.计算员工的平均薪水和薪水总和是多少?
* _" `0 u, H5 {& m z# H1 tselect avg(salary) avg_sal,
3 N, q# n& B6 B/ y sum(salary) sum_sal: q2 f: ?4 l/ J8 V' f
from emp_ning; Z4 f) u( y& F/ f, n
1 T# w/ ? x+ p3 D: ]avg(salary) = sum(salary) / count(salary) , f$ V7 n/ m# q/ [# Z: l# U
68500 / 10 = 6850
7 ~; u* A: q# |$ Z2 ]2 L ^7 O9 ]--纠正逻辑上的错误
- p+ [* K! ]: I5 a" E3 O { eselect sum(salary)/count(*) avg_sal,
5 O. d; V/ C0 K9 E0 J2 G sum(salary) sum_sal
& M4 G" E% o/ H, f0 v( C3 ufrom emp_ning;: r) b) {0 |# _) ?
9 ]1 D- f/ d9 g$ Oselect avg(nvl(salary,0)) avg_sal,
3 w8 u% l$ B! r sum(salary) sum_sal5 ~" {6 N0 Z: W8 ~1 u
from emp_ning;
% o; H: E: a4 w* B; @: o3 n3 g Y' i# g! Y
12.计算员工的最高薪水和最低薪水6 E0 r; n# M% B' A% P
select max(salary) max_sal,
U! V, o0 Y. r' ?" k min(salary) min_sal
: c: `+ k( C1 Q U7 t. sfrom emp_ning;
1 @$ N; e4 O0 M' K. ]1 h
( @6 s: [# |! z# p组函数:count / avg / sum / max / min 忽略空值' {/ t. \1 J6 l) H
其中:avg / sum 针对数字的操作。
5 X/ r4 b) z# z max / min 对所有数据类型都可以操作。
- u; [ s; _; m# P7 N. {- `0 ^0 n) ]- G5 \
13.计算最早和最晚的员工入职时间。
: C' [/ o+ F# p# {& Yselect max(hiredate) max_hiredate,$ H4 C* P' s5 T9 {% I
min(hiredate) min_hiredate
) n* [9 x1 m. G) @5 V, \" u9 c8 xfrom emp_ning;# N& _" R" p U( Q5 [0 Q
7 e6 o, \1 l! l2 v; z- g7 T2 Q% a% J
14.按部门计算每个部门的最高和最低薪水分别是多少?
% }7 n4 C3 X( S* k4 D格式如下:
1 M0 R1 Q+ D7 B" \/ N2 @ |8 U10 4500 3000
2 g* Z& Q, {$ R/ c20 15000 8000
# V" m7 z, r0 Y2 u30 10000 5000: h* o- p: ]) p7 V- e) {) d
( _1 f# v* f9 {/ k--group by 列名 : 表示按哪个列分组# E7 d2 T9 Q2 o( Y
select deptno, max(salary) max_s, min(salary) min_s
5 T D3 P2 O3 m( M% Z& `from emp_ning- ~1 D' ~% a9 B+ U& K
group by deptno;
( `/ {4 a+ Z$ m! f. f% E
' U9 }$ K5 V K3 m15.计算每个部门的薪水总和和平均薪水?
; ^9 L; Z! m: N( v6 V: U8 sselect deptno, sum(salary) sum_s,; E5 g% D/ a, W, n
avg(nvl(salary,0)) avg_s" Q0 [# w5 f+ z9 { N2 f+ @
from emp_ning
" @" p! @- ^/ T% v+ k! i: S; l. ggroup by deptno; D8 p2 q) ?7 p% C# D! H
8 A/ p8 q {% b; S+ c1 M4 r5 y
16.每个部门的统计信息:格式如下:
; v5 E' H- z/ F4 c9 R- U R8 _ ydeptno max_s min_s sum_s avg_s emp_num4 L( o8 d* P4 W2 c( e
10 10000 5000 23000 6789 3! p4 C' d6 w4 G2 J. v9 U
....
( F# A# ~0 Y) H. l. \8 y0 Aselect deptno, max(salary) max_s,5 }. ^. e7 w! X; t7 y7 S' V. V
min(salary) min_s,
/ n4 X7 M% Y' }% Z6 l sum(salary) sum_s,4 a1 |5 v& @$ s; q/ a/ N. z! }) H
avg(nvl(salary,0)) avg_s,
9 H( p% J# Z* `$ R: L' ~- l count(*) emp_num n# X! j" [3 {/ O; `
from emp_ning
! N, D+ U- v3 U& [2 ]* wgroup by deptno;0 a4 X8 ?6 H* p
4 E$ D- ]( g5 r: d; R" ]! hselect后出现的列,凡是没有被组函数处理的列,必须
3 F. o G4 H2 X' ^3 |出现在group by 短语中。
5 o! y( _& w; b; ]* r T7 u% N3 I2 }1 o
9 W$ W8 w8 }. q6 K按职位分组,每个职位的最高、最低薪水和人数?. p$ n! m% g9 t+ Q( R8 B/ S6 X
select job, max(salary) max_s,
) B1 y7 Z* @' A" o6 I min(salary) min_s,
1 k; Q6 h. ]* m% k count(*) emp_num
+ T6 T+ `" _/ }$ tfrom emp_ning
. q( C. G$ s* R) ^$ p7 lgroup by job
) y# O: e0 U5 \- ]& q) [order by emp_num;0 p% s! K6 O# w
17.平均薪水大于5000元的部门数据?
( N& k/ X/ y6 I" ]) Cselect deptno, avg(nvl(salary,0)) avg_s
5 v; G7 X- x- {) Y/ |from emp_ning
! N& G& q' q% d. L* ^! J& qwhere deptno is not null
! G( o1 i+ k! o. dgroup by deptno
# ]9 M1 n0 C# P0 M, Mhaving avg(nvl(salary,0)) > 5000;) B# S- Y, o6 |$ J g( u
* a' _2 _( i# ~& ~8 }
18.薪水总和大于20000元的部门数据?( A9 u3 Z) W$ t* Q6 h, M
select deptno, sum(salary) sum_s
& s7 s; M( l: B$ ffrom emp_ning
, o& Q" B2 }1 x. J2 }' _where deptno is not null. P3 v+ i8 p- u1 O$ w; B: F4 g
group by deptno
4 a" N/ w: f7 r7 i" Ghaving sum(salary) > 20000;
( I6 `$ p# K* k u0 f" }9 E. [! m/ g; g; f* H0 b- }* [
19.哪些职位的人数超过2个人?
6 p& e2 u7 W" D9 `2 Oselect job, count(*) emp_num
6 L. l0 U7 H6 ]3 ^+ Ffrom emp_ning
' t$ X+ |9 Y: r) Z1 c2 B; Wwhere job is not null& e2 m" ]2 t$ e0 ], e
group by job
- @3 k3 g5 u$ G4 ]- B% @' Y( hhaving count(*) > 2. H# x7 C$ L7 B
order by emp_num;
# K* M2 `, M5 v' y$ h* f2 n$ C6 z* N7 {7 a' V( h/ q2 ~# v
|
|