我的日常

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

动态微博

查看: 1728|回复: 0

Oracle增删查改 day02

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:40:52 |只看该作者 |倒序浏览
SQL*Plus   7 O: n: N/ l, E* b  b
sqlplus.exe 2 Y8 l/ r& `, G! n0 G* V0 o
& V5 P; Q* m, Z7 X9 {
1)数据定义语言:create / drop / alter / truncate3 d- I* n/ k( D# Z% o  O7 s7 r4 g
对数据结构起作用。3 ]# M8 N9 r" Y& J
  ********
6 e' @  g% t/ Q" c  pData Difinition Language: DDL
  V$ _* x  `3 {2 F1 B2)数据操纵语言:insert / update / delete8 s, g0 ]/ j! C/ Z: U8 R
对数据起作用
" {5 U% B! s) P5 q8 N; z. O  ****4 ?( {4 `& |' h2 b4 A  K3 L2 `
Data Manipulation Language: DML
6 X* ?+ P2 Q- S8 Q9 A3 T3)数据查询语言:select
! f3 w" t: N4 ?1 C! N( D* b      ****( ]8 O* D* u- ^# T/ v/ r# T$ d
Data Query Language: DQL) E% r4 B' ~" h/ Y2 y# k% j
4)事务控制语句:commit / rollback' I  ]- V$ @! x8 N7 ]) P
对DML操作确认5 X& a0 K/ k; g
: Y8 U) W+ @0 g, c
一、学习单表查询语句。
* Z2 F3 ?7 {* g' w1.计算金额的四舍五入?
( X' |8 c1 z3 A" N) e  P( b* o4 B% Gselect ename, salary * 0.1234567 s1,
- r9 h8 E' v& b9 l% C6 Eround(salary * 0.1234567, 2) s2,2 o; t1 c& e( w
round(salary * 0.1234567) s3,( A( b5 m% y& V1 U' s6 C% |0 p
trunc(salary * 0.1234567, 2) s4- s' K* a# r9 f& ~  H7 `& V7 D0 u
from emp_ning;2 [5 U. |  {0 J7 @( M8 X" ]  ~
+ K3 d- n2 b  i5 v% c* ~" `( C! i
round(数字, 小数点后的位数):四舍五入! s+ s+ m, ^* {
如果没有第二个参数,默认是0.
: {  a2 E: K, B/ a# o1 |& z
$ O) w8 T+ n5 u7 C  q5 _trunc(数字,小数点后的位数):截取
2 u) ~( W: n- v1 ?/ n1 o' p如果没有第二个参数,默认是0.. Y4 j- z  E( C& n6 t; X
1 x* h2 Y" C1 A9 v& m8 A
2.Oracle中的日期2 J) C8 [) M. v0 t- m4 L
1)取系统时间的函数:sysdate
) H2 [9 U# J" Y: Bselect sysdate from dual;$ y, x2 w9 ~9 Y: |" W

. R# o% \1 ?" K# X2)把时间数据按指定格式输出
/ l6 Z0 {7 e5 _, R; ~2 H4 N1 tselect to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
: t0 |2 y0 G7 [/ {& }from dual;
! b: s" j  y* Y  V- G; f
6 k) x  t( W; L/ ^select to_char(sysdate, 'year month dd day dy')$ R3 o4 G4 g% I4 Z8 w
from dual;
/ _* G0 F& ~. G5 _9 k7 ]4 d5 ~/ `1 A& M1 n  I1 y- _
to_char(日期数据,格式)
4 ~5 F. A$ d4 J7 {. W6 z$ F" l# Q1 m. n( i5 h6 _+ O
public String to_char(Date d, String style){9 x" q& @1 F: d1 d# K# W# f- [, {- Z
        //SimpleDateFormat把d按照style的格式转变为字符串2 `1 W7 y2 O, }) x$ B2 C6 }
        return 字符串;$ l- ?. @1 ~- a
}
( [" m/ M" x( i  \
( K4 K4 U: W0 C) ]: gselect to_char(sysdate, 'yyyy/mm/dd')
* |' [+ q/ n1 S5 e0 z/ k5 d+ q* efrom dual;
! q. J  G7 P$ u0 f: m. H. i7 e9 ?$ D- t9 P
yyyy: 四位数字年  20115 _* Q. @$ C. a" m- V
year:全拼的年 twenty eleven
6 P* j/ N8 y8 x8 M7 r2 \month: 全拼的月 november  中文:11月% f, p6 J: ^' ~* y, Q
mm:  两位数字月 11
& O% ~; k7 M2 `: ^3 V2 A3 t3 Bmon:简拼的月 nov, ]- w' T5 ?6 T# C
dd:两位数字日
  O& {3 y& i- }" d' \. Oday:全拼的星期 tuesday
% `. L. p9 S8 p: R5 F$ ^dy: 简拼的星期 tue6 D1 N" u- |+ H1 j  l/ ~$ A
am: 上午/下午 am/pm
3 s* f" m8 R6 `) B" ^. ^& v: u
  ]% ?' M! q% T7 E: |sqlplus中日期的默认格式是:DD-MON-RR" W# S9 E$ n. P5 o
现在的时间是2011年4 Z. p( {9 g) q; I/ q% c% C4 M
           YY           RR) ~) ]9 \3 G- @
05年      2005         2005% S) s1 x: H9 l# U: ~
98年      2098         1998
. _) H, [2 v% d5 t% x6 g' t
2 w; \: i) F+ b4 G" Z  k假设现在的时间是1998年
1 p0 |! O: n5 |9 Z; ~7 P3 V0 k05年      1905         2005
0 P% T! \/ @2 }  n95年      1995         1995
! T  @( ~/ E+ l+ k) ]2 c/ o. K! G# W4 X. `8 f7 u) }8 E8 U) q- T# N+ A
insert into emp_ning(empno, ename, hiredate)
9 C1 e9 m9 Q1 d$ V6 Hvalues(1012, 'amy', sysdate);& ~/ b; p. `& ]+ ]
--实际入职时间是2011-10-10. U$ h6 c0 u( s8 `- q
insert into emp_ning(empno, ename, hiredate)* o* r, f8 d1 Y2 u7 M2 P7 j
values(1012, 'amy', '10-OCT-11');
" }) F7 t. \. q5 H, H# \6 y4 `6 @9 M: t& k* s) @
insert into emp_ning(empno, ename, hiredate): {) M0 Q0 B1 f& Y! O8 p/ c
values(1012, 'amy', 6 R! K) h' J# |
to_date('2011-10-10','yyyy-mm-dd'));9 G8 B2 e9 K: g" e+ Z2 Y2 V: t5 u

