科帮网-Java论坛、Java社区、JavaWeb毕业设计

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

动态微博

查看: 1608|回复: 0

Oracle增删查改 day02

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:40:52 |只看该作者 |倒序浏览
SQL*Plus   5 G( k9 x5 O& B! J% R
sqlplus.exe 0 s; A( ?, B3 R9 \" Q

7 p& V/ f4 u: H+ z' J1)数据定义语言:create / drop / alter / truncate9 z, W6 z8 q% H. ]/ y) A, W" ]/ k
对数据结构起作用。% y' f0 T" ]5 Y% [* b2 g
  ********
, K9 D1 h( w/ ZData Difinition Language: DDL
' D: n# J) i6 p" T% M2)数据操纵语言:insert / update / delete  `9 u* U, H  z6 p6 M
对数据起作用1 ^8 T. p4 Y* ~( @. X
  ****, `' d3 Y. O# y, M2 @4 H
Data Manipulation Language: DML
- w5 s' `% ~6 C, j1 W7 v3)数据查询语言:select6 L6 v: q$ k) G8 U; F; G9 V$ C
      ****& A, f' D2 U4 S) L1 M
Data Query Language: DQL
' r" E5 K  X+ v, I4)事务控制语句:commit / rollback
' Y$ S) ?2 N" J! O9 w对DML操作确认! A9 v& s2 b* X0 F

2 q: M6 `4 a0 j9 h  {, \0 Q2 @6 u& H- C一、学习单表查询语句。
. T9 d5 K7 b/ X2 r- j  _1.计算金额的四舍五入?
  t$ F2 h  o- C3 Cselect ename, salary * 0.1234567 s1, . N% P+ f7 I$ L7 ?
round(salary * 0.1234567, 2) s2,
7 J0 ]5 M% O5 c! g' p8 Pround(salary * 0.1234567) s3,- K9 t$ u* c. J$ C1 _  @3 O
trunc(salary * 0.1234567, 2) s4( [2 @$ Q& s: h  c- V
from emp_ning;4 P- @' h6 a) V: g4 v
# f' S2 X' e7 @/ l) R: n, p
round(数字, 小数点后的位数):四舍五入* z! E0 n8 j4 o$ a3 B( A7 C
如果没有第二个参数,默认是0.
% s$ O5 c: D% {% O6 R, g2 j$ m+ |$ ]- y- |$ i6 f
trunc(数字,小数点后的位数):截取8 F% @$ P6 j* e$ `* G
如果没有第二个参数,默认是0.3 H, e; y% U* Y, L' |. B: M
  y' l  F' H& n& j- _
2.Oracle中的日期9 F$ q- K' i% A1 D! m7 r
1)取系统时间的函数:sysdate) ~4 V8 x" f4 x: @' J# }" U/ [
select sysdate from dual;
1 }/ M) s( k6 T- f6 w0 H
  n- H9 D' M6 j  ?( g2)把时间数据按指定格式输出8 Q3 m; O* D3 r
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')$ j) O3 h# U! B
from dual;- o0 v: e4 T) y

