我的日常

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

动态微博

查看: 1701|回复: 0

Oracle增删查改 day02

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:40:52 |只看该作者 |倒序浏览
SQL*Plus   2 D2 k4 e, u/ z0 {0 k
sqlplus.exe
6 A- U% t2 Z+ n3 K) K' W0 T' m! I' ^* c3 C. a( o, j" n+ w3 y
1)数据定义语言:create / drop / alter / truncate. @' f. _; s. A2 I
对数据结构起作用。
" A) D1 n6 a1 a- V0 Y  ********
% J( i+ H5 U' V# c9 [7 SData Difinition Language: DDL+ }. r% ~* U+ D
2)数据操纵语言:insert / update / delete" i  f* K# n  A, D4 P( ]' E% O
对数据起作用
+ a( w+ a2 S. C0 G+ A; ]9 {7 H  ****
2 q& h1 E, A7 Y$ c  F+ r! }) GData Manipulation Language: DML
- N3 y$ B) W' L; F0 B2 B3)数据查询语言:select
. M) K+ q* b/ B( Z6 M0 b# `( u. \% X5 P      ****
: K" X1 r/ g' [* WData Query Language: DQL" {4 r* O( w! L+ P
4)事务控制语句:commit / rollback
$ ~& Y+ V$ w* J1 }对DML操作确认* A% \% Z! M9 W% G' L  D5 }
2 R( L' S+ E% G! D1 x, b/ h0 y
一、学习单表查询语句。
1 o$ s! G/ S- Y. b+ K/ R% C1.计算金额的四舍五入?) m* L& k7 i& h; u0 c; L' N. I
select ename, salary * 0.1234567 s1,
. V6 v" ]5 J) m0 C% k6 @round(salary * 0.1234567, 2) s2,
/ z7 l3 z* D# U. s6 eround(salary * 0.1234567) s3,
0 t  y% j4 r& qtrunc(salary * 0.1234567, 2) s4
  [" c5 G& W  v2 e6 H" M! {/ a3 mfrom emp_ning;
/ s% c. I% R8 u- u
$ h) f; g) P. L4 @5 w& U7 around(数字, 小数点后的位数):四舍五入
' ?: y9 ]% J$ Y% d如果没有第二个参数,默认是0.
% X, D& \6 p- D" |/ D8 I) ]/ y. Y
trunc(数字,小数点后的位数):截取% x) R3 h1 d" Z+ T7 g9 v
如果没有第二个参数,默认是0.1 c% ~; N7 m% {, X

3 N6 S# p3 ~# {2.Oracle中的日期
7 [3 u  m6 r- D# {- Q9 P, I' X9 k2 {1)取系统时间的函数:sysdate
8 r, n* h* |. ?- A+ O- Jselect sysdate from dual;2 E- Q' Y8 T  J( d' S( h- d, u- U
4 x; g" z, _+ \1 n
2)把时间数据按指定格式输出  F* m4 a) \& [+ g* `. [2 M
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')& ], C# h' s- M5 G  x* m* Z
from dual;- L2 H- z. c2 @& `5 u( |
& F: w0 V2 T# K: X) s
select to_char(sysdate, 'year month dd day dy')
1 B% m3 Q  h7 y5 t, H5 Z$ Bfrom dual;# k: l  N4 ^3 v6 s0 q0 G! J' u2 n% e7 z

4 ?. }+ O9 ?4 D$ uto_char(日期数据,格式)
- {7 c" g- s$ `. T: k. W6 M1 V! G! W( ^* a5 T
public String to_char(Date d, String style){: A2 s! R, Y+ D% f( V9 P
        //SimpleDateFormat把d按照style的格式转变为字符串
$ c: r4 @' {/ h( q        return 字符串;
( T! B1 L5 e5 l, A}
$ q2 ^( m* }$ j& I+ T
8 |0 I4 p7 o+ ~# ?select to_char(sysdate, 'yyyy/mm/dd')
% V* a; [6 b; p% j  i7 Ofrom dual;7 u4 G; h0 L/ t3 Z1 u- d) E

, f2 A/ i: Z  W/ N* o8 o& ?3 iyyyy: 四位数字年  2011
- Z8 W$ X2 }0 ~4 G/ iyear:全拼的年 twenty eleven0 `) c4 d+ X# ?% |4 x
month: 全拼的月 november  中文:11月9 u# f* v2 ~( G0 e' _3 Y$ d
mm:  两位数字月 11& n7 [& x7 N( q- u5 O1 q, C8 v  }
mon:简拼的月 nov2 h5 A; V; L, G
dd:两位数字日
' Q  U" B& M* @# P% P. \day:全拼的星期 tuesday
# I- f. b& y3 Edy: 简拼的星期 tue
; N/ o6 {) k7 Ram: 上午/下午 am/pm3 K6 ~' G. P3 T1 r

( F3 b2 |7 ~5 a; F3 wsqlplus中日期的默认格式是:DD-MON-RR- f& h) f$ d3 u- a2 G& E1 T2 t" u
现在的时间是2011年" f' n) Q; ~/ U4 j$ Z1 Q; u8 p
           YY           RR
, h* z# s$ W/ u4 `5 t9 m9 I0 H05年      2005         2005
: \3 O3 I/ |9 w98年      2098         1998
) w. w$ Z) a$ U, c! V+ h0 Z1 }4 L* M' L
假设现在的时间是1998年' a1 O  I! o) S  P" z1 P
05年      1905         2005
' W/ E+ L6 U0 J- X95年      1995         1995 / Y7 Q) ^- z4 |3 R$ g3 q
+ z7 {; q$ ^. W4 x2 x6 U9 p
insert into emp_ning(empno, ename, hiredate)
2 l# r7 _8 x* G" J" vvalues(1012, 'amy', sysdate);
4 z0 V8 ^& V3 y--实际入职时间是2011-10-10
$ o; w6 y9 C- Rinsert into emp_ning(empno, ename, hiredate)& u# X/ L+ j* t
values(1012, 'amy', '10-OCT-11');* Z( O  `( j/ [5 v$ A5 r' N
$ E' `. U, q% |% R, v
insert into emp_ning(empno, ename, hiredate)
( b  C9 ~5 P' q6 Q/ I- m; \/ ^values(1012, 'amy',
* H, M& b+ p) D8 r' i, H  J  Uto_date('2011-10-10','yyyy-mm-dd'));
& p# F; n1 C; d0 o6 \4 |' X& H& g" E& i
显示员工姓名和入职时间,显示格式为:9 @8 Z# a* ?1 d3 W9 M
amy   2011-10-10+ U$ t) p" W, |9 z! t: J

% j  r) o$ p7 [% I- m         to_date/ H, A/ L  h" |+ M' v. r
字符串   --------->   日期4 B( v2 ]1 h- B9 `* o# A6 x
         <---------  b$ ?7 E, G3 {+ v  [( T, a
         to_char' t% z) s- R$ a$ Q/ b
$ O3 ?9 o- ?# c  |
3.计算员工入职多少天?
- ~; v4 [1 Z. ^: ^& p4 W2 @8 Yselect ename, hiredate, (sysdate - hiredate) days) p3 E5 Z2 F) c& j2 n6 h
from emp;
5 t- A, z& [  V
) W" x" [: x2 Z6 D% A9 {: U% G日期数据相减,得到两个日期之间的天数差。
1 j! {5 c6 u1 T- O7 b, D不足一天用小数表示。
/ M5 f6 b$ F; d1 M2 S8 P7 c4 m% E
! m1 A3 U( g, {* d* I: dselect ename, hiredate, " N4 M4 Q% x4 d# F' M& H$ K
round(sysdate - hiredate) days
+ G6 U% y+ [# Q# S# |7 k( ]! Wfrom emp;
2 n$ s. i, {: d2 [1 X! i1 q+ `% S6 U' L, _- M" h; |! s3 i
4.计算员工入职多少个月?用整数表示。
9 ?- Z% w$ q  e( O1 Q6 {) Q% O) H5 Aselect ename, hiredate,
+ J2 S+ V6 f( Q; x5 Cmonths_between(sysdate, hiredate) months0 i5 I4 z/ k- N7 m! E2 Q4 j
from emp_ning;
; L/ I. L0 Z; n8 E) N5 }0 H/ E
select ename, hiredate,
  v* v/ |5 N. o/ k; Dround(months_between(sysdate, hiredate)) months/ Q9 u3 F  W% c6 c; c$ a; M4 ?# m1 e
from emp_ning;
! J2 x% k7 a, i( W( e  V4 i( T
) C9 q! i8 W9 t- g, B7 V2 Q+ Q* Lf3(f2(f1(p1,p2),p3),p4) : 函数的嵌套
2 V0 |  \% e1 @/ B# l
7 W% G% _) F8 f: V/ S+ Y6 i5.计算员工的年终奖金
4 M6 d, p9 U5 \4 x, g) I6 Abonus不是null,发bonus的数字。
  l! w2 Y, f. c1 }/ Fbonus是null,发salary * 0.5.
