我的日常

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

动态微博

查看: 1723|回复: 0

Oracle增删查改 day02

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:40:52 |只看该作者 |正序浏览
SQL*Plus   
0 s6 v* G: ?3 i% fsqlplus.exe ' B, [8 C- Z* A& ~: U/ t
) k4 d, Y& I; C1 u" g( a$ `. \
1)数据定义语言:create / drop / alter / truncate
0 B: S, l3 ]+ O% X2 D/ }( F/ l对数据结构起作用。% z5 m+ K8 v6 Z8 D" ?. a
  ********* I2 E6 t) t1 m* H
Data Difinition Language: DDL
  a& N& }2 w2 s2)数据操纵语言:insert / update / delete
# _) W) b# B: ?: P3 s( n6 v) P# O对数据起作用; F  o5 g: `$ g8 U( ~- [0 ?
  ****
  A, l1 P3 p8 T; eData Manipulation Language: DML
) ~5 l) V0 K5 ?: }- D3)数据查询语言:select
$ P" M. X/ R- W& n+ I      ****0 k& d1 x5 K- V3 u8 O, B8 Q1 ~
Data Query Language: DQL
9 Y- E2 L' j  \+ k4)事务控制语句:commit / rollback4 P( Z' ], m" Y+ c  Q! i- b: W4 f" z
对DML操作确认! G( N  ]- s3 M" l. G- O, N( x
" A; u* s5 T; m8 X" _
一、学习单表查询语句。
# P5 @) f! |7 W& E1.计算金额的四舍五入?4 o0 U. H# ?) R
select ename, salary * 0.1234567 s1, # k; B0 M, V9 V4 P! P  p
round(salary * 0.1234567, 2) s2,' W4 [: C6 a+ K1 K2 Z7 M0 l  ~/ x
round(salary * 0.1234567) s3,
& Z" _. g( I6 k5 G0 J5 l! Utrunc(salary * 0.1234567, 2) s4
2 f" F, l& i6 Pfrom emp_ning;. k' B7 S1 l  z/ W; w8 i9 H& M) d; {' J
0 H& h1 ~& g  @
round(数字, 小数点后的位数):四舍五入
. Z- P8 g3 X7 ]+ q5 w$ M# Z如果没有第二个参数,默认是0.
! A& \) Y+ `2 p7 Y6 }+ S
# y8 O5 ]' {* Z2 ftrunc(数字,小数点后的位数):截取; b# e4 s7 V1 _5 B/ u" z' j
如果没有第二个参数,默认是0.
  X+ H# F" i  C4 m* A% E2 C
' ^+ Y$ g* d) Q6 H8 P" @2.Oracle中的日期8 {2 e+ Z2 l" R0 B+ ?
1)取系统时间的函数:sysdate
4 l* @( {/ N) h. xselect sysdate from dual;
9 Y4 j; j9 l6 p1 A1 O3 j( D
! @) D, f" M$ p: R$ y2)把时间数据按指定格式输出
9 S1 _# w# {. P9 Q( O  qselect to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
( B, J) C% V: H& h  Zfrom dual;( r) c0 C8 `8 R9 n8 ~2 F3 S& i2 B
  q4 H* \( _# a: Y- S& g
select to_char(sysdate, 'year month dd day dy')
3 u% B1 x' v5 B( j" O9 \, n' X: z( Nfrom dual;
8 w! Y/ o/ v2 x! t- X4 i# X1 M4 k4 O- g! u5 k! A1 R! }
to_char(日期数据,格式)0 V( X6 ~. J7 P

5 V. ]( s! ]6 I' W7 Upublic String to_char(Date d, String style){
- ^8 |& }- ~$ A- ^& W) V        //SimpleDateFormat把d按照style的格式转变为字符串1 I2 h+ m* J5 R" I/ a
        return 字符串;) a" k8 X0 _) v( t, {
} 7 i* E' S+ Q# O) h1 }

