我的日常

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

动态微博

查看: 1663|回复: 0

Oracle增删查改 day02

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:40:52 |只看该作者 |正序浏览
SQL*Plus   7 w$ K8 B* n% d; ?
sqlplus.exe
5 u( O" N5 K& y$ M. M/ H7 i' i$ R4 V3 z7 O) i
1)数据定义语言:create / drop / alter / truncate3 P" g2 z* `/ |6 P& _+ I1 x
对数据结构起作用。, C! G: F9 g! H2 `" b
  ********
: ~" U4 o4 q1 ~3 _* x3 X' Q7 Z1 H  jData Difinition Language: DDL3 j3 G, l3 u4 e9 g1 y+ ?6 \, v
2)数据操纵语言:insert / update / delete
, |/ p8 G- ^+ L3 R0 p对数据起作用2 d( i! h- ]1 _
  ****
) e% p- m. |1 w) AData Manipulation Language: DML
8 t7 `: r5 V, F( v3)数据查询语言:select
% r9 G! G  n0 u7 n. [% p      ****
7 Q, S/ w9 d6 b5 [$ XData Query Language: DQL- V* e5 q0 Q1 {. q; C: W
4)事务控制语句:commit / rollback0 X9 b7 _9 ~9 K- o  b
对DML操作确认
/ Y6 o8 K9 \: n+ X/ H4 z. m! {) ]8 G
一、学习单表查询语句。' N) m' ?) B  R2 C
1.计算金额的四舍五入?
& u" e3 a/ Q5 y) _5 fselect ename, salary * 0.1234567 s1,
0 y% \0 R. O- P" Zround(salary * 0.1234567, 2) s2,
* a* m  p: j. I: o9 Sround(salary * 0.1234567) s3,; c0 d0 W0 L+ n  U% ?# @
trunc(salary * 0.1234567, 2) s4/ y/ T, j7 v) L$ g  ?2 l
from emp_ning;: F& \- J4 j+ N- E

, Z; n5 R) h. F4 R% y, ground(数字, 小数点后的位数):四舍五入3 g% ^9 b; v% M. D
如果没有第二个参数,默认是0.
5 t( z3 k; X; `6 f$ `! E
3 e# p* P5 d: J& V- J, t; ftrunc(数字,小数点后的位数):截取
' q3 K4 N7 X2 n& w* e/ k, l如果没有第二个参数,默认是0.
$ b" ^8 m1 ^0 _) _+ J' \8 u5 m9 ?
0 b. [  a* D4 d. C; @2.Oracle中的日期
' n4 J+ S; l4 O2 C4 @1)取系统时间的函数:sysdate
3 a& T0 P, c' U3 |: fselect sysdate from dual;0 m5 O+ S' U/ {  j/ {

1 P4 X! c1 u, x  Z3 a/ N0 \2)把时间数据按指定格式输出( J4 {$ q& `; L* y
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'); l" A- B2 w+ p& g
from dual;
# {( ]& r( C6 y0 Z$ _
! Y) }' G/ s9 l6 [' j) xselect to_char(sysdate, 'year month dd day dy')
* Z. C6 w  C2 |from dual;
4 t+ o0 C) e# }, C' i! R+ v. e' o! g# h
to_char(日期数据,格式)7 \. z9 ^4 U. O& C1 `8 d8 Q' l4 x

$ C. ?3 z) g6 Fpublic String to_char(Date d, String style){
8 o  a9 a7 O1 E0 ^" z& S        //SimpleDateFormat把d按照style的格式转变为字符串
* R/ |" \+ A% k% {        return 字符串;
9 |  P% b8 C! V0 @, C1 A} # V3 ]7 N( u8 S$ l$ [1 v1 i

9 g" _# r" o) B3 oselect to_char(sysdate, 'yyyy/mm/dd')
6 M, i, X3 y6 K) X, D: Ufrom dual;
! \  u$ o( U0 Q( `, Y# z' s( G0 X0 J1 A2 ~
yyyy: 四位数字年  2011
9 |5 `" U. X5 Z* w; nyear:全拼的年 twenty eleven" h) Q: \! }$ O! s5 m- }) M& s
month: 全拼的月 november  中文:11月1 P2 g# f: }6 C3 e
mm:  两位数字月 11* V) f! {4 r1 [) T: G6 V% g
mon:简拼的月 nov
% r9 ^% h# j" v! t0 N, S2 u4 wdd:两位数字日$ _" F9 t0 J9 w/ B; g. B
day:全拼的星期 tuesday
) S* E8 \: i' c, ^& qdy: 简拼的星期 tue" c4 [$ p' G# b$ l
am: 上午/下午 am/pm
* E3 S& d% J  ?) R5 q3 L) O1 ]: K6 |6 A2 S5 k/ N
sqlplus中日期的默认格式是:DD-MON-RR; {7 d7 j" a/ k
现在的时间是2011年
$ T& X/ b) L; y1 h           YY           RR' r- Y' `9 r0 A* k
05年      2005         2005
, ?$ E2 M; D. h2 P8 J' s' x' }& b( U98年      2098         19986 v6 n2 G0 w7 b3 T
+ Q4 j! c" E' q; q; C0 O
假设现在的时间是1998年
0 K" R# y& A' Z& J05年      1905         2005
. y- X4 m8 E9 e95年      1995         1995
' p: b4 t1 _+ ?# b, j( u8 x: l' V4 |  o* `+ n( ~0 S* k5 T
insert into emp_ning(empno, ename, hiredate)
4 q0 v) W5 S3 Z2 Cvalues(1012, 'amy', sysdate);" v0 d) N" S+ R$ n& J* y7 |
--实际入职时间是2011-10-105 d' B+ S7 b1 _  O* d; {! e
insert into emp_ning(empno, ename, hiredate)
) Y; ^' y+ L0 q! K, h; Tvalues(1012, 'amy', '10-OCT-11');
$ u( a4 N, o# M+ v( b4 j) t# U. G  W! Q7 p0 m
insert into emp_ning(empno, ename, hiredate)
0 ]" M- k- w+ p4 e+ n3 x. _- v" dvalues(1012, 'amy',
# C4 d1 V/ ~% Uto_date('2011-10-10','yyyy-mm-dd'));
, H- J$ ^: Z0 w; O
3 R- Q6 K8 n" z! G显示员工姓名和入职时间,显示格式为:
5 _& C5 Z+ z) R- i; H, H# y9 h& h* Uamy   2011-10-10* O! j* k$ d7 f3 R( ~2 r0 s0 h

