我的日常

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

动态微博

查看: 1721|回复: 0

Oracle增删查改 day02

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:40:52 |只看该作者 |倒序浏览
SQL*Plus   
2 Q6 ~5 }7 A- Rsqlplus.exe 5 p/ L3 r" P6 T& q; ~

" H- y2 {/ [4 H/ T2 X( p1)数据定义语言:create / drop / alter / truncate9 j8 [# e# n4 `5 B: t
对数据结构起作用。
( N2 D, c  v5 E, M  ********! a9 q; q5 f% y1 y9 m. d+ t
Data Difinition Language: DDL
2 M- t/ f; N( H& h5 }2)数据操纵语言:insert / update / delete
7 r1 ^! ]0 E8 D7 x: e对数据起作用" D9 Y& e8 g' k0 [* E, l
  ****9 v! F6 X, G* c0 k0 s4 S
Data Manipulation Language: DML
  T" B9 d- ^) Z3 W- r# Z$ ~5 A3)数据查询语言:select
8 r8 Q* L# d' R7 |$ H" V      ****3 s: F/ E3 Q8 I) C! _
Data Query Language: DQL; E0 P) P9 v# L& m: z
4)事务控制语句:commit / rollback
4 i% N1 w: J" J6 L% K对DML操作确认7 ]3 t. h$ G8 i% O- N  t% ?& ]- r
5 J( M  }! _+ M) \2 g
一、学习单表查询语句。: e& H$ _/ x) B4 T0 m, c
1.计算金额的四舍五入?/ @; z* K& P1 `& B  s! q
select ename, salary * 0.1234567 s1, : I3 I6 G) _5 v  m
round(salary * 0.1234567, 2) s2,
1 ]" ^. k1 d; g' F6 x' tround(salary * 0.1234567) s3,; R* [( p# l* ]4 R) |8 q
trunc(salary * 0.1234567, 2) s42 p6 G- J( |1 c. K: ?8 Z
from emp_ning;
  i5 ]2 z! J! q+ v
! ^5 M0 s; g. x5 \* i+ P2 {/ ^round(数字, 小数点后的位数):四舍五入
5 W$ j8 g" b- V7 b9 V1 M9 {. I如果没有第二个参数,默认是0.
7 T1 x2 t. O7 w( f
9 J9 K9 J2 f' K8 Strunc(数字,小数点后的位数):截取7 ]9 r2 G6 i) g, x) j
如果没有第二个参数,默认是0.
! M  R3 N; o8 H+ B! y, T6 A' u' [1 U% M
2.Oracle中的日期/ U5 G6 X) p4 Y: k
1)取系统时间的函数:sysdate
8 W. p5 J/ C! I; Yselect sysdate from dual;
# D7 Y3 k3 Z+ d5 A7 r
7 t7 N3 M* |; J6 q$ B" ?2)把时间数据按指定格式输出
: H3 I. N' q1 i/ g) \* I9 pselect to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
' h. A" B, g+ Z! ~, I* b; k( @from dual;
  \9 F6 D: `; Z' P9 X, E) c9 K9 U. b
select to_char(sysdate, 'year month dd day dy')
, G" b* G3 X3 v) |from dual;" w/ t( O/ k6 ]2 A* T
0 k% ~# H' `+ u* \2 l, Y
to_char(日期数据,格式)
3 {' b2 h( H7 ^6 W# H2 l/ a3 o4 e6 x, x% R4 d/ x
public String to_char(Date d, String style){* @) b! }: n1 v3 A' V1 e: m; `
        //SimpleDateFormat把d按照style的格式转变为字符串/ D! D4 H3 ]5 M( ]: x1 }! V( ^
        return 字符串;
2 a+ I# C- g8 w3 [} % v: G+ b- [# Y9 o

