|
该用户从未签到
|
SQL*Plus ' B4 G( Z, ], O5 k i& T
sqlplus.exe }1 F! G( f1 ?
M, ~4 l9 ]) v9 U. L& S
1)数据定义语言:create / drop / alter / truncate
; H w3 r1 S, J% ]" i7 i H! b& f: B" k2 Q对数据结构起作用。
: B# @; v1 `% {8 H# L2 N' v ********% H( q: w8 @( O8 x9 U/ y% u, ~
Data Difinition Language: DDL4 A T a" b/ i9 Z( t
2)数据操纵语言:insert / update / delete
' C' K) P7 P; O% ]对数据起作用; |2 u! w5 K1 q1 M3 [) h! u( U
****
4 e% {) b8 d) ]9 uData Manipulation Language: DML
; h+ e+ a: s$ v. Z" y% o, @. q3)数据查询语言:select
2 x, w% t' e% D% c ***** F3 R% E3 i$ b, ]' K f
Data Query Language: DQL5 R7 v$ Z7 h4 L. h/ V, I
4)事务控制语句:commit / rollback
" E! H. N& X2 ^9 R1 g$ W5 N对DML操作确认: K2 ~5 n! L8 O4 y" F
- a2 j- f2 v" K1 {5 b* O一、学习单表查询语句。0 F3 q% _5 a5 T
1.计算金额的四舍五入?( f% A% E7 X0 m
select ename, salary * 0.1234567 s1,
" I: O, Z2 {1 uround(salary * 0.1234567, 2) s2,
! \( L8 U' w* E) S4 Y. Tround(salary * 0.1234567) s3,$ F7 y- u$ |* m* b% G, J
trunc(salary * 0.1234567, 2) s46 M f; Q0 w, o; d7 c9 j3 E
from emp_ning;
, g- n0 B, @4 b
! [% \, h; Y/ i5 J1 d+ }round(数字, 小数点后的位数):四舍五入
0 ~9 F; o$ _9 C( T6 {如果没有第二个参数,默认是0.
! R( S! H' D1 G! a% k6 b
: d/ p8 i, E. \( utrunc(数字,小数点后的位数):截取
" G1 x5 f( ?4 {* U6 k1 F9 F如果没有第二个参数,默认是0.
5 I. O( b& `. Y$ X' w1 o7 e4 Z3 C0 g) g0 t5 c4 x l* f0 I
2.Oracle中的日期
& C7 e4 i$ x! E* m% U) ?9 l1)取系统时间的函数:sysdate
2 V0 V& `0 s; {" W4 Zselect sysdate from dual;% f$ W, l4 K( X3 L. Q. F
* m1 `5 o: k5 Y2 I* R; ~2)把时间数据按指定格式输出
, F1 W* l9 ]1 p1 ?" B4 m# b2 v) {4 ?& vselect to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
1 l5 Q7 s1 v! N6 o1 A2 f$ Afrom dual;
* g- x# ~, n& ?8 r
: E2 ]( ?2 y) ?; i5 Cselect to_char(sysdate, 'year month dd day dy')+ h0 m) ^9 ]4 C
from dual;
0 `/ F5 D! ~7 x, X4 U6 S: \# J% C: {1 ~1 r% Y! Q. |
to_char(日期数据,格式)
( t) [$ v4 U( n- P
- s0 q' P1 t1 [+ Qpublic String to_char(Date d, String style){
) {0 B& n: v. {& e8 {7 D, x //SimpleDateFormat把d按照style的格式转变为字符串
# `) `5 G/ Y& ] return 字符串;" u" J% d' A" k9 C2 C
}
9 [ V/ {: X0 R6 B) k* P r0 R5 N3 @# l |1 `1 T' n0 J8 ]) a8 C6 ^4 L
select to_char(sysdate, 'yyyy/mm/dd')# r8 @' c- g6 U
from dual;
9 p6 K' g# J; e' O- r6 u( @3 J% y) e- p! _- s
yyyy: 四位数字年 2011
7 z. ~# p2 n: |/ b# W6 V i; }year:全拼的年 twenty eleven5 I. D+ \% O0 L6 w3 j# X2 ]
month: 全拼的月 november 中文:11月3 n! Y: x( L7 o9 e1 S) U
mm: 两位数字月 119 Y+ `, T% J* ^4 m& l: M$ z! a4 m
mon:简拼的月 nov: `% C2 C7 m7 Y( d! }- G
dd:两位数字日+ j# j6 E6 z @* L
day:全拼的星期 tuesday3 u, A- x$ M4 d( E& [) v: a
dy: 简拼的星期 tue
. O) B& ~& Q; \, O! Oam: 上午/下午 am/pm0 _* o) d& X9 Z( F* p# ]' }8 y
# Y% Z8 a7 M* S: C
sqlplus中日期的默认格式是:DD-MON-RR
' z' P# E7 ^# l& v, u现在的时间是2011年: C; I8 n% M$ X
YY RR5 q6 ]/ m% O0 e1 J# p, ]8 }
05年 2005 2005
; F9 \0 }. t9 M, [98年 2098 1998/ c# p) V5 \* {% n" u9 Z: r
: \3 o Q1 D0 q1 j q9 g# E1 u假设现在的时间是1998年1 a J; z; e+ M0 Z( \7 p3 w+ J
05年 1905 2005
' B2 k% u* j! m9 v' {6 [3 g/ k95年 1995 1995
2 a' m5 K! g; {
8 u4 @. K! U. b; tinsert into emp_ning(empno, ename, hiredate)
' F- `( y8 ]8 E4 K3 O5 xvalues(1012, 'amy', sysdate);3 n; A8 j5 ]8 q" z4 Y7 X, _0 C
--实际入职时间是2011-10-10* J, {( d, R/ _- X) L8 G/ F
insert into emp_ning(empno, ename, hiredate): E7 e h8 ~8 i
values(1012, 'amy', '10-OCT-11');$ Q9 j* r* F. D, g" H5 |. h( D. C
3 v/ l, Z4 {. h! h4 X
insert into emp_ning(empno, ename, hiredate)
8 c( O8 J7 o4 B* F4 i" |values(1012, 'amy', : Z! |; e' ]) W% a) y' _+ L( J
to_date('2011-10-10','yyyy-mm-dd'));
' J' U7 _; G- [; F
* p W- X# f- ]" Q) g' W& n显示员工姓名和入职时间,显示格式为:
5 o8 T |9 J5 Q4 ^7 O% camy 2011-10-10- ]9 g$ ~' L5 j( q. h4 h
3 L- N7 Q- u1 I( h; h to_date
. o9 N1 S0 j) b" j/ U字符串 ---------> 日期
, x' I9 I1 M, v- R' C7 ]( d <---------
. s9 q( k0 Y; d6 S9 G9 \ to_char
8 y5 b. i3 _5 y Z# @2 N" z& m, ?1 ?) k# W( M% E3 K' b
3.计算员工入职多少天? O! E" z8 W0 }, l, l$ Y7 H O
select ename, hiredate, (sysdate - hiredate) days" d+ \6 l3 t, d, T9 @/ L
from emp;1 L7 T# I/ U$ L. @4 E1 k
& A, }7 f! ?8 I. l |. d
日期数据相减,得到两个日期之间的天数差。1 ^1 d2 Y) [. k* C' m4 ]% Q- b
不足一天用小数表示。7 x0 [4 U! R9 I; d# T
+ e; A+ J" `' q& cselect ename, hiredate, # `% n. Q1 ?5 g2 ?& U
round(sysdate - hiredate) days
/ `% n m7 M* Q+ ?4 ^# ^from emp;/ b7 w# G G/ ]1 f1 ?
l Y: T) m) W/ H. X2 A5 c
4.计算员工入职多少个月?用整数表示。1 X* [) J+ d4 T& M1 `. z! K
select ename, hiredate,. S3 T8 n$ h* Y+ F" V- ^8 ]( k/ o' b
months_between(sysdate, hiredate) months9 v5 L5 y5 j& P
from emp_ning;
$ @ Y! r4 R. i* A) P! ]" L9 I. N6 d7 |! }
select ename, hiredate,! u! k2 i' H; {0 [
round(months_between(sysdate, hiredate)) months
+ a0 L2 M& w+ n! @% R0 t; Rfrom emp_ning;
0 b4 C- p) P3 j2 a, c3 j# a F! a# w
f3(f2(f1(p1,p2),p3),p4) : 函数的嵌套6 h" N- q5 X, Y! I* ^/ O, g
; b* ]4 G/ e& \1 F1 m. @ q3 z
5.计算员工的年终奖金' C' c' F$ j; d/ x/ l
bonus不是null,发bonus的数字。
% L2 G: q+ [ W6 Sbonus是null,发salary * 0.5.6 v2 C9 [% T) X* k
salary还是null, 100.
+ G5 \ |# R& z' z" R# m; L* D- ~9 p+ [8 S3 V3 g& d- V
public double calculate(double bonus, 4 |: J5 H" V% D5 W+ { w
double salary,; _+ w3 A) ^8 ~' ?+ M
double comm){0 z( I- c9 S) M. o4 n! _
if (bonus != null) return bonus;
5 a2 T% g3 v: H. u if (salary != null) return salary * 0.5;, w# N2 f6 E# U. i
return comm;
, `5 V2 n' S2 R}
5 L2 c5 X; s* H$ d' _* y--返回参数列表中第一个非空数据
/ K; F* q6 `/ |3 y) k6 X! B& |! {--最后一个参数通常是常量。
# v% t. |+ J* v9 H4 @select ename, bonus, salary,
/ h, e, x" \5 X1 Ecoalesce(bonus, salary*0.5, 100) bonus. t" }8 [' R5 t: R0 o5 o! C
from emp_ning;6 w# t' r' C# r8 L. O& o/ g
6 k; u* t6 J' ~1 d+ S
6.根据员工的职位,计算加薪后的薪水数据:* `$ i; u$ r% N* N
Analyst: 10%
+ E: G$ k/ {4 d+ x: S9 WProgrammer: 5%" L2 v, y: w' ^5 V0 x
clerk: 2%' d! T2 F, Q3 B" I3 C& x5 h4 {+ z- V
其他职位:不变。
* f: u- T5 A7 b' o5 c. @/ B( }* `3 H7 w
case语句:
* P6 ^* L+ K3 ~- }" l6 `select ename, salary, job,
0 v* k4 A6 h' _" x8 U/ p9 \+ dcase job when 'Analyst' then salary * 1.1
5 b7 D' s& d0 t! M% {% ? when 'Programmer' then salary * 1.05
7 i: f$ ~* k0 H* s: ? when 'clerk' then salary * 1.02/ P' g* d( e2 B9 Y
else salary
2 U2 R+ l% k8 J# b! X! r9 Xend new_salary2 a4 I' s A( K' r$ d2 {8 b
from emp_ning;
1 R3 L, `6 s; s q* L; t% W
& d. d m- w9 `1 b( jselect ename, salary, job,1 M( [8 \6 Y7 O
decode(job, 'Analyst', salary * 1.1,( ^6 L. K, h' J* {
'Programmer', salary * 1.05,
0 p- b6 \4 l! w/ @2 ~0 R 'clerk', salary * 1.02,: i! m# A; ]* s& R; O2 ~6 L1 h
salary) new_salary, |* q1 O: p) G# p% M& o: ?$ B3 r
from emp_ning;% C$ s) p* W T6 B6 `0 P
/ e' ^/ A% I( R! Z5 f/ m8 T# b7.薪水由低到高排序
4 C5 `* h7 O/ q' L: g. V6 s1 uselect ename, salary from emp_ning
5 O8 c L4 U" N* N9 k, T6 Jorder by salary;
- m$ f6 j0 s( l% G) y
, p8 W$ A: T3 t P2 tselect ename, salary from emp_ning
D% T3 w# V) O6 Lorder by salary desc; --倒序排列 descend! H. V) y& Y1 P: O/ Y" {
' G$ `% x; Z( J3 v. Z# f, B- ~desc emp_ning; --查看表结构 describe/ E* ~" t ]/ F: b6 h- R/ E
9 z1 ~' V: z- W/ a) Q+ T" q \$ R5 K
8.按入职时间排序,入职时间越早排在前面。6 h, H2 V8 q0 I- }% Z- o& `! E( o3 _
select ename, hiredate
9 A: W" J9 q. O2 o6 ~from emp_ning7 M* I; @1 N, l& g
order by hiredate;& P2 a8 C8 X2 l* p4 l
0 h7 E& @- J! f. v" @' h5 `: w
9.按部门排序,同一部门按薪水由高到低排序
6 w5 [3 B# T0 k( u ?select ename, deptno, salary
9 U5 l' N9 G: J( A1 \& S) Q1 Cfrom emp_ning8 p! F* T/ ^6 E: h: f( m
order by deptno, salary desc;2 {3 W; Z8 H' Z: M" m
. Y! ^& ]7 J% a( C
10.员工表中有多少条记录? U! F1 U7 v8 ?
select count(*) from emp_ning;
( M/ Y4 y. q% F+ J. I4 B/ Z, C
! Z; o# o# C& [ Vopenlab帐户下有多少个表?* i6 [* Y4 H7 S5 o
select count(*) from user_tables;
$ w: l4 F- @( k8 w! p/ h' Y t1 w: X0 _# K8 m- b, B" {
openlab帐户下有多少个名字中包含emp的表?
3 D3 x% J0 `6 ]. `4 zselect count(*) from user_tables& l' \! \3 G7 N
where table_name like '%emp%';
$ _" Q6 g" w% k# x6 g6 r0 m- N1 _. g8 p! q6 o; M: F
--表名默认大写1 I$ u! @+ t( G, V
select count(*) from user_tables7 a) L% M- X: Z1 E" ^9 |& e* a
where table_name like '%EMP%';
* }, b6 n( ?# j) K: [. j: q* z
) {( q: N7 `, M7 h--入职时间不是null的数据总数。
) ~$ d& v' L1 x+ V--count函数忽略空值。- ]2 I. r. T, K5 ]
select count(hiredate) from emp_ning;- f: G& X! a2 u" |
0 U% q% d0 [3 W% i9 t9 ~
11.计算员工的平均薪水和薪水总和是多少?. W* U8 k" [. i2 k
select avg(salary) avg_sal,
* S0 G$ Q9 b; o/ n' F4 K sum(salary) sum_sal! E5 x" S1 L V8 z. L# m
from emp_ning;! N$ E7 G5 t8 g2 B' S! L
1 v/ W6 P- z& ^9 }avg(salary) = sum(salary) / count(salary) ! I/ P# X, e& c1 Q+ ?2 I
68500 / 10 = 6850. F0 q: S' S0 b4 l% i o
--纠正逻辑上的错误
' v) J6 _8 w4 f1 D" bselect sum(salary)/count(*) avg_sal, 8 G5 w: C: I$ o& [8 j
sum(salary) sum_sal
! S0 z6 O& S2 @ u0 I" q! ufrom emp_ning;" o; l8 Z$ Y" Y+ j
" n t' ]4 S* U; S. ~3 `* h
select avg(nvl(salary,0)) avg_sal,
T) w" R8 o. H- b2 d' o; G sum(salary) sum_sal8 k* `; |4 e8 D" ^4 o
from emp_ning;0 T5 K4 s' a* z
" t( R( F/ ~' n# M& | ]! T4 I0 Y12.计算员工的最高薪水和最低薪水( d e1 ]. \0 K7 Q' o$ \% q6 S
select max(salary) max_sal,/ I* E3 b# z2 B0 E# x8 Q* Q
min(salary) min_sal
7 F9 Q5 |+ M2 ^7 j* pfrom emp_ning;
7 o, r1 ` Z3 ?: |# M k* @
6 {) d+ Y& A. r: \: y组函数:count / avg / sum / max / min 忽略空值% O2 m* v" z: v( y3 a5 i% z: C
其中:avg / sum 针对数字的操作。& u9 i, ]: B) `) P( r" z; e
max / min 对所有数据类型都可以操作。: W7 D6 t2 N1 J' Z
+ {4 L% w) D( |% \13.计算最早和最晚的员工入职时间。
) m/ Q: j, e) B7 B) |9 gselect max(hiredate) max_hiredate,
% {/ G2 ^: P2 c( C* @$ }0 Q4 j0 W min(hiredate) min_hiredate
) ^4 t: \% a6 s( F* ~1 `9 y! I4 Tfrom emp_ning;
- G( B2 I7 @: a7 a. f- w) o7 K
! n0 P# q, }( W/ |14.按部门计算每个部门的最高和最低薪水分别是多少?. b) S5 S6 t* ?/ D" X3 N# u
格式如下:
6 |* y, G0 D& z7 Z3 n. I h10 4500 3000
% c8 g4 `7 o" Z; F& S20 15000 8000# y9 Z5 J* v6 ?
30 10000 5000- s1 h! I) V8 F5 g. d% f8 B
$ C! G$ v/ O/ o8 h0 f6 F2 c9 ^
--group by 列名 : 表示按哪个列分组
% m$ {, m, U. b: t0 r9 Lselect deptno, max(salary) max_s, min(salary) min_s
- k( N. I4 v& s- F% U3 F4 G. Efrom emp_ning
2 Y$ G J% a& i0 L5 }group by deptno;3 F3 O% J& T4 J- B8 C _
, V9 g4 B0 y& r
15.计算每个部门的薪水总和和平均薪水? b' |: B& n- T" P) C4 B8 o
select deptno, sum(salary) sum_s,
+ L0 T2 v( G& _+ ^ avg(nvl(salary,0)) avg_s5 j* h& ]9 d; h4 _& L/ S
from emp_ning: z% n0 A8 p4 N
group by deptno;5 @: v( ^4 u& K) i6 |/ \' T, {
+ Q, O0 m, `, e$ Y16.每个部门的统计信息:格式如下:: x; i9 {& q! f2 }
deptno max_s min_s sum_s avg_s emp_num- y4 I1 F! J3 A, v, O
10 10000 5000 23000 6789 3
6 R) A: g2 g* x' t( g# z6 g2 d....
4 v! W9 V; W1 W2 Nselect deptno, max(salary) max_s,
" S, H5 A' r5 N$ \4 n& t# c: k min(salary) min_s,
$ ]2 ]" Y, D: K1 H7 x( R1 p sum(salary) sum_s,2 [! q9 T2 J1 ]. c8 o) D( x
avg(nvl(salary,0)) avg_s,
! u1 [& e X' H count(*) emp_num, O" @: _2 U N t1 M
from emp_ning
9 {8 k3 Z# G0 S/ X* ^+ Igroup by deptno;
: u; R& j4 ~% R9 j3 W4 t" w6 H8 y' `8 r% a
select后出现的列,凡是没有被组函数处理的列,必须
! {5 J) M- ~$ R, s4 ^% i4 Y. E* O出现在group by 短语中。
8 O( a' [' z$ e, W- W
+ o9 C; e. _3 j3 H% N( {+ u按职位分组,每个职位的最高、最低薪水和人数?
1 {8 G: z+ _4 M+ w) D4 Wselect job, max(salary) max_s,
0 G& k$ }$ p& |( N% F! G5 Y min(salary) min_s,! _5 W" C) q7 Y2 c$ a
count(*) emp_num% x% h. F# B& S* x7 |2 j
from emp_ning
) {! p7 u( Z: Z) h# \# cgroup by job
/ }1 k r% v- w' ?; g+ sorder by emp_num;: m) O3 I1 G! G% H. r, ~# v
17.平均薪水大于5000元的部门数据?
6 s7 M: A# z; A8 P1 n! f9 rselect deptno, avg(nvl(salary,0)) avg_s$ j j& i- n, M2 k( o
from emp_ning
3 [ t: M. t8 uwhere deptno is not null5 u- k8 U! \: o5 r1 s1 z& v8 |
group by deptno
( J3 O8 U9 y) xhaving avg(nvl(salary,0)) > 5000;
" Q8 f" Q, J5 S# F0 C
# z6 @# s2 P$ d+ D' Y. q18.薪水总和大于20000元的部门数据?
, P* Y. | b9 L1 P+ R, A8 Kselect deptno, sum(salary) sum_s; N( E3 C' U. M, f1 t0 t
from emp_ning
+ B$ B$ c; Z7 k6 b( dwhere deptno is not null
- {# d; z5 y4 G; a" v' B# J: }group by deptno( l0 b) @- H% o: U' E9 c0 }/ I0 M
having sum(salary) > 20000;
( V! M7 r3 Y2 b9 K% v/ ~# u7 ]; }5 ` [# S8 O# M
19.哪些职位的人数超过2个人?7 Y7 ?/ W! p N' _# R, r- {
select job, count(*) emp_num) y; F8 m. q* |! h& `5 ]3 @% j
from emp_ning
5 D* h, L; ~3 ^3 y/ Ewhere job is not null
+ o' G/ B/ v( w+ Ygroup by job% d4 X+ s @. A# t6 u3 d
having count(*) > 20 W( S7 Y b4 h! Q1 {+ c1 _
order by emp_num;
( D) C" P* j% m6 n/ W( e+ ~2 d% q5 p) [
- I" e4 v9 F9 l! K9 X7 r |
|