我的日常

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

动态微博

查看: 1666|回复: 0

Oracle增删查改 day02

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:40:52 |只看该作者 |倒序浏览
SQL*Plus   $ ^, K- L$ S' _8 L; c% O* @
sqlplus.exe
' e5 j6 Q- {9 D& G3 O* Y9 S. Z
0 N( ~7 r1 V+ A1)数据定义语言:create / drop / alter / truncate7 }4 R2 M- o$ `7 {9 _
对数据结构起作用。
$ q' ^4 ^0 m) v8 z  ********/ v0 o( [6 K4 N
Data Difinition Language: DDL
% ~# `0 z& V+ z9 i% a9 [+ ]2)数据操纵语言:insert / update / delete8 B( g8 a( R% h; j. ]+ _6 Z$ g
对数据起作用; \# m! l  G" R, w5 r: z
  ****
! @- z8 m7 L' }) i" r$ [4 x. tData Manipulation Language: DML5 J+ M( w; O8 d1 N8 N
3)数据查询语言:select  ~% H- j: e2 c" w6 F8 ]$ U
      ****
/ b' @- }5 J9 QData Query Language: DQL$ \" M8 f2 ]/ U/ j# u: w
4)事务控制语句:commit / rollback
. s! Y5 ^) a. _8 \9 k对DML操作确认
4 `1 M% Y$ i" B. e: {* B( Y/ O* ^9 _/ l1 v* C3 t, r
一、学习单表查询语句。3 b. q' ^# E  C3 ]4 U) X' Q& q: X
1.计算金额的四舍五入?
: t7 }# y7 P% Mselect ename, salary * 0.1234567 s1, % X: [0 P) d: H  n+ _7 _) d2 [. u
round(salary * 0.1234567, 2) s2,9 y/ [& k% R* ^; m4 W2 g
round(salary * 0.1234567) s3,5 h) a1 d( |1 t* M% s) r
trunc(salary * 0.1234567, 2) s4
4 r& p/ A  B, n$ k5 G: Tfrom emp_ning;6 r/ b" W* t# M) e- C1 J
" V  g* A7 R+ K: K6 R
round(数字, 小数点后的位数):四舍五入
! d5 i9 B: G% ~: m; K! \如果没有第二个参数,默认是0.
# k! ?' r" ^" S: F. O5 H0 [' F2 K7 ]' q
+ f4 l5 G% J: a' l/ otrunc(数字,小数点后的位数):截取+ |* S6 O2 ]( Y# f9 C* t5 j
如果没有第二个参数,默认是0.
/ I0 Q+ G* {7 m7 E
. E( n" i% P/ h. b0 S/ C2.Oracle中的日期
+ _/ q7 Z) t$ k) V- V, P4 V/ Q) N7 \1)取系统时间的函数:sysdate
4 c. {8 O& Z* d$ f! Xselect sysdate from dual;0 k0 B- ]% Y+ t6 M5 U! u; T2 K

3 k9 x0 m9 a7 c* y0 J2 `2)把时间数据按指定格式输出
2 y7 f3 J& T! k9 a% wselect to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')+ S& \) s$ _, Z* q2 r: q$ x
from dual;
) p4 y5 Z0 S5 ^5 z& W; m! S
* P9 Z$ r3 L& J& l3 Aselect to_char(sysdate, 'year month dd day dy')
: a" `8 Y$ `9 g3 H) Lfrom dual;" Y5 _) E6 x/ N+ y5 E
' X/ A. F; p/ C3 W
to_char(日期数据,格式)
8 p  K# l, m1 k. F2 N# N
1 G: `5 Q9 ?+ L/ q* w9 B  O6 lpublic String to_char(Date d, String style){
6 L2 T, f1 o! W# o1 R        //SimpleDateFormat把d按照style的格式转变为字符串- l5 U4 o7 ~% q
        return 字符串;
$ c9 k9 ]7 Q' I/ B& I}
# i- H5 J4 O" _5 U1 A7 C$ A+ |
. s6 {& S2 P. B; z$ [+ Z; ?select to_char(sysdate, 'yyyy/mm/dd')
8 k& s- B& K% r3 s& F( q1 ~from dual;8 ?/ w$ c- u. J# h' [

* T9 J# m- q3 Zyyyy: 四位数字年  2011* M9 \* X2 m* f2 B. s
year:全拼的年 twenty eleven9 ^, T% c0 X; M1 r/ u
month: 全拼的月 november  中文:11月
9 P. E0 E4 `' e) d+ P3 T. `9 P$ I) h2 smm:  两位数字月 11/ U8 w% ^+ s9 m1 E
mon:简拼的月 nov$ _/ H* i5 v5 W1 F$ W' ?: Z. x: }
dd:两位数字日5 z; s, m) x. `6 K5 A' a+ }
day:全拼的星期 tuesday6 G( h/ _: g: A+ J3 L- J3 e0 \
dy: 简拼的星期 tue* e. o  _! O9 t% l
am: 上午/下午 am/pm
8 B* M- W0 K6 C+ c9 h1 N+ E6 j5 j. p$ M2 U. A; i' j! m
sqlplus中日期的默认格式是:DD-MON-RR
" J- {( E3 h% f" j# h3 ^& U# B现在的时间是2011年6 F9 H4 M8 [9 p5 K! O% D4 ?
           YY           RR
  S1 E1 k2 f6 j" v* \  \05年      2005         2005) E. L: Z; S9 P
98年      2098         1998) M7 J' Y0 r; j: a; ^5 t  r9 O7 e  p$ M
+ N3 e2 F1 U# P* X0 U
假设现在的时间是1998年
  s) W0 C- R& y8 Z05年      1905         2005: D4 }4 e  r7 y9 j% j4 U+ T
95年      1995         1995
7 ^! D" P; w; ]- ~  Y/ Y* M& [+ f1 C; [$ E7 g; y
insert into emp_ning(empno, ename, hiredate)
: r7 g2 {9 @  `2 o& A: Q0 |/ W" U* \values(1012, 'amy', sysdate);* X' s/ D( f2 L& a6 [; O. U
--实际入职时间是2011-10-10: ]! ?; y1 U* T. c
insert into emp_ning(empno, ename, hiredate)
5 B% ~1 V2 p) v' v# Fvalues(1012, 'amy', '10-OCT-11');# c( h7 M+ u1 Q5 b3 H
& d9 M. x9 g* t, s1 M* `/ x: d
insert into emp_ning(empno, ename, hiredate), d. a+ Y  K) L3 C5 {- Z' H
values(1012, 'amy', # G% D/ D2 v3 s' m6 `, U
to_date('2011-10-10','yyyy-mm-dd'));
; }3 K1 @! @' A& Q3 A9 Q
8 F' j' ^2 O6 r% S1 ^显示员工姓名和入职时间,显示格式为:
8 a4 B  T2 g8 Z& d) {8 J% Q! ]3 N; U" namy   2011-10-106 A# A% F7 B+ Z

