科帮网

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

动态微博

查看: 1804|回复: 0

Oracle增删查改 day02

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:40:52 |只看该作者 |倒序浏览
SQL*Plus   
/ K% ]1 s: ?" [7 Z0 n4 \sqlplus.exe # H4 L( D. O( [  ]# ^
$ Z: X0 `8 Q( K
1)数据定义语言:create / drop / alter / truncate5 T3 F% l4 O" h  o: t
对数据结构起作用。/ J7 r3 `2 U. o; ~1 J1 I
  ********: N+ ?7 n+ p7 ~0 w
Data Difinition Language: DDL& Z" _+ |  s4 Y+ N' w: P
2)数据操纵语言:insert / update / delete6 b" ^2 w0 e2 G- F$ @0 |
对数据起作用8 C& |4 q- r! a
  ****
9 }" I4 m1 f/ Z6 Y0 H; Q1 |Data Manipulation Language: DML# x: C5 O* I2 \$ L! Q3 G) q9 m; i
3)数据查询语言:select
$ {  x* |1 @: c* Y# b- E      ****
) l& N) P8 i( W, |/ S7 CData Query Language: DQL0 v/ ^% L& W. x0 M3 \5 J* ]" _) ^9 P
4)事务控制语句:commit / rollback
3 R, P$ b5 d$ J) E3 D4 T2 P  A/ w9 T对DML操作确认
: Y4 x3 [$ g$ e! A/ n
( f& @; t8 w- a8 P) e一、学习单表查询语句。5 @/ Z4 Q0 }( @& i: F7 @
1.计算金额的四舍五入?
% o8 `# [( G5 N4 j3 Aselect ename, salary * 0.1234567 s1, & I, \! @4 ^) S
round(salary * 0.1234567, 2) s2,
/ q5 W5 B7 U: ^7 I# ^round(salary * 0.1234567) s3,
! P  g7 z* P( p# _- B: ^# Y* \trunc(salary * 0.1234567, 2) s4
* B! g- B, n+ n4 D; d' ~from emp_ning;% r& \7 B# i7 H) }

  F$ ^8 a+ e# B1 sround(数字, 小数点后的位数):四舍五入
6 b  f  ^# Y' ?如果没有第二个参数,默认是0.4 H8 P: b; |6 ^, r* m( l( [
& R7 p/ \) k, k9 l5 T
trunc(数字,小数点后的位数):截取
5 A/ i- q5 v9 z, @9 M. Y如果没有第二个参数,默认是0.3 e7 ~! f0 F6 ?

! N/ Y% ^3 B$ F) ^2.Oracle中的日期
# J; j5 G" D3 R* q" p% G' g$ G1)取系统时间的函数:sysdate
7 w) S! A7 w( l, N' W5 g/ Qselect sysdate from dual;
6 \; F) u- p0 K: U% N5 m" a; L3 ]+ g& o2 D7 ]  ^5 s
2)把时间数据按指定格式输出
# o  `5 a3 h9 E. {$ Lselect to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
" e; U4 U/ Y2 s) @3 afrom dual;; M( G" B$ _: |7 {8 V9 b
3 t; t  N; i2 e; j* R7 _
select to_char(sysdate, 'year month dd day dy')
4 I& w2 Y9 S( x2 zfrom dual;- F" `6 Z0 S" F; G& S! x1 T

0 D( a7 x: s! p5 _" |to_char(日期数据,格式)2 d/ w% H/ ]1 Q. t1 e2 E$ ?. a
% j4 H7 b) U* c' c" K! a
public String to_char(Date d, String style){5 {7 W: _3 G) m0 V# @
        //SimpleDateFormat把d按照style的格式转变为字符串: O" L5 b4 e+ i$ [
        return 字符串;
  V$ w! ?6 V4 d' e} 4 C& y. M9 ]! u, ]/ c/ X" J$ N
9 M& r1 [5 V2 w+ r' s: @1 k+ r
select to_char(sysdate, 'yyyy/mm/dd')% G5 J% d" D3 ]) N. E9 ~
from dual;
' V- v; T( @1 @& T
: |+ G# W* _+ v/ c+ C. Pyyyy: 四位数字年  2011  l; n- o- A1 C- H+ c7 O" {& |, m8 i
year:全拼的年 twenty eleven
2 u7 T7 X/ x8 a8 z1 j' l2 Amonth: 全拼的月 november  中文:11月
8 X+ {: m9 Q) u( Y! C. a* ?" v( r- qmm:  两位数字月 11
. Y6 R+ d7 @3 S! J' a9 R4 Vmon:简拼的月 nov0 n+ Q& V5 O; Y# A# z- |1 C
dd:两位数字日+ I' H  }; |6 R4 B( K( B
day:全拼的星期 tuesday; E" \2 A0 c4 n% ^3 g3 x' x
dy: 简拼的星期 tue& Z3 N& g5 V. \, I  z+ e/ K2 D
am: 上午/下午 am/pm
6 V1 S. z- ^. b4 b6 a
  m/ }1 ^! s5 a7 U" z3 \/ ?( Asqlplus中日期的默认格式是:DD-MON-RR
; e/ C! s1 l2 f* |# e现在的时间是2011年% C( L- ^+ y$ n" g2 W
           YY           RR3 ~# g- }  }! T3 K# L) X8 F
05年      2005         2005
  i+ P) V9 t7 j' e$ {98年      2098         19981 W, w  j! ]$ t% n

1 k2 ~: _* A2 y( b假设现在的时间是1998年
7 t6 t9 A, K& f1 f* n05年      1905         2005  b8 R8 d, e$ J3 T* K
95年      1995         1995 + }# n! C* j$ X- f

! \7 M5 r+ g% D7 r3 ^% Ninsert into emp_ning(empno, ename, hiredate)
! q( u/ o1 y$ p5 H3 F+ yvalues(1012, 'amy', sysdate);; c  B1 F# Q3 M' v( t1 ?/ v4 S
--实际入职时间是2011-10-107 N' |5 ?3 U, i
insert into emp_ning(empno, ename, hiredate): l# Z- m3 ?" R! i, q
values(1012, 'amy', '10-OCT-11');
# ^& w* R" Q/ K1 T7 @
- F( w( `  |' m! b- ]" Ainsert into emp_ning(empno, ename, hiredate)
! p  `( M7 T" g) y0 V1 p% {" Evalues(1012, 'amy', & j7 ^0 \/ d5 `5 o+ z. V
to_date('2011-10-10','yyyy-mm-dd'));
, P$ }; D8 m; v# U4 ~; y
  I4 e/ E$ Q) y4 t+ v显示员工姓名和入职时间,显示格式为:2 I$ |; E: m) S' d. s: R! a
amy   2011-10-10
- A3 X& ~- W1 K
% O$ }) |3 Z7 I) i5 y( F$ k, M         to_date5 C' f) v6 X4 z3 k7 W5 d1 [; A
字符串   --------->   日期' _  j" J* P8 }3 b. P4 o
         <---------7 ?; z. b, E7 T9 [
         to_char
9 h' w1 C; a3 A; h6 v; z% s) j" f5 |; w1 d4 p
3.计算员工入职多少天?1 ]5 Q* n6 ?! l; z4 ?8 X
select ename, hiredate, (sysdate - hiredate) days! N: r, f) M6 r, N/ S7 M7 j: s/ ^6 q
from emp;
& f7 M5 y3 |0 d. {$ l- b9 c, H4 Z* v/ U- y
日期数据相减,得到两个日期之间的天数差。. E2 L: ~& q# x* s; z$ \
不足一天用小数表示。$ U9 P# D; E2 c' E2 J% ]  x
/ V/ X+ k2 y: r( ~: t
select ename, hiredate, / {6 y  @! T( H
round(sysdate - hiredate) days
5 R4 G2 n# h6 N3 P: W, Yfrom emp;
+ e7 ?% V+ e0 v* B( G+ ]6 X- M2 O; b9 t
4.计算员工入职多少个月?用整数表示。
  ^6 b% }! d8 ?select ename, hiredate,
2 m& a- u& O2 m* hmonths_between(sysdate, hiredate) months
- I8 K6 H+ T! z- r; b: l8 Qfrom emp_ning;3 N1 ^0 P3 e/ ?% l0 [" p
, L* x* T) S" @& M6 g
select ename, hiredate,7 i% x0 l3 s! }# E4 R
round(months_between(sysdate, hiredate)) months% H' M2 s. @( ], e( ^
from emp_ning;
- M+ e- W* J5 L7 h; M! n1 N& ~  }! F3 I  t! O
f3(f2(f1(p1,p2),p3),p4) : 函数的嵌套' G$ l+ x2 Y8 ^) P1 a* \" l

3 n: i! d6 |) I: O8 S$ q4 x5.计算员工的年终奖金' L: \: i* G2 _3 w% @
bonus不是null,发bonus的数字。
8 l: U. I' W3 K4 [- m: _bonus是null,发salary * 0.5.  T0 n9 v2 t* T% P2 G* R' m5 i7 I
salary还是null, 100.; c/ Y) Q# M; |/ ~; H8 n. ]
# h1 r& u+ k  }
public double calculate(double bonus,
/ S9 t6 m$ Z6 g1 p% ^/ G, k6 r1 [, p+ g                        double salary,
' e  F, W8 H) B5 z' F                        double comm){
5 ?5 r: |) B2 [7 F* u' Q        if (bonus != null) return bonus;3 ?% K9 o3 ]3 N( W8 s
        if (salary != null) return salary * 0.5;
' q+ ]. l& v9 i/ `5 p3 V        return comm;                        
! h8 Z  b+ _+ b}
3 F8 U1 Y, Y( I( ^, E( Q--返回参数列表中第一个非空数据1 t+ r+ X5 p: {$ U0 K
--最后一个参数通常是常量。( m- j; }' N9 ?& d8 v
select ename, bonus, salary, + N! ], N5 D7 s
coalesce(bonus, salary*0.5, 100) bonus" R6 y4 E9 y+ X. Z& L
from emp_ning;
  f) `9 F2 z/ V/ ]9 B! y
! @5 ]2 s+ U- I$ o6.根据员工的职位,计算加薪后的薪水数据:+ j: L& X4 x: i' z7 Q" a5 ?
Analyst: 10%
* O* L$ n7 w% q1 ?Programmer: 5%
7 L! I, ]) y- P* @7 V- T  W7 vclerk: 2%  e" J2 l5 F+ q+ @& e1 z: Q* K
其他职位:不变。
0 v* ~" N; ]' Z; I. R" U5 v' {) s( x* D: |
case语句:6 u4 e  a& z4 z/ |$ ~$ Y
select ename, salary, job,
% C3 `, W% I( z; [# T8 ucase job when 'Analyst' then salary * 1.1
+ y' h7 W8 k+ \' u% x1 c4 n+ y         when 'Programmer' then salary * 1.058 c" [7 _1 a( {
         when 'clerk' then salary * 1.02
: e# ]- ?$ o8 V% Belse salary
5 ~9 B' m3 [6 o$ P6 J; o% |% Pend new_salary
( c2 B& t% Q# mfrom emp_ning;
7 c1 C5 k" z$ ^! e& s' S) H+ T% u2 \7 q* h& Z: C
select ename, salary, job,' b! V9 {: N' T# U! y8 F
decode(job, 'Analyst', salary * 1.1,& e, Q" U  g" l4 V+ d  z
            'Programmer', salary * 1.05,
4 {6 r2 W5 R4 I            'clerk', salary * 1.02,2 ?" @. ^/ ~( d' A1 ~  k; {) l0 d
            salary) new_salary
- p/ F2 R1 ^$ ]7 nfrom emp_ning;4 Z; K( `( {( Z* v2 q7 v) e

3 I3 r% i  G9 t' ~% e+ O5 j7.薪水由低到高排序
% X- i! A, I+ B5 h0 h6 R6 rselect ename, salary from emp_ning
4 d7 t' B! g3 q* j) |. Oorder by salary;. i0 M2 o! y8 U
# h( V* }  D. W5 `
select ename, salary from emp_ning) A, a2 ]% K) T/ K
order by salary desc;  --倒序排列 descend& n1 m7 e& {' o" x+ l9 @

& b1 H* F& |% Z& ]: n  `. L8 zdesc emp_ning; --查看表结构 describe  w& u6 t9 s1 I. d6 w5 g, S2 P

8 {: p1 h9 L) t' c; R4 G) t8.按入职时间排序,入职时间越早排在前面。0 t. w3 ^4 U. C3 R% m/ q3 S
select ename, hiredate# e) z: X' ]6 g( W# S  X
from emp_ning. ?3 d3 m. h! f5 T- N% g  e( x
order by hiredate;
( ^- f" K) \- Y& h0 s- }
9 g/ \' h1 U3 q9.按部门排序,同一部门按薪水由高到低排序: X7 i) Y+ }: `2 s8 `4 Y+ S/ `
select ename, deptno, salary
4 }* d$ ]$ J- J/ u: W6 cfrom emp_ning/ O) o9 T3 f7 c3 r' u
order by deptno, salary desc;7 k! O5 A- U9 g3 W* I
" [1 x2 [% t8 k- g" S5 d
10.员工表中有多少条记录?
) G) X4 y( Y7 L4 Y2 _# Bselect count(*) from emp_ning;
: L& s9 A- x- A5 C5 ~
3 f1 ]% [* b1 iopenlab帐户下有多少个表?
) F+ p3 d! K( H: ]7 P: Y7 gselect count(*) from user_tables;' g2 }8 g' |! @5 L

2 [$ O' e7 K4 Q- S2 Vopenlab帐户下有多少个名字中包含emp的表?
3 f, z' k+ t0 B7 a4 ^& q! v- Mselect count(*) from user_tables, a6 X% J# I- c+ a5 A2 {
where table_name like '%emp%';6 H( e2 f. g0 m8 F  t/ I: w

8 Z' d  v8 B. V- b--表名默认大写5 X& B2 Q, M5 X2 G2 ~- x
select count(*) from user_tables7 c) G5 K: @& U" c0 t% h
where table_name like '%EMP%';, t# g0 ]$ v0 b1 V) k" [! C3 Y
4 K% ~' o* B8 k; y. t2 j
--入职时间不是null的数据总数。. |7 c; T$ v5 e  j8 E; x
--count函数忽略空值。% z; k( z3 J/ \6 l0 P- f- u9 c
select count(hiredate) from emp_ning;
6 ], A0 j8 I7 i0 O0 x, R& p
; C: w7 ~2 i& S6 l; a2 f. e9 V" B) s11.计算员工的平均薪水和薪水总和是多少?- o5 Q5 n, k! X8 o# K) F! {/ z( _
select avg(salary) avg_sal, 5 t/ ^% x# h5 ~: m$ @
       sum(salary) sum_sal% E5 \5 Y" k7 }/ p( L& n
from emp_ning;
/ x: B1 \8 T" c' Y5 a6 @& H$ Y
8 {  ~5 P) O7 m9 \8 l5 Bavg(salary) = sum(salary) / count(salary)
) I* m( Z) r9 c. |3 f              68500 / 10 = 6850
' q! P9 y# N# [& D  w) C--纠正逻辑上的错误
9 _, e) l: A7 x7 Wselect sum(salary)/count(*) avg_sal, + y3 E5 H  U. Z/ t
       sum(salary) sum_sal/ b: g9 M+ U/ c2 j: P
from emp_ning;2 J3 Y3 p/ t+ |8 I4 }$ u* C
3 E6 f. l# _- A" C  z8 s9 c  ~
select avg(nvl(salary,0)) avg_sal," r* [. d# ?8 g; h/ j7 i
       sum(salary) sum_sal
2 y8 Z# r; D) ~! _, n( C1 G: A! j9 R0 bfrom emp_ning;
9 a# V( ]) y3 U6 a9 r3 l6 y" |
) H' J0 ]! m9 J/ z0 l12.计算员工的最高薪水和最低薪水
% J9 N! L# J0 i* K0 f1 h: M* Tselect max(salary) max_sal,
" G9 E- R/ O6 ?5 T* Y. F6 F       min(salary) min_sal) f  f4 ^4 ?0 U% D) ?# H
from emp_ning;
+ M3 K8 H" f& T; n  ~3 A' q. ~& f1 g# P
组函数:count / avg / sum / max / min 忽略空值) g- i; r% K7 p) w6 b
其中:avg / sum 针对数字的操作。  T5 r* \: T% W& q" z* z
      max / min 对所有数据类型都可以操作。
% C" q' J. j0 ]: ?3 |3 A: C& u' D: D" I
13.计算最早和最晚的员工入职时间。
0 E7 n7 q; P( l1 N: j& X+ t8 Uselect max(hiredate) max_hiredate,
4 ]: r; z- w  j: G       min(hiredate) min_hiredate
. A5 {) U: |: h# Xfrom emp_ning;
% o. M0 b  Z4 n3 n0 Y5 ^5 Z3 Q4 o# |
14.按部门计算每个部门的最高和最低薪水分别是多少?  D3 z- f7 a& t6 v6 W) O. l, O
格式如下:
5 t8 G) N. B( @: h5 w8 K0 D10 4500   3000
1 N2 |! j" w' b$ }20 15000  8000  \  l$ i6 ^" \1 s
30 10000  5000# v( D7 b) m8 @  V; W+ }- l

9 H- t1 a: F' Q+ W: `2 I) P--group by 列名 : 表示按哪个列分组
: Q% N2 ^9 Z4 w$ h/ U3 b3 w. aselect deptno, max(salary) max_s, min(salary) min_s# A  o1 ^8 B0 T1 q
from emp_ning6 B! }3 L2 G8 U- \0 s" z7 ~  P
group by deptno;2 I9 D9 P( B# l# o6 M/ Q

; b9 a2 z1 X- Y- _" R  q# v5 `/ q9 y. E15.计算每个部门的薪水总和和平均薪水?
+ [7 u/ ]2 o9 y# c, y* T' }select deptno, sum(salary) sum_s,6 b" Q+ b. j% Z6 u( j" Z% h
               avg(nvl(salary,0)) avg_s
! g; w( y2 I8 v& p' T7 p" |( efrom emp_ning
/ j- f/ i/ a0 g( \; I0 Q4 r, H2 lgroup by deptno;. i/ n; V! u2 U5 b  X8 Z
0 c/ q) j. n/ u# m2 W0 H
16.每个部门的统计信息:格式如下:
; h3 b; @# q: K8 q, {deptno max_s min_s sum_s avg_s emp_num4 |( u/ M! f/ ^; ^8 A+ m
10     10000 5000  23000  6789       3$ m5 B! O( E2 q* b# d& v) Q
....
$ u; u, D3 z2 T; V4 h) N. M) `select deptno, max(salary) max_s,7 }+ U2 J- d% {4 v4 t1 f
               min(salary) min_s,' @/ P) s" s7 ?5 [
               sum(salary) sum_s,
! j. Z( @) H) W5 @# {( I               avg(nvl(salary,0)) avg_s,8 K+ }6 L/ F  {* _! _9 f
               count(*) emp_num- m- G4 @" |& u. O. |6 r( e9 T) d
from emp_ning
. ^+ B/ o$ D! v, Y) ggroup by deptno;
4 {. k; ^# K8 u) S% w$ M
( f$ {4 e/ m) z2 w' z" s5 b# e% Dselect后出现的列,凡是没有被组函数处理的列,必须% i0 H0 {5 G& E+ h
出现在group by 短语中。
: `) i% z' o; g' D, s
" g  G7 l8 m$ O$ p- `/ [按职位分组,每个职位的最高、最低薪水和人数?
) C4 c* k8 {$ T% W$ Fselect job, max(salary) max_s,
* E  P/ s/ ]' C9 f- t: k            min(salary) min_s," e5 _$ s: @3 V2 P
            count(*) emp_num4 n/ J/ u' a/ G3 W" r
