我的日常

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

动态微博

查看: 1702|回复: 0

Oracle增删查改 day02

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:40:52 |只看该作者 |倒序浏览
SQL*Plus   
3 W% Z$ h5 }! d3 A5 Zsqlplus.exe ; q7 f  I8 m4 h0 U; g
) I& z0 k, k6 E( o( c( L, e5 z
1)数据定义语言:create / drop / alter / truncate; l% z, p+ y8 F5 n  I
对数据结构起作用。: U6 `2 u! j4 }) H: ^+ A6 K# S2 a
  ********( D/ I, Y( q+ L
Data Difinition Language: DDL$ ~) t* y6 ]  _" r3 ^/ j
2)数据操纵语言:insert / update / delete, O- ?) ~! }8 ]  A
对数据起作用
0 S, e1 \! q! `* T  ****9 N* C" v- T- l" E1 W
Data Manipulation Language: DML
1 C) x  ~5 k+ f& P* H* x" Z1 u6 S3)数据查询语言:select
4 Z& E9 ]: J: I' `( O      ****
6 O9 I, S& s# r: }" lData Query Language: DQL
7 o  ]; O( d: m# {. q8 u4)事务控制语句:commit / rollback
8 W7 |/ M% \7 Y5 J- B. _- {- R对DML操作确认# v& t; h  f/ S+ Y0 ?0 Y! I( b( X

; c9 r4 @0 }7 f9 g+ u7 U一、学习单表查询语句。
4 V/ R, `% b2 U1.计算金额的四舍五入?( t# P* z1 w6 M* j) P3 p6 O
select ename, salary * 0.1234567 s1, : @; A! _) H5 q6 @+ [
round(salary * 0.1234567, 2) s2,
+ S2 v4 z- O8 L, r+ ?round(salary * 0.1234567) s3,
% x# z% w5 l) \* C$ T6 Atrunc(salary * 0.1234567, 2) s4- N' S1 l" K! U4 a% T$ r: v2 s5 I
from emp_ning;
) H& o3 m, v3 X& I. B! |" \+ P. ]7 W
6 K* F4 p5 ~9 ~2 Pround(数字, 小数点后的位数):四舍五入* c9 }0 d! q! Y
如果没有第二个参数,默认是0.( {" ]$ w& ?4 Q! `8 u( Y5 |/ e$ I

7 k  }% F4 `9 }; P1 ztrunc(数字,小数点后的位数):截取
/ O- s+ \5 B) Q; l; f, L如果没有第二个参数,默认是0.' R, U  d1 q% w8 `$ j; @

" q  w/ Z$ s2 c2.Oracle中的日期9 ?6 A; V2 ~3 I# s6 c1 s
1)取系统时间的函数:sysdate% F" Y! x9 u" H/ ^$ }. `1 R
select sysdate from dual;
4 `: |* o. Z) w
, X& `5 e4 h0 i, F! Z  T2)把时间数据按指定格式输出! D6 Z, q7 R* N% t, a
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')$ P2 A' j7 M5 g! [4 l
from dual;
7 M1 w3 b+ I9 Y9 |, p7 U/ d
4 V& |) s" [$ e8 z$ Dselect to_char(sysdate, 'year month dd day dy')
/ y; Q: E$ u' G" A* G  Ifrom dual;9 G! l: x9 Y. ?  u  ]) ]1 v  Q3 _
% h% x  x( a! G9 a4 N# o
to_char(日期数据,格式)1 ~  U7 H7 H7 i9 X5 G3 b$ l
! p8 A1 f' ?) f  [9 |: H8 S& ]
public String to_char(Date d, String style){; H5 r- B9 v: r5 A- i4 Y- ?( y
        //SimpleDateFormat把d按照style的格式转变为字符串
9 t8 Y1 e9 L5 k* o/ ^& h        return 字符串;5 h. r6 q6 e3 O# u* M, e
}
+ J: J. z" w- o; L5 s; ^9 n  j8 G# L' H! s9 k
select to_char(sysdate, 'yyyy/mm/dd')
# `7 Y. M, u6 M# r  S% ^" j9 yfrom dual;6 C2 a4 x& J& T; L
& h6 r! a: d6 i9 m/ o9 O
yyyy: 四位数字年  2011
& z8 n5 L: r! G; m' O* L; N' Y. nyear:全拼的年 twenty eleven2 c: E6 Y" s1 @
month: 全拼的月 november  中文:11月
' ]& z; H' x6 V, ]: ~mm:  两位数字月 11
( ^# Y/ H5 X( v( x& }mon:简拼的月 nov
+ i& o5 X8 O, j; z  R1 Wdd:两位数字日
# Q9 Z) M$ D- l6 @day:全拼的星期 tuesday$ ^  j. z% ~  U; A3 k$ z1 F7 I# _
dy: 简拼的星期 tue
1 h  e) ?/ c: \' i5 J5 E8 t7 fam: 上午/下午 am/pm: J$ s5 }1 B- q

