我的日常

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

动态微博

查看: 1762|回复: 0

Oracle增删查改 day02

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:40:52 |只看该作者 |倒序浏览
SQL*Plus   
2 j# _, X' ?- {: F0 s: qsqlplus.exe ) O! T5 t6 l( f! H* _8 z4 S  ?  k1 `
: ?. X+ `) F; [3 z
1)数据定义语言:create / drop / alter / truncate
! _! z9 z$ p4 P# y8 U$ f3 j对数据结构起作用。
' N+ [& N6 Y* {+ `; _) O  ********9 @' Z8 z6 g1 |/ n" N/ P
Data Difinition Language: DDL$ M. h" T2 D) `8 X8 }
2)数据操纵语言:insert / update / delete
  s$ r# g; E8 u对数据起作用+ t# S1 {2 D9 t/ P- {0 F1 x5 r
  ****+ f. Y' p/ n5 l& A$ Z, g6 p
Data Manipulation Language: DML
; n. s% c% W( J3)数据查询语言:select
9 e# M, P" [: F/ y3 ?      ****4 h$ A- J; E( B% B
Data Query Language: DQL, n1 C  F/ _0 n5 X9 r% u7 L4 K# ^  }
4)事务控制语句:commit / rollback
( s( ]; W  Q" Z+ v! N- [9 H对DML操作确认" E4 _- h  T$ L) h0 F! G2 Q/ c

5 W5 F* w% q& E* G一、学习单表查询语句。/ _/ c5 k9 D9 T+ k# k. Z
1.计算金额的四舍五入?3 I5 ?+ d+ B, N0 V% ~+ i
select ename, salary * 0.1234567 s1,
. o3 d1 V5 R; v/ \! w) Rround(salary * 0.1234567, 2) s2,5 }, _. [) X  S8 Z
round(salary * 0.1234567) s3,
' X. w9 p2 I" s" I2 \( H; Strunc(salary * 0.1234567, 2) s4  q0 f) [7 }! i0 D3 t0 ]
from emp_ning;5 ^+ f, g2 ~) _( \

9 Y8 H+ N. E4 k1 d* m0 Y, `round(数字, 小数点后的位数):四舍五入( M! e* D& k, i9 N4 R2 ^. D( l
如果没有第二个参数,默认是0.
5 z' _1 @: O( @; j! J
- c; L! W9 i1 A+ W: Ztrunc(数字,小数点后的位数):截取9 ?1 O- Z+ }8 e# A, ^
如果没有第二个参数,默认是0.
2 S- h$ w; M1 i: K
5 Y# `: ?+ G' m0 x- X, I$ F2.Oracle中的日期8 |$ v# L$ @% z0 c  `6 `
1)取系统时间的函数:sysdate
/ b# D; a. G4 z, S' qselect sysdate from dual;/ y, Z8 ?9 ?, H
$ U% k1 o7 \1 X3 f) k2 S
2)把时间数据按指定格式输出
& ^/ X( f' L# P( Aselect to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); F3 m$ Y* X. {0 _  l2 h' e5 j. I
from dual;) _6 z' F0 ^! ?; `

' O3 b, b4 H7 B; N  vselect to_char(sysdate, 'year month dd day dy')4 F/ k: N2 b6 M5 Q4 ^; R. p9 H
from dual;
3 ]! F# Q% G( w7 H4 \3 U3 I- A# o" |0 e1 p" m
to_char(日期数据,格式): w" G4 i/ v; T4 I6 h, v* T
+ G) E8 i# i' H. e# Z
public String to_char(Date d, String style){
& {/ N. l% ^5 n' \5 {! g' T( |        //SimpleDateFormat把d按照style的格式转变为字符串
* ~) |  w1 Z8 l        return 字符串;
1 \7 K3 f: d6 g3 x} & S0 R$ r) [# _

2 X6 v2 G8 z) Q% w; h- M0 fselect to_char(sysdate, 'yyyy/mm/dd')
/ a2 b3 `1 M0 `: z5 D) h+ Afrom dual;. M- y$ P4 R9 A

