|
该用户从未签到
|
SQL*Plus
+ |* c$ i% x: S. H5 nsqlplus.exe
3 l3 Z5 f2 K2 `. P2 S$ g6 R9 ~6 A, i8 ?2 R. U( V+ n
1)数据定义语言:create / drop / alter / truncate
8 x2 B8 e% \- }- X% Q# }对数据结构起作用。
, U5 Q" o. Q# R% E ********5 o" }) u- P: ?0 o v3 N) _
Data Difinition Language: DDL
3 T( M7 z U* l! O: f% y2)数据操纵语言:insert / update / delete" x' a1 [0 z( i E" G. q" d; T# o& _
对数据起作用8 b% l* A9 a7 V- D$ B0 ]
****; s& D( J( f" m' D, @
Data Manipulation Language: DML4 R! |- M) }- h; z0 {
3)数据查询语言:select; [1 {. k( N- I
****' s. G4 n$ ~% R8 p$ Y3 E/ H
Data Query Language: DQL7 d( C: \) t% a/ ?
4)事务控制语句:commit / rollback
7 K3 K" |1 I" a+ \ a& p对DML操作确认
6 M0 G7 }2 f0 o) c: c2 p
: A3 W1 H$ c$ g d5 I4 j6 x一、学习单表查询语句。4 `* y2 }4 ^" J
1.计算金额的四舍五入?
: Z) Y$ a8 d# N. w3 t9 I# L1 oselect ename, salary * 0.1234567 s1,
( a4 T, \, |- h: D: A4 n; l7 iround(salary * 0.1234567, 2) s2, ?! Y! Q! V: g1 f% o4 A% @( o* `
round(salary * 0.1234567) s3,9 n: @3 H" z6 a' G* \; }; P
trunc(salary * 0.1234567, 2) s4- X. G0 p9 V t. Q4 k2 p: E
from emp_ning;
$ ~; R% G( L, ~- J$ u" A
1 _8 f4 n. _8 e+ {; p' N$ Zround(数字, 小数点后的位数):四舍五入0 T4 s5 [; d* O/ a" o. T4 T
如果没有第二个参数,默认是0.5 w% c% _2 n, R+ Q9 D- l' i. G
' {; |2 V) d$ r, E9 b
trunc(数字,小数点后的位数):截取
b" [$ k- R( \/ Q2 s# D如果没有第二个参数,默认是0.* n7 U/ \" W! ` ?! o' q$ [* l
6 ]( P2 v- U. @" |3 P* T2.Oracle中的日期& B: B+ Q& V7 Z; x
1)取系统时间的函数:sysdate" @( i0 z. k, P3 k; W' P4 I
select sysdate from dual;
9 b/ Z/ ]. A) O. V
P" w0 f$ Q( Y& X) O( n2)把时间数据按指定格式输出6 N- `. y3 F# H" q
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
: `; v a( V" Dfrom dual; u0 F: D \, M2 ]( A
" Y3 w; d8 ?. [# C; G$ B
select to_char(sysdate, 'year month dd day dy')8 h! w7 Y6 y. M9 _9 k
from dual;0 w' v1 P/ n( ]$ i$ |
6 H, Q* @$ @9 l% P
to_char(日期数据,格式)5 Q6 q$ i: D; ^4 a5 X
* ~: L+ a" j) b# L! |! i" ~public String to_char(Date d, String style){! }0 _0 ~& g1 N) Q6 W, x
//SimpleDateFormat把d按照style的格式转变为字符串9 g' M6 B" P. J
return 字符串;0 R1 G; ?7 a* r1 E$ N9 P* {+ y
} 3 e/ V# r! Q l$ W
& ~2 W% i# Z& K1 _select to_char(sysdate, 'yyyy/mm/dd')
3 J, M& s! }; y2 F. x2 G8 Mfrom dual;
( f3 s( l K7 m3 k' j! ^3 o ^& H: Q5 Y) j3 C
yyyy: 四位数字年 2011
6 s3 _2 L0 ^' byear:全拼的年 twenty eleven6 E8 B1 w' A& u5 A
month: 全拼的月 november 中文:11月
, x& V2 P/ {0 c. V" ]mm: 两位数字月 11- w+ {5 x( g; X( }/ S
mon:简拼的月 nov- Q/ J7 L' J$ s t7 _' Z% C
dd:两位数字日0 x1 P3 T* s; S/ p# g
day:全拼的星期 tuesday
. Y/ u: x- C5 X7 @8 F/ Wdy: 简拼的星期 tue
9 U' W6 [( t& G3 Pam: 上午/下午 am/pm3 v1 k% ? \7 b) U9 ^9 A$ N
& A0 U" _) Z9 C" `sqlplus中日期的默认格式是:DD-MON-RR9 E5 S9 ^! ] k# V" g' @0 E, |
现在的时间是2011年
: C- j0 U% U" d/ G& f YY RR
3 j3 o& X( M; {* _05年 2005 20058 V C; G( p# y$ N' }- c
98年 2098 1998. @, B5 Y$ ^; w( i" Y8 _4 _' O
( c/ |; F5 u6 t$ F) r假设现在的时间是1998年5 |6 V: x% |6 G7 u) i
05年 1905 2005
7 E1 } [' h+ {/ D95年 1995 1995
% F/ i( r. N# b( k7 d: Q4 f0 w ^) u7 T Z) z2 @9 F" m
insert into emp_ning(empno, ename, hiredate)' V4 p* J. M# e/ t- ^& ~
values(1012, 'amy', sysdate);- a. Z$ N% K* q7 `$ x( u1 o' W
--实际入职时间是2011-10-104 [* b9 r7 b% {/ f9 m' Y
insert into emp_ning(empno, ename, hiredate)
, @! G, l2 Z" }+ B3 C3 G0 e$ H8 O0 tvalues(1012, 'amy', '10-OCT-11');
" Z& l; ^, i! i1 j& T }7 e R% h; H1 B+ w1 G" ]/ ^
insert into emp_ning(empno, ename, hiredate)( n6 _. E( v5 U; Z/ {
values(1012, 'amy', 0 i4 z2 j5 A& [5 M. |# p
to_date('2011-10-10','yyyy-mm-dd'));
7 P2 F1 P6 D N: n' ], Z4 A! e- |
& m$ w* L$ a k% z8 J2 C+ V- A- ^显示员工姓名和入职时间,显示格式为:( {2 [5 Z. s" q9 S+ D0 D
amy 2011-10-102 z3 K! B' W- G7 M
8 {9 y% ~* p' v) m( J0 z# Y to_date
( {) p8 s3 T* ?6 U字符串 ---------> 日期
2 d" }* g p( t' i3 N: F, p" U! t <---------
6 x, x, U! |/ D+ w8 k) j3 [# s to_char
: [, W$ q% l& P, u- z( R" T1 A
: o0 _; I Y. p4 f5 L4 V3.计算员工入职多少天?/ i u4 e) ?( n z' a, k! W7 ]/ a
select ename, hiredate, (sysdate - hiredate) days
; C# J% ^: ^8 y! F( Nfrom emp;
2 A: ~& r# W: K9 n z7 o7 n$ Q! G& Z* [' L( \1 {- n
日期数据相减,得到两个日期之间的天数差。2 I: V4 m+ ]+ N, j
不足一天用小数表示。$ v: x* h+ Y) c# w
+ L/ k" X. v) n1 m
select ename, hiredate, 0 J6 s$ \' Z& b' F
round(sysdate - hiredate) days6 x9 t2 _8 }9 R) U. K( ]
from emp;- i4 R8 t1 H9 w6 B# [. A) J
( ^% G* S% p# d7 E
4.计算员工入职多少个月?用整数表示。1 I' a6 X, |1 t( \- ~
select ename, hiredate,3 h; p. }+ i; w5 X- w' S0 g' u
months_between(sysdate, hiredate) months& `; J9 m$ G- o1 l, i0 n
from emp_ning;
! w! {. E x% f% K- l9 T- o! U* W6 r+ P% ^' a- M5 g
select ename, hiredate," a9 C# g: z6 N+ P9 h* d, `
round(months_between(sysdate, hiredate)) months
_$ Y* ]- F& `0 Y+ @from emp_ning;
1 V+ ^! A2 ^4 P5 p8 d3 w
% b/ N( O/ U- M. |" mf3(f2(f1(p1,p2),p3),p4) : 函数的嵌套% U" F' w8 U9 |- W
4 Z! |' V: \% P5.计算员工的年终奖金
' y+ v& @0 ~* { N+ P- Obonus不是null,发bonus的数字。
: S0 v! L. s! Q9 q8 f G7 Fbonus是null,发salary * 0.5.( ]: z, c. H' s% h' x
salary还是null, 100.
. B+ B8 _7 N! A* Q: J3 D! B6 G
) e1 i& |3 T9 F4 R: wpublic double calculate(double bonus, & u7 Z* E1 M3 N: R* S& r
double salary,: E h; o9 ?2 q7 C
double comm){
- ?9 Y1 C1 B- p if (bonus != null) return bonus;9 I# p) M0 k- D5 n- j
if (salary != null) return salary * 0.5;
9 R A0 M" O- l( k return comm; & g8 G+ {; |3 }# H4 ~
}. Q5 G: ~7 V, z8 v: [* ?4 u5 d
--返回参数列表中第一个非空数据
& K7 P* F! T) f1 i6 k$ S--最后一个参数通常是常量。3 R& a3 K& |. P
select ename, bonus, salary,
4 V# ^* v r! [; a7 Ocoalesce(bonus, salary*0.5, 100) bonus6 U9 k/ b* ~" v9 [
from emp_ning;
; a) W& M% K! C. D$ `; ~- z0 V4 e5 a$ w8 ^% B5 o
6.根据员工的职位,计算加薪后的薪水数据:/ x! q8 x/ J* v6 g1 `7 X) q" }4 M' d& w
Analyst: 10%/ t% z+ L2 i( d# f0 I9 Q
Programmer: 5%
+ n, l% ]- M1 Yclerk: 2%; L( O# R4 s# ^: p5 ?. f4 W' q
其他职位:不变。* [- d$ O/ |- C O' N
# x" {% m. P) D) I, r I
case语句:/ M/ D* @) [' Q6 q' X0 K
select ename, salary, job,
: w& C5 R% c0 w7 }case job when 'Analyst' then salary * 1.1
4 v' y# O y! m( A" T when 'Programmer' then salary * 1.05
, O+ l% g! C9 g when 'clerk' then salary * 1.026 ?1 f3 r# A7 _
else salary
0 [: I7 m( [7 k5 J8 z2 x0 cend new_salary) H: r, S% d# N% Z& ~6 P
from emp_ning;
5 ]$ J) h. Z) I8 j# d. u
* @0 h# h% c3 L- Iselect ename, salary, job,
8 v- q% l1 x4 o) e( Qdecode(job, 'Analyst', salary * 1.1,. O( f* x# |" G& u
'Programmer', salary * 1.05,& b5 R5 E) Z6 C4 Q, N* f
'clerk', salary * 1.02,, L$ k$ {+ q, ?1 |
salary) new_salary
# B. S: h9 e6 R2 ?7 Ffrom emp_ning;, g6 V* W& ]/ t: |, T8 o0 S
. I1 _+ A4 C/ k- n* o7.薪水由低到高排序* J7 ?( @1 p) d; Y0 m
select ename, salary from emp_ning! Z( s. L4 Y' ~/ d
order by salary;5 o9 k4 T O! n* g0 ]
+ k4 E+ `% o2 C: I2 r) q+ @7 [% Zselect ename, salary from emp_ning) k$ G. _1 t0 @5 ]+ X% u
order by salary desc; --倒序排列 descend
. e7 C/ n) i* g6 C- M0 E/ K9 k9 ?1 V3 l8 Z8 {' g. b" d
desc emp_ning; --查看表结构 describe
# F ^" }3 x- d- W7 ~3 @7 R* d# q" J6 | h. K1 x
8.按入职时间排序,入职时间越早排在前面。9 [; \; ?' |3 h4 k2 I5 p" S
select ename, hiredate
: `9 ]* X# n( d. [) L$ q1 V, i! Qfrom emp_ning7 i3 p# D: q9 c( W2 Y; ^* M
order by hiredate;
' G4 a6 B7 }" o" H/ n" H7 V9 J% }4 J. A5 |
9.按部门排序,同一部门按薪水由高到低排序% j/ j$ |$ Q7 l$ H( I
select ename, deptno, salary: l h( C, \+ Q" b
from emp_ning1 b* |! X& }) c1 M
order by deptno, salary desc;
% n, J, r; }) i4 b( E# L
4 m; W7 l8 M8 ]10.员工表中有多少条记录?. W8 j! v) Z! b l$ l" X8 I
select count(*) from emp_ning;% }! b! _) N8 M2 w: x6 u
6 ~$ Y4 \. L* [. r/ A5 jopenlab帐户下有多少个表?: ]% ]; z- |: G& A( F# n
select count(*) from user_tables;
" Q! q! `5 H, t: ]' G8 H7 X, V+ c0 b: I# E( ~+ x/ t
openlab帐户下有多少个名字中包含emp的表?
7 h8 i/ G a, pselect count(*) from user_tables
; o( H2 `0 p: a0 L! \( ^" w$ _) f# Fwhere table_name like '%emp%';
: O# f6 A; O$ y: ?6 V9 r' M* S/ i0 r. a
--表名默认大写% K, G* `- ^2 _" d
select count(*) from user_tables
?+ Q0 W% m! M- P$ J% wwhere table_name like '%EMP%';( o T% Z& |, k6 j, q# f, ^
: N3 C, R1 N7 ^& l3 s. m
--入职时间不是null的数据总数。
) F* c W. `/ \; _0 N6 I. C--count函数忽略空值。6 L6 t' k% ?8 F; |
select count(hiredate) from emp_ning;
0 ]. B9 C; j+ l$ \; w/ d! \
2 B. f" ~: S/ n- P, R. ^11.计算员工的平均薪水和薪水总和是多少?
* u' l9 u- V7 R3 O- i! a! [1 Wselect avg(salary) avg_sal, 3 R7 t* r+ a8 y' _+ m
sum(salary) sum_sal
' _! u' G1 B C$ T% p$ J& {from emp_ning;
# p3 _+ P5 K6 f; B s0 C) E5 j) N/ P) C; C
avg(salary) = sum(salary) / count(salary)
}! H8 p1 e2 l6 T9 e. } 68500 / 10 = 68502 e2 C0 v/ s T) o9 N
--纠正逻辑上的错误
" a! m. \9 P' S( R1 o4 uselect sum(salary)/count(*) avg_sal,
8 x+ J# k& v9 {* B) X sum(salary) sum_sal1 z" }0 v( z- U
from emp_ning;5 C, }' G* b" Z% `# h
0 u9 p" s) C5 ]4 G2 y) }
select avg(nvl(salary,0)) avg_sal,
- c% Y. y. l5 [9 w* K( S2 d, C sum(salary) sum_sal: M( k' Y& ]( A" z
from emp_ning;
: t& T0 Z ]/ |
' E+ `6 Z: k9 v7 f; e" C' }12.计算员工的最高薪水和最低薪水- @1 A& F+ d3 z
select max(salary) max_sal,
0 D5 t4 o! v, P8 K3 z7 I/ a min(salary) min_sal
- R( Q2 h/ o) h) x3 dfrom emp_ning;
& J, ]: R. @: \6 Z# T$ j0 f: v
" W2 K! U7 x+ @! \8 A组函数:count / avg / sum / max / min 忽略空值
) W5 U, T6 E7 L9 A8 [其中:avg / sum 针对数字的操作。/ j. X/ X/ B& f% C) i* K
max / min 对所有数据类型都可以操作。& ^" _8 `7 L; Y+ M& g0 R
# C/ i! p' y2 [9 K3 I0 {
13.计算最早和最晚的员工入职时间。( c/ I# `% G0 I( ]* ?1 k! k+ y5 J8 X/ j
select max(hiredate) max_hiredate,
: v2 l& d- E+ A7 k8 j( T min(hiredate) min_hiredate! S" P/ E3 r9 v% Z
from emp_ning;' ^( H% j' Y2 ^ k; D+ Q# E( M
, l. m: b: v: ^3 f( ?
14.按部门计算每个部门的最高和最低薪水分别是多少?
. G5 {* `5 y9 Y+ V格式如下:( L& K5 G" C0 l2 x S
10 4500 3000* C' U1 M9 J+ o8 g% N7 v3 Q6 Q
20 15000 80006 K# z) h& }% y* {
30 10000 50000 G7 ~( J. Y' }7 {2 p, {+ F
4 s& R" t g. D- W& N; k \0 w
--group by 列名 : 表示按哪个列分组
3 s# O$ T0 ^% K5 e; ?1 |: xselect deptno, max(salary) max_s, min(salary) min_s# U( K3 S. a7 r; ~
from emp_ning9 ?. X9 M0 h) S# S
group by deptno;
( z' C9 O; t, K
$ a6 L( m" z9 r- g4 {: R15.计算每个部门的薪水总和和平均薪水?
. R0 P- j% _ [4 B. b2 @select deptno, sum(salary) sum_s, A! N' F2 w6 s" v& R8 p! ~4 z& A
avg(nvl(salary,0)) avg_s
: u! |+ }! k! A: B# C; f* Xfrom emp_ning
$ w# k" Y7 j+ F4 ], ]% g1 R5 G5 Egroup by deptno;& x3 z. k( ~! u4 A3 M$ Y/ a
6 D& g8 Z: W x2 Y$ h2 S9 w h16.每个部门的统计信息:格式如下:
) K+ ?. m0 T V' v: B# K. s) _deptno max_s min_s sum_s avg_s emp_num3 d3 y* L8 L8 i$ S& M- x
10 10000 5000 23000 6789 3/ G3 q g8 C1 }2 l) E4 z
...., `- j% B7 _* c% K5 O8 |# A5 ]
select deptno, max(salary) max_s," n' R1 T; J; s/ R [
min(salary) min_s,
S5 O/ H! s7 X9 A sum(salary) sum_s,6 D# ~% ~$ E8 p: U! L
avg(nvl(salary,0)) avg_s,) h& N: W( @% @( N( v6 Q7 y: d! C
count(*) emp_num1 D) O2 m. |0 V' m$ d; V8 L
from emp_ning
% b' |1 Y; b6 y( v! y6 L1 \9 m Sgroup by deptno;
. \) V7 D e& F" N2 a! L! e2 o6 F2 b
$ p& ?' e# ]9 Bselect后出现的列,凡是没有被组函数处理的列,必须
3 U* N+ ?. Q' i6 X! |' s出现在group by 短语中。1 c. o- D+ i6 M+ A2 n( g* p
6 J; u7 ]8 m( V/ i, r: M
按职位分组,每个职位的最高、最低薪水和人数?
9 U( X1 j; G1 pselect job, max(salary) max_s,* m1 M- h/ i7 U4 ]2 i% g( z
min(salary) min_s, {5 s d( k, Q
count(*) emp_num3 b& b" q: A, W0 x5 \
from emp_ning! W( ^0 _$ ]) ]
group by job; J+ k' `: U* y4 j/ C& o
order by emp_num;/ n. Q/ P, ^* y2 {: }7 z/ x2 U
17.平均薪水大于5000元的部门数据?
5 P3 A4 h3 f$ U8 Y, \5 f3 B' hselect deptno, avg(nvl(salary,0)) avg_s
0 i4 s1 d: D) ]7 wfrom emp_ning0 s. E+ X1 \+ y& L6 b: S
where deptno is not null
4 R/ e3 t8 [: p( D* _! Ogroup by deptno. V$ z* p& x8 p9 A8 V
having avg(nvl(salary,0)) > 5000;
% w: d0 l) c, y. K9 Q% P9 T4 S
( W1 `( q* s: p4 C+ M18.薪水总和大于20000元的部门数据?
4 a6 T! o% x+ ]8 pselect deptno, sum(salary) sum_s
v {. p' i i( l' o+ rfrom emp_ning
; R8 Y# m. a$ A* o7 m3 ?where deptno is not null" K" ?1 c& l# q) S
group by deptno" u& v! L, N$ X
having sum(salary) > 20000;
3 m1 S8 d" Q4 d: k- |& L' [
. @, x) v/ B# a& x- u6 U0 `. \19.哪些职位的人数超过2个人?; Q- j! p6 Z9 r" H# o6 v5 J
select job, count(*) emp_num) ?: v s. U2 Y m. M: a) O
from emp_ning
/ D% L5 V [4 I5 ]7 X8 S/ D$ H& y" Owhere job is not null( P$ a# A; Z2 h0 `& h) Q/ P1 d
group by job, Z C; x9 z' G4 ]! r, \4 s
having count(*) > 28 V* _) [* ]' Y6 u% a& ^( }
order by emp_num;' {- \# T2 j' Q0 g2 |% I( ~( q$ w
5 ^2 X0 e P! y* P$ r2 G
|
|