. H1 r* u" y( c6 [* X% Isqlplus中日期的默认格式是:DD-MON-RR
: t* J* h( V6 t# _/ p1 ]现在的时间是2011年
8 ]3 e% m: i% _7 i1 b           YY           RR
  z: A; U" O/ h8 h4 r4 n' {% K# E05年      2005         2005, ]4 C5 N/ v! _" a! ~) d5 |( a- h
98年      2098         1998$ C, G! k! G3 }7 W6 U6 E5 H

* W2 R6 L0 u4 o. @6 S) ?: y* {# L; O假设现在的时间是1998年$ I' ^2 `& S$ s, n6 K  R
05年      1905         2005: k$ b9 j+ {' R% [
95年      1995         1995 ( B& k* J( O0 w, p( Z! I, j& ?

2 v$ y2 {  N9 i- b* q. e6 Yinsert into emp_ning(empno, ename, hiredate)# A& n5 B% \% n
values(1012, 'amy', sysdate);
; x. f; L# i  n--实际入职时间是2011-10-10
$ t: r, c; q% H  u0 T2 h# T3 t( Binsert into emp_ning(empno, ename, hiredate)9 L2 b4 o1 W1 M& o- N( Z4 ?
values(1012, 'amy', '10-OCT-11');
! l2 K% ?! \0 S. d7 S
& E7 i% u) I6 f3 u5 v* Ainsert into emp_ning(empno, ename, hiredate)
2 B$ r' L4 z. e: h5 ]- b2 F3 E* Pvalues(1012, 'amy',
5 [; p7 O; n. V, x, }! ^to_date('2011-10-10','yyyy-mm-dd'));6 j2 V0 k- h9 C& l

# |1 R4 H1 C( J8 t4 q4 H0 T显示员工姓名和入职时间,显示格式为:
5 S. ]( K& d4 d+ r7 R) [amy   2011-10-10$ }) W- R' I2 [* L' U

5 H% n: B  |6 i- o3 T' q8 g6 R         to_date2 @- b4 [* o' @, B
字符串   --------->   日期' T6 f: ^- O! }/ V3 a
         <---------
0 D8 i- S( S0 o9 P3 q8 o9 N         to_char" B) Z, i: _% C+ j. _  j/ h3 l
; M! h+ I- f  H% C7 K2 ?) V
3.计算员工入职多少天?0 f5 o( `' y0 }9 f0 A( O' H( }
select ename, hiredate, (sysdate - hiredate) days! U% Y) E7 y2 d1 _  g9 Z
from emp;3 Z; c/ [8 A5 g) l+ W" f

2 L  J5 z0 M- g8 L& Y日期数据相减,得到两个日期之间的天数差。
4 F; V) B) O/ Q. ?5 Q8 x不足一天用小数表示。6 U' G9 T: ]: d7 Q
4 z1 z  e5 L! |! X7 c, ^8 C( y" j/ \; X
select ename, hiredate,
9 M: I1 N% x3 U9 X0 D: I( zround(sysdate - hiredate) days
# U) Y9 l  ]5 U1 i+ Ifrom emp;" ^  N3 x3 }* o  L6 r/ w. V8 [# c/ d" a
6 k% @6 Z, E9 [
4.计算员工入职多少个月?用整数表示。
' h* M& p5 H! Y1 n$ ?. j! n2 Fselect ename, hiredate,& I( N" Y& j. Q- D
months_between(sysdate, hiredate) months
" x: i1 s( f2 p! @from emp_ning;8 a+ r0 U) w) u2 ]( j; b
+ W' P' d  ^5 z) A/ B; V$ z
select ename, hiredate,+ F  O+ l1 d, R# S
round(months_between(sysdate, hiredate)) months
6 z9 q. j/ f  U' n. i. [3 R. [from emp_ning;0 W3 k6 f. F  V, J7 L

  e* i2 a, C& ?, W8 [7 e: Tf3(f2(f1(p1,p2),p3),p4) : 函数的嵌套
% C$ ]" b2 t' D$ ^* e& v& k; P8 _
( Y1 e& H! I- D/ a4 B% w4 z# t5.计算员工的年终奖金
  N( F, v3 d' V, Ybonus不是null,发bonus的数字。) v; T3 s: p5 i. v% J$ F+ S
bonus是null,发salary * 0.5.
. _) `1 ?2 H4 S2 wsalary还是null, 100.- j2 H( v. J5 A" [% J

/ C( u8 {( ]7 K' lpublic double calculate(double bonus,
! b* @& S' ]1 K6 I( L( Y                        double salary,
5 M& E; L$ W- X4 V5 D8 E# ~5 G0 z0 ]5 p                        double comm){7 u/ L" t- s6 l7 r
        if (bonus != null) return bonus;+ G9 ~4 Y+ ?% h" P% _
        if (salary != null) return salary * 0.5;
+ S" l8 ]1 r( y7 H        return comm;                        
5 m, ~+ @, r3 \) L}
0 A+ X7 S* Z0 r6 A& V7 H' I6 }--返回参数列表中第一个非空数据! G! g% B$ ?: t6 T  A" V
--最后一个参数通常是常量。
2 C: ^- v: t. g1 t  X' a3 wselect ename, bonus, salary,
  e" P% ?7 O) T& q8 Z) ^coalesce(bonus, salary*0.5, 100) bonus) ?' A0 ~4 j  P. \2 i+ D% w
from emp_ning;) o1 _$ ~0 {1 ~7 C1 O$ d) d$ c
. G3 V  e2 M/ c  ~! z
6.根据员工的职位,计算加薪后的薪水数据:
/ ?# d3 J: C- X$ w- g2 s9 O6 U+ xAnalyst: 10%
% v! B) W% p0 Q, x: O: ~Programmer: 5%
6 ]' P5 z$ _8 l( G+ t) `# }clerk: 2%
4 R2 ^1 l* x: r其他职位:不变。
; v6 T6 f" I# t6 t# G% O4 @( y" ~
case语句:
) O  h1 F& P% D' p: Gselect ename, salary, job,! L6 K7 {6 N) Q" {$ F
case job when 'Analyst' then salary * 1.1
" m9 L6 ]  _, S         when 'Programmer' then salary * 1.053 C- ]' g# r9 t
         when 'clerk' then salary * 1.02) |  F- [1 J" H9 w1 m
else salary1 [' J7 _- @7 ~! Y" o
end new_salary" ~# d' b3 R$ B9 A
from emp_ning;
  G9 E: ^1 I# w" Z& N3 L* n; E. z- {! k; }( }/ X/ V* R* W
select ename, salary, job,1 b/ Y1 G% @" k3 {# m
decode(job, 'Analyst', salary * 1.1,
' E$ ]' N! s1 r8 J  L; @            'Programmer', salary * 1.05,! k& f. C) H; ^% v
            'clerk', salary * 1.02,2 }4 a- G, |" z7 v5 G! c2 y
            salary) new_salary3 q+ Y8 ]! M3 J4 ~
