我的日常

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

动态微博

查看: 1718|回复: 0

Oracle增删查改 day02

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:40:52 |只看该作者 |倒序浏览
SQL*Plus   ; T9 z4 U% d( O2 y9 t; P
sqlplus.exe
5 t  C( {* S' L. ^; N/ `) l0 e$ n; v$ W2 x+ ]
1)数据定义语言:create / drop / alter / truncate! p! t1 ~: _( H2 P5 z0 D  [
对数据结构起作用。* ^$ g" f$ \# U& v! D
  ********6 R4 J& x' ~  |3 d* }$ J0 h( n
Data Difinition Language: DDL- N3 L0 M# Z* I* V2 k. Q4 Z
2)数据操纵语言:insert / update / delete: ]: D. h  j/ x: w1 ~
对数据起作用2 M: ?! H4 ]/ o, z! V0 P
  ***** p$ n0 i2 |1 C8 [1 Z
Data Manipulation Language: DML
2 @. {1 }6 Q; ~3)数据查询语言:select, Q1 J+ o$ {$ b4 S- F2 H: a5 K( }
      ****( D, _+ l6 o( l) m& g
Data Query Language: DQL2 f9 k9 L* ^0 W$ v$ |; e6 f
4)事务控制语句:commit / rollback
# f. j. k* P! {6 o对DML操作确认8 Y0 A3 T0 W3 h- U" d

/ W- W, Z. Q5 |2 i# G: k( h8 K一、学习单表查询语句。" J2 A+ ~2 E) _: F. e# A
1.计算金额的四舍五入?
1 I+ o/ e; E4 |9 o0 y. ]select ename, salary * 0.1234567 s1,   b9 q( V" @& u5 D1 [  B
round(salary * 0.1234567, 2) s2,
9 c, T+ O2 p$ Z$ ground(salary * 0.1234567) s3,
3 @1 R% L* ?. U! d5 {8 Ntrunc(salary * 0.1234567, 2) s4
* d% z" M- d4 r3 f9 cfrom emp_ning;8 A6 C+ Y: h7 q6 T# {; L
1 s8 u7 D1 }$ J4 ^* A& U3 i
round(数字, 小数点后的位数):四舍五入/ M) e9 n8 z" U  y- C3 G
如果没有第二个参数,默认是0.
1 c+ K% E. Y& A& z6 P+ S* D4 e6 g7 t  ?; ~
trunc(数字,小数点后的位数):截取
4 P* p/ F+ G, H' ?% e2 p如果没有第二个参数,默认是0., c3 k" J0 }) `$ D4 P

/ I6 J# T/ h* @2.Oracle中的日期8 e  S. H! ]* N
1)取系统时间的函数:sysdate5 ^+ M/ G4 J. f" s8 M
select sysdate from dual;# U! A0 n  K3 j: e  X1 n' o
: M. E6 F0 W; l8 F
2)把时间数据按指定格式输出) q, h7 Z' i9 L+ B! g  e  l
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
  R0 ?0 W4 d8 E1 F2 e- ?/ K2 nfrom dual;
! Q, A3 u9 W$ \- L
4 j7 Z0 t, F% ?2 Pselect to_char(sysdate, 'year month dd day dy')
* |5 x# J9 {  s* J# ?# R' Vfrom dual;
5 H8 k) r; {5 C! g* O4 T% ]7 s! w& g; L* U
to_char(日期数据,格式)% a4 Y0 ^. d) B- b" g# J, r# ?  H: ^0 z
5 }. ?: L3 r# N; U& Z
public String to_char(Date d, String style){
% s1 j) H5 r& v- b: \7 @        //SimpleDateFormat把d按照style的格式转变为字符串/ W/ M7 u/ R+ y" {
        return 字符串;
, P1 e1 E2 a7 z; `3 `! P} ' B1 W/ P! }3 a* S" ~/ l) o
1 A/ }7 U1 R# r! n0 v
select to_char(sysdate, 'yyyy/mm/dd')% X2 P9 n! G! p6 v+ N# W6 g
from dual;+ C6 f6 f) A! y8 y) u& u5 S  T