. \6 ?# `4 x" C6 D7 xyyyy: 四位数字年  2011  i3 L$ {* q4 o! u
year:全拼的年 twenty eleven9 r' `. t' S2 t- I% R% B! F
month: 全拼的月 november  中文:11月* [5 j6 U1 p* }* z
mm:  两位数字月 11# H" e4 ~; d9 T& k+ ~
mon:简拼的月 nov4 z, @' e9 W# |& Z( O
dd:两位数字日
! g2 G- ^0 Y1 a' E5 y( Sday:全拼的星期 tuesday1 o$ Z. ?+ }- Z2 O
dy: 简拼的星期 tue) o  v; U/ N! z+ i) [4 H
am: 上午/下午 am/pm* R& w- [# m: V0 C

4 l! S  d6 a/ l9 B: tsqlplus中日期的默认格式是:DD-MON-RR
% k8 k5 W. v  U% z* |2 m9 R: z现在的时间是2011年: B) D4 k, Q+ G, A
           YY           RR
8 \# m- T' S' N4 G# G8 }) R* O05年      2005         2005: C1 A6 S" x( U- T3 [# e2 ^
98年      2098         1998. i# f9 H3 R- }0 t* [- v. _

- J4 B9 v, z8 e: a8 R4 B假设现在的时间是1998年
7 P) ]5 u, I& L9 M7 \4 x2 e05年      1905         2005
2 e0 D( R) R# U0 ?' {95年      1995         1995
5 ^/ ^& e( D0 s$ @6 b2 ?
0 k" U/ H  K8 E& T7 L& {insert into emp_ning(empno, ename, hiredate)  k& p6 \! j0 R: b: ~& }& g' ]5 b4 H
values(1012, 'amy', sysdate);, l& w1 D% {# @
--实际入职时间是2011-10-10( j; g0 f6 V, Q* w7 g+ a
insert into emp_ning(empno, ename, hiredate)
. u1 O! B- c7 x3 d. \# K2 ?; kvalues(1012, 'amy', '10-OCT-11');9 J6 P8 Z8 j% G( a
" Y) d, `6 j8 o9 v2 @" J8 ^8 }
insert into emp_ning(empno, ename, hiredate)
. |" d6 }0 R- S  a6 H4 m: W% yvalues(1012, 'amy',
2 N' i1 Y0 t6 T* Q0 Rto_date('2011-10-10','yyyy-mm-dd'));1 t- `$ g2 g9 a

- v) [6 n* K; z9 E显示员工姓名和入职时间,显示格式为:
/ P0 _5 n% W- w9 q: z2 ^) famy   2011-10-106 F' x$ C. ~0 Y' R* r

1 F* F! ~4 G4 q/ X2 f         to_date6 u# {& q" S8 q- _: A! Q4 h
字符串   --------->   日期
* N; H% J9 R, ~3 Z         <---------9 ~$ f  X3 q+ A4 G
         to_char4 i; _/ b, y9 I, p- |. n% F
" g3 a. R6 Q& `: D9 V: x
3.计算员工入职多少天?
/ M& b* u% d/ rselect ename, hiredate, (sysdate - hiredate) days7 d8 x+ |5 I1 [3 U1 F
from emp;
2 v; @; y7 d! c: K
8 }  d4 v& C1 |8 s2 G! z日期数据相减,得到两个日期之间的天数差。( h/ c6 _! `* d
不足一天用小数表示。
) v# H4 B2 u7 k0 c
4 }  ?  o, p$ O! a1 G0 f+ q/ a% ?select ename, hiredate,
) z. w6 H6 g, n- i! L  @round(sysdate - hiredate) days
! A0 }! c: j- v6 B7 o  E( cfrom emp;
( i& z6 i7 z1 c7 S
8 @  v" k/ r, ?4.计算员工入职多少个月?用整数表示。
/ M! k) V! n5 `- \/ Q& b. Eselect ename, hiredate,6 `: E' g- D" w# P: v% }
months_between(sysdate, hiredate) months) I) W/ Z0 ?& k% z3 |$ v
from emp_ning;% s/ _( Y) }/ X. b
. |( z( w9 G  d4 R# ]
select ename, hiredate,
7 q( u. v9 A0 h3 u- r- r& fround(months_between(sysdate, hiredate)) months6 z0 r# N5 g5 Y$ ?! e
from emp_ning;! x' I. a6 m" |6 {! k/ Q
9 R* Z% V4 O/ u5 x/ }0 ^: |1 o
f3(f2(f1(p1,p2),p3),p4) : 函数的嵌套; Z3 n  Z9 N( X

* J8 Y8 h% p9 U6 Q1 F* d5.计算员工的年终奖金
# x% ?& Q3 c" I' q2 c0 D0 Ibonus不是null,发bonus的数字。
/ `1 ~6 Z2 |. T  f, `. y. W7 Gbonus是null,发salary * 0.5./ n; q3 r" _! m2 g
salary还是null, 100.
+ D: t* s/ l; o! x" j
3 J/ R1 \) L3 X1 i+ |public double calculate(double bonus,
  o: k- u1 \2 D                        double salary,6 A8 `* q/ k$ x
                        double comm){
- G' h' Y0 q! A) W        if (bonus != null) return bonus;# g& e# d$ i4 o7 f2 l$ I9 i* C
        if (salary != null) return salary * 0.5;
! e, m% Q: C6 ^, N; c        return comm;                        4 G! Q% b' h( a1 [0 X
}' h, P8 `# g* v' C5 K
--返回参数列表中第一个非空数据0 ^7 j! X) r& X
--最后一个参数通常是常量。
% _0 n7 x* k( _- `( rselect ename, bonus, salary,
7 u- m4 }$ k2 J: A5 A9 xcoalesce(bonus, salary*0.5, 100) bonus7 A# C' x$ d, V! a7 {
from emp_ning;7 L( [- n* ~4 z+ s" e* ^

6 t# Y- M7 l$ W% j. X9 @6.根据员工的职位,计算加薪后的薪水数据:
- K) w* ?9 w* f! T7 DAnalyst: 10%$ k& M) t; o; C0 G; N! d" P
Programmer: 5%
7 {) ]6 X* z0 u6 u/ s6 bclerk: 2%6 ^2 [& `; Z* X' ?  n
其他职位:不变。
2 ~' M4 K4 n0 I5 Y$ W
! K6 u2 q! B- M* w! h$ T* Gcase语句:
6 n: T6 F9 J7 o! S  q, i; w2 Xselect ename, salary, job,
9 o2 o% N& G- G3 |" ^5 {' lcase job when 'Analyst' then salary * 1.1" E( G0 W7 [6 B5 K
         when 'Programmer' then salary * 1.05
- F; a+ \4 g) J7 |! B7 }% l         when 'clerk' then salary * 1.02
$ X$ g3 B; M7 j6 O- Q' Z- X4 S" aelse salary
1 _! A) ?# i" K7 `- Uend new_salary0 k( t' O0 x, ?, j2 w5 V
from emp_ning;" M' L. }- l3 [0 m6 B, F1 E  p- x

