|
该用户从未签到
|
SQL*Plus ' C) N: ]( g- C/ v5 N" D
sqlplus.exe " L' V; K6 P4 t6 x2 |* h0 z
' k" Z/ F+ y; m( u
1)数据定义语言:create / drop / alter / truncate
# H- C: L4 d) \! n# Y" Y对数据结构起作用。
/ q+ i: F1 t. E! n- i- n ********
, t4 |1 k+ m6 b7 m7 Y& oData Difinition Language: DDL
. ~6 N3 S* ^. d7 w* v2)数据操纵语言:insert / update / delete
, d$ e* v4 z! b8 I: w) Q对数据起作用
" n5 y6 E e- ]0 e4 j3 i ****
V- o2 l v1 X- {8 pData Manipulation Language: DML1 B& F+ }' A) Q8 S
3)数据查询语言:select( B' }$ c2 ?# j+ \
****
3 R: P4 b, p; ]Data Query Language: DQL
# |/ [8 W9 a- j4)事务控制语句:commit / rollback
; J6 X' J' c* _0 L9 G+ r对DML操作确认
4 C/ o1 }( ~0 h5 }; n1 |2 y5 a1 G' Z6 H4 ?
一、学习单表查询语句。! p3 S9 u& W& m; m( D1 i
1.计算金额的四舍五入?- i E: Y) f+ N# L; U
select ename, salary * 0.1234567 s1, 8 }5 T$ r+ P# R/ O3 b' v
round(salary * 0.1234567, 2) s2,
( W7 m4 n+ h+ Q* |round(salary * 0.1234567) s3,
( `7 }3 n$ n) s3 S6 Y% f3 Ktrunc(salary * 0.1234567, 2) s48 s6 I7 q4 P# ?: b& i
from emp_ning;
7 a- M9 C5 j) u; X3 @ H
, W3 @( k% g& A o4 A, x8 jround(数字, 小数点后的位数):四舍五入
1 Z( k/ @1 W! V' x! h如果没有第二个参数,默认是0.
( A" c, I" a z1 T j3 s- b$ B; Z8 ~8 |8 _- U& Q# ^* Q
trunc(数字,小数点后的位数):截取* Z( x7 v3 i% T" v4 R. p
如果没有第二个参数,默认是0.
" P1 ]/ O. s' N( M# K
b' h/ X( E3 B: v$ y: v+ Z6 d2.Oracle中的日期
7 R0 o" F0 T7 Z, x7 _; N; V1)取系统时间的函数:sysdate
! |) {! z3 a- H$ z* j1 C# [4 Q$ Kselect sysdate from dual;- K( S$ J0 P1 @+ p- }, X
) M3 G7 y% y& E9 U) V
2)把时间数据按指定格式输出# b5 L# n: T! {$ |# u. Q
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
1 u# w8 z J. a# ffrom dual;
% s2 W: P( u( a4 N# \& I0 Z7 g! M' V+ d* f
select to_char(sysdate, 'year month dd day dy')
: W8 X1 y1 d( |* a6 j/ z* ~7 Sfrom dual;; L; @" b3 d" A& E
! o( S- `; r5 D' F% F
to_char(日期数据,格式)
' o* ~ l4 h# y2 l
: U' {+ ^7 o( a( W0 n# Upublic String to_char(Date d, String style){' L5 d" [ Z" {& h
//SimpleDateFormat把d按照style的格式转变为字符串( m% W$ R( m$ z; \6 J% j( O i
return 字符串;
G. F7 r5 u% F% ~% Y) i} 6 ~6 C/ F7 z' h- g; v/ e! ~: z
2 L: T# W; {/ }# G' \% Iselect to_char(sysdate, 'yyyy/mm/dd')
8 _( W, L4 q8 N& @, Zfrom dual;* s' g ^7 V- A1 ^! o) F* }# {
. Q0 l6 e5 c' d2 l
yyyy: 四位数字年 2011- o$ E* w0 F% u& I- t$ C6 Y1 T# X
year:全拼的年 twenty eleven
6 [; ^ s a; W0 _, S( N7 \month: 全拼的月 november 中文:11月
1 Z& \" o1 o8 F9 C2 Cmm: 两位数字月 111 m/ ?" I+ W' _9 V" Q5 o
mon:简拼的月 nov' @; L9 S' q% a1 a
dd:两位数字日: i; n2 y( R( l) z" X5 G
day:全拼的星期 tuesday3 f3 Y; h: O5 E0 a
dy: 简拼的星期 tue
3 c' |% A5 M+ F( wam: 上午/下午 am/pm6 ]* L* K) j$ F9 Q B( G& o/ ?
- X2 @! S6 c! |, l+ b
sqlplus中日期的默认格式是:DD-MON-RR" |" A8 o4 m+ @
现在的时间是2011年4 Z& F K4 n* x3 ]" ~7 S
YY RR
, ]% z. F7 O( E/ d2 ]; l0 e$ G05年 2005 20054 q8 I* f& L/ a4 u6 n
98年 2098 19988 R R; J3 d& h x q
# L4 s* w$ z/ E0 U" [
假设现在的时间是1998年
. l) l' ?! S: B: K: n+ H' }05年 1905 2005
' Z7 @, P5 D9 f: ?9 _4 |95年 1995 1995 ; e# {; L5 m4 P
7 l' X6 U4 z( k7 {" \" r
insert into emp_ning(empno, ename, hiredate)# b8 f/ C6 |% U( S* d
values(1012, 'amy', sysdate);
/ N2 I& I1 Q# k- o--实际入职时间是2011-10-10
) }: S' U& z! P; A) `, Oinsert into emp_ning(empno, ename, hiredate)
: Q" x# b/ q' } Jvalues(1012, 'amy', '10-OCT-11');! j* S1 V. J8 k+ a4 T# [
) e$ P+ n6 p0 {. R1 R. T( m$ s# Linsert into emp_ning(empno, ename, hiredate)8 K% @ H+ s1 t2 a# c! d5 @( w. ^
values(1012, 'amy', ) r0 K7 V2 ~9 i' Z2 T# B g
to_date('2011-10-10','yyyy-mm-dd'));
0 [! o+ n- f, O4 E8 S3 f! D; Q7 m$ V% Q! {$ k8 P5 k' [
显示员工姓名和入职时间,显示格式为:
- I5 }+ d7 g$ n8 \- `- S3 oamy 2011-10-10" _5 V6 W! L! G" h, V- M" I
$ B# D* _4 l4 o, S! K$ D' [9 f
to_date3 Y! J) }! s7 E9 _# s ^' q0 {
字符串 ---------> 日期
$ |. K5 L2 E }2 s" r4 X# k0 i' X <---------; z- I" g4 t" o; ?
to_char1 ]- m2 V* o9 `2 B. T: P7 C0 y( ]
) h2 h5 o0 h( Q
3.计算员工入职多少天?
' v( z. ^" A/ t8 U$ qselect ename, hiredate, (sysdate - hiredate) days
( n- k, b: a2 b* C' l( Ofrom emp;
: |3 C2 ?3 M- c2 P8 O) G1 P
, m/ N. B t5 |" b6 I2 g日期数据相减,得到两个日期之间的天数差。# r6 R" R/ R. v
不足一天用小数表示。
/ v2 e A" L4 r4 @$ ^/ Q3 Z% c5 K
0 J) i5 z) j Hselect ename, hiredate, ! b# m0 u) K, W3 ~1 v' ^3 G" \
round(sysdate - hiredate) days
* F+ } g! {, M) k4 r; b& Qfrom emp;
" R# F' u# ^, c6 B. V2 Q0 T
$ C- Q8 G$ P; y6 @4.计算员工入职多少个月?用整数表示。
2 Z8 J( ~( n1 _4 Bselect ename, hiredate,' q b; Y6 r; ? G" Q/ q* P. k
months_between(sysdate, hiredate) months
, R3 o6 t4 J( U/ _+ t9 @from emp_ning;, p' l$ `) x- ^- z u
" S1 V6 M. k0 u0 lselect ename, hiredate,
5 t& m# f& }! y7 X, i% ^round(months_between(sysdate, hiredate)) months. B# D+ H7 y0 P0 S3 A0 q( z
from emp_ning;, [) u, z, n/ O* {( j9 R+ b- f
2 Y3 U% i& v; n
f3(f2(f1(p1,p2),p3),p4) : 函数的嵌套
+ V" X$ d9 E D. E
3 q( J+ _8 I* q2 j. i& k* }% c U5.计算员工的年终奖金
; e3 T" I1 B& Hbonus不是null,发bonus的数字。
2 [6 J" Z: D, u2 ubonus是null,发salary * 0.5.2 C2 J: N1 f' A& f! e4 v
salary还是null, 100.
. l/ [, H- h# N- g- u* q' S# ^; q* z+ Z
public double calculate(double bonus, ) ~& n9 i; A, ^
double salary,
' k/ V" ]/ u; I# z double comm){. Q7 c! M- y0 m' p& Q! y3 N4 T
if (bonus != null) return bonus;/ v, V+ c W* l/ C. b
if (salary != null) return salary * 0.5;
+ Q' [1 }3 J. V) g# I return comm; % _1 K0 g8 Q& h" p/ K5 H8 m/ e s( q
}
9 L( p% l: U: [* k1 ^/ _--返回参数列表中第一个非空数据6 Z5 r6 N$ L5 g7 C/ _
--最后一个参数通常是常量。0 O- m: ^$ f: M* @$ M& o/ [
select ename, bonus, salary,
7 A4 R- M O6 A2 E2 X( ~9 w9 Kcoalesce(bonus, salary*0.5, 100) bonus5 S. A' M) N+ z
from emp_ning;) Z7 R) @1 @9 W* {3 ]7 w( o
/ y; N' h. X! b3 z! U) U9 }3 N9 p6 o6.根据员工的职位,计算加薪后的薪水数据:
# {7 [* L9 D& [Analyst: 10%
/ M; V' |. E* ?' k5 DProgrammer: 5%: P9 ]: ~+ g3 d- d: b
clerk: 2%
5 y) {( ~8 L& A. ?其他职位:不变。& D& d" e$ W' G4 y
V( Z5 R7 ^) ^! H3 e D
case语句:6 q+ X1 R1 F _6 V/ ?
select ename, salary, job,
( R& S) _, e1 M: _' F2 S6 Ecase job when 'Analyst' then salary * 1.1. b$ h9 X9 }% H2 U
when 'Programmer' then salary * 1.05
: Q: j( ^, \7 {3 x+ ^) Q. S. m when 'clerk' then salary * 1.02
$ N6 p' K9 L8 u0 Aelse salary
) o) E1 h$ p, b0 V* a* eend new_salary
2 z9 S0 ]' q6 ufrom emp_ning;9 Z& }4 | M- ~" R+ ^% X
' ~6 V, s [, A3 o; b. [9 [1 B" M
select ename, salary, job,7 @; z8 G2 U$ p0 v( k- b: I% \
decode(job, 'Analyst', salary * 1.1,0 g$ S! b% F2 \: m9 V) K9 l" ?
'Programmer', salary * 1.05,
& g5 D1 T4 F6 T# T 'clerk', salary * 1.02,, }1 p- D+ k% U* m/ Y+ w
salary) new_salary: }) X8 p' t v T3 ]* [
from emp_ning;
+ z0 L0 a E1 H3 p4 S
: c: K4 G5 ?' h9 V S6 X& u7.薪水由低到高排序
$ o5 `7 R3 J1 Q! _" t& u) uselect ename, salary from emp_ning
2 Z1 k0 d3 m" }3 g1 }! qorder by salary;0 q3 u( {, W' g% E/ U0 a; h$ \( ?
6 M( I# a# x7 C: E- v
select ename, salary from emp_ning
$ O% `+ ?5 n# zorder by salary desc; --倒序排列 descend4 X4 l2 H% s: |
/ P3 e: q' Z; q6 X; G4 udesc emp_ning; --查看表结构 describe' U9 G5 U, G/ J8 U
. u4 Y# O4 X" t# W4 a8.按入职时间排序,入职时间越早排在前面。
H1 @ E+ F* b4 |+ O! a% u! Fselect ename, hiredate
0 K- U- z! v$ h1 Dfrom emp_ning# }7 i, h0 N$ C, I1 A/ c
order by hiredate;
2 Q0 P5 L4 w# q, `3 K& s- Q) F7 w s3 ^5 Q# a
9.按部门排序,同一部门按薪水由高到低排序 X) h6 G+ d6 h0 a9 P7 P
select ename, deptno, salary
( M$ w# N1 ~& t- Jfrom emp_ning5 {3 E- v- R1 W2 b1 ?0 P$ W
order by deptno, salary desc;
2 K5 T a, Q# e9 x5 z2 L5 V- Y/ L3 s1 F
10.员工表中有多少条记录?9 ~8 N' z0 F& j8 c, T7 ~/ U
select count(*) from emp_ning;2 T6 s/ w7 E6 g$ H; J
+ t- F( `2 B, i" j( m! H+ z$ |( Fopenlab帐户下有多少个表?" W* l' }, |4 n' F( B# y9 d2 o
select count(*) from user_tables;
2 x/ ?% B, H! P: X( Y+ W
f; }5 E9 c( H+ Wopenlab帐户下有多少个名字中包含emp的表?. _8 a, L4 A9 z$ J
select count(*) from user_tables
! u; ]$ W4 A/ y) c5 dwhere table_name like '%emp%';
; V9 `0 q+ g, V- ~7 U
6 _; {& R I* N N8 U--表名默认大写
* t# V; G- q2 A) L0 mselect count(*) from user_tables( J, a- X2 E. b$ ~7 M7 c. X& N2 D! K
where table_name like '%EMP%';
/ |" S8 k$ X( j2 B; h; Y. J
9 \9 m r( P& G& l& }2 h" A1 Q--入职时间不是null的数据总数。
+ ~6 e3 I0 f' I) e--count函数忽略空值。
1 z! e5 n1 T/ y; v: x- kselect count(hiredate) from emp_ning;; V4 q; j5 ^! B. h3 O* _2 T
e$ s o% }# H8 T& _2 ~
11.计算员工的平均薪水和薪水总和是多少?
" w; k) R8 J! |6 W* w. xselect avg(salary) avg_sal, ; P1 G/ ?* j# h
sum(salary) sum_sal% |7 L M" u3 l1 a# G
from emp_ning;
- T m+ h: D3 G( X5 @4 n# x4 J6 u& l- ^- Y1 i2 u, l& ]
avg(salary) = sum(salary) / count(salary) 3 d% P) A) ^# J$ ?/ h
68500 / 10 = 6850
0 w+ @% ^; {( y--纠正逻辑上的错误* O7 @3 m1 `5 S4 J
select sum(salary)/count(*) avg_sal,
4 b; T# f# x* p( y( ~4 v$ I1 \ sum(salary) sum_sal3 i$ a3 L+ T9 E! G5 n6 P! D7 b
from emp_ning;% h: q5 ]( d, K# R* b
% z; `1 @2 l8 M+ ~6 |0 A: cselect avg(nvl(salary,0)) avg_sal,, r a/ p2 A0 f R- _# h+ V' E
sum(salary) sum_sal9 ~* T$ G* B. w3 g% l L
from emp_ning;
+ z3 v0 K0 n! d# b! K# F! H
- G+ ?% N" p! H p12.计算员工的最高薪水和最低薪水
* Z7 N3 V" F3 a# Aselect max(salary) max_sal,! f! K' n! c' f. Y
min(salary) min_sal
! Y e8 `: p0 k" x+ ifrom emp_ning;
; T* h7 K9 Y) A1 L6 R4 {! ?- @5 ?
9 D' v+ G# S% _7 X组函数:count / avg / sum / max / min 忽略空值. ~. Q( |/ [- R5 q& ]$ F
其中:avg / sum 针对数字的操作。
% M, P* n6 r6 |( z max / min 对所有数据类型都可以操作。1 F+ R' C7 Q* V) f
0 {$ F/ u: @0 T5 ?4 }1 [
13.计算最早和最晚的员工入职时间。
5 I. s. U2 c0 t, ~1 }select max(hiredate) max_hiredate,
" f) l+ i2 x8 A" k0 d5 R6 W min(hiredate) min_hiredate- q) ~; g; a1 c& J B0 r
from emp_ning;, o! p0 ~8 g2 Y0 Q: {3 ]
" _, n, W' L3 n. o7 m8 i7 _
14.按部门计算每个部门的最高和最低薪水分别是多少?7 X/ \7 R* `; O* C% z6 d
格式如下:4 C. G& B X; { q2 R
10 4500 30009 Y1 W! x; q: V) H( w
20 15000 8000. P( W. |$ @' C( t/ c
30 10000 5000
- [( C! m) B: _/ `" t' @8 V8 G2 ]/ y, v9 x" r; \
--group by 列名 : 表示按哪个列分组0 e4 t7 U: X, h4 l3 Z: B" @
select deptno, max(salary) max_s, min(salary) min_s
$ X- O/ z) c7 O% I1 `4 ?from emp_ning
, `% U8 D0 B4 F" I* xgroup by deptno;
/ C- H% J; l0 V4 C% X
9 n& O( M$ H, S$ e15.计算每个部门的薪水总和和平均薪水?0 t. e$ \/ S2 L: D$ p F( v
select deptno, sum(salary) sum_s,, [) c7 u. [2 \
avg(nvl(salary,0)) avg_s
- c$ A# f6 E. n! i2 ~from emp_ning
- c% C3 w3 ^ O, Agroup by deptno;
! _2 o! T+ [: a# c7 D, C5 b# A& c9 P* J& Y
16.每个部门的统计信息:格式如下:
. o! W9 ?( o' E F5 zdeptno max_s min_s sum_s avg_s emp_num
8 X7 m8 _( s. b* W0 U1 Z10 10000 5000 23000 6789 3; V" G5 W) W$ ~4 }# v! n* Q
..... {+ ]6 B5 A/ s1 x3 i
select deptno, max(salary) max_s,8 i% P9 y8 Q3 V/ ]! f8 T
min(salary) min_s,
1 e. K6 M$ {) N sum(salary) sum_s,
# c* [* n% e$ q3 _, q- S1 z avg(nvl(salary,0)) avg_s,
* ^) {/ ~1 d2 w4 j9 m% q4 X, D; O8 v count(*) emp_num }+ m5 K; C8 D/ F' e! B
from emp_ning
1 ]+ P$ h; d! \. Kgroup by deptno;" _0 v7 t& V+ d7 p" E# |
3 { n' z, l& x2 h
select后出现的列,凡是没有被组函数处理的列,必须' t9 e0 b! m' @$ }5 t$ V* w* i
出现在group by 短语中。
) m$ t# N- D5 ^/ ]! |6 P w* `5 C F0 T6 z* N4 j1 \
按职位分组,每个职位的最高、最低薪水和人数?
# A% R& O! r* n2 N7 i5 O' j `select job, max(salary) max_s,8 ~+ d7 _0 ^. J; O/ _7 a( x
min(salary) min_s,6 y- S5 G7 m1 ]. {, @+ s2 Q
count(*) emp_num# L" ^3 I" @. Y
from emp_ning
8 d/ ~/ v7 h$ m* [0 C* s: T. Agroup by job n. x6 W# b9 G2 ?4 _" j" I
order by emp_num;+ K6 o3 B: t* e* t
17.平均薪水大于5000元的部门数据?, _- ?1 I) n9 m
select deptno, avg(nvl(salary,0)) avg_s; [5 y) [' G0 J5 p6 M/ }
from emp_ning
4 T+ m0 {* x9 R) v8 d- Kwhere deptno is not null. Q z/ N2 M: \4 J5 M
group by deptno
9 K5 a: }2 f' c" Xhaving avg(nvl(salary,0)) > 5000;
: U+ d) q' c1 y p
: e9 E7 s. q7 I) v7 h% M- W18.薪水总和大于20000元的部门数据?9 \ r# c" R# Y8 }3 | R) n
select deptno, sum(salary) sum_s
. V% ]% N" w+ W8 m/ ]6 |from emp_ning# \3 P" f' t& c: t0 U
where deptno is not null7 y4 v. _: {# F Q- O
group by deptno
7 C. a3 t% Z% [+ s: e% o6 u: C* e3 shaving sum(salary) > 20000;
1 t, t9 |8 x6 g, Q" h( _( a6 p
, q* L2 V9 A* h5 ]& ~19.哪些职位的人数超过2个人?" e5 a0 m. P) F" u8 P7 u
select job, count(*) emp_num
5 \' n1 a4 a+ j# Ifrom emp_ning) N2 g/ {( a! l) i" G: o6 d. }
where job is not null
- ]4 u3 l9 c/ [group by job
8 w% u# C. p- J, `8 Y6 @# X* ahaving count(*) > 2
; Y* e# f, ?& w; ?$ v" t3 Y) Lorder by emp_num;1 W0 l) N r1 V' Y6 ~" \
1 |" K4 T& K" m! o# } |
|