& B4 P+ ^$ x: q) Oyyyy: 四位数字年  2011/ r% V) W5 L8 n) W
year:全拼的年 twenty eleven2 X1 J/ P0 Y3 q$ w4 E3 V7 \
month: 全拼的月 november  中文:11月5 m1 w. V4 J9 U9 V3 |0 T
mm:  两位数字月 11
0 I7 @  ]0 g$ j/ ]& U7 [mon:简拼的月 nov, ~  w( d' p8 b8 P- l; w9 x2 @
dd:两位数字日! k8 U/ {6 W& c- r2 l, p# j# \
day:全拼的星期 tuesday
& l$ s. S& T' H6 V: `6 H* q/ Q0 I0 pdy: 简拼的星期 tue5 `' v( T9 m3 E4 f
am: 上午/下午 am/pm* c8 Z/ H8 A3 X3 O9 G1 H& c1 R
+ ?! K$ M' m0 W8 T! ]
sqlplus中日期的默认格式是:DD-MON-RR! S) C  m4 b& l: A' p
现在的时间是2011年
$ \4 g1 _  Q! z6 J           YY           RR
5 h/ l; L$ `$ L; p3 t7 r05年      2005         2005
) \; p1 `, d4 Y! j: P6 S98年      2098         19985 z# a. u" Y% p; F
; z: s" U6 A$ q4 g) A7 I
假设现在的时间是1998年* F0 R" `! ?9 j3 A$ i1 T. `6 \
05年      1905         2005! |' Z8 \& v0 ]# q& C9 d5 [4 E' o; C4 x8 E
95年      1995         1995 9 r, Y7 P7 ^& G: Q2 s% ]
: a. Y! J: a+ k% O3 V) T. F2 @1 f. C
insert into emp_ning(empno, ename, hiredate)
! J4 b" _, ~1 X# S8 ~( Ivalues(1012, 'amy', sysdate);; k( ?  r9 A+ d5 W
--实际入职时间是2011-10-10, d& L' x1 h/ Z$ p7 M  i
insert into emp_ning(empno, ename, hiredate)  l) O" g* P2 Q+ d+ f6 F1 O
values(1012, 'amy', '10-OCT-11');
* j4 o- ]" V0 N9 V7 \: ~
  |: c& n0 k) n4 \3 xinsert into emp_ning(empno, ename, hiredate)
) b0 p' G% K8 ovalues(1012, 'amy',   _9 A) ~3 S8 `3 H
to_date('2011-10-10','yyyy-mm-dd'));
' A' m* t7 p/ \( A: T8 B- [- H2 V9 _' X9 ?; U& m+ c2 [* \
显示员工姓名和入职时间,显示格式为:$ `7 p" v& K3 @
amy   2011-10-10$ L& D8 m+ e# u

( I( s2 x2 L( }. H         to_date; Y% p( O9 m5 ~. H3 L
字符串   --------->   日期; Q" k  p- z; N* q
         <---------
; t, m5 r; a. ~! k! Q         to_char- x7 r5 i$ r: Q7 j# x8 |( S- A
; X* O: Q/ _0 I
3.计算员工入职多少天?
. q$ d; ?% o( v% d- H- {select ename, hiredate, (sysdate - hiredate) days
( Y2 l' T& u" p1 Ufrom emp;
, j: I9 Z3 f) R: P( S$ U4 n8 h. b9 S& l* N
日期数据相减,得到两个日期之间的天数差。0 R+ h2 O( y, o' V) }; `
不足一天用小数表示。
+ L  o* Q; _7 q( c2 J9 U) I! v3 X) L5 i1 P) M1 s* d
select ename, hiredate, . u1 b& P" H1 {3 d: V: J  t5 A
round(sysdate - hiredate) days
- N( @9 u6 k$ h2 B/ R) Jfrom emp;* L8 C8 _$ O& N3 v

9 ?0 o" z9 x) j/ a5 l! P+ V4.计算员工入职多少个月?用整数表示。
' ?1 i4 J) \& v$ g1 {3 n- N: p5 Nselect ename, hiredate,  t' p/ ^$ O; s9 e# g2 c8 J
months_between(sysdate, hiredate) months
$ m- k$ w, i- H3 Z3 Rfrom emp_ning;6 A; z! m1 x& s) k% O: T  J

% d# L8 E6 w2 F2 }5 U2 G- i& |: Qselect ename, hiredate,
6 W! v# T$ O+ s1 hround(months_between(sysdate, hiredate)) months! G9 }7 S3 u( K. |
from emp_ning;0 O0 p  p2 @) Z$ ], Y+ c
+ c+ N4 W0 O* b8 P
f3(f2(f1(p1,p2),p3),p4) : 函数的嵌套
  L! Q# F' D0 M8 E* Q
; D+ ?% L5 X1 d, L4 h5.计算员工的年终奖金0 B4 D8 c) d2 z! e+ a, y: K
bonus不是null,发bonus的数字。: f2 L+ X1 X0 m& w
bonus是null,发salary * 0.5.  j7 f* [9 ^6 Z2 D, f; S7 T- Q
salary还是null, 100.
% N; @* h4 y$ I( }0 _) `5 B& m. [
" q2 T% q: N5 k3 [5 M! lpublic double calculate(double bonus,
0 K: F6 V8 ?2 [3 N- b3 t+ p                        double salary,5 y$ w  b- j  ^8 J1 `% f
                        double comm){
3 l3 i+ l1 g; e7 \1 d3 l        if (bonus != null) return bonus;
) Y. f- [8 \! S! ]9 C        if (salary != null) return salary * 0.5;* Z. B3 ^/ V2 F
        return comm;                        5 v: \1 Q% i5 z8 I& z3 _
}3 G1 a. t, K, Z6 X, j4 R  U: e& R# @! Z1 i, K
--返回参数列表中第一个非空数据
9 e' [/ G: D1 v- T# ^--最后一个参数通常是常量。% v' w9 Z: r2 ]" B% D, s
select ename, bonus, salary,
* R- C5 e. k5 i% O: ^1 Dcoalesce(bonus, salary*0.5, 100) bonus
* E0 S$ \3 D, w# S* gfrom emp_ning;
, m' W& R' a8 f/ B8 p$ b, X% m1 {- N
6.根据员工的职位,计算加薪后的薪水数据:& ]: l. z& {  ?+ X0 Y. B$ O7 [
Analyst: 10%
9 S6 P1 k6 M+ ^, ZProgrammer: 5%: o2 `; P0 _3 C7 i' O* y9 e
clerk: 2%7 C: Q0 U6 B( @8 e9 A' z2 k9 B# D
其他职位:不变。
# r& Y. p1 c' j, s6 d% w8 ]6 p3 l3 S1 N$ M
case语句:
: d! s: y/ C3 ^) X% ^select ename, salary, job,' ?. K# l: i9 z$ J
case job when 'Analyst' then salary * 1.1
8 g( a) ~* n  E1 w! c3 w+ S: A         when 'Programmer' then salary * 1.05
9 k0 |+ @: _* b2 N: U% G% L% b         when 'clerk' then salary * 1.023 ^8 p. s& D; U  i0 F! I- |# ?
else salary
7 c. S: `6 o5 `end new_salary
: {) T& k; U5 p* L$ L  rfrom emp_ning;
0 x; ]9 g5 B/ d
% t8 c) T) h( i! L$ Fselect ename, salary, job,
7 t+ T! p3 e: T9 H7 `/ E* ]: D& N- bdecode(job, 'Analyst', salary * 1.1,
: y# p% ^  B- K            'Programmer', salary * 1.05,
+ N; e8 G2 E- m2 `* h8 R7 O            'clerk', salary * 1.02,) V* J6 r" i& K
            salary) new_salary0 o0 l4 h, ^; V, u8 T/ N8 e
from emp_ning;( j$ ]; C% L% L  F' z5 F/ _
6 |/ F7 J2 \& `) o  R4 L5 \
7.薪水由低到高排序7 `6 H4 w. c$ I* J
select ename, salary from emp_ning, H8 u* }2 p: q7 D7 A
order by salary;3 ?9 ]! B& u' O- {7 h4 H

8 l9 z& G4 _2 F5 Fselect ename, salary from emp_ning* n0 t) \' |( j. D; `; ^% f8 A
order by salary desc;  --倒序排列 descend
0 g, b3 k# a5 ^  C( |+ J' T
* m$ Q, b+ c; c4 }( T* @: D6 F7 adesc emp_ning; --查看表结构 describe
0 t% G1 G$ e+ V, O+ R6 P
) D. ?+ ], b. ?" p9 j; y2 {8.按入职时间排序,入职时间越早排在前面。# B' N) @5 N$ T! T; o9 s9 X
select ename, hiredate
9 n( j  g+ k/ W6 q- Pfrom emp_ning) n" }4 \4 b& `  X2 h
order by hiredate;
6 f' \8 Z8 Z  C$ }) g# ^( ?# Y
3 w% w, g' u/ U& D7 M( f5 [9.按部门排序,同一部门按薪水由高到低排序
! }( L. M& u% m4 S3 `7 F  C; sselect ename, deptno, salary% H$ @1 F2 E, z1 f$ _
from emp_ning
/ O/ `4 }7 e8 Y: E- ]: x" O% b! Zorder by deptno, salary desc;
- d5 X5 J- P! G' N3 L& B1 q) H
2 B* s5 x; v0 J# x) d/ h1 G10.员工表中有多少条记录?; i) c+ Q1 S- M; H
select count(*) from emp_ning;
& Q0 v+ h. K0 _, m2 O9 Z7 V4 K# j* L
openlab帐户下有多少个表?6 a( M8 j$ e. y6 O7 @3 V$ G3 ]; U! [
select count(*) from user_tables;' N  X  |  b3 [5 s

2 j- y% z6 Z) t8 bopenlab帐户下有多少个名字中包含emp的表?+ r) d) j! m/ I. S0 B4 \* `+ Y
select count(*) from user_tables7 `# U5 n0 ^' {: D
where table_name like '%emp%';* C  A+ `2 n$ x; u+ z7 n
- w3 D4 A  _( g+ M
--表名默认大写
  j9 W) P2 r" H& ~( M( t! iselect count(*) from user_tables1 }; ^& O4 l: z6 {
where table_name like '%EMP%';
2 R' y* R& u8 |/ `
' D; g0 }9 }5 ~& l& ?7 K--入职时间不是null的数据总数。# h; w: H% a, U; ^( |- w( v
--count函数忽略空值。
% [9 G& a/ x8 o7 ~; R! X: @# F9 R! l" Gselect count(hiredate) from emp_ning;) g' L. u& x/ n9 m5 G4 [+ d

* b1 l2 j' S2 M11.计算员工的平均薪水和薪水总和是多少?
* _" `0 u, H5 {& m  z# H1 tselect avg(salary) avg_sal,
3 N, q# n& B6 B/ y       sum(salary) sum_sal: q2 f: ?4 l/ J8 V' f
from emp_ning;  Z4 f) u( y& F/ f, n

1 T# w/ ?  x+ p3 D: ]avg(salary) = sum(salary) / count(salary) , f$ V7 n/ m# q/ [# Z: l# U
              68500 / 10 = 6850
7 ~; u* A: q# |$ Z2 ]2 L  ^7 O9 ]--纠正逻辑上的错误
- p+ [* K! ]: I5 a" E3 O  {  eselect sum(salary)/count(*) avg_sal,
5 O. d; V/ C0 K9 E0 J2 G       sum(salary) sum_sal
& M4 G" E% o/ H, f0 v( C3 ufrom emp_ning;: r) b) {0 |# _) ?

9 ]1 D- f/ d9 g$ Oselect avg(nvl(salary,0)) avg_sal,
3 w8 u% l$ B! r       sum(salary) sum_sal5 ~" {6 N0 Z: W8 ~1 u
from emp_ning;
% o; H: E: a4 w* B; @: o3 n3 g  Y' i# g! Y
12.计算员工的最高薪水和最低薪水6 E0 r; n# M% B' A% P
select max(salary) max_sal,
  U! V, o0 Y. r' ?" k       min(salary) min_sal