6 X" \% |6 y/ \1 j" Oselect to_char(sysdate, 'yyyy/mm/dd')% J# u, k4 E4 B4 F5 ?
from dual;* h" n4 L) y, ^" e# ?
1 Y) _/ H8 v" o/ i% b" B
yyyy: 四位数字年  2011
1 n9 T4 ]7 R4 ]1 H# ], I# `8 Byear:全拼的年 twenty eleven
. S5 i, q2 F/ f/ Y! i2 Q# K6 tmonth: 全拼的月 november  中文:11月- Q! \' {4 B" v, r  t+ o8 |1 R
mm:  两位数字月 118 }& ~$ v* M( o4 l! z3 B% U
mon:简拼的月 nov
( C, n2 N1 s" q( s! v7 L/ k3 bdd:两位数字日
6 ~' `% x/ z2 Q" ^: zday:全拼的星期 tuesday
1 [1 I* X: I9 X/ Zdy: 简拼的星期 tue0 f: c- a; |* Z- q( h0 _
am: 上午/下午 am/pm
! L( {6 r- j4 g& Y% I+ _& [3 U2 G2 z& G; F# B8 Y
sqlplus中日期的默认格式是:DD-MON-RR
- W9 f4 R6 _6 ~现在的时间是2011年  U4 S$ S& s1 \& k
           YY           RR  W0 k* g2 Z+ O6 c. E% [
05年      2005         2005
+ e8 l7 G" p% R; A: D( b98年      2098         1998
( C9 P2 o$ s1 l
' y8 O9 k7 y8 R( s+ \假设现在的时间是1998年3 ^  n$ r# d; d+ C
05年      1905         20050 R: p; f8 A% f# D
95年      1995         1995 3 O( |$ h1 U& b! [% H9 _- T/ x

# L$ X: H2 C! m* q9 E7 ^insert into emp_ning(empno, ename, hiredate)  @. [2 m, `; b8 A; Y/ z% B/ ~
values(1012, 'amy', sysdate);& G$ _1 }, ~; T3 r6 E  f5 a
--实际入职时间是2011-10-100 H2 J; B7 `5 o& C( L5 r+ Z
insert into emp_ning(empno, ename, hiredate)& g% Q; ~) C3 s1 c& P
values(1012, 'amy', '10-OCT-11');
, J# s7 o# a+ w5 C% r- x" s5 s9 E1 @& C
insert into emp_ning(empno, ename, hiredate)
0 l: \' j! Y) K" W6 ^7 E9 Evalues(1012, 'amy', 6 l; e" y: j3 _. X/ E" ?0 v' _& j
to_date('2011-10-10','yyyy-mm-dd'));$ o* `4 c; D* V8 @+ p

6 G5 B8 ]. Q: y  A0 _显示员工姓名和入职时间,显示格式为:
% S; c7 n2 A; X& v* X# Tamy   2011-10-10
$ z# J- C* p/ J+ N# M9 T
2 P& c# }% ]5 p) u3 U  O" q         to_date) q3 S5 G' j. D! F0 b2 W
字符串   --------->   日期
1 P, H3 d  V- I         <---------1 B& w1 e1 ^* x7 `) T- K
         to_char$ j3 H: b9 |; L' {( O7 w
$ ]8 O- O- ~% e6 }4 \
3.计算员工入职多少天?
7 y2 G, f, p. J8 S4 K- Z# k$ j( |select ename, hiredate, (sysdate - hiredate) days
8 O* [! `/ X4 D  G. n4 `: yfrom emp;
& X& Q! i6 j# @3 z* B
% {) K" a; V" ?, o/ [日期数据相减,得到两个日期之间的天数差。
# j4 Z3 n. p; S9 a$ f不足一天用小数表示。# w% h' z1 U& I: x. E; W
# m8 j6 P9 E2 R* d" p7 I
select ename, hiredate, * v3 q. R6 J- T0 k* R
round(sysdate - hiredate) days: W5 y) l* {* _. B: C& R' ~
from emp;" T% E3 r% s& D, M# X5 m* d. X) q

2 V' M- X6 B2 P& Y* q4.计算员工入职多少个月?用整数表示。
, s+ _0 M5 z8 ]; f. V5 Cselect ename, hiredate,
4 A. P% w! E. Y2 A8 Ymonths_between(sysdate, hiredate) months; w3 y$ s1 t3 J- a3 |" m
from emp_ning;# g6 ~6 ]: C+ u
- _5 g5 ~: n# r
select ename, hiredate,7 N) \1 W& f/ d, O
round(months_between(sysdate, hiredate)) months
! r* Z) v% {8 a, y4 a$ V+ g$ a& Z9 Ffrom emp_ning;
' {& I+ ]  V9 ]/ s0 k+ D
; O4 r9 V1 I% a$ _f3(f2(f1(p1,p2),p3),p4) : 函数的嵌套
" C  [9 `% n6 p' K. @) _' ^1 ]$ D5 u! K! R2 a
5.计算员工的年终奖金
7 r$ R1 |# ?! s- }* Sbonus不是null,发bonus的数字。
* G. V5 p' V* L2 g8 _1 Hbonus是null,发salary * 0.5.
1 r+ o, S8 ]- \! M; Wsalary还是null, 100.& j  _% p: D6 O' q
; X( b; ?/ N5 M% H% b  l
public double calculate(double bonus,
& G/ d6 f8 R$ [' ~2 d                        double salary,4 h; B* @" p. I! L6 u: O, V
                        double comm){
( d7 c0 L2 u0 B        if (bonus != null) return bonus;6 z( o+ X( u* K1 ?2 ?( {. j
        if (salary != null) return salary * 0.5;
+ |& H/ `/ F2 ~; L- T  |        return comm;                        0 [' F" e  B, r5 ~4 P  d* r; e  A
}5 u$ @8 r& D' _$ u
--返回参数列表中第一个非空数据
; d- S& [; O3 n--最后一个参数通常是常量。% m% [9 r: o9 N! O
select ename, bonus, salary, & r9 p0 Z9 J# Q7 d
coalesce(bonus, salary*0.5, 100) bonus
: N% f9 p9 |( p  zfrom emp_ning;  q: w5 L3 ^( I8 G: g' T1 V1 ]
* M& u$ |* n: t9 W$ a
6.根据员工的职位,计算加薪后的薪水数据:
; R5 k( w+ g& ZAnalyst: 10%
' m( |( T  w6 DProgrammer: 5%" \: T6 i0 o8 O* J
clerk: 2%
1 F9 R' N' |! k其他职位:不变。
" m% ?& |9 _4 [! j4 m" }. k+ ]; |  p$ J* n& C- ]
case语句:
+ k& a* C/ n# `, }) i( W0 Vselect ename, salary, job,
6 U3 p- u7 c+ e; |- Bcase job when 'Analyst' then salary * 1.1
# E# {8 h& W5 G4 n. Z* r8 a$ s         when 'Programmer' then salary * 1.05
! s5 W3 a& O* V( B$ p         when 'clerk' then salary * 1.02
& s; s/ L* h& L- g/ H7 ^" \; T& \else salary
" Z" c5 B$ p% h* U5 W. }2 O' cend new_salary
7 B& B/ R2 z3 V9 ^( _' Kfrom emp_ning;
/ a) Z2 v* E" X* A6 |, ~/ U7 e( p1 t: o+ U7 P; F: g* n9 U) z
select ename, salary, job,
) L2 G# J* o- i/ g9 o. ^8 Xdecode(job, 'Analyst', salary * 1.1,
- D3 T) J* L0 F5 v, F: d            'Programmer', salary * 1.05,+ X/ l, U8 v2 x* ~% O
            'clerk', salary * 1.02,
; H0 A- G! Y2 z/ }            salary) new_salary9 _# s3 T0 F8 c0 `: _/ ^4 D
from emp_ning;
) T, X3 {" o. d4 S& C- B$ n! s
& K+ ~, W4 M9 s0 b1 z7.薪水由低到高排序
9 u. D( k# [# n  g2 M# j& F. @  O; Pselect ename, salary from emp_ning6 z% ^7 ^) f  r. ?  }5 e5 M
order by salary;' f. Z% {* F  j7 ]% I
8 s! |: s8 G& x+ A' B( ]
select ename, salary from emp_ning, @* r- g/ r9 `9 f
order by salary desc;  --倒序排列 descend2 O) h" Y; p: s% j0 a

/ f2 e' V2 j# ~, m# N) x# Ldesc emp_ning; --查看表结构 describe
- }+ D9 {- a0 ?+ t8 d/ s" `* Z8 L" \: {- Y& H
8.按入职时间排序,入职时间越早排在前面。
  X$ d3 E2 m; b7 T0 m6 p* O1 H' i& Kselect ename, hiredate
# V) i( p0 r8 r, vfrom emp_ning/ U2 e7 }+ g  w$ R0 D/ S6 m4 ?6 u
order by hiredate;( M- t/ i; O; N

4 Y8 b/ \$ A& g9.按部门排序,同一部门按薪水由高到低排序
0 p/ m: h  W0 `1 Y& p& D2 f/ Lselect ename, deptno, salary: e  M: }) F: o% M# K3 C4 z
from emp_ning+ K: {4 I) R, M0 {
order by deptno, salary desc;
# e( m& }+ s! }# }
' o3 P6 |8 Y5 i$ W/ M10.员工表中有多少条记录?
  @" k0 ]& ]: n" fselect count(*) from emp_ning;. m8 c6 g9 G3 [; _5 R) S5 s
) u& `9 o6 l# o) U" F
openlab帐户下有多少个表?2 J) ^* j# c$ y& q
select count(*) from user_tables;& y* G+ i  U" g6 V) E, I

) }; x  V- m0 f& A5 W9 @openlab帐户下有多少个名字中包含emp的表?
$ F9 t2 I! Q1 k' `% }select count(*) from user_tables6 n+ t. X/ u" O$ w" @
where table_name like '%emp%';
5 J, n7 S- Y' _2 \$ X
" j7 C. u# ?  E  Q2 e1 I3 Y  O--表名默认大写. |4 N" l2 Q" O7 T0 ]" c+ B9 M
select count(*) from user_tables
* x9 s: W# S+ z9 q5 Vwhere table_name like '%EMP%';5 p" p3 m: `6 ]" m
0 m* B# x+ h. T
--入职时间不是null的数据总数。. p% m# w; r/ u/ r4 Y  I
--count函数忽略空值。; |% |( O5 P8 H! E9 }& M* r/ ~9 Z
select count(hiredate) from emp_ning;* R' P1 h0 U4 M. R! w

# S7 I3 Q* u" y! m3 n8 o2 V* D" L, a11.计算员工的平均薪水和薪水总和是多少?
) f% n* p" ^9 yselect avg(salary) avg_sal, ) ?$ v; N' N- {+ K! Q) |
       sum(salary) sum_sal
" B/ t1 R5 R9 t8 Sfrom emp_ning;
6 Z* H' h0 p: e, B( w" n. b# I) c# v* L$ C: Y. n
avg(salary) = sum(salary) / count(salary) , w+ H( ]$ x- ]# }7 P; V1 w
              68500 / 10 = 6850
, p$ b. Z- B4 f" {4 w--纠正逻辑上的错误
: J# I$ J# B2 e, kselect sum(salary)/count(*) avg_sal,
/ Q. A( g7 U. z. Z* t9 k       sum(salary) sum_sal
( d5 ^. A( O( k. r1 ^# a7 Nfrom emp_ning;
, G% p$ m) P6 y' ^! V2 |: _5 F$ |3 Q2 ]8 l+ C4 N
select avg(nvl(salary,0)) avg_sal,
) B& b; o$ K6 k( W2 q       sum(salary) sum_sal
& h/ A, Y/ H2 k* N4 E/ Bfrom emp_ning;# _. S: u6 S& P8 c4 x( v
$ o$ L) K2 c( [. N
12.计算员工的最高薪水和最低薪水
; X; s8 P0 ~& b" O, Sselect max(salary) max_sal,
* d2 O$ a3 _( h! R: }2 _. \       min(salary) min_sal
( Y& R& @2 o- k) Bfrom emp_ning;8 Z- S3 \( P; I+ ]

& J/ L& u  K7 i3 }组函数:count / avg / sum / max / min 忽略空值
, J$ D% L$ c& o. M# W1 d其中:avg / sum 针对数字的操作。2 z; M. \& `5 G0 _" S& O4 e6 l/ n
      max / min 对所有数据类型都可以操作。2 E: U: a4 }0 r. u# c

" c- }& b2 F  l. g; c6 Y+ h13.计算最早和最晚的员工入职时间。7 i. b8 M. P0 U. e# R6 }
select max(hiredate) max_hiredate,: G. E" ?, i* b$ K5 B& Y& e
       min(hiredate) min_hiredate7 n- e/ L  q" C+ a  D
from emp_ning;
" y7 Q3 j4 l, u! B9 r
( R. n% L8 Y2 e2 Z9 u) u14.按部门计算每个部门的最高和最低薪水分别是多少?# |8 u. K+ E0 _% _  ^4 ?
格式如下:
( Y% Z, U8 Z1 e! ?10 4500   3000
9 i. s* r5 `+ H20 15000  8000
2 S, p( u1 J" g4 W( t' T# S5 v30 10000  5000  ~" S! _+ A& p2 R- [; ^, t

' q" j" o/ ?2 H--group by 列名 : 表示按哪个列分组
+ V0 ?- n- D5 ^/ b$ [% q' Cselect deptno, max(salary) max_s, min(salary) min_s
: S+ t8 @6 g3 f5 dfrom emp_ning, T/ D3 j2 a* o0 N
group by deptno;$ Z1 \/ i5 n3 @) T6 N
. {" L, G2 @1 |, H% G# X
15.计算每个部门的薪水总和和平均薪水?
# @+ j7 c* k9 u! u* ^9 Lselect deptno, sum(salary) sum_s,
- O* n/ O# }$ J1 ^7 t( U3 _# f  W' R               avg(nvl(salary,0)) avg_s
1 B1 D. A3 j) W: U3 @from emp_ning
: `; Y4 f# w4 g4 c* h' W5 F  J7 wgroup by deptno;' a0 ?) o* |6 f1 t9 J+ e
# d3 v  M% G7 d
16.每个部门的统计信息:格式如下:
3 M, l# R3 r. c9 e$ O4 udeptno max_s min_s sum_s avg_s emp_num$ s4 u- V# @* Q* d3 [; s
10     10000 5000  23000  6789       3
/ K$ t. m0 d- D....
1 {( |% o/ [: N' dselect deptno, max(salary) max_s,
: I) y# w* a. h( z& R               min(salary) min_s,
4 O. F, G9 m# Z" l4 p2 S2 [0 N               sum(salary) sum_s,
: Y9 o- ~; K, L" O               avg(nvl(salary,0)) avg_s,
, u  [: B: W2 ^5 h               count(*) emp_num. @" q5 c9 O- D; r+ j# H
from emp_ning
! C2 h4 ]8 E4 M9 J  N- O7 c. qgroup by deptno;
) n0 Y8 Q( Z0 G! D& t& c) P5 d  D# \) ^. m
select后出现的列,凡是没有被组函数处理的列,必须
$ j% [# D. ~/ C: D  U2 Q% o出现在group by 短语中。
! l  G+ U: J: h) Z5 x7 T3 \: g, }9 Z1 y2 C$ W0 v# k
按职位分组,每个职位的最高、最低薪水和人数?) ]' O) H- U) Q/ f3 |9 V9 m- h, R
select job, max(salary) max_s,
, y6 c2 {4 D, c" n            min(salary) min_s,' a5 ~# L2 @; z
            count(*) emp_num: a; N( a+ b- ]( x* M, f& i& f. ?
from emp_ning
8 ~; }/ p  K8 m! {group by job
& U7 N$ I% X) |" z. yorder by emp_num;
0 `4 T  A/ ^! y3 M" Y6 p1 K; c2 x$ A17.平均薪水大于5000元的部门数据?( B$ l  N& r% Y1 J+ W5 d' W* y/ I
select deptno, avg(nvl(salary,0)) avg_s
& g$ x$ [$ u; v% J" A% Ifrom emp_ning
: g$ U- O: O: G( h% b8 pwhere deptno is not null2 }! o9 s+ G* z4 X0 C/ {# K: _# J
group by deptno1 g, z1 y, H5 ^( N# j% i/ _+ C0 j5 J
having avg(nvl(salary,0)) > 5000;
. b& V6 `8 Z- G. ]: f! r
5 i3 _4 p- h3 W$ v; h$ o3 o# i18.薪水总和大于20000元的部门数据?
# S, E, v8 z- e; f& {select deptno, sum(salary) sum_s9 B# P! G# N& z% |+ k' j6 F
from emp_ning
- C! F9 i+ E) |2 P4 F1 Swhere deptno is not null3 C( X9 Z& T- P$ Q  w1 x& W5 Y  ]6 K
group by deptno& f/ \( x( R0 c5 B: Z0 S
having sum(salary) > 20000;$ z# e& x: P& Q- s  i- M9 m
) t/ p8 H( I- J" A3 c$ O, ?0 G( t
19.哪些职位的人数超过2个人?9 _- r* q) L4 r" S, r9 E
select job, count(*) emp_num
" ?9 ?( |6 Z6 ~$ @3 M% V& y  Rfrom emp_ning! {. S) j1 Z' m4 {3 l
where job is not null
8 e4 f. ]% d$ F: N' {group by job
9 ]- G. _1 j! |% `3 phaving count(*) > 27 y' R: _7 O; z. C7 ?6 v
order by emp_num;
; ^/ @6 n( R0 n/ }/ F. }
3 y. d1 V+ ], d( @3 a( t: I/ F

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


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

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

   

关闭

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

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