. y! K5 ^6 H0 M$ ?$ @6 @% J( l         to_date- ~, T) J" b- x* b
字符串   --------->   日期
. f* f  g3 d! z         <---------7 d2 d6 z1 Q# Q" ~8 c& j
         to_char
2 j+ p2 `3 U) j  `- n" {
8 t8 G* w2 {8 w6 j3.计算员工入职多少天?
; D' U  M3 Y* t4 a) u6 e7 C( N! g2 eselect ename, hiredate, (sysdate - hiredate) days) @1 y8 _8 k8 K
from emp;
, U3 V3 x5 `' @2 g2 N, I: o* v# p% L, K5 Z# I) s8 V: g2 \
日期数据相减,得到两个日期之间的天数差。1 Y  ^1 W  `& A  S( Y( X8 b. o1 J$ H# m
不足一天用小数表示。
% D" u" m3 u) E* z# F7 ^. g2 B0 @! N  z* J$ [
select ename, hiredate, " @3 _& X4 L7 r7 U* {  Q9 x
round(sysdate - hiredate) days6 E  h5 `" E+ E- J
from emp;
9 f6 ]: }  Y1 H; l* I3 w
! A$ @6 x& E- y' z; q4.计算员工入职多少个月?用整数表示。  h2 o2 c: S! D! B. m' L/ M/ g
select ename, hiredate,5 F* h( u/ x% `# X# @0 n
months_between(sysdate, hiredate) months) @7 @  l9 I; ^; W/ h7 ?/ [0 E: U
from emp_ning;7 m9 {. K; ]# c2 [+ V; Y

) g1 f1 M8 H* v( _4 V, u. N; jselect ename, hiredate,
- ^) O6 c4 E& Hround(months_between(sysdate, hiredate)) months7 P' N& I0 U) U
from emp_ning;* j3 \/ L) K& l  V4 T) Y

6 I3 Q% }1 @9 l" @6 Y* _! W% ff3(f2(f1(p1,p2),p3),p4) : 函数的嵌套. X  F$ a# M( Q8 I. a, z