5 ~: _% r5 o$ }* ]6 N( kselect to_char(sysdate, 'yyyy/mm/dd')
: O7 d# g0 ]8 W# efrom dual;/ B# {2 A9 Q( Z" H  W; P

: n4 V7 q$ u$ Z% S% Wyyyy: 四位数字年  2011
$ Z" D  K" s+ syear:全拼的年 twenty eleven" K# j  g' S, D! }* J" g
month: 全拼的月 november  中文:11月* i: A" G/ M3 t- T3 V, j) [5 {
mm:  两位数字月 11
9 j: C* I) X0 o+ ?2 Dmon:简拼的月 nov
7 w$ H. |* }- ^+ a$ Ldd:两位数字日: @; J% p/ Q6 ?: `6 T* @8 j/ `, f
day:全拼的星期 tuesday! k( U5 E! \" \" X( |' I
dy: 简拼的星期 tue/ s4 X% R3 ]3 O/ a
am: 上午/下午 am/pm
+ W- s9 u7 h4 N3 T
4 H) ~" p" @% N* j# M4 d4 Dsqlplus中日期的默认格式是:DD-MON-RR3 c# Z* B4 F  N( E2 x
现在的时间是2011年
/ K( [/ g" B- r5 d1 o$ @8 [' `; g. x           YY           RR  F6 R# o- d5 j! W
05年      2005         2005
8 y" D# [3 C. h0 ~3 Q98年      2098         1998
" u/ \5 J8 T- c8 A- i  D% A+ p6 b8 n
假设现在的时间是1998年
6 o- B8 H) x# ?; g7 P3 D2 C' c$ d4 P+ B05年      1905         2005
7 G% Y) L$ ^! z$ [8 E95年      1995         1995
$ U) h, _9 S$ R/ e, o+ x* W4 s$ m5 q2 c# N; p* {
insert into emp_ning(empno, ename, hiredate)
* y$ F$ Q1 U, pvalues(1012, 'amy', sysdate);% a5 G& x& i* V1 S
--实际入职时间是2011-10-10; J) G9 D' l) l, L
insert into emp_ning(empno, ename, hiredate)+ R! r% l& d5 H  g$ K+ x  z4 `, n
values(1012, 'amy', '10-OCT-11');
$ I7 g( O: M3 |; o  L  {+ d9 a. p+ D& X4 P
insert into emp_ning(empno, ename, hiredate)
# Z% A' }, k3 Evalues(1012, 'amy',
% C9 o+ \" R/ ]; v  I& m8 ^to_date('2011-10-10','yyyy-mm-dd'));
$ S0 Q/ i: Z1 r2 `/ m- P# k" M; y! k9 }" N1 p. _
显示员工姓名和入职时间,显示格式为:
1 p* r8 Q/ `  d, xamy   2011-10-10" }2 O0 g5 ^. t9 h: s7 F5 M
  Q. x, e2 b' \, C1 K
         to_date4 g# G" Y& `' i4 c2 y