: c: `+ k( C1 Q  U7 t. sfrom emp_ning;
1 @$ N; e4 O0 M' K. ]1 h
( @6 s: [# |! z# p组函数:count / avg / sum / max / min 忽略空值' {/ t. \1 J6 l) H
其中:avg / sum 针对数字的操作。
5 X/ r4 b) z# z      max / min 对所有数据类型都可以操作。
- u; [  s; _; m# P7 N. {- `0 ^0 n) ]- G5 \
13.计算最早和最晚的员工入职时间。
: C' [/ o+ F# p# {& Yselect max(hiredate) max_hiredate,$ H4 C* P' s5 T9 {% I
       min(hiredate) min_hiredate
) n* [9 x1 m. G) @5 V, \" u9 c8 xfrom emp_ning;# N& _" R" p  U( Q5 [0 Q
7 e6 o, \1 l! l2 v; z- g7 T2 Q% a% J
14.按部门计算每个部门的最高和最低薪水分别是多少?
% }7 n4 C3 X( S* k4 D格式如下:
1 M0 R1 Q+ D7 B" \/ N2 @  |8 U10 4500   3000
2 g* Z& Q, {$ R/ c20 15000  8000
# V" m7 z, r0 Y2 u30 10000  5000: h* o- p: ]) p7 V- e) {) d

( _1 f# v* f9 {/ k--group by 列名 : 表示按哪个列分组# E7 d2 T9 Q2 o( Y
select deptno, max(salary) max_s, min(salary) min_s
5 T  D3 P2 O3 m( M% Z& `from emp_ning- ~1 D' ~% a9 B+ U& K
group by deptno;
( `/ {4 a+ Z$ m! f. f% E
' U9 }$ K5 V  K3 m15.计算每个部门的薪水总和和平均薪水?
; ^9 L; Z! m: N( v6 V: U8 sselect deptno, sum(salary) sum_s,; E5 g% D/ a, W, n
               avg(nvl(salary,0)) avg_s" Q0 [# w5 f+ z9 {  N2 f+ @
from emp_ning
" @" p! @- ^/ T% v+ k! i: S; l. ggroup by deptno;  D8 p2 q) ?7 p% C# D! H
8 A/ p8 q  {% b; S+ c1 M4 r5 y
16.每个部门的统计信息:格式如下:
; v5 E' H- z/ F4 c9 R- U  R8 _  ydeptno max_s min_s sum_s avg_s emp_num4 L( o8 d* P4 W2 c( e
10     10000 5000  23000  6789       3! p4 C' d6 w4 G2 J. v9 U
....
( F# A# ~0 Y) H. l. \8 y0 Aselect deptno, max(salary) max_s,5 }. ^. e7 w! X; t7 y7 S' V. V
               min(salary) min_s,
/ n4 X7 M% Y' }% Z6 l               sum(salary) sum_s,4 a1 |5 v& @$ s; q/ a/ N. z! }) H
               avg(nvl(salary,0)) avg_s,
9 H( p% J# Z* `$ R: L' ~- l               count(*) emp_num  n# X! j" [3 {/ O; `
from emp_ning
! N, D+ U- v3 U& [2 ]* wgroup by deptno;0 a4 X8 ?6 H* p

4 E$ D- ]( g5 r: d; R" ]! hselect后出现的列,凡是没有被组函数处理的列,必须
3 F. o  G4 H2 X' ^3 |出现在group by 短语中。
5 o! y( _& w; b; ]* r  T7 u% N3 I2 }1 o
9 W$ W8 w8 }. q6 K按职位分组,每个职位的最高、最低薪水和人数?. p$ n! m% g9 t+ Q( R8 B/ S6 X
select job, max(salary) max_s,
) B1 y7 Z* @' A" o6 I            min(salary) min_s,
1 k; Q6 h. ]* m% k            count(*) emp_num
+ T6 T+ `" _/ }$ tfrom emp_ning
. q( C. G$ s* R) ^$ p7 lgroup by job
) y# O: e0 U5 \- ]& q) [order by emp_num;0 p% s! K6 O# w
17.平均薪水大于5000元的部门数据?
( N& k/ X/ y6 I" ]) Cselect deptno, avg(nvl(salary,0)) avg_s
5 v; G7 X- x- {) Y/ |from emp_ning
! N& G& q' q% d. L* ^! J& qwhere deptno is not null
! G( o1 i+ k! o. dgroup by deptno
# ]9 M1 n0 C# P0 M, Mhaving avg(nvl(salary,0)) > 5000;) B# S- Y, o6 |$ J  g( u
* a' _2 _( i# ~& ~8 }
18.薪水总和大于20000元的部门数据?( A9 u3 Z) W$ t* Q6 h, M
select deptno, sum(salary) sum_s
& s7 s; M( l: B$ ffrom emp_ning
, o& Q" B2 }1 x. J2 }' _where deptno is not null. P3 v+ i8 p- u1 O$ w; B: F4 g
group by deptno
4 a" N/ w: f7 r7 i" Ghaving sum(salary) > 20000;
( I6 `$ p# K* k  u0 f" }9 E. [! m/ g; g; f* H0 b- }* [
19.哪些职位的人数超过2个人?
6 p& e2 u7 W" D9 `2 Oselect job, count(*) emp_num
6 L. l0 U7 H6 ]3 ^+ Ffrom emp_ning
' t$ X+ |9 Y: r) Z1 c2 B; Wwhere job is not null& e2 m" ]2 t$ e0 ], e
group by job
- @3 k3 g5 u$ G4 ]- B% @' Y( hhaving count(*) > 2. H# x7 C$ L7 B
order by emp_num;
# K* M2 `, M5 v' y$ h* f2 n$ C6 z* N7 {7 a' V( h/ q2 ~# v

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


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

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

   

关闭

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

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