8 p. g0 x2 H/ b4 X$ {* o, X5.计算员工的年终奖金  G1 i% I% g, s0 y# v. q
bonus不是null,发bonus的数字。
" s6 [, w" c7 j; \$ Bbonus是null,发salary * 0.5.
) U, D3 L# j9 s6 }* v4 hsalary还是null, 100.
0 n8 }8 H# z, k
3 L! ~, N) j0 j0 n* C4 h7 i; Vpublic double calculate(double bonus, + d/ w" l* i; c- ^8 C6 q
                        double salary,
. D# e# V. @& N" L                        double comm){
( o' C5 ~- A0 x; U. a8 }$ U) r9 Z/ U        if (bonus != null) return bonus;& @7 ^4 a  q5 i: N0 F
        if (salary != null) return salary * 0.5;# a3 h- _- ^- Z5 [
        return comm;                        
, e, `7 [7 D0 a7 F$ J$ o}) B* s) O; ]0 T$ U
--返回参数列表中第一个非空数据% |5 O) p) d8 H- L
--最后一个参数通常是常量。
2 f4 \7 a- F; ?  B) \6 o) c! yselect ename, bonus, salary,
$ W5 a7 _$ W& j- |3 r! t0 jcoalesce(bonus, salary*0.5, 100) bonus
" y/ }% o5 H& G3 _/ D* afrom emp_ning;
, A4 P" X  r4 Y1 K, v
9 k' @8 V+ c4 S2 q1 V3 g6.根据员工的职位,计算加薪后的薪水数据:( |# i% J. I1 o7 |* u" N
Analyst: 10%
* h, S# c5 y. E4 mProgrammer: 5%3 X8 H* q8 `* u5 _8 `! Q
clerk: 2%
& T- K6 O' W# P1 l& b其他职位:不变。2 _) @% }% Q) M3 C
( k4 N; D4 G% o  L0 |+ z; k. p6 ?) ^- z9 Q
case语句:
9 m7 f# K; m. _% i& |7 c( E3 xselect ename, salary, job,
! f( M" L' W* d% V; c# Ecase job when 'Analyst' then salary * 1.18 t9 c& u4 N7 g$ i
         when 'Programmer' then salary * 1.05
. O. s5 h, Q' c4 g4 H         when 'clerk' then salary * 1.022 v" C" g) A; {
else salary
) }+ j. r: V7 ~" x) g5 `+ \3 u9 |' gend new_salary
" I( e! ?5 ?8 D1 j0 r/ v5 wfrom emp_ning;4 m. |1 G* q! \2 k$ p
) R6 c; t# \/ r! u
select ename, salary, job,
1 P9 ^' u. L( _9 rdecode(job, 'Analyst', salary * 1.1,
6 ?0 r, V4 s, F  G3 B6 ?            'Programmer', salary * 1.05,+ h. z; `! D( W+ S$ g% ]
            'clerk', salary * 1.02,, ^+ t" u6 r% X  k  T* n& k
            salary) new_salary  B6 s1 M  M( ]5 @6 I
from emp_ning;$ z0 L/ y, @: o. C

; Q6 ?9 C7 D. z- T7 L3 [7.薪水由低到高排序
) ]5 ~5 q  y+ C, z) }select ename, salary from emp_ning, F" S" S+ P1 |& |. _/ K! t
order by salary;+ W0 x$ z' ^3 O8 ^5 R7 F

) G5 C2 H5 D( O' M- e; H7 Yselect ename, salary from emp_ning
+ X7 e* ^0 o' k& Z$ porder by salary desc;  --倒序排列 descend. l9 @! }9 Q, g7 e9 x
- ]9 m) U+ s( E+ U- q1 [
desc emp_ning; --查看表结构 describe
0 F% r9 r7 i+ N8 s6 \# s! k
7 p0 v4 x2 D/ Z3 C! z( ~) d8.按入职时间排序,入职时间越早排在前面。
7 N$ X6 c$ B" F5 M. k) ], Yselect ename, hiredate
9 d$ |+ R- N$ lfrom emp_ning
3 P9 ^* S* a# {* \; L3 z$ Dorder by hiredate;
3 c% _$ U' P+ b, v8 g
$ R3 T1 \/ q$ O8 c9 y% v$ ]9.按部门排序,同一部门按薪水由高到低排序
  `, G  D6 l2 rselect ename, deptno, salary1 H" S, k2 F: S
from emp_ning
; a  Y# _1 R% G! S8 z+ gorder by deptno, salary desc;
6 [" C& ?1 @# r
( h( g) l. Z3 \10.员工表中有多少条记录?
! `) L$ ^& g  sselect count(*) from emp_ning;
" x7 C7 H. h1 \% l% l- J3 ~* D' T" e2 M
openlab帐户下有多少个表?
. ^( R! `& C5 \! X: G3 Cselect count(*) from user_tables;
. x: v8 I; ]1 Q1 ?$ d9 I) O. h+ u# Q7 V- b
openlab帐户下有多少个名字中包含emp的表?
3 D) W1 h* L9 }. B1 C0 z7 U2 h& S- wselect count(*) from user_tables* p+ Y+ @% t4 B& p! }+ x
where table_name like '%emp%';9 I8 z7 L( X/ O

9 w8 p. |2 f# j+ V# G--表名默认大写
2 \. H- [  C- Q1 n- E3 x! uselect count(*) from user_tables
. ^; b+ T: A6 dwhere table_name like '%EMP%';) \$ S- w) ~, m: w. _. F