from emp_ning3 F- _: F1 C, T. j- V5 \% |
group by job! a4 ^2 N9 X- M2 e% l. {
order by emp_num;
2 `% o" K2 O, K# N6 Y# f( l17.平均薪水大于5000元的部门数据?
& A6 i( @1 o' c! o% T* l# e$ Jselect deptno, avg(nvl(salary,0)) avg_s
" o6 i: m) B  I. I1 Efrom emp_ning7 B9 S, k& [' z3 s9 a" H
where deptno is not null6 o6 e) |1 e9 X
group by deptno
: f8 s4 M( w% x9 X% b/ X2 Q; _having avg(nvl(salary,0)) > 5000;7 k( w1 Q) n. o1 h$ ]

% ?+ l. [+ O; k0 Q( p. A18.薪水总和大于20000元的部门数据?
4 F+ Z2 h- h+ S. u( U- Z& N6 v. `$ Fselect deptno, sum(salary) sum_s8 L% n. z, S2 Z1 p0 o/ B
from emp_ning
+ Y2 Q1 t8 Q, v- J7 r! f2 uwhere deptno is not null
6 X+ r, Z7 u" b" X8 e( b' Sgroup by deptno% o+ U  i4 n" `; Y, u
having sum(salary) > 20000;, T$ n3 K& V% ]  h0 I

3 K: W7 j% k# j  H5 Q19.哪些职位的人数超过2个人?4 `$ c0 F. G7 ]' E
select job, count(*) emp_num
, _7 }  ^/ @' g7 u4 efrom emp_ning& C, h0 g& d. w* M) n
where job is not null$ C* u9 m" Z$ b* W
group by job, K# Q3 Z4 `/ {3 I" V
having count(*) > 28 l7 q7 S, u! i0 b2 o
order by emp_num;
% q6 Q9 O5 ?% B* c, P1 y5 n! w8 ]1 ~  N5 i2 `' q

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


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

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

   

关闭

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

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