9 E3 |& R+ H4 z* \9 ]+ Msalary还是null, 100.
. Y0 X# r3 @5 v: ~# p/ p& k
, F" K  o3 T0 b/ npublic double calculate(double bonus,
* E) W& O* E6 u* B+ T                        double salary,% Y+ j2 b  u) m# u' D& o! ?
                        double comm){  k5 s- N7 y* _
        if (bonus != null) return bonus;
* b/ t: {  R9 Y        if (salary != null) return salary * 0.5;
6 e/ C" b% ~3 t, l        return comm;                        2 u4 U* d$ m; I- [
}
0 M4 B8 |* N2 o+ t" A8 F* [9 s--返回参数列表中第一个非空数据
- Z+ _' k$ m6 N--最后一个参数通常是常量。: C* C" {. V5 {9 ]
select ename, bonus, salary,
" h( o) j  h- ]5 R6 vcoalesce(bonus, salary*0.5, 100) bonus# L' [. H/ y& D; P0 m0 k* F" k/ F+ P
from emp_ning;" u. @; F  K4 q2 l/ k
3 w8 R/ b" }2 ?1 w) W
6.根据员工的职位,计算加薪后的薪水数据:
2 ^* T/ d$ Q# s& EAnalyst: 10%
/ e& Y7 g4 O2 @; I5 G3 nProgrammer: 5%3 e% Q) O; \) d8 p- T( l
clerk: 2%! o  P; k% T- d7 f
其他职位:不变。2 S+ \( C5 E& r' G/ B
9 o3 u1 o" [' V- A" Q% F
case语句:/ c+ u' }* K. |6 J- U0 h! @
select ename, salary, job,+ u" c8 B  P3 f8 i# Y9 s
case job when 'Analyst' then salary * 1.1- V, l* o3 \- ?; m9 ~! h5 h5 M8 l5 l. s
         when 'Programmer' then salary * 1.05/ r! |( ]; e2 K0 I$ a
         when 'clerk' then salary * 1.02
* \9 r( i& z6 Z; Q. Y" d9 z' {else salary/ `6 b! D# K: X! x! o6 A# ?
end new_salary5 C0 f- M# g+ u( {
from emp_ning;0 D& f. v. q4 t+ z6 h

# w- d7 \6 O# T  gselect ename, salary, job,) _' B% k" d$ O7 p! z# F3 i
decode(job, 'Analyst', salary * 1.1,/ J7 l$ U- ]9 q' ^
            'Programmer', salary * 1.05,2 l, P% ?) E- g' r' P3 n3 _& d! x
            'clerk', salary * 1.02,
- G" f  j% u' Z' J8 y            salary) new_salary: ~3 A) Y% u5 o) Y
from emp_ning;: Z: p' X+ \- b3 ]* v% C/ f" Q6 z* T

0 z, P2 |5 L5 _3 Z0 {) q  r7.薪水由低到高排序6 }2 Z& B% ^/ q
select ename, salary from emp_ning
. F! |! {4 X6 K: ^* xorder by salary;. I; ]. ]: Q3 d% S; W  U
. K" X' t% m  O' }0 ?2 O
select ename, salary from emp_ning" [4 z) }" E* y5 h- W! e
order by salary desc;  --倒序排列 descend! Y+ e) g, s- @4 F, [
# H3 k8 f% z) U- A( S
desc emp_ning; --查看表结构 describe7 d( M4 Y6 O8 v) p( D

/ Q3 h1 [* b0 x" ^, ]8.按入职时间排序,入职时间越早排在前面。
$ i$ G8 C2 S9 ^* ^select ename, hiredate5 `5 c" @3 M5 E" q+ `# v
from emp_ning
! ?0 r# P, i0 }3 I7 Y0 m$ }6 T+ forder by hiredate;' N4 C- t' U1 M8 S8 b5 A# @

8 v/ x1 y# H! n$ H: s9.按部门排序,同一部门按薪水由高到低排序# v: y1 ~6 F. U/ u5 X' Z2 @! S# T
select ename, deptno, salary' K8 t7 i2 g" [+ m4 s( n9 F6 o4 d8 h8 a- |
from emp_ning
) V$ G3 V7 @: i' |& Z0 g& oorder by deptno, salary desc;
5 F4 M9 @; g/ T  c; T/ V6 I' a( s- C, U
10.员工表中有多少条记录?
1 F) }9 L3 d3 R6 ?$ b, U) x" mselect count(*) from emp_ning;" X/ J) y' D: s4 N- ^6 u
% A- Y8 m9 N/ _- O* }
openlab帐户下有多少个表?/ W4 U0 x4 Q3 M5 s
select count(*) from user_tables;" O  E8 t6 q. C$ q& H% W