from emp_ning;) H& d3 F9 v& e, P& q  s: D1 \! P
& t4 l- u- r4 y- j3 ^" y6 y
7.薪水由低到高排序% ^% q- P5 u7 e5 Y  d# R& ?
select ename, salary from emp_ning1 a6 S+ Z3 R' m' M5 W& J/ J. |
order by salary;
4 ^- r! e7 {/ G
* D" N9 l4 [7 C2 Y/ f  p) fselect ename, salary from emp_ning3 @8 N8 e# x  J; x# F9 m3 \
order by salary desc;  --倒序排列 descend8 t+ z5 M6 M6 O& C/ X" q3 M
  L" a& Y( Z+ P1 ]
desc emp_ning; --查看表结构 describe
& K: q1 R. b$ t. t, I" ^9 L) ~: A
8.按入职时间排序,入职时间越早排在前面。
: l' y6 {# ], [select ename, hiredate# V1 j* T; Z5 R: q2 h
from emp_ning
# W6 F$ y  B* _" N7 Porder by hiredate;
4 R; k8 I; x$ C+ d& G! J
+ C. R6 B# k' H, A$ U2 ^9.按部门排序,同一部门按薪水由高到低排序
3 }( H5 ^+ ?5 |$ }6 F6 d7 \select ename, deptno, salary
) f' K$ G2 }1 {8 Ffrom emp_ning, f; X) i/ X7 Q" N3 ?5 Q
order by deptno, salary desc;
) u' a$ \' x* i
% N& T* f+ @! `0 A( I1 B$ K10.员工表中有多少条记录?
  Q  {2 v% j; W/ `! S# A/ D$ ?select count(*) from emp_ning;# F' A" v+ W7 b* H; L" B# T# e; C

) W. G( y: }/ h  W% h" Gopenlab帐户下有多少个表?
& J; W  C/ F. t! D* j4 Y! yselect count(*) from user_tables;
' L' {6 @# A, i& J2 n4 o4 `
+ o" E+ u9 r( a- u- D, hopenlab帐户下有多少个名字中包含emp的表?0 k, j4 e) g. ^3 w7 [: @% j
select count(*) from user_tables: b$ m+ P6 r  L$ {- d4 Q
where table_name like '%emp%';5 N( z% C! x6 p5 G2 ]0 E- w; V
! M. R" Q( H/ n( q
--表名默认大写
8 z' b6 O& f5 ]6 g  }# B  R4 cselect count(*) from user_tables9 m) p0 k( T8 K8 s; Z
where table_name like '%EMP%';2 C& ^  F3 Y# v. E- D7 t8 k
& s* l1 ^. ?- B  N$ Q
--入职时间不是null的数据总数。
0 \2 ~5 Q8 B+ ~/ s0 K8 R* N! i5 g--count函数忽略空值。
; t/ x" M7 |1 j7 Q6 w7 z6 B4 iselect count(hiredate) from emp_ning;4 D& C" o! j/ _( H% q" V) y9 {

+ O$ J( s+ z& v/ Y# M* h11.计算员工的平均薪水和薪水总和是多少?1 j: r. A4 t! {* R' V
select avg(salary) avg_sal,
9 N7 B1 y+ Y7 W2 d       sum(salary) sum_sal5 B/ O; y  L# ]5 I+ t
from emp_ning;" ?- v" ]9 }+ f5 l/ w! B: a  u
3 B5 z2 F/ e; V. l: I
avg(salary) = sum(salary) / count(salary)   @! V7 k1 O$ I; L* r4 k
              68500 / 10 = 68508 `3 k) b0 b% m/ n- s
--纠正逻辑上的错误
) c$ C& H/ J0 ]0 tselect sum(salary)/count(*) avg_sal, - W; u0 p1 f# M7 W; K5 ^5 e. [
       sum(salary) sum_sal/ y+ E. T) M6 |
from emp_ning;/ F6 M1 Z2 Z9 W( V0 V3 A; a

+ d( C0 l) R8 v, Y' L: tselect avg(nvl(salary,0)) avg_sal,9 N) _' p1 y, t
       sum(salary) sum_sal
: d) j& b; J/ p& u' Q: Lfrom emp_ning;3 {, F0 ]% l6 X2 ~4 \

( j' o" e3 A' Y: [! g! ^- s12.计算员工的最高薪水和最低薪水$ O; r$ N+ W1 P$ P1 K3 r
select max(salary) max_sal,+ L+ G1 p8 N3 j% s
       min(salary) min_sal
4 ]9 `: n! Z/ a7 Kfrom emp_ning;
/ s/ F9 U3 C" x9 ?% t1 `( a- N$ S' R' i: R0 `" O
组函数:count / avg / sum / max / min 忽略空值
4 [% ]6 z7 \& u8 r其中:avg / sum 针对数字的操作。, Z1 M, ?. b1 i+ ]
      max / min 对所有数据类型都可以操作。
  L" q- ^) d  Y$ u- [3 b2 H5 s$ V7 P+ X3 `% v# U) Z
13.计算最早和最晚的员工入职时间。- x7 {% Q6 m. Q6 d
select max(hiredate) max_hiredate,
9 J. O- t" D. j- n! H3 \- O, ^; r       min(hiredate) min_hiredate
/ a! d7 p( |0 k& K$ wfrom emp_ning;/ L( f; U7 q( d0 D/ p4 G

+ C, U- l2 t! w3 F' j! d- ]$ r# w14.按部门计算每个部门的最高和最低薪水分别是多少?+ `; }. I, e( u, t
格式如下:
9 h1 U7 `; ]% s10 4500   3000) R: [4 S( S7 v& `6 h
20 15000  8000
+ h& O1 m% m- I8 [* e30 10000  5000! Y/ G" {( V/ ?  Z
, m. Z0 Y" i# m$ Y9 @" v# M9 l
--group by 列名 : 表示按哪个列分组
$ _/ ], X, l3 [( w) @select deptno, max(salary) max_s, min(salary) min_s
8 ]- |! i$ {% J$ t- l! Pfrom emp_ning% i! t- a5 O  C* e) @0 S
group by deptno;
: t' ~, \* x" e( w9 X4 D( w( T% V6 H6 T& r0 ?
15.计算每个部门的薪水总和和平均薪水?/ k) m+ u7 P7 K! d
select deptno, sum(salary) sum_s,
1 J0 G" |4 [. J8 |$ k7 p               avg(nvl(salary,0)) avg_s
% C5 u9 r4 l8 B+ h# k9 mfrom emp_ning/ A6 Y9 Y% p# T" e
group by deptno;+ N, U' M9 x4 Y9 D/ v% I) ~

# c- S1 G- F1 Q. w( o# r9 E+ L16.每个部门的统计信息:格式如下:2 V, |8 C. b: \& H4 J* C! Q
deptno max_s min_s sum_s avg_s emp_num
, ~. |5 ]. d6 B+ {10     10000 5000  23000  6789       3& A" F, b( Q, ^2 E
....
" q, I, R6 V/ ~select deptno, max(salary) max_s,
' N2 T% i. `# d* h. c" V               min(salary) min_s,1 a8 i2 Z- z; X) Y9 [& C2 ~
               sum(salary) sum_s,- G9 v4 \8 o+ s- k3 s
               avg(nvl(salary,0)) avg_s,
8 T$ B* J) ]2 Z3 Q: ^               count(*) emp_num7 @2 v5 @4 L4 G# T% G; o
from emp_ning7 s. b" s3 ^/ b# t& A
group by deptno;9 t( {  t/ J* z' ]7 M, T
9 S+ i  h8 a& z1 @4 C
select后出现的列,凡是没有被组函数处理的列,必须
6 r3 _& i' `5 l* N出现在group by 短语中。
" w0 C6 k* ^8 @6 G, U0 b1 D! k- {* b# c+ \. i9 X4 n7 V, I
按职位分组,每个职位的最高、最低薪水和人数?) C- ?8 q# ]9 S1 H/ j& O& V1 B6 O5 x
select job, max(salary) max_s,
; F% N0 B5 K0 }: k2 N            min(salary) min_s,. g- Y; x+ @8 {6 a, V' `5 E
            count(*) emp_num
6 m* \7 ?  ]: r: N  G0 bfrom emp_ning2 e- f1 d) \* W% T. m* b" u) B
group by job
% M( }, a' K* l6 m& m" }0 z" ~( yorder by emp_num;8 E) r1 f1 H% Z% I! r3 @8 }
17.平均薪水大于5000元的部门数据?
5 M# |( r: d. q! }/ O$ mselect deptno, avg(nvl(salary,0)) avg_s5 m1 Z4 C8 K$ _% D5 e# [3 K4 B. Q
from emp_ning: P& A& @& F7 Z4 c7 V
where deptno is not null
" j1 N. Y$ O# X: Q0 Xgroup by deptno
" L- t) k. D* F* s6 ]& l7 Xhaving avg(nvl(salary,0)) > 5000;
0 O$ H. M. b) ?* O- _& R& V: @0 B9 o4 @( q' v" I0 m! L% D/ I0 ?- V
18.薪水总和大于20000元的部门数据?+ y1 `$ D* ], W1 `. o" }3 Z6 R# `
select deptno, sum(salary) sum_s
4 h# v8 e" G0 w# t8 f% Q, {- Dfrom emp_ning$ ]; E+ j% y6 ^9 f, ~9 \
where deptno is not null$ @9 ?" l0 H1 r
group by deptno" Z2 }4 S' s) y1 ]/ h" z
having sum(salary) > 20000;" j* C! e0 J$ b- c+ z" |$ r% Y
% J6 j7 u" O6 T6 c
19.哪些职位的人数超过2个人?4 L& a8 W- u$ _! l! p
select job, count(*) emp_num
4 G: T0 S3 V9 K- ~* t/ y# C$ rfrom emp_ning
! t: o8 c' \' n4 Wwhere job is not null. I' {! z6 W' f7 w3 O& r
group by job3 M0 |! h3 c9 C
having count(*) > 2
$ j9 M- a$ o8 r" j2 ~order by emp_num;
. z) \! W0 o4 m, s
$ Y9 o; U5 N6 i0 i% J  |8 z* t  l5 z

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


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

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

   

关闭

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

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