我的日常

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

动态微博

查看: 1752|回复: 0

Oracle增删查改 day02

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:40:52 |只看该作者 |倒序浏览
SQL*Plus   
9 l7 `5 D8 ~& f, P4 L  u& a4 Qsqlplus.exe + i% k! L$ J; Q9 P6 q

1 c* w5 L" [, g5 [* i1)数据定义语言:create / drop / alter / truncate
) J2 y7 Z! r. e8 Y, \& G2 i对数据结构起作用。
# p+ b3 l5 t! Z$ f( M2 D$ _' U3 `  ********5 f9 n3 C' Q, m2 y
Data Difinition Language: DDL
/ K$ P) ?- Y# C7 E, J: V2)数据操纵语言:insert / update / delete* H7 ]" S/ R: ~+ q' e# u# j5 |7 e
对数据起作用1 C4 K, H% w) ~3 u7 t+ h
  ****
; h1 Q! ?4 Q0 [8 r" D; _Data Manipulation Language: DML
. r$ z0 M! H" S+ X6 f# y+ E3)数据查询语言:select* _* G5 i2 r$ R
      ****$ w0 h0 f0 Y0 {
Data Query Language: DQL
& z2 H9 l1 h. W- m# Q' E4)事务控制语句:commit / rollback  t+ W0 U( x6 `) K' l) w4 U7 z
对DML操作确认! q( Q( p( F* A3 y( H
" @+ O2 @4 V3 [9 u/ u; ]6 _% w4 f. o5 ~
一、学习单表查询语句。/ q3 X' R+ ^1 h. y7 S) |& O9 S8 y
1.计算金额的四舍五入?2 _9 Q* V" a2 U
select ename, salary * 0.1234567 s1,
2 A4 R5 R' X- f8 h) r4 z3 Bround(salary * 0.1234567, 2) s2,
- s# n9 s* z& ~( v. E. Y) Pround(salary * 0.1234567) s3,
# f5 `, v2 Q4 N& C2 Vtrunc(salary * 0.1234567, 2) s49 y" D2 D: I# E+ s  f
from emp_ning;' n) t1 F' r+ K% J. T* w
0 \! C- V2 J/ `
round(数字, 小数点后的位数):四舍五入
$ }, O9 P3 i' d- Q. A8 F2 W如果没有第二个参数,默认是0.  V$ L# w' q6 O+ a* l0 V
$ o0 X- T9 B4 I& w
trunc(数字,小数点后的位数):截取
1 y4 m' N- N' J" U4 E! n如果没有第二个参数,默认是0.
- ?% B- K+ g* G$ d% F6 F$ [& p6 N) l/ P. `; B8 t
2.Oracle中的日期
, Y7 \4 o: Y* t( y* E1 r5 p5 i1)取系统时间的函数:sysdate
+ J: F1 j4 m; N! q( X0 n, vselect sysdate from dual;
& ~" y4 h7 z: _" x$ F
. J* y; P' y4 H, F2)把时间数据按指定格式输出
6 [' i, c) _: d; kselect to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
: O* P7 t, b( p! v  X* U. }, bfrom dual;& l) C9 L9 M2 e0 R& O

1 g- a( S7 I0 N4 x; G' p/ fselect to_char(sysdate, 'year month dd day dy')% D7 m; o  Z0 Z' E) R0 e8 H8 h$ [
from dual;
( @. q! S7 k7 q& p  @
8 _, g( I! b( f9 ?0 u# H) o. B! Xto_char(日期数据,格式)" c5 c' E/ r- d( e# G- e  i

$ v0 Q9 G" @) N3 i2 e+ }: L8 Hpublic String to_char(Date d, String style){; T, M% f4 L1 o
        //SimpleDateFormat把d按照style的格式转变为字符串
8 w: v( |: R; v/ d& }6 u* B5 b8 T        return 字符串;
. \! m! c# x! d}
5 i9 j/ ?7 c. k! a7 ?$ S% g- a5 }$ Z) h/ h2 p
select to_char(sysdate, 'yyyy/mm/dd')3 j6 g6 F. b# F5 s- B) \* S
from dual;
" ~8 c' e3 E: I* w- V
) l$ M+ L! F8 R! @6 T+ C4 myyyy: 四位数字年  20116 i; d/ `+ F; A
year:全拼的年 twenty eleven% h: k) p2 N! c! g" d* O
month: 全拼的月 november  中文:11月
! f- f% b0 P6 Z/ W, w- Emm:  两位数字月 11
9 }3 J( `! d+ F! O: ]mon:简拼的月 nov
$ |+ z# z0 w" Sdd:两位数字日
- a- C( a5 ?. E# p) V7 b' ]3 uday:全拼的星期 tuesday* n! o% M0 p& I9 \6 s9 s
dy: 简拼的星期 tue
" t3 o0 g" u: n; u6 y% }0 Eam: 上午/下午 am/pm1 g( o& X0 {  U$ H9 h0 X) W1 |

' G0 R, j, v5 A% v0 B  wsqlplus中日期的默认格式是:DD-MON-RR
1 \) c: R: q; L5 e现在的时间是2011年
4 t# E, e- a5 ^* B! X           YY           RR7 A2 G+ n  ]& M: w6 t
05年      2005         20056 ~: h% B  `$ \6 g% H4 S* c
98年      2098         19984 `. a* A/ u5 P5 f' w5 A2 X# S
2 T6 P7 \- h' O$ q* X) }! H  }
假设现在的时间是1998年
2 o* J0 y. _$ U05年      1905         20052 ~5 o' h( a' Y5 v" @
95年      1995         1995
- J( z/ B) h, b8 [
8 F9 K' R" Z0 E! pinsert into emp_ning(empno, ename, hiredate)
( h6 b! W/ a- F$ Pvalues(1012, 'amy', sysdate);. g7 ?+ m% d4 |( T4 I
--实际入职时间是2011-10-10
5 R: P4 f' y# B- L5 g3 n) ]insert into emp_ning(empno, ename, hiredate)
: F. g/ ~7 T3 Dvalues(1012, 'amy', '10-OCT-11');1 @  z7 l" B# I* m# L: z( u

( \% r% I* V4 Linsert into emp_ning(empno, ename, hiredate)6 ?5 r' y% S: I/ Y
values(1012, 'amy',
) B& [) |6 |( a- f0 ^to_date('2011-10-10','yyyy-mm-dd'));% U, A0 I7 H1 Q- x5 H% S  t/ q) d" ]
- u# _: q5 b, W/ ]% w
显示员工姓名和入职时间,显示格式为:. [" h' S' B& t
amy   2011-10-10
8 C* ?0 P' ]( Y8 r; J5 m
+ D, v3 R, s& |$ B' t% l         to_date, A+ i9 m6 T/ J( M, m1 J9 D
字符串   --------->   日期; Z# ?" \: l$ }5 u4 n5 [# `
         <---------
) B7 R4 q% w/ H3 K/ {5 R         to_char7 ]8 |; o: ^1 l$ p7 o; U4 W
5 Z8 x) [# y) ?; M1 o4 W3 {, b0 M
3.计算员工入职多少天?
. s& a* u4 `; J7 T" L1 K* Gselect ename, hiredate, (sysdate - hiredate) days; L7 M; q0 i8 \' s
from emp;
  ^2 e: ~. K0 c5 E. u1 n, @6 C
0 P+ \2 b& L  I6 K5 V, J6 O日期数据相减,得到两个日期之间的天数差。' Z. w% x0 X( P' q5 F
不足一天用小数表示。2 Z7 A6 }9 [. V5 l7 E$ |0 D( o# _

+ _: b, @+ }& Lselect ename, hiredate, + W. _8 N: n1 S7 W9 ~. V6 K
round(sysdate - hiredate) days; n/ [8 j: q  \3 w8 |/ y
from emp;4 l" Y) ?: X8 i

2 M& R4 N) \2 B5 U6 f+ l4 o4.计算员工入职多少个月?用整数表示。
" i% H- d. M; v# G/ l% f7 Nselect ename, hiredate,
0 E7 |3 Y8 \( t: o2 T# ?: B1 W# j0 y1 Emonths_between(sysdate, hiredate) months
% e3 O+ ?7 H) E3 lfrom emp_ning;
% m$ ?% @0 o* T+ V
, A9 i% }2 s. B0 v; h6 Kselect ename, hiredate,& z, o- Q* j2 p& ^
round(months_between(sysdate, hiredate)) months' ^( Y, R/ }% \+ z- W6 l8 C# ~
from emp_ning;! X3 ?' a$ y+ }" Y: Z: s  y

0 d0 h6 V0 i& I* P: K( ~+ b% D5 t& tf3(f2(f1(p1,p2),p3),p4) : 函数的嵌套
" h5 A& Z7 y# |6 `! |. u5 {
+ _+ K- r& T  i0 N: X1 s5 I6 R5.计算员工的年终奖金# K& u. b  y4 r  f7 ~& }6 B
bonus不是null,发bonus的数字。
, L+ L/ D6 p: i: R8 C) n4 m8 T/ `bonus是null,发salary * 0.5.
7 T) G1 t' Q; [- H: t  zsalary还是null, 100.
+ g0 L3 p3 W- J- _' w/ _4 o
3 w: _' Q5 {4 }) H) p' O: k& bpublic double calculate(double bonus,
! S/ G& q2 m* g% E& \                        double salary,7 x  w/ b. H* ?0 w7 w% _
                        double comm){6 g. D# m. Z* r& b7 T8 p" ]
        if (bonus != null) return bonus;9 O! g) F8 S+ Y
        if (salary != null) return salary * 0.5;4 `9 |4 x+ G0 V( n0 N+ Z1 r2 a9 Q
        return comm;                        
* j7 ]. G8 Z8 C' t5 P1 ?; N}7 h7 c4 V. B3 d
--返回参数列表中第一个非空数据. f1 N& K4 V5 Z* G
--最后一个参数通常是常量。
7 N: [* G# ~6 z6 g" C( Y& wselect ename, bonus, salary, 8 v' D, n' P8 k4 L" u6 t/ i# D
coalesce(bonus, salary*0.5, 100) bonus
  m0 y% A+ ~! d1 a9 Lfrom emp_ning;9 K5 l3 Z: y0 w! e, o& v

! v( E8 |- m# @8 r9 }1 V( a. g, n5 U0 q6.根据员工的职位,计算加薪后的薪水数据:3 ~! D! i' f9 M, ?% `8 s: p
Analyst: 10%
8 Z& \- p& [2 N6 L+ y* e& j) O2 ]9 B! DProgrammer: 5%
; ]/ n9 K# d4 P" D) lclerk: 2%; B! ?0 }0 j* v
其他职位:不变。6 |* C" R3 z" f" `) [
4 {* U* ?* _! b
case语句:, z4 ]/ Y' t4 x5 D4 j3 Z" p+ g$ B
select ename, salary, job,
6 U2 U8 ?( H4 ?+ v9 `, `! Xcase job when 'Analyst' then salary * 1.1
7 M" Z0 Z* A4 `9 {" T         when 'Programmer' then salary * 1.05
% A* D2 R& |; e2 w0 W- e7 i         when 'clerk' then salary * 1.02" q  [7 h# N& M1 @) J" @# l6 M
else salary
/ C% t' }6 \' Z# L. aend new_salary
- O' A+ M1 w$ X+ O. }1 zfrom emp_ning;
& \: K9 ^+ A2 E8 ^0 |' s$ \
! Y% g  J  J+ {- X% M8 L% Eselect ename, salary, job,7 V( B& E4 N6 u0 G' [6 ]9 g0 d
decode(job, 'Analyst', salary * 1.1,3 H& N: I: w5 |+ j
            'Programmer', salary * 1.05,
- X/ x+ V* u6 I9 ^. ^            'clerk', salary * 1.02,2 ~8 P& x: ]$ ]! A0 q) d" k
            salary) new_salary
+ o' g! V  A- z0 f7 s8 Y. sfrom emp_ning;
2 k' U8 @" U  H( z( |7 J9 C. P! i9 s- c3 _6 j% Q5 Z
7.薪水由低到高排序
( |& x9 i* n0 I: w$ `2 ~' L6 sselect ename, salary from emp_ning4 s* y6 j0 Q; ~  Q
order by salary;1 y" @/ C; B# i9 Q( I$ Q" S
1 W2 y, d/ ^# F5 h7 u
select ename, salary from emp_ning# M/ l' M( L- F
order by salary desc;  --倒序排列 descend
1 L2 s# [; @) m: O8 O
1 ~% @$ L7 p/ ?# [" ^desc emp_ning; --查看表结构 describe2 V0 T! W1 x9 c: N/ l7 \& q

. K' {; y9 H: \( k6 |6 h8.按入职时间排序,入职时间越早排在前面。
5 c/ W& Y# k" G7 K3 O( W1 J, dselect ename, hiredate) O& Y  l- C" i  _3 S+ O' c" N
from emp_ning
9 H8 p; |# K: a6 J3 jorder by hiredate;
7 h# \1 U0 [) s" z0 Z1 K. _- a# Q- o3 k. l; c9 N
9.按部门排序,同一部门按薪水由高到低排序
- G/ p1 x# X  e  O. Eselect ename, deptno, salary) g. w3 b2 i$ \6 c, ]* ^
from emp_ning6 _( z1 l9 l- ]6 f
order by deptno, salary desc;
4 c1 F  c$ J- w7 x3 O$ Z' n) Q& G' g+ D, e8 s" u0 x" U4 x; U- D
10.员工表中有多少条记录?/ |) s) {! u$ d' J; w
select count(*) from emp_ning;
, J4 m% }& A0 m  Q( y" C
; ~7 f7 Z& a/ J: j" yopenlab帐户下有多少个表?& s% x. A+ G  J4 m- ?
select count(*) from user_tables;3 E* L. {" ~) k6 O* Q

2 R$ I# l, o: x& iopenlab帐户下有多少个名字中包含emp的表?
) e: m  ^" ~) ^& }  Kselect count(*) from user_tables7 \1 R! @" Q2 G8 Y& ~
where table_name like '%emp%';5 ^- Z* h/ J( R. M

' }$ g/ a' o, ^) B% a--表名默认大写# G8 S8 ]% |0 w1 l
select count(*) from user_tables8 E: [9 j9 E* R3 z% H
where table_name like '%EMP%';/ l7 p" ?+ ]* q

, L# y# y7 u% C. ?1 u) w& w--入职时间不是null的数据总数。
0 T: `; s5 U0 M* w--count函数忽略空值。
  w6 u. _. U- f, p- Lselect count(hiredate) from emp_ning;9 T7 U$ \  l, k, K' o. R$ w- U0 k8 s

- d0 H# |" ^4 d) H4 r( T11.计算员工的平均薪水和薪水总和是多少?! v/ W* a8 Z. ]8 O# k0 M1 B
select avg(salary) avg_sal, 3 @5 L" }- O! O  [: {2 h6 `5 r
       sum(salary) sum_sal% z4 }- b6 E7 u6 N# S9 I
from emp_ning;
3 L6 V9 D$ R  j& K
$ h% D  k6 t3 \avg(salary) = sum(salary) / count(salary)
( [# L0 d0 z% Y  ]; S              68500 / 10 = 6850
; u! }0 L1 x. w: I  W5 _, j--纠正逻辑上的错误
" O0 ]& e0 j5 I. n4 H" @& s. Pselect sum(salary)/count(*) avg_sal,
1 X* S0 X: b. Y       sum(salary) sum_sal
+ ], w% B& n$ efrom emp_ning;
0 E4 t3 i3 J) V- ]
- _" ]7 H2 W5 b) Z9 J# Gselect avg(nvl(salary,0)) avg_sal,) E) `  E8 w; J2 |; }. W6 F
       sum(salary) sum_sal+ k0 j$ }4 ~2 m5 t. V
from emp_ning;; r( {1 P9 i: m( x( E
! e% O( s7 A! `5 o/ o7 ^
12.计算员工的最高薪水和最低薪水1 w0 U- I2 Q" D$ P+ M
select max(salary) max_sal,# W; O/ J% K: n* Y& a+ G* m
       min(salary) min_sal* j$ S' [! Y& T! d+ W( k
from emp_ning;
4 Q! n  Y% `- N1 h" P" z( E
6 \2 L9 T$ _6 d组函数:count / avg / sum / max / min 忽略空值
8 S0 e- U0 @" G" v' x其中:avg / sum 针对数字的操作。( p- k% W) @0 s+ X: M' y, Z# W
      max / min 对所有数据类型都可以操作。
  M, m$ h, _0 |# f; _! Z0 t6 G% v8 z- j
13.计算最早和最晚的员工入职时间。
5 Z) q, {$ D% uselect max(hiredate) max_hiredate,
7 f- G" B2 n; E/ ?7 @       min(hiredate) min_hiredate8 C3 f5 u! C0 }5 Z
from emp_ning;
( r( w4 F- l9 n% Q/ ]; |4 }8 M  a0 g* t
14.按部门计算每个部门的最高和最低薪水分别是多少?
. l8 @: q* N; l/ J+ M8 ]. U格式如下:
2 D5 T, W, |- i& {10 4500   3000/ `; u8 Q% q1 z7 d5 P3 G
20 15000  8000* N1 ]. M$ s* z# `
30 10000  5000
8 J. r" c: A6 F) P
7 }+ S/ ^1 u3 ^* b( [7 X, J3 J--group by 列名 : 表示按哪个列分组
7 c6 d/ [6 m6 |. Sselect deptno, max(salary) max_s, min(salary) min_s  H7 u7 c- _( b: R5 w$ [: m* j. b
from emp_ning
( A1 Q6 D, ?3 s9 k$ @4 ?group by deptno;4 F: ]3 ^4 U6 X1 ]: n
  c0 d$ W8 e! l; Y0 y
15.计算每个部门的薪水总和和平均薪水?
5 ^7 O7 z) r8 ^! f# y6 @! Bselect deptno, sum(salary) sum_s,
) O4 G- `* H3 k/ `% J               avg(nvl(salary,0)) avg_s" d9 P  n, i5 w  P) {9 J: k  d
from emp_ning
5 X" G) o0 P/ g9 D8 V3 E! ggroup by deptno;, d5 Q" a0 c6 e2 M% V' W0 L
( b, E: V7 `4 b/ o/ _& Z
16.每个部门的统计信息:格式如下:" y/ u) V* U/ C1 Z- M7 S; H# G
deptno max_s min_s sum_s avg_s emp_num
4 i# ^/ `* G# s: b& i2 l4 n' @10     10000 5000  23000  6789       3- U* \* c4 J- K$ @, I# S
....
6 E5 B, J/ w# |7 Uselect deptno, max(salary) max_s,
% |3 _- m5 r+ V) {5 @# F               min(salary) min_s,1 g/ t+ d# g) e
               sum(salary) sum_s,
' f6 r* w  |: C8 I" y" `5 ^               avg(nvl(salary,0)) avg_s,
8 b: c1 T+ q4 A% `               count(*) emp_num9 }  f3 E# Y% M, @5 u& G* I
from emp_ning
) \: o* k  ?  t) K1 @6 Tgroup by deptno;* O% h/ p- [9 i( S# a. R# D

  ?, N6 e. @8 I. t4 C3 Fselect后出现的列,凡是没有被组函数处理的列,必须
9 B! P3 D' D- t1 f2 z0 f出现在group by 短语中。
& F0 T9 d+ P& f- N& r+ ~9 A# z# D) Y3 p
按职位分组,每个职位的最高、最低薪水和人数?9 n5 {% r8 v: }$ y2 {/ l7 C
select job, max(salary) max_s,
' w8 Q4 X* E5 q            min(salary) min_s,+ t- V& K( B6 s* e/ L% X
            count(*) emp_num
8 ?5 ?  }3 F, @from emp_ning, z% h( g+ Q$ j# K
group by job
+ v' F  v5 C3 W; ?8 B7 corder by emp_num;2 _( I' h- T6 @$ t' Z$ l2 T
17.平均薪水大于5000元的部门数据?
$ ]1 r: X+ o) Sselect deptno, avg(nvl(salary,0)) avg_s5 n/ T" U1 j* G7 ~5 Q( r, F/ q
from emp_ning
; G0 ~! X( M, T, M  D# Q% {where deptno is not null
5 z+ @1 H0 y1 I, {; E+ Dgroup by deptno  ?1 b9 }* \' M  }4 Y' X
having avg(nvl(salary,0)) > 5000;
; [2 l6 q0 Z# |6 v6 y9 d1 \- n( l, w% `4 O7 s/ _: I
18.薪水总和大于20000元的部门数据?9 I' i* |( ?" I* i6 f8 J; H) V
select deptno, sum(salary) sum_s
, [( m$ M, u; g3 s+ h7 q+ pfrom emp_ning
; p: U' b- o) l; Z" c7 N4 k5 Pwhere deptno is not null
! J0 d5 v$ R, H9 Pgroup by deptno- w) V/ A1 J0 g7 }8 j) E
having sum(salary) > 20000;7 ?% b' P, k2 v4 y; G  F

- L7 a+ @4 s5 g# G19.哪些职位的人数超过2个人?
7 J) z$ s, }2 q# a" ?* d' f( kselect job, count(*) emp_num
- b, ~- U6 @. `from emp_ning
5 R- D$ _& D! l5 i) K8 ^- Pwhere job is not null
) e' @2 l9 J, G# cgroup by job1 B6 s1 w( P8 D
having count(*) > 2
- d  O$ w9 }& O- M" S5 O; Xorder by emp_num;  p- u& U! p7 U# G  V. @

' `% P& M$ {/ t

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


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

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

   

关闭

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

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