! P! a' D5 ~  W2 N: z5 b0 X& B显示员工姓名和入职时间,显示格式为:: |# u1 m4 F2 [# ^; b$ G4 R
amy   2011-10-10- z2 F7 {* ?# B2 h

* ]9 f) N+ K) d; g* H7 H; I         to_date% ]5 U2 Y- U6 P1 N
字符串   --------->   日期: }  T6 U, b& u
         <---------
$ y/ Y3 ^. v( i4 }& z" h' n/ o         to_char- ]+ n3 |0 }0 x" w. E
3 N* ?3 m3 m' o+ A+ `  }0 I* h' x
3.计算员工入职多少天?( _  R+ X. u8 }  V' _
select ename, hiredate, (sysdate - hiredate) days
# p+ B7 A7 \3 s+ t& @( H4 |from emp;
# V: u0 E9 l% e5 i3 U- q+ \1 ?: {# f2 ?1 G9 f
日期数据相减,得到两个日期之间的天数差。
4 I3 p! O; G. X6 B" `4 C; f不足一天用小数表示。
1 G4 H0 }' ^9 q+ s3 |  c1 v5 W6 \- |7 K- [6 o9 H
select ename, hiredate,
4 j5 A" O0 @* U% D0 Uround(sysdate - hiredate) days* `: k. Z: n" r+ a
from emp;
5 O) F7 V& `$ v% Z" K
1 Z5 Y( G  K1 `/ ?( S5 `4.计算员工入职多少个月?用整数表示。! ?1 t, {9 q% r9 P6 ?
select ename, hiredate,7 |) B3 D( e9 F
months_between(sysdate, hiredate) months7 r7 X4 Z4 T9 k) y  X$ h
from emp_ning;* s0 g- e; X+ k. Z
  {2 A  c2 c$ c+ I8 {  b/ I
select ename, hiredate,
- N% `% H9 T, s9 _) r/ W; Oround(months_between(sysdate, hiredate)) months! N  W# f6 u9 n* s# v: N1 e! F2 T
from emp_ning;
9 J5 ^+ K/ y. s
3 n+ Z6 {* A& m- g9 I4 Cf3(f2(f1(p1,p2),p3),p4) : 函数的嵌套3 |# ]: H/ K; z2 P/ V7 i

, w3 m8 f0 D, B4 S# E0 X) g5.计算员工的年终奖金* x" F- }% i# y1 `0 g
bonus不是null,发bonus的数字。1 y; y) x+ D- o% H# \
bonus是null,发salary * 0.5.7 ^8 V3 ?2 e5 |8 n+ s+ I* C
salary还是null, 100.
* |* n8 v3 t2 j& \, o  K/ s( o( k( Z% d7 `2 t6 b
public double calculate(double bonus, , r# B1 S6 g5 i8 Q; |$ M
                        double salary,
9 Y6 p' H# w' h1 G) |3 F2 \, l                        double comm){  l- {" u) T, E
        if (bonus != null) return bonus;
- U) |9 Y6 g1 ^* ?        if (salary != null) return salary * 0.5;
$ g+ F7 g$ ]! a3 e' |0 c        return comm;                        
% k1 e2 y  @7 @2 u" U}
& Q/ {( Y6 g2 A" @1 v$ y" R--返回参数列表中第一个非空数据$ X4 ?" w# X) c0 ~8 M3 o
--最后一个参数通常是常量。
# U% ?% g( Q3 z9 |select ename, bonus, salary, 1 j5 \6 M, |, M! N! k* o1 S
coalesce(bonus, salary*0.5, 100) bonus9 P5 t; }# `% z' q2 w# s' |( A9 Q
from emp_ning;
: O  m# E" v; @. T: [  T+ o. Q6 F0 @( z7 V8 A/ f9 W9 C0 m
6.根据员工的职位,计算加薪后的薪水数据:
2 X( g/ R; j" ~5 \" WAnalyst: 10%
( J0 \( c5 `+ O. @Programmer: 5%
; [5 @$ u( e3 {8 U9 Yclerk: 2%
+ q- }1 U" g5 R, ^5 E  S其他职位:不变。' P, V6 Z& T" @7 H: ?8 W

1 J7 R# t& o8 ~, l+ \- Mcase语句:
% |9 \) ?4 e. R: _select ename, salary, job,1 l! f7 w5 F2 V: b' ?, S% h8 j
case job when 'Analyst' then salary * 1.1
, t4 S  O/ ~0 x9 q; D: L" c         when 'Programmer' then salary * 1.05
8 Z; P' B+ N% Z         when 'clerk' then salary * 1.02- b3 G+ i+ y/ e2 t1 A# ]( X8 i
else salary2 [5 c% U( \* C) A4 D
end new_salary1 r# a1 y  N1 ?" `+ [" X; k
from emp_ning;
" _( {$ ?$ N! W4 h4 ^  W
/ A6 c. F! p$ {8 ^* u4 Pselect ename, salary, job,
4 l+ \; P9 k1 L3 Kdecode(job, 'Analyst', salary * 1.1,
: u- I: W* M9 g8 D            'Programmer', salary * 1.05,! p! G( ~0 _) p/ f6 h' }
            'clerk', salary * 1.02,
/ j5 V$ ^( X. R9 Z4 s3 P# M            salary) new_salary
3 [$ x: R$ Z! A9 p8 Xfrom emp_ning;2 P" N3 V1 U7 V3 p+ i) J; ^6 i' S! Y

- g7 H9 A  _7 U6 \, O7.薪水由低到高排序$ a2 d: D  Q& H7 ]$ R% m7 e
select ename, salary from emp_ning
, m3 J6 r, i8 p8 }  b' dorder by salary;
5 x8 M# x3 t, _0 X- M2 [$ R# K
  \6 W3 ]* E: {' D; U) Yselect ename, salary from emp_ning
8 J* G+ k" R% s! V" L( ^; e3 T  Iorder by salary desc;  --倒序排列 descend
6 T/ q5 t6 S& X, l& ^( ?; b) F1 \- O9 X. @5 V6 k
desc emp_ning; --查看表结构 describe6 o) o+ M5 ?0 a, W) G

  z3 m' ~8 k8 b  Z" p" e' N: d5 r3 t8.按入职时间排序,入职时间越早排在前面。& A" x8 D: T5 `6 }4 k& w
select ename, hiredate' p$ ^$ {' D8 V. A3 m
from emp_ning
% F0 _. Q8 d2 D! vorder by hiredate;- B) r; e' E) W. M
  S' e; f( F6 g$ Y  A3 K0 t  ?4 [
9.按部门排序,同一部门按薪水由高到低排序9 [7 @3 z. x% ]! F0 ?
select ename, deptno, salary0 u( P/ J2 _6 A. k0 n; x5 r
from emp_ning" ?0 v! g2 O7 ?/ q# s% u1 d+ L2 M# n
order by deptno, salary desc;
( }, k& F8 ~+ E# L( O8 _7 G/ T. b7 R. d
/ O& u! I; Y) V' C. B5 H10.员工表中有多少条记录?$ a+ X' @* w5 m5 O6 ?! Q+ L3 r( C
select count(*) from emp_ning;
1 {; @, S7 O: ~) J1 b" l0 @6 O/ a) c1 L# O$ }& O0 N
openlab帐户下有多少个表?
# {$ f. L' q6 Q! t( l  m; M6 Mselect count(*) from user_tables;) _  q; X0 P! `

" F6 I: }! s9 ]% d: |openlab帐户下有多少个名字中包含emp的表?
/ K8 b3 J+ W% d! Oselect count(*) from user_tables
: u9 a+ t* r" |" U" y3 Iwhere table_name like '%emp%';, [& Z  o* k& ^' u" y6 z' W/ L- u

& T) Q( G1 y9 k: d" Y1 M--表名默认大写
  T9 N$ z4 @' @$ fselect count(*) from user_tables, ]6 R. z2 z" z% u" i
where table_name like '%EMP%';
8 O7 y/ G3 h1 F4 U8 G3 T0 p' x2 j
--入职时间不是null的数据总数。
4 w- y/ ?+ E/ c4 O% T  c--count函数忽略空值。$ c% C0 Q) z* E/ f* n3 ^! e
select count(hiredate) from emp_ning;
; b' Q% ^) C; q; h' p+ d
% W1 u! O  t3 X. C% B4 k11.计算员工的平均薪水和薪水总和是多少?
; ~5 h: k9 g1 o4 U. u# e! c9 pselect avg(salary) avg_sal, 2 A" n6 l; x8 Q  }8 K+ S4 i3 e8 w
       sum(salary) sum_sal4 j3 B$ g7 G- d2 B
from emp_ning;/ |: D) q, z4 ^2 c6 f6 O: X

+ h' n; a% T- G  V% o7 p2 J9 ?avg(salary) = sum(salary) / count(salary)
- o; c5 _- f, L% X+ V: [" ^              68500 / 10 = 6850. w, {6 p) O4 J& J) v
--纠正逻辑上的错误6 A3 {9 F- i- k6 y
select sum(salary)/count(*) avg_sal,
% y9 x) P% ~+ S; D- s  C& r1 w! R       sum(salary) sum_sal5 y4 T9 |1 n1 @3 M) ]! {
from emp_ning;( y7 v, q: y* @, K$ ^9 f

9 W; }, G2 @4 u9 r* C$ [! vselect avg(nvl(salary,0)) avg_sal,0 H: F0 \- w, _- `
       sum(salary) sum_sal
# |7 c" u8 u- {* Wfrom emp_ning;
$ W9 Z+ d; |# B( y, I
2 m9 s4 T$ o, t, k5 t6 \12.计算员工的最高薪水和最低薪水2 Q1 X8 ^9 M5 d- K
select max(salary) max_sal,0 w7 V. @5 g; o1 h+ S+ V
       min(salary) min_sal9 C+ S1 ]; a+ a' W
from emp_ning;
7 m' l- c3 @5 v
9 x  `0 G. L  E  d, h2 S3 r3 P% o组函数:count / avg / sum / max / min 忽略空值! ?, B: \: y1 }# W0 m# B( X* |
其中:avg / sum 针对数字的操作。
2 @5 p6 y1 Q" Q- h' d      max / min 对所有数据类型都可以操作。+ M" B9 b! G+ I- ^0 P* n- O

9 k$ x. A7 s' m: v! @* R13.计算最早和最晚的员工入职时间。
2 c  i; n) q, p/ S0 Oselect max(hiredate) max_hiredate,
: \2 a/ ]+ t/ X) w* m       min(hiredate) min_hiredate3 L- \  `; C. M" c
from emp_ning;
  S& m) l( D* ^+ t
+ Q2 \6 d' h0 A! o8 @14.按部门计算每个部门的最高和最低薪水分别是多少?
% u( i! A  Z! d* x& Y- H格式如下:  `( t' U% k) q% ?+ J
10 4500   3000
! L0 ]( ]; _( [- I# {20 15000  8000
2 Q# |# e" S1 u3 H3 e6 F# V8 b30 10000  50001 x9 x% S) \( w, z- H/ `, V
# V3 n& q$ l' E) L" W9 G. N
--group by 列名 : 表示按哪个列分组5 ?2 h: ^( q. }7 d/ o* Z  h) W
select deptno, max(salary) max_s, min(salary) min_s
$ j0 T6 U5 }+ W; S7 M1 I# `  sfrom emp_ning
- m3 d) r/ O% {) Hgroup by deptno;
; C; Z& Y: B, G  w
4 ]2 D6 ^3 ?8 J& T15.计算每个部门的薪水总和和平均薪水?; K* x7 I  p, X2 G6 _. }
select deptno, sum(salary) sum_s,
! d0 A( U+ X7 d               avg(nvl(salary,0)) avg_s
+ A$ u/ K4 n, O1 m/ Y% Yfrom emp_ning: V* t0 T& C+ _3 A- g! D
group by deptno;
- ^. l6 J: o: N/ ~: t
4 f$ d5 G9 u9 {+ j1 H; ?16.每个部门的统计信息:格式如下:4 s" o" V7 e$ x( w
deptno max_s min_s sum_s avg_s emp_num4 c1 _( a1 M. q, w' W- H
10     10000 5000  23000  6789       3( H0 u6 S2 U8 c$ ~! ]- Q
...." r6 f! n) D- b+ V& B2 y. F1 {
select deptno, max(salary) max_s,
; X1 c5 `7 }/ q# g6 e               min(salary) min_s,2 o# t2 m$ I; Y; M7 m' I
               sum(salary) sum_s,) C8 G# E' g4 F0 \  C3 H
               avg(nvl(salary,0)) avg_s,; R  q6 {0 `1 n  h5 A
               count(*) emp_num
# ?: ]- v& Q$ Zfrom emp_ning
3 Y5 _2 R* ^) i9 t1 z% g7 X' xgroup by deptno;) f* f& `& ?. i( M
! e% f6 `. ^* f
select后出现的列,凡是没有被组函数处理的列,必须* R) k5 ~$ e. X4 B. x
出现在group by 短语中。
- F2 ^" b0 r+ l% m+ S1 W
3 K3 |; a9 h2 _, v+ |- P4 k按职位分组,每个职位的最高、最低薪水和人数?
9 ^4 d4 |) s- E8 Aselect job, max(salary) max_s,- o6 d8 |7 D; A
            min(salary) min_s,
) n! S: _8 A2 w, G# L: l% _7 J            count(*) emp_num; P* d' Q$ u- `" ^9 m+ b
from emp_ning" o3 z3 }/ T9 m+ v" E" s" U
group by job
1 v" \" C  X) C6 [/ p- b2 x( \8 @order by emp_num;8 s9 a5 ~, i/ ?! Z2 D! S% j% g' Y/ x
17.平均薪水大于5000元的部门数据?
: L  |9 _3 G  S) V/ aselect deptno, avg(nvl(salary,0)) avg_s
" U9 z8 @, ^7 ffrom emp_ning
  \) ~" e" T/ Qwhere deptno is not null$ k4 k( h: J0 T  Y% k3 X
group by deptno
2 E2 R$ g! ]- U2 xhaving avg(nvl(salary,0)) > 5000;6 u2 }/ W* a, [( Y, I

: Q: P2 v6 _9 }8 T; u18.薪水总和大于20000元的部门数据?
* D; c  W5 J( K9 \! vselect deptno, sum(salary) sum_s; g# q  A' ^0 ]% L
from emp_ning! i- y7 u, y/ Z8 F( R6 I# n+ Q% v
where deptno is not null, F" x5 y0 q( f7 S- s" q+ _4 p
group by deptno
/ L- |; I4 x: o0 ~; B8 Z# v6 Nhaving sum(salary) > 20000;
% z  z3 g! }5 h- s# y& g# T5 ]6 J' n( r7 {" K+ U5 o: b$ i
19.哪些职位的人数超过2个人?
& i" i# Y0 [$ X* vselect job, count(*) emp_num( }: v- E! p, ^  l1 s
from emp_ning
4 U; }' p, B1 i) I* gwhere job is not null
2 p+ A0 w/ G# r  xgroup by job
0 k; {3 d3 g& t2 k8 S7 L' a5 Khaving count(*) > 2
, K& J5 x9 B  }9 R1 \( f5 worder by emp_num;+ J/ w+ p* m- H8 q; Z0 ~
' F9 N+ e& U  a2 ?# Z

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


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

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

   

关闭

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

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