字符串   --------->   日期- [7 T5 @8 G$ M3 {, S
         <---------
  k! M5 P. B. w9 G. u6 t8 ^8 q8 m         to_char
9 H% j0 m: i( M9 \
4 r) _9 ~3 G& y5 d3 }3.计算员工入职多少天?: H, y1 n. u( _# K* p
select ename, hiredate, (sysdate - hiredate) days
9 A8 p& }4 h0 ?$ d/ ~3 @0 ofrom emp;
' d0 c& L# Q1 h1 G
0 t4 Z+ p5 s; ?! f1 \日期数据相减,得到两个日期之间的天数差。& L( M4 |( N, [1 A
不足一天用小数表示。
# c: l6 t" E& R, t+ n$ l6 j
- {3 L( f2 l0 _. F4 d0 hselect ename, hiredate, $ T& h7 X% v/ \: C1 f
round(sysdate - hiredate) days
) r% B- ^& M( _$ N7 ]' x( p# |from emp;
8 `' d' v6 Z* M( \. o/ e. H, l5 a+ g1 G$ v
4.计算员工入职多少个月?用整数表示。3 [1 [6 f% C  f" e3 d; T
select ename, hiredate,
( J* F: y' a# x, ^& `$ N% @& o# C4 Omonths_between(sysdate, hiredate) months
/ n1 x9 K$ G2 B% t) ^9 wfrom emp_ning;: Y  ]' n) N& i2 d

% Y* T! ?4 f% l; Hselect ename, hiredate,) ~8 r  L3 Q9 X6 u- b
round(months_between(sysdate, hiredate)) months
; J5 P' C: j# C/ U# {4 K4 E, h" {from emp_ning;
6 L. B; y& V/ D1 A* u7 C$ F( o4 M
f3(f2(f1(p1,p2),p3),p4) : 函数的嵌套
+ G" W. [; G- T0 I4 v
3 i# |/ k" o" e5 Q5.计算员工的年终奖金# C+ l: J6 O7 ], k, x8 W
bonus不是null,发bonus的数字。
% T/ J/ }/ ]- x* [2 |  X$ Gbonus是null,发salary * 0.5./ X' s# G& n8 e# @! ^$ S8 W6 K* ~) C
salary还是null, 100.
# e0 A- u& P+ ~) Z) |% ^  {- E
! v! p( C/ Q, rpublic double calculate(double bonus, 6 \( x! I% W2 i$ g0 j3 {
                        double salary,+ I+ F" I* s* n; V  o% q* x4 a' D
                        double comm){) \5 U. V: f  q( R' m, u* q1 `
        if (bonus != null) return bonus;8 V& U! H6 B( P: N4 X# P* S' G
        if (salary != null) return salary * 0.5;
/ g1 `* H9 j! x" ]        return comm;                          R9 e: h7 H3 h: t5 d, F: u
}; i6 X# b& L! a/ B! r! K
--返回参数列表中第一个非空数据3 i3 C1 y( }( |
--最后一个参数通常是常量。
6 j1 c5 q4 t* V0 M9 T/ V7 v5 d$ Wselect ename, bonus, salary, + X4 Z& \; Z! Y. D& N: p+ G( J! S
coalesce(bonus, salary*0.5, 100) bonus, F! H! }" \5 |$ L  R
from emp_ning;
& {2 E9 d( b- C/ I
. v' F3 k: B$ q5 n7 h' x; X; [6.根据员工的职位,计算加薪后的薪水数据:  e- v8 f- j# X8 V& z2 r! d
Analyst: 10%! s1 |6 }- v/ [0 t
Programmer: 5%
/ w4 ]5 h& u5 j( r% n: ?  Kclerk: 2%
2 ]& X! ]$ E, C: n, ]0 U7 j其他职位:不变。
. v$ t3 }- ?) ?9 v1 f) V- C5 R  h
1 k4 w( a' ^/ v& c) Hcase语句:
5 y! Y. _& U6 I) i) v8 W/ Jselect ename, salary, job,& ^' i4 ?$ I1 k3 R/ K
case job when 'Analyst' then salary * 1.1$ C0 C; s3 {1 B9 L. ~+ [
         when 'Programmer' then salary * 1.05
' P! |0 Y/ V' {8 S) M8 r( h0 i         when 'clerk' then salary * 1.02; a4 d7 l) n* S1 t. D
else salary" P6 W! [; A8 d( g6 ^, F/ c
end new_salary/ {& s* j/ s& l
from emp_ning;. n: V& p5 g2 {% H6 w3 f

4 n& Y+ G9 k" A" ~/ ?& t0 o9 Kselect ename, salary, job,+ k7 `  b5 s6 K% |2 B( u
decode(job, 'Analyst', salary * 1.1,( b9 y. s( P; O4 f" r. y# |$ i
            'Programmer', salary * 1.05,
$ O' Q# c7 x& T- P! |) a            'clerk', salary * 1.02,
) e* d/ w: r1 w, I% r; R            salary) new_salary0 L/ ~8 {2 A. m+ V/ `" l' c
from emp_ning;
0 }  z+ O/ N8 y; t4 X' M& }" p, n6 M! P- _. O
7.薪水由低到高排序' R# M5 ]( {9 h
select ename, salary from emp_ning$ P8 P4 W* F/ |3 z( X% E
order by salary;- D; v3 t2 h" A$ P2 h. x
) m7 f% R  B: O  h
select ename, salary from emp_ning6 N/ q$ f2 c7 t" B
order by salary desc;  --倒序排列 descend
  H, ~$ P2 a* s: M0 U3 L4 P* P
7 u( I+ L& t" ]2 ~* p! sdesc emp_ning; --查看表结构 describe
1 c, a, c$ H, N7 y9 U$ E1 y
) ?& q( F# N) n+ ~/ R4 J8.按入职时间排序,入职时间越早排在前面。3 s3 E& K0 U$ t  J
select ename, hiredate6 i% P- n3 n* C5 x
from emp_ning8 ^  q+ \. E$ Y& L. x) N
order by hiredate;2 v9 O1 O- ^9 w0 V' x+ m
) z  L. y( R1 J- m
9.按部门排序,同一部门按薪水由高到低排序, b7 U5 r5 m5 m- I3 j2 L$ g
select ename, deptno, salary
  @4 ?1 I0 o. _8 \1 ?& B4 p" }  Ofrom emp_ning. u) I+ ]8 d  g  w! Z
order by deptno, salary desc;3 x5 b' Z5 _% F/ P; h

6 Q/ X! L0 S7 Y7 {10.员工表中有多少条记录?. V" A  |% E  w% z
select count(*) from emp_ning;6 m* u! I) j7 r3 A
6 Y( z+ L+ m  ]" d; Q, U
openlab帐户下有多少个表?! s8 \% I  T8 ^; \* A
select count(*) from user_tables;& [- E% W- R* Q9 Y% S* K+ z4 o

: `" ]7 L& \/ L  S, _" m9 bopenlab帐户下有多少个名字中包含emp的表?
+ r: H8 z! y3 v5 G7 y. I# ^* ]select count(*) from user_tables, U1 G' ^1 c' |% b6 Y
where table_name like '%emp%';
7 K4 y5 y; |7 r) ]' T$ e* Z, J6 Q) s! W4 n- h
--表名默认大写0 _0 v2 z) F, j$ t/ [5 ?2 e; m
select count(*) from user_tables
3 F' Y  u; E( k% A* rwhere table_name like '%EMP%';
8 l& e9 ]4 H2 u* [3 I( H4 @; Y2 U5 I+ {
--入职时间不是null的数据总数。
8 @, q- S. g/ ~. u+ Y  {--count函数忽略空值。
/ `5 \% r3 z  eselect count(hiredate) from emp_ning;
) A8 S! x3 e% ?& g" o, t; L7 x. B2 z1 U" g+ V
11.计算员工的平均薪水和薪水总和是多少?
: P0 S0 Q' i4 S. s0 iselect avg(salary) avg_sal, ) M; {& ?8 D. c3 Y- D- u7 M4 `$ Z
       sum(salary) sum_sal! b/ p% k7 F* z& M
from emp_ning;
1 v: m5 t( V/ a- p2 q0 {4 N: |8 v
! c. y" \0 J* ]$ w1 ]7 lavg(salary) = sum(salary) / count(salary)
) g, W6 v5 @$ K; H. C9 p! d              68500 / 10 = 68502 @# H! G( K) Y/ N
--纠正逻辑上的错误) \! ], s1 Y1 t9 R5 x% A
select sum(salary)/count(*) avg_sal, 0 i' F$ \. {* d; n  v
       sum(salary) sum_sal' |6 g" ~! v7 i5 b  V
from emp_ning;
$ ]- o8 r: _/ M* W# S! a# q
# l8 Z( H% ~% i  ~select avg(nvl(salary,0)) avg_sal,
: K% P/ f& I5 c6 U0 y       sum(salary) sum_sal
8 W3 M2 @4 S1 {- ofrom emp_ning;
* }( q: X) I& N
. u+ b) a9 X7 a7 u; p" F8 J# |12.计算员工的最高薪水和最低薪水( i8 H3 t# i! R  F' ^: j, n% U
select max(salary) max_sal,4 [6 o# X& J& t! y! D
       min(salary) min_sal4 [9 Q% A/ }4 B3 w" v' Z) e0 t
from emp_ning;0 a, g. l# B9 I" r1 [8 l  [
8 r" L8 c7 r$ G" d! Q
组函数:count / avg / sum / max / min 忽略空值* p" z4 R, j. b) A/ O/ j8 `
其中:avg / sum 针对数字的操作。
2 b- ]5 b" B" q! H* M" h$ A      max / min 对所有数据类型都可以操作。+ G9 ^5 q$ K, Y% I$ v. y9 o

1 I5 z% `) }/ t8 `# O13.计算最早和最晚的员工入职时间。
, w) Y2 c6 `0 l1 {& nselect max(hiredate) max_hiredate,2 @: O) M& r% h: Y0 G) I; J
       min(hiredate) min_hiredate
& y- A4 F1 b. \/ r7 j5 hfrom emp_ning;) w3 ]3 c: k! _9 V/ F1 y6 W) L

/ h! k) G& [) Q14.按部门计算每个部门的最高和最低薪水分别是多少?9 z) Y, d: x0 B: D0 `
格式如下:
2 C7 e6 a5 i. {) Q; d3 E2 B10 4500   3000$ _' X; x+ ~; e3 J
20 15000  8000
! k! U3 M# R3 Y; r/ e5 N% [30 10000  5000# O  M/ t( I' {1 R( ]
+ }, |1 {. x9 r) p4 b0 _
--group by 列名 : 表示按哪个列分组
3 U2 L+ p' X& R+ _" `* Y5 Pselect deptno, max(salary) max_s, min(salary) min_s5 X% ?/ C% n) ]5 S2 G) @
from emp_ning
+ H: v3 Z, z! l6 p* r8 |; i1 kgroup by deptno;0 k" H% |, i# v" w
9 m9 D. I& @) s7 r" q
15.计算每个部门的薪水总和和平均薪水?
+ b" h. h* U$ A6 Nselect deptno, sum(salary) sum_s,
/ e1 `4 n1 w$ n$ k- Z2 V               avg(nvl(salary,0)) avg_s! I4 J' `% P) n
from emp_ning" s6 E4 t$ D! c4 l
group by deptno;, a. J- L4 b3 S+ j7 |0 M+ \

! X& w' l/ R+ k7 k16.每个部门的统计信息:格式如下:8 b% B- `+ r5 ^5 Z% u7 p% r3 I- {3 M$ Q
deptno max_s min_s sum_s avg_s emp_num) t% a. Y$ Y* b1 n/ U
10     10000 5000  23000  6789       3
$ t* b8 m' F: a0 Y1 S...." z' o# d9 g9 O3 q" I7 o. J
select deptno, max(salary) max_s,
* g4 K5 s4 M& y' R               min(salary) min_s,
# ]5 Z5 V* a% l3 N               sum(salary) sum_s,
* w0 a0 P2 A, ^2 v4 h" \               avg(nvl(salary,0)) avg_s,
) b5 Y) I; I5 x7 S' y& \+ _               count(*) emp_num; G1 Q. m, O5 B2 I
from emp_ning9 j$ [7 _. y. d: \( T
group by deptno;; m) a- Q# N$ E  ?7 D5 h

, a5 U0 O, R% p7 p' ]: ~select后出现的列,凡是没有被组函数处理的列,必须
4 b: f& G5 ]- f% L; a/ T: z出现在group by 短语中。
) b9 T# f. f( q% v
9 n. m$ }5 B1 s9 i" D5 x( q( h* x按职位分组,每个职位的最高、最低薪水和人数?
  t3 \, I* }+ K/ Cselect job, max(salary) max_s,1 J/ `  ^% h7 M: `3 o" w
            min(salary) min_s,
) ^! `) B" _5 `3 @3 }- V. S% [& R            count(*) emp_num
; l& \/ u! e: y9 S0 g3 [. I$ Hfrom emp_ning+ x6 @3 u2 c4 x+ K
group by job
- g* L! Z* J3 }order by emp_num;
- m3 \* O% N" m( l1 ~- a9 E17.平均薪水大于5000元的部门数据?
$ y% G8 s+ Q' u9 z7 ~" Rselect deptno, avg(nvl(salary,0)) avg_s
' H* ~1 S: y; ]4 Cfrom emp_ning( b1 J$ s; t- I, x7 Z, N
where deptno is not null
8 q5 |3 L! i( b7 ]2 [group by deptno
& c2 |8 A/ _# ohaving avg(nvl(salary,0)) > 5000;' V* u! Z* P, X9 W) |$ I" F# z+ c
  b; I' w& r1 E  J* c1 E# k
18.薪水总和大于20000元的部门数据?
* L3 Y! S4 S' r* Z) }8 sselect deptno, sum(salary) sum_s0 \* K& J/ ?+ W9 Z6 [+ a
from emp_ning
3 ~0 {- \1 H2 k+ d' _1 D  W. Uwhere deptno is not null
2 o( Y2 B+ l: A% w& F/ C9 ]. `7 vgroup by deptno5 u; p$ w. I0 ?* h6 u( n
having sum(salary) > 20000;% R! E) D" }4 M: g* Q  z6 r$ Y

; S3 G5 g& y. o+ V4 ~& A2 G+ o/ |  O19.哪些职位的人数超过2个人?) i0 ~  ~/ }" h9 O
select job, count(*) emp_num
' [* X7 J! q2 O/ \from emp_ning- }& O- H" }7 i- m$ i& f& S
where job is not null
0 {1 v" y3 ]5 H1 E7 `$ mgroup by job6 |' w6 v$ ]  e
having count(*) > 2
6 J/ p# k7 C9 z# Gorder by emp_num;
) {6 N9 [) J. n& ~! k
* k8 ]% H: @! V8 N) ~

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


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

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

   

关闭

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

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