我的日常

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

动态微博

查看: 1662|回复: 0

Oracle增删查改 day02

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:40:52 |只看该作者 |倒序浏览
SQL*Plus   
* ~! a* N5 R$ h5 ]sqlplus.exe 7 Y; ^: l" c7 J( j# }" u

' U1 k3 D# e0 P% q) Z& q: N- p) }: n1)数据定义语言:create / drop / alter / truncate9 D5 Z0 T: Y7 i! Q7 i
对数据结构起作用。  r4 ^' ^+ K! l: t% n0 U$ I
  ********" D  {8 v% S* @$ Z* r: g: M3 O
Data Difinition Language: DDL* ?& {# U/ s5 q3 E. O+ b) T+ z
2)数据操纵语言:insert / update / delete; C" E9 ]. Q" u5 U" _: D
对数据起作用# m5 c. I6 `+ r
  ****6 ?1 R) i( x; E3 V6 C" b9 e3 S
Data Manipulation Language: DML, s6 Z; P5 C( k* i
3)数据查询语言:select  x: |0 C& o$ ~( F% K3 W
      ****
0 [$ b* b: P$ h& @- f* tData Query Language: DQL5 s, B! p" V/ S1 P& _+ s  Q
4)事务控制语句:commit / rollback5 C" {$ Z% B& k' O7 Q* c
对DML操作确认
( n( `7 v% e, ^: S* m1 D1 K
8 [/ d( ^! h5 l. W! W2 z# s" e一、学习单表查询语句。; y( W9 ~6 j1 B+ K% Z
1.计算金额的四舍五入?
: g  }$ m' r% a5 h. ^( u* m6 o9 q9 b0 Vselect ename, salary * 0.1234567 s1,
6 d/ T$ Q5 x# v" j# Pround(salary * 0.1234567, 2) s2,: S% H" W! M. {3 B# g9 G
round(salary * 0.1234567) s3,- u" m% J+ `1 g
trunc(salary * 0.1234567, 2) s4+ L# T1 q  S4 P
from emp_ning;
5 u0 j6 N+ ^5 y, E3 F
# B: u9 v7 U: T8 L! a$ a4 Bround(数字, 小数点后的位数):四舍五入( m' i! y/ @  q8 v
如果没有第二个参数,默认是0.
2 u) v' F+ j7 H! s# P
) w. g0 `  `1 F1 \trunc(数字,小数点后的位数):截取6 A+ Q4 Z$ D( h  N, O
如果没有第二个参数,默认是0.
! t8 [. A6 H5 T% y' V
) ^) q' j3 k! \8 x: ]; I% j2.Oracle中的日期
  v. [# v% ^! n  r1)取系统时间的函数:sysdate: G' q& l9 M3 N" [7 b1 a7 S
select sysdate from dual;$ }+ y9 `0 D0 X& H+ H, l

. U, D6 T- `9 e0 A2)把时间数据按指定格式输出* E! q& S8 p, y8 A2 t
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')9 }6 o* a9 d: l( L
from dual;; _/ _! E6 G; Q6 J- [

# `; I7 Y9 j! h1 n  e* K  Xselect to_char(sysdate, 'year month dd day dy')( p- ^+ I$ ~8 \( `' P
from dual;
0 [" i( b- P. s/ P4 |- h4 `- }
7 D2 H: d9 c: n3 o8 H9 ito_char(日期数据,格式)# t7 {: H* X# r: @* ]" c( e
7 f0 h/ x  o9 J$ @# q
public String to_char(Date d, String style){$ y2 S4 T. z1 {
        //SimpleDateFormat把d按照style的格式转变为字符串% H) m& D: ^: U. |% @
        return 字符串;7 S% }0 b- y5 K  R7 }7 j+ j( @5 [, O
} ' p: S; |  x1 K8 k1 k

* p. `5 m" B/ Q5 |! Z' yselect to_char(sysdate, 'yyyy/mm/dd')1 Z; W% P0 K* z( `2 c
from dual;
/ ~% K" a5 J5 v% P3 r! T
( T3 j/ ~" a5 L: w- _yyyy: 四位数字年  2011
7 O* W6 S) x8 D+ }year:全拼的年 twenty eleven
8 q/ l2 k7 t" u  K7 |' E: [  b5 ]month: 全拼的月 november  中文:11月' Q3 `, a$ z/ v# H9 U% o
mm:  两位数字月 11
6 U6 J0 p% Q0 M) w3 `& T; Z2 hmon:简拼的月 nov
/ |3 K& Y, |3 wdd:两位数字日
& V* K& X& z: h- Z: z7 _day:全拼的星期 tuesday
2 g4 @, z4 G5 ^4 E) k! I# wdy: 简拼的星期 tue- W4 d$ ]- }1 [5 l5 \3 B, ?5 t
am: 上午/下午 am/pm
9 m* e: T  p" W. f$ T" [9 z7 T/ E3 E! Y$ T: ~
sqlplus中日期的默认格式是:DD-MON-RR6 l" I9 B+ F( Y& r# V, s
现在的时间是2011年0 `: o# A* L! G1 T  w
           YY           RR0 b7 j: N7 }( `, }" U1 |  |$ M
05年      2005         20050 i) }3 E8 K+ T% f
98年      2098         1998$ J# r0 Q2 Q8 Z' g
5 n- L) g* L7 M
假设现在的时间是1998年
9 E$ x; o6 I* a! T05年      1905         2005
9 k; m" y% S0 X4 @95年      1995         1995 * u! O4 ?8 J% _) q/ t, I

  }1 m/ y3 a, g' O3 h: Oinsert into emp_ning(empno, ename, hiredate)5 c2 v  q5 m* e* m5 A% k
values(1012, 'amy', sysdate);* W$ q2 J3 d4 A: W7 M$ t
--实际入职时间是2011-10-10. N: V+ g; t0 s, \, ^# [
insert into emp_ning(empno, ename, hiredate)
  C' \$ x2 f& H# v8 W5 ]2 u# Yvalues(1012, 'amy', '10-OCT-11');9 Z' n, `: Y+ h* e2 n

- ]( F2 |% {+ N$ `6 einsert into emp_ning(empno, ename, hiredate); x. |* P/ {7 ]" X
values(1012, 'amy', + z% \) |9 O5 ?9 R  g
to_date('2011-10-10','yyyy-mm-dd'));
/ j( \' J! m! I7 M
; r* I* i  j; k; Y9 R, j显示员工姓名和入职时间,显示格式为:
8 c2 _9 i1 Q) Z9 xamy   2011-10-10
) s$ M' }1 E9 a# B% j+ ^# n: G. j; s; W; o  |2 V3 m: v
         to_date
& F8 V. z! C$ F# U- g. O( H$ e字符串   --------->   日期0 f  J# Z) k. Y+ h. c* X
         <---------& Y# c" D9 X. Z# V& n- t0 g
         to_char
5 Q0 [% @* R. ]: A: T  W' X9 B) `3 L
3.计算员工入职多少天?  R9 O. C* x! l' \9 ]3 K
select ename, hiredate, (sysdate - hiredate) days. t0 k1 D3 {8 C$ c( U5 K% O5 y( M0 |7 n
from emp;5 U8 l& H9 I& W" Q

) [( H- `% g' }( X- I日期数据相减,得到两个日期之间的天数差。
5 H* r% L1 ^8 l; j! O不足一天用小数表示。' ~  F$ g' c* H* w" I: O
, _+ Z# ?+ e7 u( m/ d  R% G& ?
select ename, hiredate,
% s! D' `2 T- q) Y  }: xround(sysdate - hiredate) days0 B" T+ c, Z& l& M8 Z8 F5 h# z* M
from emp;
0 I! {1 O( h$ v+ j+ p! u! B/ |8 N- w: d, B5 N2 c1 i% f
4.计算员工入职多少个月?用整数表示。) i9 O0 w$ F4 H9 L$ N; \2 c0 R
select ename, hiredate,# X/ c6 [+ ?$ o) S
months_between(sysdate, hiredate) months) U# w# t* G( L2 i, T# Z
from emp_ning;$ \2 w! e  ]6 ~, l  M+ i; q

. y' j$ d% N( `7 C  e( Yselect ename, hiredate,
: k/ K# @  v. d5 y# r. m0 R6 y( qround(months_between(sysdate, hiredate)) months
- Z/ g3 W& ~1 t" y+ O. y0 afrom emp_ning;2 p6 t; o# n% u# t4 x1 j' j' Y$ R
% l1 Q# i, d' g- ~- s
f3(f2(f1(p1,p2),p3),p4) : 函数的嵌套6 _9 r$ @' N1 r1 y4 ?
2 b. m+ A+ F! l6 O  B
5.计算员工的年终奖金! A: e5 O3 h0 R9 O. T+ u/ O
bonus不是null,发bonus的数字。
5 _6 r. ?) y( l' ybonus是null,发salary * 0.5.0 ]9 N7 i# c; N' }
salary还是null, 100.
! t2 }- o: O9 j1 X/ C( x9 S3 P$ i! u. [' w: F' U
public double calculate(double bonus,
* X! a$ |, U4 D- l9 a6 \                        double salary,) @' I$ ^* g) G; y( @
                        double comm){, ^! E9 {. [$ O! e' }9 I3 X
        if (bonus != null) return bonus;
, k6 l" l" ?( S; T8 ]  s9 P        if (salary != null) return salary * 0.5;
" X, v, r2 F. r" ?        return comm;                        
+ Z* B/ S7 D9 K  [}
7 k4 y- j& X+ j9 u0 ^9 _9 Q--返回参数列表中第一个非空数据8 g7 ^% ]& W7 ^- i
--最后一个参数通常是常量。
4 w' S) a" u5 G! r% _select ename, bonus, salary, 7 H# ]) [/ @( q$ P5 K, F; X
coalesce(bonus, salary*0.5, 100) bonus$ d* L- C8 }0 S
from emp_ning;
  |& K) v! I) r' N- J4 e
- n! j# j* _0 m( u7 {  h1 w0 E6.根据员工的职位,计算加薪后的薪水数据:0 P! S# H2 f& L8 k
Analyst: 10%) ?7 H+ d9 D4 c8 X+ P4 z- I4 `, C" W
Programmer: 5%3 P3 v2 t9 e& Q
clerk: 2%- C! O' n* r7 D0 E: Q4 E
其他职位:不变。% J4 T% W  _6 |7 O" O# Q+ w
( \  [7 I& a4 G7 ]3 R" i, G
case语句:
# u8 X4 |+ n% B4 Y4 Q6 y7 E4 k( Eselect ename, salary, job,8 p. e+ O4 I2 G. p% c
case job when 'Analyst' then salary * 1.1
, X8 T& ]+ D5 I1 W         when 'Programmer' then salary * 1.05
" g8 c; v% J) F+ a         when 'clerk' then salary * 1.02
- F: E( F2 ^' v/ Jelse salary0 y. N8 W" w+ J+ p; L% O
end new_salary
5 u2 g/ F- n, {* Gfrom emp_ning;3 [- Y+ L9 P1 Q# j( K

9 h# j/ ]6 a1 }3 V1 ?$ e7 a& s* J$ Eselect ename, salary, job,
4 m3 [, S! C7 `' hdecode(job, 'Analyst', salary * 1.1,
: x0 z! e1 p, h- d            'Programmer', salary * 1.05,
: r* A& b  Q$ \  S. C( @* n            'clerk', salary * 1.02,1 ^2 G+ k: n4 s8 J" r
            salary) new_salary
! U$ P  l. ~. h' Z" ifrom emp_ning;6 M* S; D' K7 i. C7 W; B4 c1 `# N

8 o! v5 V8 s+ y1 |, D7 _3 D7.薪水由低到高排序4 b9 g3 ~; |. [" l# n9 D* I
select ename, salary from emp_ning
3 V( }3 j9 o& b/ vorder by salary;# B$ O7 A# M- Z; l6 v0 v$ G6 z
" c" R5 P& F! |) p
select ename, salary from emp_ning
& @0 o1 S6 Q* i0 T5 k/ iorder by salary desc;  --倒序排列 descend
1 A, E3 \$ F8 ?' x% i/ h
1 h: Z5 e0 }: `; R2 Z9 |, J& odesc emp_ning; --查看表结构 describe& T/ r8 A/ \8 K

+ z$ \# }) V& m8.按入职时间排序,入职时间越早排在前面。
( t5 }, X' e' O% n3 cselect ename, hiredate
! E; Z- O$ H+ n5 l, D- Ffrom emp_ning
0 A9 I) \; H' f, A: |) c, {order by hiredate;% o1 N) r# J$ e5 k
9 `* I; R' h6 j& b
9.按部门排序,同一部门按薪水由高到低排序; R; ?" |) ~# M5 P( P0 U9 P
select ename, deptno, salary" Z+ Y: @  c$ D
from emp_ning
5 B) q" f% Q4 G" T; [8 Dorder by deptno, salary desc;2 o% i& X  P* J, H4 j5 d2 j, H

* L3 J9 l- h7 ?2 A: P10.员工表中有多少条记录?
& q; c0 w# G, o" m6 Sselect count(*) from emp_ning;$ f% J9 {7 B  l& b# S6 ?0 w+ j# K8 _

4 N; Z. `6 q2 O& I/ G* ^; I# ^3 W$ aopenlab帐户下有多少个表?
3 J9 _: K+ ]) a+ h+ hselect count(*) from user_tables;
1 T5 T0 U# g. R, [& k- g3 Y0 u1 }- [$ b* i0 C. G
openlab帐户下有多少个名字中包含emp的表?- d* A/ v: K* l2 @* N( B
select count(*) from user_tables3 I' f: Z$ l" s2 o) T
where table_name like '%emp%';) \$ W2 V* O+ v
# a& G/ @* A) Z* X
--表名默认大写
6 q2 w, ~* H" E" B: wselect count(*) from user_tables
' j3 T3 b7 l( z7 K; g! awhere table_name like '%EMP%';4 @* [5 [/ v7 @
, l) |  ]4 i6 T) `& M/ }- h  j
--入职时间不是null的数据总数。
4 c; u  a  d( ^, _4 n8 ~--count函数忽略空值。
1 l* F6 E  ]  F9 ?2 Iselect count(hiredate) from emp_ning;% l1 J( W* E* ^  ^
4 r5 y" x, A/ l3 F9 c' |6 k4 d
11.计算员工的平均薪水和薪水总和是多少?  o0 f7 v. L* M% K- z. ~
select avg(salary) avg_sal, # l7 {8 `' l( q8 w
       sum(salary) sum_sal