/ S/ o( }+ Q: N1 tselect ename, salary, job,5 z# n: o, \; p7 Q" d+ S6 V
decode(job, 'Analyst', salary * 1.1,
# j7 W3 d8 ^+ Q: o, c            'Programmer', salary * 1.05,
7 D( J: Y3 m3 E2 P: @            'clerk', salary * 1.02,
% X; `* [( _& i! o            salary) new_salary
, o2 P, F7 K/ r7 m( Z1 {+ {from emp_ning;
( K! k2 b! i4 [( d! M' p, ^" a9 ]/ ^: P0 s# J) k8 c. M# e  R
7.薪水由低到高排序4 [0 Z1 u- ?) r
select ename, salary from emp_ning4 b5 f* \" n& l
order by salary;& H5 y" O8 [: q) p" U

! C! ^' a9 i3 ?select ename, salary from emp_ning8 c# {5 M" K3 Y3 \" q
order by salary desc;  --倒序排列 descend8 b! A( k) f4 ^1 ~2 @7 _9 m( m- m

" @/ ^- I1 f, t7 ]$ S# e7 pdesc emp_ning; --查看表结构 describe
) `: h. L2 X5 c5 Q8 x/ T4 m, o$ v* B+ G$ p9 p, y
8.按入职时间排序,入职时间越早排在前面。
2 V2 p8 z6 R( a% @# w" J/ F$ X& [select ename, hiredate
. v0 b% m" L$ e( F- N$ O/ Pfrom emp_ning' T" D9 V. l# y. b' ]4 s
order by hiredate;/ I! g: ]* E4 ], y5 D; z3 F, t

% N1 V  g) M- F& K6 J9.按部门排序,同一部门按薪水由高到低排序
& L: a/ P  h5 H: v5 e% sselect ename, deptno, salary
7 k% ~% }+ U; h2 Qfrom emp_ning
+ c9 Y( S; d% J) z* T, ?order by deptno, salary desc;
" I4 w9 R, B& g- k, `1 _5 B" a5 @
3 X" K; N; t+ [$ f8 B$ q, h( I% v3 t10.员工表中有多少条记录?
5 P4 X0 x) z* H0 oselect count(*) from emp_ning;- i/ u" M) w6 Y" S, P. @
5 K* e+ k/ \6 y; s. u9 l  A0 b8 n
openlab帐户下有多少个表?
2 V# a( \% \& Xselect count(*) from user_tables;
9 t- U6 d, Z, W' f6 G  M; H. q4 Y* [/ ?  _9 L
openlab帐户下有多少个名字中包含emp的表?
$ a4 M1 o* P$ M8 J0 M4 F0 ?select count(*) from user_tables" O+ Z+ M, t! T3 Y7 T
where table_name like '%emp%';7 o# P0 L7 I1 E8 E( v' ~