8 A- ]( h9 V5 W2 `7 q8 C# N, Hselect to_char(sysdate, 'year month dd day dy')$ d  p9 {0 e( k/ m) \5 J0 _9 K: O
from dual;
: O& l, [; |8 |4 G
- |, T( m2 b6 h4 q5 `to_char(日期数据,格式)2 N/ n) v8 u( i0 x9 l3 R, v4 N

+ k: m" N5 d8 Xpublic String to_char(Date d, String style){
$ W2 z$ S9 v$ \! g! b        //SimpleDateFormat把d按照style的格式转变为字符串$ }8 W4 W' O. y) J% B4 u# C- l$ h
        return 字符串;
3 u" P0 Y# K' }, }}
; m7 X5 s/ W7 P- A# B2 h+ D& o3 z1 D4 k% A) N) M
select to_char(sysdate, 'yyyy/mm/dd')
$ |5 `6 C  o$ |3 X4 k8 efrom dual;3 F- E7 B, R4 z8 D

0 N" u* X# D* D) L# d' ]/ i- Dyyyy: 四位数字年  2011
6 Y& U- P1 L% [8 r! jyear:全拼的年 twenty eleven& C/ d, s1 |* N
month: 全拼的月 november  中文:11月$ X' X7 Y& Q6 O7 F& s
mm:  两位数字月 11* g$ n) W$ O) P2 s6 O  h
mon:简拼的月 nov5 J: G$ d1 O" _2 E5 K% q
dd:两位数字日
5 X3 J+ C2 c' {! bday:全拼的星期 tuesday, E9 n+ `( Q0 Z8 }2 \* e
dy: 简拼的星期 tue
% O; _& b) Z4 ?$ \& C' n6 qam: 上午/下午 am/pm7 L( m  |; a/ q
) v" t# s0 E2 N
sqlplus中日期的默认格式是:DD-MON-RR2 r. t, J# o! k( t
现在的时间是2011年
$ B6 J! u* @! y           YY           RR
/ X, @4 e2 x9 |$ r: ^05年      2005         2005
0 ?' \: b2 r: }3 Z& i! E98年      2098         1998
, _& j8 }5 d" |8 z% A3 Z, |* T3 m/ E9 N' Z
假设现在的时间是1998年8 N& J& e  F1 x. [( N/ @
05年      1905         2005
7 ]0 t  O! v, J4 {95年      1995         1995
1 \; ~& m/ F. x- @1 {# \# O3 c) k" @+ c& H* S
insert into emp_ning(empno, ename, hiredate)- d4 M/ k/ x! L  L9 j
values(1012, 'amy', sysdate);
; Y* t+ }' I) Z8 h0 x--实际入职时间是2011-10-10
) g- h: |# F0 t2 H! g$ h  Winsert into emp_ning(empno, ename, hiredate)
# E2 q1 W" G, a1 \, F( ?5 Yvalues(1012, 'amy', '10-OCT-11');
* f5 Z! }4 }- o( K6 K6 a2 z9 R4 `1 q& I1 V
insert into emp_ning(empno, ename, hiredate)) Q$ X! G7 W8 r( a! N
values(1012, 'amy',
, U( |/ b4 Y  eto_date('2011-10-10','yyyy-mm-dd'));) W" C3 @) D" @$ r0 b  d
2 N+ o  y2 D$ S' p; l
显示员工姓名和入职时间,显示格式为:5 p! T# O1 L% b
amy   2011-10-10+ R) t! b1 w4 B: n

0 L; t2 G' {! \4 q         to_date- V# ]( k9 `- k( |! d6 ^
字符串   --------->   日期
$ @$ x# p6 `! i$ ]" Y# T8 I         <---------
2 ~2 c% x% |  _% U, ]' Y& s         to_char" Q) w4 X  @( P& q7 a

6 A- b0 {( V! |3.计算员工入职多少天?
9 V9 _8 r' l. V& Kselect ename, hiredate, (sysdate - hiredate) days
( @+ j: V8 z4 L# r' Jfrom emp;
" b/ W# {) W% }1 y3 x
4 ^" n3 x/ Z7 g日期数据相减,得到两个日期之间的天数差。$ q% [# w* w% }- t- o
不足一天用小数表示。
. _" u- p4 K: X* g/ k, z/ w1 |
$ _% e& `/ N. e" I5 cselect ename, hiredate, ! X% X. g0 Q+ L) r0 ^; n' M
round(sysdate - hiredate) days+ t* b$ R8 B/ o/ X0 D
from emp;7 _) h: a0 @5 m( l  U/ c5 y

$ x( @% L5 y/ L( W* n9 D4.计算员工入职多少个月?用整数表示。5 V5 G; y# R4 o1 E" w
select ename, hiredate,( n" k6 x. W6 _
months_between(sysdate, hiredate) months
6 s; d; Z8 W, B- }# D: Lfrom emp_ning;2 q: P$ c6 V/ }
8 z) ?' b  [) h$ i9 w1 ]' J
select ename, hiredate,8 C' ~; Z0 M3 D  }8 f* G) |3 ?7 l4 B
round(months_between(sysdate, hiredate)) months
7 j2 U: U! H9 A, Afrom emp_ning;$ J: ]6 e" h/ r/ r" ^1 j
% s$ j! k( w. C0 J* O
f3(f2(f1(p1,p2),p3),p4) : 函数的嵌套/ O: k  ~/ }" o' J9 s; k& u9 g' b
, m3 @, {* `: R* q3 K3 z  U# A0 Z
5.计算员工的年终奖金# V3 L, R4 N: j+ t5 H0 e, @
bonus不是null,发bonus的数字。0 S+ G; r& N6 A( O/ ]9 h, U8 O3 d
bonus是null,发salary * 0.5., K* d0 v  ^5 {
salary还是null, 100.7 _! X8 f8 ~5 c( N9 W+ R9 e
: m" |6 d6 ]2 F, q8 s! W
public double calculate(double bonus,
" @( i/ u; t4 \3 b) C3 P                        double salary,% L& R4 |9 A- n) `( z5 H
                        double comm){6 }' @6 Q+ h6 V) {3 J, _
        if (bonus != null) return bonus;
, S1 J% W1 p5 W/ W' u        if (salary != null) return salary * 0.5;3 H/ A( V! H) E* Z
        return comm;                        
: k; c/ s* O1 e+ f1 k}
) t" X% m/ l6 b3 F$ ]1 c--返回参数列表中第一个非空数据2 d! A0 U$ F: e  R: W% v
--最后一个参数通常是常量。
; [, {' w* ?; j5 `: f4 Mselect ename, bonus, salary, ) l3 ?7 j# H% u; K. b9 F* {5 K
coalesce(bonus, salary*0.5, 100) bonus) i0 ^, D/ g0 P6 w+ b1 T% Q
from emp_ning;
5 F% N# E0 h: A$ K: R  G! f5 ?- W* q) F* J3 ~7 Y4 X# P
6.根据员工的职位,计算加薪后的薪水数据:% o  B" _& @0 ^( Y1 V" s; ~
Analyst: 10%
. x+ F4 X% k7 QProgrammer: 5%
9 U; E1 I' n4 Q4 {+ [. V5 r7 v  dclerk: 2%
0 Q' a- q1 R  s其他职位:不变。
& Z8 A! a# Z9 X8 x# q
7 |2 x, S$ a5 x! Y: f3 lcase语句:
9 c# k0 L. b9 {select ename, salary, job,4 p" H0 N' n5 q2 W5 N: h; W7 h8 \9 n
case job when 'Analyst' then salary * 1.1
0 L" i$ v1 w, L         when 'Programmer' then salary * 1.05  O" D$ B! m; k
         when 'clerk' then salary * 1.02: C2 B  V& N0 {+ x2 r! ]' }2 a0 L
else salary
+ |, J4 m9 Y* I: c* bend new_salary
4 v- I: T& R" n' tfrom emp_ning;
1 w0 S6 k+ I4 x8 O0 D3 ~' E% ?% u7 ]
4 B3 I) y/ Z! o$ T$ |( iselect ename, salary, job,- k9 m8 u, C& h' `2 P
decode(job, 'Analyst', salary * 1.1,. G/ B/ Q5 e  H2 f5 p) k( r
            'Programmer', salary * 1.05,/ I' h" G. L2 k8 N
            'clerk', salary * 1.02,
; v' K5 j$ i6 Z2 i2 r3 _7 r' }            salary) new_salary
6 ~7 o9 s9 D! z! Kfrom emp_ning;
3 o, c9 X, f4 r4 e# Z3 g. x5 Z4 O  i+ B8 v) ]1 B
7.薪水由低到高排序$ Y; A& H3 J$ Y" \3 C
select ename, salary from emp_ning3 _" F, S7 c' h- _
order by salary;+ {% |( x' f! \# S" l: d
, Z4 F, L6 ~1 i. q) i
select ename, salary from emp_ning
! ~( Q0 B. B2 ?2 K- M  u0 |order by salary desc;  --倒序排列 descend# c" T" M# L& V6 h% G3 W

, X/ `. S: B4 O- @1 o1 v8 M, A7 E' V+ udesc emp_ning; --查看表结构 describe
! @- y# W0 L; D, T  |! A2 l/ l1 I) Z1 j0 w
8.按入职时间排序,入职时间越早排在前面。: u1 I! {) ]8 V
select ename, hiredate
/ z0 E& ?* e# l, D+ p, Z+ lfrom emp_ning
8 ]  ^! d; ?% d7 e% sorder by hiredate;, H! o; _4 R: r- J

. b$ Y7 a8 Z6 C3 o2 I2 J; H9.按部门排序,同一部门按薪水由高到低排序
0 G' j3 T  R9 N( o& {select ename, deptno, salary3 A/ A$ j1 j1 ?# M
from emp_ning
; u' B$ E, H5 i, M) j. q4 vorder by deptno, salary desc;
5 D: V2 k4 f2 s2 P; G% t
6 l- Z( ]* g/ k" I) F1 _( u10.员工表中有多少条记录?% i# \/ z% i/ `0 r3 Z* `
select count(*) from emp_ning;
& Y1 T# U7 l4 ^( t
  M" l' H) a; G8 Q- n- nopenlab帐户下有多少个表?
8 A8 I# y+ u- X+ r) o6 wselect count(*) from user_tables;
; j" D* M! b8 B$ e' f9 B% V0 [1 {$ S
openlab帐户下有多少个名字中包含emp的表?: w  K* ], P& b! F) @1 X3 }, L
select count(*) from user_tables
. `5 E5 c. F6 `( H+ Cwhere table_name like '%emp%';
  I( j% c3 S$ k% |  l' W
) ]! Y9 M6 w8 D. i--表名默认大写
9 l# ]" X6 U4 y% {/ S" [! e3 sselect count(*) from user_tables: K1 d9 Q0 a9 {; k
where table_name like '%EMP%';
0 X  @& N9 s' Q( W: \
8 Y* U+ h' L, w" }' F# W/ U3 r! J--入职时间不是null的数据总数。2 S4 r7 i) p/ I, z- y0 p/ Z
--count函数忽略空值。4 J- M4 x' h; h
select count(hiredate) from emp_ning;5 J* a& {6 s! h2 G

" h' m, {' L7 N) k9 O8 C' r11.计算员工的平均薪水和薪水总和是多少?
5 z6 _5 N! G0 S: V( {0 u5 oselect avg(salary) avg_sal, " z, H' S$ W/ ^+ m6 f! Q
       sum(salary) sum_sal1 U3 m. K; U9 i0 r& m$ R! g
from emp_ning;
0 q( e6 I/ H6 R/ q8 k  q8 y& ?4 o% O; U7 }7 o+ E/ w8 a  t6 u5 K
avg(salary) = sum(salary) / count(salary)
/ Y7 K8 w& c$ G  x( C& i% g              68500 / 10 = 6850
( ?" t' `9 d7 E: C4 A5 V9 P  K--纠正逻辑上的错误8 o/ G* k& k/ h+ d
select sum(salary)/count(*) avg_sal, ( [: O3 p; ~. |; |( ~# u
       sum(salary) sum_sal& W- E7 [* J" A" o3 x/ m% k
from emp_ning;' y7 \# q# D& e1 }! J
, z' K& }& |$ P3 s  p& ]0 y% {
select avg(nvl(salary,0)) avg_sal,
  ^! r: D0 @* o0 O2 {1 D) X" s8 j$ I5 y; L       sum(salary) sum_sal
9 x$ e  x0 Z- ]: Z) \from emp_ning;5 \% b  z7 C* @2 t# \4 R+ u( H6 n
9 B+ B0 \; v9 ]/ O
12.计算员工的最高薪水和最低薪水( b) f2 E. E8 t& y8 T7 Z( t1 N
select max(salary) max_sal,# P  d- j/ A6 b) S, [7 `1 {
       min(salary) min_sal* Y7 s" I, H7 X6 Y/ J( W' w, V& K% |
from emp_ning;
/ W7 c0 m0 a  X- N* Z# r- y6 |7 r0 l/ p5 S5 X7 v" J1 t
组函数:count / avg / sum / max / min 忽略空值
/ Y6 N: t  x' F' ?1 h其中:avg / sum 针对数字的操作。7 g! G' B4 f6 Q' V7 m8 Z/ i+ K
      max / min 对所有数据类型都可以操作。
' g& m2 K5 Y+ r- H7 c: b7 i
6 n( k. g: x4 J+ ]8 N13.计算最早和最晚的员工入职时间。7 L) z$ T3 f3 w& k
select max(hiredate) max_hiredate,6 m# A6 t5 Y' s) t: K& g: I
       min(hiredate) min_hiredate; |* ~% V$ c+ ?0 m* F' ^
from emp_ning;; O0 `3 F! K( F+ k

7 `" @, x5 }& o9 l% E& C* v14.按部门计算每个部门的最高和最低薪水分别是多少?
7 M% `& W& |6 s5 k* q+ K格式如下:3 v, q9 u7 ?$ h. N4 B
10 4500   3000
. m- D, c8 P! E: {. s4 X20 15000  8000
& V' U$ w/ ]1 l2 l1 U  f2 h; I7 W30 10000  5000
/ H7 x8 X3 C& l/ N% m4 s7 i" U- I+ c9 K3 P
--group by 列名 : 表示按哪个列分组, f4 \. f5 \1 o3 h0 _! n
select deptno, max(salary) max_s, min(salary) min_s7 ^8 L3 E% `- H) \- t: o, J
from emp_ning
( \9 ~7 X5 v5 V5 R5 Agroup by deptno;
0 e& w% {: Y& n2 r9 n
% T( n2 B& x. M; {  I. o6 G- G! J15.计算每个部门的薪水总和和平均薪水?
$ C. G& R7 `6 t- I8 U3 J4 Cselect deptno, sum(salary) sum_s,9 t" R& a! p/ z7 B1 r; ]
               avg(nvl(salary,0)) avg_s) ]2 T( K2 j% i# s: v( O! [
from emp_ning
3 v: I/ B/ M1 Ogroup by deptno;
. [: m- A( N: a$ U- ]) f8 x1 v& e- @! ^- P7 n- i; }
16.每个部门的统计信息:格式如下:
+ C( l; H% x5 a. P& fdeptno max_s min_s sum_s avg_s emp_num
# q5 `* G. M4 X% X; `10     10000 5000  23000  6789       3
! A' f; b. U, q: S4 {9 {+ B....5 C1 E- P( W0 S) W
select deptno, max(salary) max_s,; i1 r7 }" W* Z
               min(salary) min_s,
" h  ?4 ^, ~7 V  g3 S7 [3 v               sum(salary) sum_s,+ \4 g9 Z: P/ {" X( u( j
               avg(nvl(salary,0)) avg_s,# \  V. m- b, F) o  _8 f8 m
               count(*) emp_num
, z2 f8 T4 a+ Q$ U3 Bfrom emp_ning# D: s3 S: W" u4 v
group by deptno;6 \7 Y& I4 t) A0 O6 F
: b5 u# T# Z+ L9 Z
select后出现的列,凡是没有被组函数处理的列,必须' U+ V) I6 P6 j; D+ J
出现在group by 短语中。  J# e( U! A# u. Z4 G% p

: F8 R: ]8 X7 h6 e7 @. A; z# T" d按职位分组,每个职位的最高、最低薪水和人数?
) S" M! n3 H1 R+ @- ?! {/ s# Aselect job, max(salary) max_s,* M0 B, f, P2 T
            min(salary) min_s,6 z& E/ E6 n$ y2 F! P& m8 M# G
            count(*) emp_num
' z6 o2 c( X$ \# O0 afrom emp_ning4 n: n$ ?6 \- g1 A
group by job
4 u/ C+ E8 G2 g' i- zorder by emp_num;- r% {% J6 C3 p1 r( u
17.平均薪水大于5000元的部门数据?
$ @& ]/ _' b( q, t* A% ?3 Rselect deptno, avg(nvl(salary,0)) avg_s( f0 ?/ R( r! n: Z$ U2 R
from emp_ning
0 L7 m( `6 @6 cwhere deptno is not null
& n2 ]/ G0 E9 a  Bgroup by deptno
' r5 c6 Z* W# k3 Q& e- ~0 fhaving avg(nvl(salary,0)) > 5000;( c2 h8 L/ m, B3 V
1 @# _2 |: w" M  c* V
18.薪水总和大于20000元的部门数据?9 H2 i0 {) q& u9 X" F6 O
select deptno, sum(salary) sum_s# U, d" M; E  R  i
from emp_ning/ b* e- F; p9 u8 A9 v2 U
where deptno is not null7 H$ [2 p! W. S* V# ]. p6 |
group by deptno
: {# L+ b4 G/ l1 dhaving sum(salary) > 20000;$ N4 [0 T" n' ~' w; M

8 p0 R- U. L4 I; A/ d* B8 x19.哪些职位的人数超过2个人?: _  c+ |4 F) f( z% ]& R
select job, count(*) emp_num& J) u6 [5 L6 C9 ^# |$ j2 B
from emp_ning
) H9 I  J9 I' l) b& o, lwhere job is not null4 t) @8 S# @4 A- K5 ?! V% r& @
group by job9 j* H* v3 x( G) @# m: z
having count(*) > 2$ R3 B0 S8 D( o+ k/ Z; J! ?% b
order by emp_num;! ]7 ~8 m+ H; d6 h+ p  b

& H; H, _+ t1 b1 u# O: g

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


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

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

   

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