3 B1 O6 P4 s9 [openlab帐户下有多少个名字中包含emp的表?! N% N0 R, Q" u9 B6 \6 d- b
select count(*) from user_tables9 v/ d5 d! S  k* L) B8 A
where table_name like '%emp%';8 G2 r9 s& k) d$ q
3 y9 G2 j* M: B4 m5 X* V) t
--表名默认大写
9 t# D; A/ d2 ^$ }select count(*) from user_tables7 O2 [* D. c8 g& ?
where table_name like '%EMP%';$ H. m- ?+ g1 J) }, n/ U/ r
! s) O) B& ?; G/ E- L+ k- X
--入职时间不是null的数据总数。
) ]& A8 r2 }' E' \( e# F% O--count函数忽略空值。' C$ F: T' a8 w( [
select count(hiredate) from emp_ning;
. s5 ~9 Q" t) F4 @( A2 ~- }: H2 b
0 @4 |$ [! f- c( m11.计算员工的平均薪水和薪水总和是多少?
9 d8 m  D0 g' p; ?6 ~" Xselect avg(salary) avg_sal,
# g  T* u* O" Z+ Y6 \9 K' T) m2 t       sum(salary) sum_sal# o5 B+ n3 P5 Q. q0 [4 }/ V
from emp_ning;
/ X1 G! _) g( B% \7 o4 q6 i0 r. H1 |' t6 ^
avg(salary) = sum(salary) / count(salary) % b: k8 U/ d' K' f6 P2 Z, |. @
              68500 / 10 = 6850
$ X0 B% d- R; S% ~# d8 w2 U--纠正逻辑上的错误
+ J- }- l; ?7 N! U! A8 Xselect sum(salary)/count(*) avg_sal, : ~( u* F5 z# H6 B4 {
       sum(salary) sum_sal
/ A! G' y4 n! D% Hfrom emp_ning;7 [( ]9 g& ^5 D* C6 E) p4 _* b

" W  K# Z# P: t: }% q0 `4 Yselect avg(nvl(salary,0)) avg_sal,
' i8 U' n8 Y! y6 h. f       sum(salary) sum_sal
0 n, l6 i4 @- n% Z( sfrom emp_ning;
' |6 F) |, }" r+ a
& _9 [, a' m# Q' _2 l1 ]  v1 |12.计算员工的最高薪水和最低薪水
/ O8 Q0 f+ F2 x) Y  s# z/ Cselect max(salary) max_sal,
9 w0 \7 T0 G+ r  C4 _       min(salary) min_sal
( P7 i) |% L- X" ?- ofrom emp_ning;# t" Q" b% A3 r+ I$ i

5 o$ H" n  Q, n; ~" n' `, S组函数:count / avg / sum / max / min 忽略空值" }! H. J3 t2 `. {% w, N
其中:avg / sum 针对数字的操作。
) e0 U1 j6 r9 ^      max / min 对所有数据类型都可以操作。
) @6 n* h8 X+ H
" l% S: e3 D6 m3 j13.计算最早和最晚的员工入职时间。
. W2 o. p- L0 X1 j1 d* _4 M9 nselect max(hiredate) max_hiredate,
+ y! @. k, V* b6 |6 s  h5 j       min(hiredate) min_hiredate
4 L2 \8 u0 G: B' |( Lfrom emp_ning;7 N# R5 q; a( j2 W$ X% q9 k6 P
+ x4 f: i2 W. |2 m
14.按部门计算每个部门的最高和最低薪水分别是多少?) Q6 H( C/ T2 K( o
格式如下:
  F5 N# V( \& R  F6 k10 4500   3000' {+ t" x% ]4 S9 H
20 15000  8000
- Y7 }5 S* i! V# v30 10000  5000
! ~4 ~+ Q0 L8 q& A/ l- u0 P, X0 H# \" e7 _7 G3 D
--group by 列名 : 表示按哪个列分组
3 i" r: Q3 Z; t: ]select deptno, max(salary) max_s, min(salary) min_s
) k) k6 r0 W4 pfrom emp_ning' {2 f* `, M, ~$ O, k2 \
group by deptno;! i  ~! I" m* I. m
/ U* d9 G4 x% P& a2 G0 F% ^5 F' q
15.计算每个部门的薪水总和和平均薪水?* q* Z! B2 C, F( ]# ~
select deptno, sum(salary) sum_s,
- T# v1 Q1 j5 }1 D) I               avg(nvl(salary,0)) avg_s
- P& R, z% Y& g) [) A( Wfrom emp_ning6 u: o8 H+ a) c' g* F4 P/ W
group by deptno;) ]+ d$ p; ^1 x. T* q, c; ^7 \