9 p) H# @4 f7 i; W# z--表名默认大写
0 ?4 x- ~$ ]  B- ~  F1 q/ }select count(*) from user_tables% C/ N) ]! g+ r- f; ?! V# g: P* G
where table_name like '%EMP%';
+ q! S; v9 \4 w$ x% ~5 L: D7 v0 p5 j& A/ `2 B5 F
--入职时间不是null的数据总数。
  P' s8 C" V- r; ?/ }, D7 P--count函数忽略空值。
# l3 J; Y0 {9 n( R; G5 @: sselect count(hiredate) from emp_ning;- ~% M+ F* @# I& o: c: p/ o
" {  o+ K6 N5 z# Y
11.计算员工的平均薪水和薪水总和是多少?
* z3 y  O" y3 e1 n; C; ~+ Aselect avg(salary) avg_sal,
" V: ]3 O9 W5 u1 a9 G3 z" f       sum(salary) sum_sal
6 W" ?( \* P7 A1 wfrom emp_ning;' f/ `2 c' v, h, P. X

1 v/ K% D: P4 }5 @avg(salary) = sum(salary) / count(salary)
2 }1 F6 |/ Y2 F3 @$ z              68500 / 10 = 6850
+ y. L5 c; r  `! M3 b8 j  j% y3 x, G--纠正逻辑上的错误, l" {) f' R; {3 Z
select sum(salary)/count(*) avg_sal, % g. }  v. l- U. v  `! v% h* I
       sum(salary) sum_sal
: _; v& O4 a1 z1 J; l, nfrom emp_ning;+ p7 F# W3 a& J7 d
) v  \# s9 `) R5 J
select avg(nvl(salary,0)) avg_sal,. {) }$ u' [8 S, S- H
       sum(salary) sum_sal
0 h2 G/ g8 W3 j9 \& u2 \# Gfrom emp_ning;) Y+ \5 j/ e! Z

