|
该用户从未签到
|
SQL*Plus % i5 A. W/ Q/ \) P6 `
sqlplus.exe / c9 k# ^2 X7 U+ V
6 V- @1 |* }+ `4 T: q: T9 \
1)数据定义语言:create / drop / alter / truncate8 g, Z% [0 i/ {
对数据结构起作用。+ ]! r3 ?" U+ g: z
********5 y; m) s, ~/ T2 X! I, ?
Data Difinition Language: DDL7 i n; L- R2 C
2)数据操纵语言:insert / update / delete7 C1 ~& O4 a5 w" r; w4 `, {
对数据起作用
( B+ n, B& _7 z9 t; M) X ****
# O6 `6 o- l5 r) EData Manipulation Language: DML M# c* a% ?. l5 j+ k3 |
3)数据查询语言:select
, r2 y' r8 y! b9 f, `) l& e% J% b ****
( N/ {3 ^( P, w5 _. J9 c; SData Query Language: DQL* `- _# a% H/ ?& W
4)事务控制语句:commit / rollback
+ F( {2 f+ \5 Q9 J6 S" |. z1 k对DML操作确认3 ]! F, I5 f/ {$ u
( B, i2 u. B. }' R- h3 S一、学习单表查询语句。
& P3 p5 r0 j' U" X) x- l1 P* v0 r1.计算金额的四舍五入?
( P5 k7 `. D4 r5 Bselect ename, salary * 0.1234567 s1, 5 E, B9 K6 `! ~- e
round(salary * 0.1234567, 2) s2,
$ N/ N0 M" \% \round(salary * 0.1234567) s3,' V& }* |9 o! |. z, r! ~0 c+ e
trunc(salary * 0.1234567, 2) s4/ n" S. v( {3 T3 J4 {+ B+ o: D
from emp_ning;
) }, U M+ t1 t7 b/ D/ x
& z1 `* p* B; A; N0 h. b1 Q* _round(数字, 小数点后的位数):四舍五入3 V2 a( [% U# H8 }( h
如果没有第二个参数,默认是0.4 J E7 I/ |" q& [; d/ h7 n
* U! m$ @* M7 C, |! a! p* Ntrunc(数字,小数点后的位数):截取6 u+ h, O( e6 z* q- i% q: Q
如果没有第二个参数,默认是0.
; o3 S/ e- w& j) ^9 C$ i
& X8 ?7 }8 A2 D2.Oracle中的日期$ A- n/ d( N0 B5 Q7 w0 p9 x
1)取系统时间的函数:sysdate
! J3 w1 d. j$ ~% w4 n8 l$ _select sysdate from dual;0 z; X, D2 u. ?2 S- l9 b
3 O! B" I9 B- F* f$ F+ m7 W2)把时间数据按指定格式输出
+ [: c y0 ~& }0 N% Yselect to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')5 j! f/ ^- _6 @. x) P, Z
from dual; s/ K4 n# M" o# W2 H2 J
* y: g. ?: i- S# C& d$ Y
select to_char(sysdate, 'year month dd day dy')
3 j# O& O, U0 I: _from dual;
8 c. F! F4 K& U& C8 B
* l* r0 ]/ w: I7 W' Gto_char(日期数据,格式)8 E$ I3 W# O6 d1 B( r* S
! W; q" H' G; k
public String to_char(Date d, String style){
1 W, g5 a+ b9 V. ` y/ `8 E //SimpleDateFormat把d按照style的格式转变为字符串
6 \9 T$ r' ^2 |) U% ?; G" y& G% h return 字符串;, g% V& b+ a6 E! [1 S2 K& J
}
6 ^1 t+ d1 ]) p# q" u
; g; Z# O) f$ I8 mselect to_char(sysdate, 'yyyy/mm/dd')
4 z8 q7 P0 w, ]( f8 Q3 F! v( cfrom dual;; ~" K" r. K% q4 |
: s! D& A. R# B& [( R
yyyy: 四位数字年 2011. V: k' N, _ E
year:全拼的年 twenty eleven( X; O+ u/ X5 q. J+ }: x
month: 全拼的月 november 中文:11月
8 z6 K6 x L J( {6 H; O; c% o% |mm: 两位数字月 11
) ^) C0 l6 b# D0 \" i' {mon:简拼的月 nov1 l, }1 O6 ]' f, n, Q5 K
dd:两位数字日
6 z& ]$ o ]) Z8 `5 g6 jday:全拼的星期 tuesday
" F8 a" j p3 F9 U2 o) u; h. Q3 ddy: 简拼的星期 tue$ ^8 f$ p: Y; w2 U1 @4 }
am: 上午/下午 am/pm1 l0 Y* Q% F r( g. a
" y9 X1 b* W" y( S2 |
sqlplus中日期的默认格式是:DD-MON-RR% ]" G! l: G2 S! I/ C3 c3 ]" M
现在的时间是2011年4 M6 Z4 N: e# r
YY RR- F3 |, @% N: w+ }- s- j4 T
05年 2005 2005
0 I1 N5 F, f, N+ Y' b# D6 Y* E98年 2098 1998! }7 J6 G! _& ~% ^9 O3 G' Q* w6 O
! \' d' k5 P7 J+ R假设现在的时间是1998年1 l! ?$ P; U b+ f5 c* c f
05年 1905 2005
* V3 z# D- W* E1 U; i95年 1995 1995
: |/ i A: `: ?! ^- Q
) o( i+ A/ ]! d" @9 n8 T* `: u+ Ainsert into emp_ning(empno, ename, hiredate); d+ a5 @1 ^$ {: k
values(1012, 'amy', sysdate);+ x6 Z4 z/ ?6 W0 y& {
--实际入职时间是2011-10-10
- |% {$ m4 D( B1 B0 z% ?insert into emp_ning(empno, ename, hiredate)
$ Q! O- P; A1 y/ Avalues(1012, 'amy', '10-OCT-11');
/ ~9 D) x c. @- Y, G) E: E1 d& a& e- i2 _- b) U
insert into emp_ning(empno, ename, hiredate)
' b8 a: q; _( y' r. x/ F* }values(1012, 'amy', * @; R' |* \, @4 V0 @1 E% d0 T6 g
to_date('2011-10-10','yyyy-mm-dd'));
! S7 x5 p$ [+ j0 F/ {% I7 @5 e
+ n. D' q1 ?6 s0 J显示员工姓名和入职时间,显示格式为:+ N/ l. |" U4 u$ o% r( ]9 h' ?% |6 P
amy 2011-10-10
/ v( k6 X6 d. H2 N/ T# |# \# e) l/ {5 Y% V1 U# Z0 o
to_date
- p" d; l [2 T4 M+ ]字符串 ---------> 日期$ B2 W6 S I" g1 w
<---------
$ e) F! W" H% ~ to_char# `7 U4 B5 b/ R$ P+ e
' o! M6 |, ?' r
3.计算员工入职多少天?! d0 Q& ~) G* e9 }& X5 s
select ename, hiredate, (sysdate - hiredate) days! B( c; ^. \8 r2 `& f& B. Z# h
from emp;
$ t+ A6 b2 \' S* P' e" E2 n
" z& {( J6 {7 {. b; x" L8 X日期数据相减,得到两个日期之间的天数差。) G9 R2 D% b' L0 w
不足一天用小数表示。* \* w& J/ ]3 R( Q
7 {9 U: W1 Z; U8 s/ h( Q, [
select ename, hiredate, ' j6 x5 l& F7 g3 d& A @# L- r: X3 q
round(sysdate - hiredate) days" e J0 a- \% P6 k
from emp;" H, V0 c1 e, l7 |( X6 ]9 E# X
, g4 o! x. B1 ^+ Z; V
4.计算员工入职多少个月?用整数表示。5 V: @& I) `' D0 R0 I1 n! o5 k
select ename, hiredate,1 C) w2 r9 d8 K$ b6 N, x3 E
months_between(sysdate, hiredate) months
) V$ T' X# y1 {' \' Cfrom emp_ning;. k9 u) u* P8 y- U
3 M/ Z/ n9 e8 [7 m2 y
select ename, hiredate,
4 `) k D7 Z* a9 |* T/ G8 M2 P. h+ V/ Oround(months_between(sysdate, hiredate)) months) L+ N8 G* W7 L. y$ L
from emp_ning;7 x) F1 T" [9 `+ Q* I" c
/ E k& Q" t# |; ^! ^* f
f3(f2(f1(p1,p2),p3),p4) : 函数的嵌套+ E) M2 i+ m" j/ d1 S3 b2 u7 q8 i
) B- D, l3 c7 j9 _7 d7 M
5.计算员工的年终奖金
V4 N" l9 M! r, A; b9 a- Abonus不是null,发bonus的数字。8 V( O8 `: N, [8 Y& K/ r
bonus是null,发salary * 0.5.! M' q r7 M- w* p
salary还是null, 100.) y, I' `& P6 f' J& Y" {5 [
1 n% u0 t( f% v3 l6 Kpublic double calculate(double bonus, 0 C, F; d) x; a: ^( c/ R9 V/ m, d
double salary,0 J8 ~) \* A2 Y/ S2 I/ X
double comm){$ c" x6 b+ o& m9 _" a& l: T
if (bonus != null) return bonus;7 w2 N3 F& }1 [0 ]& b
if (salary != null) return salary * 0.5;) q9 g$ \* u/ c i1 m6 e, o2 r$ p
return comm; 0 u2 g: ^8 [# P
}0 ` a' R) l5 K
--返回参数列表中第一个非空数据! S0 _6 I5 [0 g9 k/ U/ k- c0 K
--最后一个参数通常是常量。
" j- F: B9 f! F2 V6 j) R6 Pselect ename, bonus, salary,
5 [2 H7 O+ c+ V" z2 J5 h* g4 Wcoalesce(bonus, salary*0.5, 100) bonus
- b4 I/ G% ~* R# D8 t: t/ M ofrom emp_ning;$ D2 P6 D7 C" P2 {& G* y9 i
! U6 a( q# Z. o
6.根据员工的职位,计算加薪后的薪水数据:/ V" d! i7 J- i) s
Analyst: 10%
# M: D1 Q+ _& q9 }+ J2 iProgrammer: 5%& O5 P8 G! u: e. w
clerk: 2%; F& [9 L9 E3 G& u0 u( Q8 b* g
其他职位:不变。
! E J$ u9 _: I+ i7 a+ m
+ w" \. W6 D w0 b8 gcase语句:
& Q" g1 T5 A" V: F0 t3 t6 Uselect ename, salary, job,
9 X, P h* k7 _* o1 D$ q# Lcase job when 'Analyst' then salary * 1.13 M# `1 R. f: E# @9 {: W2 J9 v
when 'Programmer' then salary * 1.05
4 T2 ]4 ]2 \% t1 x when 'clerk' then salary * 1.02
- ], S/ t6 y8 _else salary/ M9 Q( T8 L5 P, ~" F+ ?
end new_salary' z' S8 L" T* G% y
from emp_ning;
0 Y2 p5 B0 U! s$ w7 n' g( B$ w& H# |4 Q$ ]9 l
select ename, salary, job,
7 P1 U& a; B' {% S# k$ g' o8 ldecode(job, 'Analyst', salary * 1.1," D+ b" Z2 u3 f6 ?$ L4 i! w. Q# |9 H
'Programmer', salary * 1.05,
' Y. R: D+ A) L% e* e 'clerk', salary * 1.02,
, K4 M5 x( Y7 ? salary) new_salary7 Q' i: G0 t* y, g) Y9 q0 P. ?
from emp_ning;
! j. N4 U# K8 o y
{6 c/ } [/ B" N4 v7.薪水由低到高排序1 j7 v7 C% l+ B0 Y
select ename, salary from emp_ning# q6 a; f" E8 q% o5 Y: ?
order by salary;
5 x, w3 n5 L0 B9 t6 W. _- e3 Y7 S
select ename, salary from emp_ning7 t# D. c! |0 e; y: b( }0 j9 L$ \; L
order by salary desc; --倒序排列 descend
; N! F3 Z/ @, \. Q$ t3 M2 g: N" ?8 n; B
; S$ u( y* N; G0 k$ rdesc emp_ning; --查看表结构 describe" A! U. @6 B6 ~2 h
; e# E5 U2 ?# A9 ?& r$ K) h3 u( u
8.按入职时间排序,入职时间越早排在前面。
3 B* j8 B6 R; }% D" b7 u {4 |9 s: \: Qselect ename, hiredate
: n: V' \" T2 ~from emp_ning
8 \+ x9 |" Y y* f7 zorder by hiredate;) v6 m; o5 t7 x% ` y: w
9 v& c. y% f2 N0 ?9.按部门排序,同一部门按薪水由高到低排序9 ^9 Q5 j; L) ]& k- c
select ename, deptno, salary2 V2 d$ e9 f( S/ _6 o3 I- p. e
from emp_ning
) a& N d$ p/ e! ~/ j0 corder by deptno, salary desc;$ |; b1 P$ i7 H) ^9 K' \ r9 Y
Z( S6 W4 S1 X( M
10.员工表中有多少条记录?
/ u1 Y8 P( o3 o* Z& {% y- S# ~% [8 Yselect count(*) from emp_ning;9 U; f6 l2 M+ C( S7 d
3 ~3 c" r6 k* e. V1 m
openlab帐户下有多少个表?
/ C0 x, v5 w- ]select count(*) from user_tables;5 G' F8 c3 ]& ~
# q- n) E! A" l9 F7 u& E" o9 N6 I
openlab帐户下有多少个名字中包含emp的表?
' X0 l( F a: C! B m! wselect count(*) from user_tables
4 n: W- {0 S1 R6 Vwhere table_name like '%emp%';
( E( |3 d! B) ~; {. Z4 Y1 H; }
! y: B: V! c# [--表名默认大写
- m( F8 s/ v$ t. s3 S" e! ^/ \select count(*) from user_tables
# m W" c0 b. G* F1 Z& n: ~7 d9 vwhere table_name like '%EMP%';# H) x+ m: G4 {6 k, _! x
2 I3 N: \3 x3 r! `) c5 O4 ^
--入职时间不是null的数据总数。. E: @, I6 a# p: g( ] \
--count函数忽略空值。+ x/ r, y& `; J% ]8 X$ q
select count(hiredate) from emp_ning;+ }4 ]# y% o7 y; u* l
$ O$ N+ U `2 G8 Q; Y$ Y' g
11.计算员工的平均薪水和薪水总和是多少?
C1 l* b6 |6 A0 M% R' gselect avg(salary) avg_sal, 0 W! l9 n% e$ w, j
sum(salary) sum_sal
% P8 j% e: \% \9 `$ Ffrom emp_ning;
( l- q) W {7 @/ O1 Y- [4 Q& x5 I. Y' M- \' Y( l$ X8 T. k; p Z
avg(salary) = sum(salary) / count(salary)
6 W+ {/ u; V' H/ d, s 68500 / 10 = 6850
" C% A( w. f7 o2 A9 g& j--纠正逻辑上的错误
8 [* s* @" ^7 v+ u' i2 N" r, Hselect sum(salary)/count(*) avg_sal,
: O1 H3 p) g0 K W sum(salary) sum_sal# d! y3 ?0 p0 T# k3 Q' F2 H
from emp_ning; Y8 L; q" x2 Z: [
+ G/ v% X- ~ i! _& ~. X& W# A0 f
select avg(nvl(salary,0)) avg_sal," j+ N- v& n0 s; Q% k, o7 ^" e
sum(salary) sum_sal
" p# Q' B4 A# Y3 M3 N" l0 l) rfrom emp_ning;
# Z/ u% T! Y" b6 G6 F; D2 j& ?5 {' s
12.计算员工的最高薪水和最低薪水
: K N2 T5 L0 M, j2 I' cselect max(salary) max_sal,
6 T4 Q7 J V$ [/ j. W min(salary) min_sal
5 d4 g# G" T5 W8 {6 _from emp_ning;
2 E( c$ Y0 f2 Y# o4 S+ g/ Q& y" P- t4 {8 \% D0 ?9 [
组函数:count / avg / sum / max / min 忽略空值
* v7 v5 Z4 H4 b其中:avg / sum 针对数字的操作。$ C0 H/ h, t% Y1 o% r, a
max / min 对所有数据类型都可以操作。2 N# s- c i! s" V, ~; `/ O
. z. e3 J3 a0 Q) z7 b- q+ v# k* F13.计算最早和最晚的员工入职时间。# w% S3 [5 Y. N- T
select max(hiredate) max_hiredate, ], l) A8 V# u$ p6 l4 y
min(hiredate) min_hiredate
1 R: A7 Y8 S k7 w: Sfrom emp_ning;5 X6 X( P% o, r3 F/ {8 h l& X
0 i& ^; V! I( A! a1 g14.按部门计算每个部门的最高和最低薪水分别是多少?
$ d# Y0 n: P! E1 s格式如下:
' v9 g% u- | t1 b0 L# j; R+ g10 4500 3000$ H/ J4 |- n* K( Z& q! f
20 15000 80001 l! p+ D$ R( T, d+ |- q; c& Q
30 10000 5000
% K7 h1 x; Q! I3 f7 Q/ b4 I
: ?* K1 i$ J- p0 s5 ?--group by 列名 : 表示按哪个列分组( J* m: a# Y& b+ U, Q
select deptno, max(salary) max_s, min(salary) min_s
& W! l7 I) v5 Q: I" Jfrom emp_ning
) p! e2 k9 I" b; ]* }' bgroup by deptno;/ {9 Y( J9 |/ [' l
/ R4 r$ a- |5 ^1 s" N* u" ^
15.计算每个部门的薪水总和和平均薪水?
- N: p! E9 T' Z% b1 {% ?' ~* Mselect deptno, sum(salary) sum_s,# y1 p" V( P; o D$ n
avg(nvl(salary,0)) avg_s- D. z$ ]6 `" ?* i# R2 {
from emp_ning
! a( r' z+ g! r& ^. @ Egroup by deptno;2 c. C4 Q: p. Z
i! m! j# O, H
16.每个部门的统计信息:格式如下:1 g7 ?$ h9 e/ k' k/ @6 d5 M f0 N
deptno max_s min_s sum_s avg_s emp_num
$ p9 o. H! m9 I5 E& @ ? N10 10000 5000 23000 6789 39 K% R: q7 V3 B# X( L9 F2 ]1 K
.... M+ h, N& u+ m/ I: N
select deptno, max(salary) max_s,
! _6 f& ]7 m; E+ @ min(salary) min_s,; i# S' \: Z0 a0 [' ]
sum(salary) sum_s, B0 m4 O: T. I
avg(nvl(salary,0)) avg_s,, q/ {- Z4 l+ \# ?( x" q# b/ E# r
count(*) emp_num
: ?0 q, e- T2 d8 J# e2 qfrom emp_ning
" u2 _, { i) n! Agroup by deptno;, v3 b. ^) W; B6 s6 }
5 Y' M7 j5 s# l8 ]% Hselect后出现的列,凡是没有被组函数处理的列,必须
$ v2 U5 h% Q7 f出现在group by 短语中。9 d( w/ Y" g- y. X/ C0 D# [, }
8 i) U2 Q2 N. @" x
按职位分组,每个职位的最高、最低薪水和人数?
# }5 }- L+ M9 S& \! A3 C6 v7 G6 Pselect job, max(salary) max_s,- `, ~" u0 z6 c
min(salary) min_s,
( j! k4 n U { count(*) emp_num
9 H0 N0 t- @( G. \8 C5 mfrom emp_ning& A% m F& P; S9 r5 U
group by job2 f! J+ C; y9 N5 d) D0 s. f0 k
order by emp_num;1 ] E, x2 ~1 j1 o1 t" S, }
17.平均薪水大于5000元的部门数据?# |. W7 s9 o I) f! ~
select deptno, avg(nvl(salary,0)) avg_s* J1 D% @& b7 @( P0 {. U
from emp_ning
8 V- I' L# `2 Z' a0 J* ywhere deptno is not null
7 H% @8 b; A" o* t9 Hgroup by deptno
; ~( ^( I7 o" g i; qhaving avg(nvl(salary,0)) > 5000;
# I( p) n e- ^# O4 E H, g# M! P$ c6 O9 A2 c$ ~$ U% b; o
18.薪水总和大于20000元的部门数据?
9 a+ D+ u; K) g: X- g7 mselect deptno, sum(salary) sum_s
: x) l) `8 j! d: Tfrom emp_ning9 I: C: s/ w& E7 ?, I
where deptno is not null. d. Y8 T [( _+ T6 N# a Z* k; d
group by deptno) C; X, I9 C# y
having sum(salary) > 20000;
: F: `+ R( Y* O7 J" M1 W
( M2 Q3 i7 `& R* k% B! u19.哪些职位的人数超过2个人?6 _5 W9 k+ O Z4 t x5 h& l
select job, count(*) emp_num; }' d. O9 I( D) t0 K! D7 ?$ R( @
from emp_ning6 s4 e v! M n/ c. f
where job is not null! P0 z- C$ o. W! M" @+ W
group by job H& J! ^; \: K) _) ^
having count(*) > 2
& ?4 X; K& T1 p& f& O4 horder by emp_num;
; f; n3 `1 S$ F4 W$ ^% M! T* A D! K# d Z
|
|