( [' h3 ^- E4 C! r16.每个部门的统计信息:格式如下:6 M" a' B' W. Q/ p
deptno max_s min_s sum_s avg_s emp_num
3 i# t/ M" t$ D. V( a7 x10     10000 5000  23000  6789       3! _: x4 t2 b& g0 L+ ]4 w
....
% |) a4 B8 I6 A8 P  f' jselect deptno, max(salary) max_s,
! l  S" n7 c6 p2 w               min(salary) min_s,
( I6 i9 X4 q# l/ s9 k               sum(salary) sum_s,* Q: z$ s; n" l+ j, S7 W/ w
               avg(nvl(salary,0)) avg_s,
: C% z" K! t: k8 n& o, \+ ^               count(*) emp_num
! \( E% h2 Q! Cfrom emp_ning
  h" q4 Y1 x9 |% `group by deptno;
6 ]8 A2 n( M0 W& V1 C' |! p$ C- E6 \9 F
select后出现的列,凡是没有被组函数处理的列,必须
7 \8 @3 r  H1 D0 k出现在group by 短语中。
' Q# h* h/ z4 @2 Q( ^5 Y( k* n, }
( Z# ~+ n2 r4 a* N按职位分组,每个职位的最高、最低薪水和人数?
3 S/ k' n/ j) @, [select job, max(salary) max_s,
0 w5 D( O+ J* v8 {            min(salary) min_s,( \( f. O0 p* L* L8 F5 {' C2 G
            count(*) emp_num; J0 `1 _* L& E# @
from emp_ning5 ?% L5 U+ J5 B2 \) H. c9 p% L6 e+ H9 B
group by job$ Z3 T1 @. J1 V; D
order by emp_num;
- f  M$ I  e( T. W. \" |/ j5 C9 r$ t17.平均薪水大于5000元的部门数据?7 o" k. e! e6 R$ I3 J+ k7 Q/ g
select deptno, avg(nvl(salary,0)) avg_s
; e; i0 v! b* @from emp_ning
9 H4 p2 S2 u- d1 y4 c& }7 Y( |0 }; W( Nwhere deptno is not null3 f0 N; y' F4 k; ~: Y
group by deptno
. P7 ?2 E- N2 c' B+ yhaving avg(nvl(salary,0)) > 5000;
$ U7 u2 p! T8 f& P% |0 H# o: L' f6 [) o# c% b* f9 l. d
18.薪水总和大于20000元的部门数据?' N) R0 E: {0 F% o3 O
select deptno, sum(salary) sum_s
( X5 [  @/ r9 @9 ifrom emp_ning8 i% R: Y0 Z7 {( q
where deptno is not null
1 ~- _7 z) e, V3 h, Z, rgroup by deptno8 ]' {  H* T+ _6 Q1 d
having sum(salary) > 20000;
$ i& X8 n2 O. ]/ E8 y9 Y( U9 \
& A% y( C8 H  m* R19.哪些职位的人数超过2个人?
, m8 A+ R3 K( M5 {2 f5 eselect job, count(*) emp_num% w. I# |, [1 a* {0 q' {
from emp_ning$ l/ n# h! y* }0 ~6 s, a* r
where job is not null9 H" O% Z8 I2 f" }2 n, @# |1 n
group by job
* n9 ?# q2 }" h) k7 ~: u4 ~) shaving count(*) > 21 }0 q, ?4 Z, N% W" [/ F
order by emp_num;+ A1 ~5 z0 u" c
# E0 m. p" p$ t7 i4 Y

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


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

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

   

关闭

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

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