; \) b7 P' F0 ^from emp_ning;# @" t( |0 C/ K* ]

0 q6 r" x4 t8 M, M, X6 ]% \& m2 Ravg(salary) = sum(salary) / count(salary)
; ~1 |! l" X8 a1 \; Q# l              68500 / 10 = 6850
, Z7 y1 B0 E# s--纠正逻辑上的错误
/ a! u6 J2 O. ]. l; C% J6 ]4 t. Mselect sum(salary)/count(*) avg_sal,
0 K* c5 c0 H% N& T" f9 }2 g1 m       sum(salary) sum_sal9 d  Y' ]- Y# h$ A
from emp_ning;8 ?' }- G" g2 }! x; z$ |& x
8 p/ i$ a2 L) R  [
select avg(nvl(salary,0)) avg_sal,
+ C/ W" G2 i1 d! F' ]8 K( k       sum(salary) sum_sal( t+ Q+ A4 D: n+ U: a0 [. u) W4 n
from emp_ning;
7 X, [, A1 [5 t1 B, E4 ]5 D+ S7 d8 ^& S4 Z
12.计算员工的最高薪水和最低薪水: X  U8 `2 t9 |' Q! ]. M6 J
select max(salary) max_sal," ~8 @! n7 o5 D4 ?2 G6 j! B
       min(salary) min_sal6 C/ `% ?' b9 {- O  a8 K) F( l+ D
from emp_ning;
: a9 @. g+ D" ~& K) ]# y  ^3 E# W- e0 B- H
组函数:count / avg / sum / max / min 忽略空值/ F0 h2 ^/ U3 X( i
其中:avg / sum 针对数字的操作。
( w1 A# B/ m. ?      max / min 对所有数据类型都可以操作。' d3 f2 C4 s3 u+ O
1 f* D6 @' F& h$ ^8 f. j/ b
13.计算最早和最晚的员工入职时间。: ?0 [2 y# d! d/ Y% R
select max(hiredate) max_hiredate,
3 f" `0 v" Z7 |# N" n7 a       min(hiredate) min_hiredate
+ W  v" u3 N0 P/ z! F& P3 E3 ]( Cfrom emp_ning;* y0 y: v$ W" O" q

! N8 J9 \7 _; k. @- q" b* e6 e6 c. E0 ?6 H14.按部门计算每个部门的最高和最低薪水分别是多少?
9 q: \; W; a* v格式如下:
/ s! x! d! P/ x  P10 4500   30002 m& n; }' b8 T- v# R( Y) _
20 15000  8000
& U, _1 |2 E+ b30 10000  5000
0 V1 r- k  ]; Q: h4 v& ~3 V0 M2 r( W3 `4 N& P
--group by 列名 : 表示按哪个列分组
: S: f, B8 L1 n2 P0 \select deptno, max(salary) max_s, min(salary) min_s
, f+ Q5 R# B% a0 ?$ N# i) }from emp_ning9 H0 M2 B, M9 a* B( ]: Y
group by deptno;
: F  C" @- Z+ M  C
, b) X% R" o3 {- ]15.计算每个部门的薪水总和和平均薪水?5 T% C0 B2 _3 E& M1 F3 w1 W/ m9 U
select deptno, sum(salary) sum_s,
7 z0 F! b0 X3 i0 B( Y6 T- X9 _               avg(nvl(salary,0)) avg_s
8 M% L0 T. {4 D7 y! B# vfrom emp_ning5 u8 c/ k) o: q9 d  v
group by deptno;
7 Z. R6 q- O3 a: A. x
) z/ k$ v% A5 B( G. z1 ~9 V16.每个部门的统计信息:格式如下:. U* A5 j2 I( l6 P# P' l) {5 K5 ?. C& K
deptno max_s min_s sum_s avg_s emp_num, X+ ^: V) T% e; J* F  h9 V9 M. ~
10     10000 5000  23000  6789       3
7 X# ]) d9 o8 G% t....
* M- A* i2 w' Y: Vselect deptno, max(salary) max_s,
- B4 T& X; J& u               min(salary) min_s,
. j* Y" B1 w% K0 i7 X               sum(salary) sum_s,
2 _7 o3 K5 A. E( z% \* _9 N( X               avg(nvl(salary,0)) avg_s,# I* A/ j: J/ u4 l( P
               count(*) emp_num6 L" W" u5 L* E
from emp_ning. _" S6 V) C! C, S6 q
group by deptno;5 {  Z5 e& ~( ~( h$ a/ k1 L0 I; N

. V* E. _) a" {select后出现的列,凡是没有被组函数处理的列,必须
+ g. A+ }8 n% ?7 F, [! d9 @出现在group by 短语中。
# C+ q* S) S8 K' q! |. ]
& r/ ~! o( W( U按职位分组,每个职位的最高、最低薪水和人数?3 v+ F6 y" e! ]. R
select job, max(salary) max_s,( A" d2 g5 q" I; \: E5 v5 F
            min(salary) min_s,
6 b7 J7 c; w: U0 o: `8 v9 L3 z            count(*) emp_num
. Q6 W! A% b" jfrom emp_ning! V4 ]/ G) b$ m% x
group by job0 W$ z- P' q' F4 J; }: q7 w
order by emp_num;4 h% X) P6 X8 X
17.平均薪水大于5000元的部门数据?; W& T+ c$ N9 U2 P. C
select deptno, avg(nvl(salary,0)) avg_s
3 t1 M; v8 _% K# \* N3 b6 O' ~from emp_ning
. F# S. I& L6 A0 O4 }& R/ {where deptno is not null' x2 E, u8 S5 R' {5 k% N# `
group by deptno
' v! d; W  h" ]6 D+ w: Nhaving avg(nvl(salary,0)) > 5000;# ?% M1 T7 A5 m! {' w% j  s
6 f# m  l' o# w9 @
18.薪水总和大于20000元的部门数据?
8 o% _7 S! D" g. t) X! Y  e' z( Sselect deptno, sum(salary) sum_s
. t) k( n- H3 b/ }2 Hfrom emp_ning
* f- E9 j8 ~0 ewhere deptno is not null% f' F3 G2 Q6 _/ ~1 m& K# z( h4 x
group by deptno
* {" E5 j; @) y1 }* rhaving sum(salary) > 20000;
# b" l- q9 }9 w! P& `; A
4 I" N, g  R3 O# {+ i19.哪些职位的人数超过2个人?  e  V! d2 c/ V3 |! y  L; Y
select job, count(*) emp_num
- v/ S6 [! d+ Qfrom emp_ning
( e0 `; X( f5 w! twhere job is not null
: q- n& b0 u% Z+ |+ K* R" Bgroup by job
" K  C& K3 x& E9 zhaving count(*) > 2( l( E  }4 V5 g! }8 X
order by emp_num;
- B% k! [* {; R! D- _
$ {4 @0 g9 r7 I5 X" F1 S

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


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

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

   

关闭

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

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