科帮网

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > Oracle增删查改 day02
总共48087条微博

动态微博

查看: 1807|回复: 0

Oracle增删查改 day02

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:40:52 |只看该作者 |倒序浏览
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

科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表