, V! a/ P- c2 P; q7 {--入职时间不是null的数据总数。1 y* t& B& {8 R) O* q( U% r) G( V5 I
--count函数忽略空值。7 x6 @6 u* A2 g  P+ Y
select count(hiredate) from emp_ning;0 o3 i; W( |. {8 C( U3 o) l, s- v

$ M, P& _  S3 C; I. q/ J11.计算员工的平均薪水和薪水总和是多少?
6 x1 {# m# @( S6 Pselect avg(salary) avg_sal, , O. p; }: n( `  M7 k: I
       sum(salary) sum_sal
) u" Y0 C7 [$ y7 |+ Yfrom emp_ning;
7 \; {, J3 @$ F* @2 i+ v# f: B
% M0 {0 U7 ~8 Q5 m1 t$ Z, vavg(salary) = sum(salary) / count(salary)
/ f- v) ]- \$ e' x" ~              68500 / 10 = 6850' s2 B- o5 D8 h0 @
--纠正逻辑上的错误3 f& D: {8 ^& y6 |
select sum(salary)/count(*) avg_sal, ( Z- y" R5 d& _" w5 {
       sum(salary) sum_sal
% l* G0 c. A* K* F4 Ifrom emp_ning;3 e. K) J1 L# }4 \, T# h
4 u- Y( q! x' g- {- B- G
select avg(nvl(salary,0)) avg_sal,3 n, X% p( E2 O& ]
       sum(salary) sum_sal
& R0 E0 a& P8 K9 E8 ^* u5 Ufrom emp_ning;
* m0 Z# m( M6 ]. c6 R4 d: \' R; B; F! s' {5 k
12.计算员工的最高薪水和最低薪水4 i# o5 L: A/ f/ u0 q& _# D+ ?
select max(salary) max_sal,) ?% P2 w: T; U$ b" h0 Z
       min(salary) min_sal
2 a2 ?1 ]) l. i* ufrom emp_ning;. A) U; W3 z: J! j- c1 G5 Y  ?5 W

- `0 K7 |4 A6 I" k组函数:count / avg / sum / max / min 忽略空值
# _  n( P( n1 g7 \  Z其中:avg / sum 针对数字的操作。
' [0 D& O/ G8 Z1 ]) y: X& a- G      max / min 对所有数据类型都可以操作。' `$ D+ v' B5 x: q; P6 |+ E6 S

5 u8 _& K% l) F! b1 w  r' h13.计算最早和最晚的员工入职时间。
1 R' N* X% p/ x. y: s4 {, y# J! Mselect max(hiredate) max_hiredate,
- [( p" b" ]2 m. r; m; q( e$ Q, Z# m       min(hiredate) min_hiredate! S7 {. T8 k6 _- a8 E4 J
from emp_ning;3 W% I8 W- x' u) j  |# U4 F+ X! r
. L7 F/ X* F* }
14.按部门计算每个部门的最高和最低薪水分别是多少?
* F# _( Z/ K8 l# x, Y格式如下:+ B! B+ W% Y5 h) ^) M
10 4500   3000  V4 t3 A9 }6 W1 V
20 15000  80001 `2 T1 a$ L; h. P/ s9 V
30 10000  50005 ^! W& C5 m1 {' W. _6 D& b$ T
) a4 z' n8 k' U3 j; y
--group by 列名 : 表示按哪个列分组4 \- T% t5 u; m: j3 |( F3 T  k
select deptno, max(salary) max_s, min(salary) min_s
5 e# p( ]; n& m: m0 E9 qfrom emp_ning* ^& }6 Y. ?$ ^2 k& |4 o4 X
group by deptno;/ B- P% o- D% T5 m* v8 ]
: O; D8 e  O; h) u) b
15.计算每个部门的薪水总和和平均薪水?  t$ ?: a9 S& m* D% R2 i
select deptno, sum(salary) sum_s,
, k0 H* W' w0 a               avg(nvl(salary,0)) avg_s
& x" S" i% H' S4 E: Tfrom emp_ning
1 B+ X; C+ O& U  M1 t/ K' Ugroup by deptno;
: q( p/ n6 ]1 ~  p7 T0 f" E3 w$ _$ Y4 A5 W( r! ?& d
16.每个部门的统计信息:格式如下:
! X' g8 s) E+ {6 H6 c* Zdeptno max_s min_s sum_s avg_s emp_num
; w9 b% t  v* \4 Z+ V; Z# u10     10000 5000  23000  6789       3' \* v5 A. Y3 p0 ^
....
7 F( ]2 ^% w3 Aselect deptno, max(salary) max_s,
* g$ h0 e1 F5 W6 [               min(salary) min_s,
# R% t6 P( b  \1 L               sum(salary) sum_s,7 ~/ e0 y$ Q' K4 P: c. U0 D
               avg(nvl(salary,0)) avg_s,
  E" Y6 d# V0 T               count(*) emp_num% b! {, o+ ?- _. d' e
from emp_ning
1 ?1 `7 A2 W& B' @8 N* p) G7 ugroup by deptno;
; G  J6 U, d6 f4 ?7 j& z& a. ]9 i) |% C# x2 ~8 B" f8 G" T
select后出现的列,凡是没有被组函数处理的列,必须
5 L6 W' `3 W) P( Z$ G+ h- t' W出现在group by 短语中。
% R% Z- }. G/ i0 X4 x2 @' L0 I2 p0 V" }$ u; q
按职位分组,每个职位的最高、最低薪水和人数?
  K3 S( p+ Q) P3 n+ s. Cselect job, max(salary) max_s,# k0 _& e0 y' b% E6 ^7 s
            min(salary) min_s,0 S. q! ?2 q4 b! C! M6 ?4 a; B
            count(*) emp_num