7 @% X$ i- ?$ e8 U12.计算员工的最高薪水和最低薪水
2 [' {8 I# }( q$ u* _select max(salary) max_sal,! j( r8 g" q+ p2 e. ?+ Q
       min(salary) min_sal' }. V; E4 @. D4 _, y
from emp_ning;
! o, w6 M( i( v) X0 x5 Y+ q3 p7 l3 \$ ?* F3 p* ]2 r8 E. o. {
组函数:count / avg / sum / max / min 忽略空值
0 D* z, Y$ s4 i9 c' P& q/ t其中:avg / sum 针对数字的操作。
: o0 j" L. K! G      max / min 对所有数据类型都可以操作。( o! U2 `5 U0 Y* V1 L( ?' W+ n

3 _. Q7 T! D/ p3 _5 s! p! p; a13.计算最早和最晚的员工入职时间。
1 n, R4 i* d3 Q* u4 b  Cselect max(hiredate) max_hiredate,7 C; u4 O# k2 ~. x) V$ X) n
       min(hiredate) min_hiredate! h* r1 u! M& t, s* w# x' ~! e
from emp_ning;5 Z: n/ p: Q" s2 `
/ f6 S2 \7 |2 }+ f, ?5 v
14.按部门计算每个部门的最高和最低薪水分别是多少?
- q, t4 r) r) W: W1 [格式如下:( s3 Z9 y* T4 v- G8 C' E' n
10 4500   30007 V* H; {/ Y( y; X6 y
20 15000  8000
9 a- j% g( _! }7 ^$ }" Q0 B' V) v% t6 U30 10000  5000+ c+ E2 m6 w" y. \0 L  P* D& n% Y& d0 y

% u0 [7 c1 {8 \" n& o1 J--group by 列名 : 表示按哪个列分组! q) y$ U7 Z% R/ i* R( E
select deptno, max(salary) max_s, min(salary) min_s
$ h2 U4 ~+ X# w7 J. ifrom emp_ning* b& ?# H7 ~; U1 x8 Z
group by deptno;
( W0 J5 V7 @  Q- x; x( X" a+ O" Y' o/ J
15.计算每个部门的薪水总和和平均薪水?9 B3 f  }, Y  |- y' ~& s# @" p, G4 f
select deptno, sum(salary) sum_s,
9 r: d8 z# [+ G4 g; a. P$ D' K               avg(nvl(salary,0)) avg_s
, G5 t" d( r. o( H" }from emp_ning
; v  p5 ~* J$ S7 Kgroup by deptno;0 x: z' ^5 y. c, B

( M- F5 d' q$ G3 w$ I4 M2 l7 |) q16.每个部门的统计信息:格式如下:! ]4 k1 C( \; ]" f: ]
deptno max_s min_s sum_s avg_s emp_num
; S2 r4 I& t& F# v10     10000 5000  23000  6789       34 |% \( u2 R$ g$ F8 W/ y. X) @
....
2 `+ L, E2 R4 y& P" @+ Eselect deptno, max(salary) max_s,) W# b5 t3 \4 R, t, n0 r2 d
               min(salary) min_s,8 C; l/ b& J  t2 x1 u7 Y
               sum(salary) sum_s,
$ Z" m9 [5 Y0 T) u9 |               avg(nvl(salary,0)) avg_s,: D& A: L! t9 |( _* R. U' y" A1 i
               count(*) emp_num2 u1 b. w4 O! x5 n% H
from emp_ning! _% m( `/ N7 y- n0 Y5 N
group by deptno;) p) O4 T+ @# n* E7 b" [& N% v! W
0 G# v+ i: {# z' K9 O, D$ i
select后出现的列,凡是没有被组函数处理的列,必须
* U+ o2 H' n) m) F+ j/ ?7 U% p* N出现在group by 短语中。
1 t. ^& P- n; m- H9 w
; S  ?9 A5 ~6 Q0 |7 T0 `0 N- Y按职位分组,每个职位的最高、最低薪水和人数?
9 [( o" i$ N: ~- V- p7 \6 Zselect job, max(salary) max_s,
1 J) E% I9 c3 {, s+ h# Q            min(salary) min_s,
6 A: y! {/ A% P/ ?; n9 |* i5 l            count(*) emp_num+ p3 L0 ~. p% h! T) d$ H6 K% g
from emp_ning- \8 F/ @6 K8 f9 r% _, M0 Q
group by job- Q: }6 o' X! l; |5 `
order by emp_num;8 G' @: ?8 E0 o- h
17.平均薪水大于5000元的部门数据?
- H0 J. z! v" O$ z" s9 lselect deptno, avg(nvl(salary,0)) avg_s
% l( P# Z3 f. `/ I! bfrom emp_ning" G- a: L3 ]0 e  t0 `' F
where deptno is not null0 L8 K, P8 F9 {: I; x; N, C
group by deptno0 L, w0 o. g  o) B* K
having avg(nvl(salary,0)) > 5000;( F  N; f3 B% E: R+ x6 _7 Y8 o
4 S& a" M; i( h, N* d7 d
18.薪水总和大于20000元的部门数据?
5 p  B& L8 ~- D0 m6 k+ _select deptno, sum(salary) sum_s5 @& T# ?# }# A) ?
from emp_ning
" r3 @! s+ F9 L+ e1 R* @- i7 p* D) awhere deptno is not null
6 k  v7 q, J0 z  agroup by deptno; y, H4 {+ s% r0 h  `
having sum(salary) > 20000;5 N  Z: Q" U0 R( d4 M6 @% n' }

& ^8 _5 n  w1 \19.哪些职位的人数超过2个人?  T, t$ n' b8 b. |- n3 r/ Q
select job, count(*) emp_num
9 p. J1 J9 i) C- @from emp_ning5 F$ B1 {" `2 e& a, z
where job is not null
' i7 N* @2 Z% T3 i( m( ~- H6 Kgroup by job6 a- Q5 {% A6 z8 [2 l  K
having count(*) > 2
" y% S% W5 v# C( r1 R' ?order by emp_num;6 x; J. ]  g. k, D$ P
5 u- v5 a" ~. ?+ i8 c

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


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

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

   

关闭

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

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