0 n+ n+ R5 }) k1 F$ }         to_date
* \' H. J0 h: E5 O' A( x. x3 v5 R字符串   --------->   日期9 m& q3 h1 ~( G+ l* u8 j+ _
         <---------* S, J8 |! d% ]* }
         to_char$ n0 F5 K, l/ p/ l( i2 M1 Q# |; j

; P7 |% W. e" k+ X) u  \" n3.计算员工入职多少天?
9 B# k/ a8 l& C8 s; _select ename, hiredate, (sysdate - hiredate) days
" y$ B2 @# D# T& F+ _from emp;- l5 P( ^1 N# j
- F! p. l+ A8 i( r6 T
日期数据相减,得到两个日期之间的天数差。7 U+ }$ g3 Y2 Y4 u$ W9 x, |& j
不足一天用小数表示。5 K, J& o% v/ Q  ?

1 [5 ?# w) w5 Y) N, eselect ename, hiredate,
! ]6 |: c9 R: Pround(sysdate - hiredate) days
6 O9 e$ c4 k: p2 C( rfrom emp;
  P$ I! ~9 `. }/ _6 L& i( R9 ^
2 s2 C8 F# ~7 Z5 Y# s: m4.计算员工入职多少个月?用整数表示。
; y8 R1 ?/ w# k( Vselect ename, hiredate,
* k7 k: c; T/ U1 X7 jmonths_between(sysdate, hiredate) months/ E5 R  e+ y7 H1 r- s3 `" [: u; h, H5 C% l
from emp_ning;
; {% s' L! e- Z8 f/ I; h0 `+ C2 c0 g. E; y1 S" w
select ename, hiredate,
1 r# L. p3 R& [& R( I9 M0 Z4 pround(months_between(sysdate, hiredate)) months1 P4 R2 W8 Q, C- d8 \
from emp_ning;
  X( D3 S6 Z4 A' W" F) F, i0 ?+ h8 W( W4 M/ u, ?
f3(f2(f1(p1,p2),p3),p4) : 函数的嵌套$ d9 b, ?( l4 a

: d) R0 ]6 l/ s: h7 r+ N5.计算员工的年终奖金( {3 L; R* j) x3 J1 {
bonus不是null,发bonus的数字。- x) R+ F/ q! H& m! }
bonus是null,发salary * 0.5.
' U3 i6 X, @2 _' z% R* f6 Wsalary还是null, 100.: t% A1 o8 S2 v% a
! h5 c& |) s6 a  I2 @
public double calculate(double bonus,
. r6 r7 I# p1 W) f                        double salary,
6 |* x& G3 }1 N                        double comm){
- t8 l2 s7 t- k) n2 v, }        if (bonus != null) return bonus;' Q2 E7 x' M  Z' G9 }- k) ?
        if (salary != null) return salary * 0.5;: v$ x/ j: V' E  c+ P2 s
        return comm;                        9 G; ?; ~4 M9 f2 o: d$ ^. a/ E
}% |" o& ]$ T. ?* H$ p3 L
--返回参数列表中第一个非空数据
: ^/ J- ~# i6 N0 t& N--最后一个参数通常是常量。/ G' d$ R! ]9 S3 Y
select ename, bonus, salary, ; ^/ j4 @( H& U
coalesce(bonus, salary*0.5, 100) bonus
: l! v# t! \, |, j! `- D. Bfrom emp_ning;3 p# `% @4 ~! e$ f0 t, U

0 c1 d) X* `5 E% h6.根据员工的职位,计算加薪后的薪水数据:  x" p0 Z3 @4 g# X( k$ P% u; B1 ^
Analyst: 10%. C8 e- Z6 r$ O- X& F# a
Programmer: 5%. u5 ]; j! B: U/ x5 G) d
clerk: 2%+ A4 }4 G% G3 b% I2 p
其他职位:不变。
& N: C6 f2 c2 o; {; Y8 u# }# E( ?
case语句:+ B' x) Q, m% b) c# g, c
select ename, salary, job,
! \& x, G; n# N; {7 }) g) p/ {& Q- T, Vcase job when 'Analyst' then salary * 1.1
, X& W5 ~, Z+ [3 {% O2 b         when 'Programmer' then salary * 1.05
* D, w( S  F4 q: X+ S         when 'clerk' then salary * 1.02; M) z! J: c2 u9 S: @. C2 ~9 p7 z
else salary/ w0 {: [5 M! z  V  W
end new_salary
  l- q9 B. v8 qfrom emp_ning;
. I& M5 R# F+ y. a. b' v; T& _  E3 w+ R$ E/ B1 X
select ename, salary, job,* t) S- T- I8 N
decode(job, 'Analyst', salary * 1.1,
! ^( o/ X. l* S/ D# G  I* p8 w            'Programmer', salary * 1.05,. r: m1 ]7 d  V, p" G; U
            'clerk', salary * 1.02,
  c" f: m) |& [; H  c( Z            salary) new_salary
7 _- d& O5 E  j8 E! W4 X: i+ [; mfrom emp_ning;# K5 r; T4 a" d/ L" U4 M, Y7 y
6 ], f$ p. H8 n( o
7.薪水由低到高排序
% H" l. ?8 }1 g& n7 [select ename, salary from emp_ning. c: ?8 X2 S/ `& W/ L3 e0 X5 m5 D
order by salary;
3 r4 p0 H- N- Z) o. y. U/ H
" h' M" i; E8 [9 W1 m. r6 J) }select ename, salary from emp_ning
5 [0 [: x6 w- d- J. @: T8 korder by salary desc;  --倒序排列 descend
- \! o+ N: Q: H! i! u% h6 n
. E5 c9 p, [! [* x4 udesc emp_ning; --查看表结构 describe* E# \" Y8 L  C4 G& a9 Q) y- H
+ Q3 e7 c& O7 o: ^* T& J
8.按入职时间排序,入职时间越早排在前面。5 x6 c9 R+ \/ Q* b+ F
select ename, hiredate
8 ~2 ]7 W( i2 Bfrom emp_ning
9 T) g2 @5 }( h8 f0 H* vorder by hiredate;/ N  b( y, N/ H+ I$ `4 A
" U. j( m) d* F3 J( v" {
9.按部门排序,同一部门按薪水由高到低排序
2 \, t5 [! h, z" H4 f9 o$ i/ yselect ename, deptno, salary
# S6 B( }* v1 t; j% wfrom emp_ning1 {) b) ]' j5 f/ z+ P6 o
order by deptno, salary desc;
6 l- i7 K/ L* T/ r. L8 z2 Z! \. p3 m: m  {$ ]
10.员工表中有多少条记录?1 ~% M! \1 v" l3 c0 w
select count(*) from emp_ning;
! T& y" k8 e. K* l! ~
% R8 `9 j0 P" i6 K' Uopenlab帐户下有多少个表?
5 w/ }, n) u, z8 |" ^select count(*) from user_tables;4 I. P* l. `( c

; H: \' ~" W4 O* |4 _  x  Mopenlab帐户下有多少个名字中包含emp的表?
5 N% @& q/ i6 b0 k, k) nselect count(*) from user_tables
( w# b# w# r) ]5 j5 y" Dwhere table_name like '%emp%';& s! H& v& c% O- J
% Y6 K. F6 B, E5 I# o
--表名默认大写# @; P7 ^  G) p( T4 P. W9 X
select count(*) from user_tables) S, [1 b# x& T! A4 h3 W) z
where table_name like '%EMP%';5 A) p( V0 N, O: j: G, B9 T

4 {; c* S: W0 W& b. H4 b4 q3 j% J--入职时间不是null的数据总数。
) _( j5 }! S6 }* e  b+ R& x--count函数忽略空值。: d% U' N* z( ^1 {
select count(hiredate) from emp_ning;, H) a0 [% v4 X7 S. k: I
; S1 b# q! _6 F+ }
11.计算员工的平均薪水和薪水总和是多少?, Y% H# A; A0 X3 `+ O! C. _1 w/ T
select avg(salary) avg_sal,
$ @$ ^% m: F) y8 J6 v8 r       sum(salary) sum_sal
% u6 N- k+ S$ _from emp_ning;
) V+ b) u6 t8 ]# W; B/ y# B" L
' i( \3 |' `1 t% @/ X1 e7 bavg(salary) = sum(salary) / count(salary) 9 [1 P1 Z# k. |
              68500 / 10 = 6850
9 e/ F) r8 W: E* D% ]--纠正逻辑上的错误; y9 X. W0 c2 Q, I: u$ }2 \
select sum(salary)/count(*) avg_sal,
' v2 U" t  X1 |9 M% m1 i/ Q       sum(salary) sum_sal
. r# j+ E" M8 _1 r' _5 Lfrom emp_ning;/ U0 G, u3 {6 N7 N
% a. Y. o- s& i8 z8 v1 M9 X
select avg(nvl(salary,0)) avg_sal,
, h; R7 o# a& X       sum(salary) sum_sal
0 C( g2 C: Z3 ~: Q$ m* \from emp_ning;1 x% {9 y' m. \7 o! l( w

& k! E! ~$ e$ B8 n1 T12.计算员工的最高薪水和最低薪水
5 x$ O7 k$ Y+ }  F$ v$ p+ Aselect max(salary) max_sal,4 M% T6 b" L! b6 d! w$ A& L
       min(salary) min_sal. a" s: |* t8 r# R" a1 o+ N
from emp_ning;
# n# k% U* R* ?+ U
: M% I1 s' `2 U, D( o* `( ^! _组函数:count / avg / sum / max / min 忽略空值
, Y+ Y- y$ K- O* r5 Z其中:avg / sum 针对数字的操作。% e3 w, s" ]7 k  q
      max / min 对所有数据类型都可以操作。
$ ?: x4 B( }# j) h
$ I, n( l% V% f- l4 N+ D13.计算最早和最晚的员工入职时间。/ o* }9 X; R$ w! Y3 Y
select max(hiredate) max_hiredate,
: {) m2 o5 @- h# S       min(hiredate) min_hiredate8 e4 Q9 w4 n, u, [$ H7 o2 y: j
from emp_ning;
: |/ J% ~- v7 f( p
6 M% A' ?( A# a  k6 j# b; W1 X14.按部门计算每个部门的最高和最低薪水分别是多少?4 M, y1 I' h$ k" L) L& ]
格式如下:
+ A( S2 j( c% f1 {; T3 d, S- U10 4500   3000
6 u2 G  Y+ a4 W20 15000  8000  U( m4 \; z/ J- _% T9 q7 k7 u
30 10000  5000
/ x+ V2 x& L5 B! M
  p7 {" [+ o* S( q3 i9 q  D$ `--group by 列名 : 表示按哪个列分组
$ G" F5 Q( g, E( L* q. r4 v6 tselect deptno, max(salary) max_s, min(salary) min_s4 z) t0 K8 _1 J- t" q
from emp_ning
3 G! n- J7 X) S4 ?3 ~( mgroup by deptno;4 P: Z& q# K  b
& M0 d* J0 T2 r, d
15.计算每个部门的薪水总和和平均薪水?4 L- k+ r1 t1 D$ o+ u' N3 L, Y8 ]- j9 ?
select deptno, sum(salary) sum_s,5 f2 @- B# s& s. P! U% |
               avg(nvl(salary,0)) avg_s- I7 k- @' c. q5 A8 o/ S5 ^8 M* @! `
from emp_ning4 z5 a8 S9 G9 a" [2 f; W, q
group by deptno;
% G% @* U1 I+ y. q9 d# |% p" o& u" a; M
16.每个部门的统计信息:格式如下:
# A+ G/ M  V. _deptno max_s min_s sum_s avg_s emp_num
* q5 W! e) B7 F# y8 U10     10000 5000  23000  6789       3
/ v7 d  s! J+ d% r" B% ?....
% p3 [7 w; H: I2 k- U& M( Gselect deptno, max(salary) max_s,
6 v, T# Y, w  Y. q$ H0 ^3 }               min(salary) min_s,! X, o# T) y( [) Q4 P
               sum(salary) sum_s,
9 f6 m( \/ S& C6 `4 S               avg(nvl(salary,0)) avg_s,. @+ R: J( Q( {- o0 j$ m' r
               count(*) emp_num: E5 R9 t. {( Q9 Z9 z  c( L% \
from emp_ning" c! b6 e6 G8 b, y4 C
group by deptno;
' W6 L. u: ^" Y0 ^& ]
) y8 O; f6 O: F# Wselect后出现的列,凡是没有被组函数处理的列,必须! p9 m+ p6 c' u& e* O+ ~, K+ G0 {
出现在group by 短语中。: {& q5 _6 b: n3 x  |" T

/ u+ m! W& O4 {6 M5 I2 f# o/ A3 {6 b按职位分组,每个职位的最高、最低薪水和人数?
4 L; d+ Z9 [$ N" h! e: {6 eselect job, max(salary) max_s,
: h0 ?! N/ u8 W8 Q' k( x3 v9 Y            min(salary) min_s,! P3 H1 J0 L( Q2 N+ w
            count(*) emp_num
& q* @& U! F# \7 t) c7 Xfrom emp_ning
$ r$ y  {# I9 b$ E4 H+ s/ Agroup by job  _9 c. o9 `7 U0 Y0 Q
order by emp_num;
$ ?; l+ w" _3 a7 z7 j* e17.平均薪水大于5000元的部门数据?; D  q# Q2 E3 M  k- H& \
select deptno, avg(nvl(salary,0)) avg_s
4 Y7 }* G3 ^' m6 I8 f3 }from emp_ning. l7 o4 @( W- \
where deptno is not null
6 a) i+ N% }+ l! v/ A: |4 bgroup by deptno
* `$ D. ^3 d/ D/ jhaving avg(nvl(salary,0)) > 5000;
. m; `# O) {* |, P2 N7 z- R; D& E7 q6 j5 w. m$ X" g
18.薪水总和大于20000元的部门数据?
8 n' S' W) p, f# B3 F3 Qselect deptno, sum(salary) sum_s- d+ U3 c: ]0 |) ~0 \
from emp_ning7 ~9 k- j$ h+ P  R
where deptno is not null
! u7 }2 o" j2 F; Ygroup by deptno
0 k8 Q; j- {. k: i7 g4 T; g8 jhaving sum(salary) > 20000;
4 x7 B/ F# T( `
5 G( `- w1 ?( u6 H5 ^; t19.哪些职位的人数超过2个人?, Z7 H, a' Z  W3 ]
select job, count(*) emp_num: v& v" K5 x2 _* ]- H
from emp_ning
- i: E4 f6 x1 b+ c: G1 @9 fwhere job is not null
4 ?% q5 l& ^+ Z6 m/ q% S3 \group by job2 E; c3 V& _/ i" J2 d
having count(*) > 2
/ k$ \) C# |6 L8 Y3 }/ forder by emp_num;
4 _, V" l+ k3 G* m8 I8 u! P0 K" |) D1 H; S2 I. ^! j+ r

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


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

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

   

关闭

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

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