4 t& n4 s# \5 n( d/ \2 I2 L3 Ifrom emp_ning
( |7 S1 @# Y# o, z  \& B; V1 [" `group by job2 H8 ~5 D# H3 m; C, j3 g" d! V
order by emp_num;
. z( h# S* x+ ?17.平均薪水大于5000元的部门数据?
+ y/ p5 l" \2 S6 s  X* oselect deptno, avg(nvl(salary,0)) avg_s
4 f1 k+ ?  _- [; w, N" @+ M: O5 yfrom emp_ning
9 T6 x0 Z4 r# k  {! K: _! d2 J3 r$ Twhere deptno is not null
7 E+ r' |9 \" W6 g, J* [group by deptno) C0 H& D' U7 c# E% }
having avg(nvl(salary,0)) > 5000;
7 o9 q% l( G- j  O5 H( A( k8 T; |. ]( Q3 e
18.薪水总和大于20000元的部门数据?
) v6 T7 V; f; b9 a# v) H* Sselect deptno, sum(salary) sum_s
' x# j) f7 o, ~" w, W, n% Hfrom emp_ning- a7 Y' X+ A5 ?0 ~
where deptno is not null
8 f1 S" Y" s! }# U3 {. [9 @group by deptno
: \$ u$ ~7 C* U! {) yhaving sum(salary) > 20000;" T1 ~0 f7 F- R+ l9 \, Y
2 w+ w$ e' X) e
19.哪些职位的人数超过2个人?# j$ E. Q& b: }) c
select job, count(*) emp_num- N( n4 j) @# |  p- W1 j- y. m# L( E
from emp_ning, F0 V$ o& w% g* Z/ b( L7 {
where job is not null  ?% Z+ t2 ?% i$ U% o) q
group by job
2 y  z0 P4 ^8 u; d1 t, khaving count(*) > 20 Z  D( T1 L  ^; e
order by emp_num;5 ?3 g6 K# p, b( U" \$ X
; d9 U# L& P& j% y% B: M8 U1 w' k

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


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

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

   

关闭

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

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