科帮网

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

动态微博

查看: 1917|回复: 0

Oracle增删查改 day04

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:42:13 |只看该作者 |倒序浏览
1.内连接
. l* Q) H) u1 E5 @. X. V  x% o5 k# b% y0 l* S. `, h3 B9 \# O
t1 join t2 on 条件# Z$ F6 F6 ~9 ?* l$ ~4 `6 s

% b! \4 ]* Q5 X/ M! _4 i+ U1.1.等值连接:如果on后面的条件是等于。
2 X3 n5 G4 r# V$ A: {t1 join t2 on t1.deptno = t2.deptno) x+ `$ x" a" a) e$ y; r- Z
1.1.1.等值连接的一种形式:自连接0 f* N- z! |* S' R+ h. Y
t1 join t2 on t1.mgr = t2.empno( V0 u8 _$ h( V

( i0 O$ i" H) y' z& z1.2.非等值连接:on后面的条件不是等值操作
$ O2 ?, f, p! B; ]6 `! H- Wempno ename salary         grade lowsal hisal
, Q6 S; d* G% E------------------         -------------------- J0 H4 r7 l5 M! d
1001 zhangwj 10000          1    10001  99999
* l0 U! W, i& Q$ s8 t! X, n4 ~9 b6 c1 b: ^1002 liucs   8000           2    8001   10000  
# r, r+ v2 y4 ]: {1003 liyi    9000           3    6001   8000- o- h+ I% O4 ~6 E1 h7 f  @7 D* G
1004 guofr   5000           4    4001   6000! y: j$ @4 z- B- j" @9 t3 s0 \
                            5    1      4000
$ Z# H3 m; c& b" u0 u3 J--步骤:1.建表;2.插入数据(commit);3.查询) I+ M" t1 f. Z- t
create table salgrade_ning(; P" J9 O4 M3 }& {: Z, F
grade number(2),
, m# n% u, Z6 ~/ t4 ?' F7 G8 z6 vlowsal number(7,2),
) g* T5 x/ n' ?hisal number(7,2)
; V! H7 H. J' o9 y# ?( B! }9 u);* E/ s0 u( G( Q  F  U4 @0 j; m
insert into salgrade_ning values(1,10001,99999);" P7 R& q  v7 j* g3 F% `1 \2 ?
insert into salgrade_ning values(2,8001,10000);4 f* f0 M; T7 e1 c/ X9 X) s
insert into salgrade_ning values(3,6001,8000);
/ F" h5 g* m7 l; g0 Z% D! Oinsert into salgrade_ning values(4,4001,6000);% y* A, z" k5 F6 }0 A8 q
insert into salgrade_ning values(5,1,4000);
' C. s3 ]7 J( w& J3 zcommit;$ G4 {/ u4 C. j* j
--计算员工的薪水等级:
) B* V0 A8 X6 ~: m  Q; ]; t4 Fselect e.empno, e.ename, e.salary, s.grade* n) G0 Z$ t, D& x2 D
from emp_ning e join salgrade_ning s8 i" }: a% }# n8 H  W9 K# ?) g- ]% O& d
on e.salary between s.lowsal and s.hisal;
1 M5 ?7 m+ o" {6 O$ o--最终查询结果的形式:) |6 U) H# m! r6 [
1001  zhangwuj 10000 2( r+ s2 u1 [. T6 B$ _( U
1002  liucs    8000  3  
4 j0 F8 s. E! ?% ~5 G4 X, R9 f( F+ I* ]
2.外连接
( z# k9 N0 U$ z9 x9 X% R& T+ et1 left | right | full outer join t2 on 条件; ?0 d  n' I; r0 y

" x! @7 G$ b( ~  V/ h$ USQL语句的种类:8 X8 y- N( c8 A0 K/ b4 @! ~
DQL:select
" L: c4 q( I8 v8 A$ _9 N' {DDL:create / drop / alter / truncate9 i, l2 N, r3 b* L! Z
DML:insert / update / delete
- m: ]; v: }% k2 jTCL:commit / rollback / savepoint
+ H6 |4 r& u4 S6 W- \1 |% B1 pDCL:grant / revoke* Y& o- R7 u8 H9 ?2 ~
( D4 Z7 r9 `2 V" Y# Z
一、DML操作
* q3 y; u. Y5 E" M: ~: a* L) }* P- ^1.insert into...values...
8 I# f' u4 H' r# Y4 d--1.1.不写列名
: G5 o) F, @5 h. W2 l% q  Z$ t--必须提供全部的列数据,数据的顺序必须按照表结构* C2 I' k3 U' w* ]) N5 f
--如果有数据没提供,用null表示( o7 x" `9 C& ^  ]/ c
insert into dept_ning
& [7 D: Z: \+ V+ G; evalues(66, 'market', null);
7 g* x2 [$ Z1 ?
$ [. J4 @9 D( o( O  j1 c6 k! Dinsert into emp_ning; E8 y; {1 ^$ j9 g% ^7 n# N$ ]
values(1020,'rory','Programmer',6000,null,null,. a' F# G. `8 H5 n1 |0 u
sysdate,10);  O* q# z7 t7 M  ~* X" T  f  w
* H- R9 C. P: U; w1 f
--1.2.写列名
& i" k. K6 A# W+ ~8 h5 W9 ?& Pinsert into emp_ning(empno, salary, ename, hiredate)
! B( A" b- O- q$ I! }: vvalues(1020, 6000, 'rory',  
- e* W0 ]0 z. q2 ]& L2 F6 l  B( cto_date('2011/10/10','yyyy/mm/dd'));6 H# S' \  ^/ Y; ~$ L) c
* S+ G/ w$ Y/ }4 ?; R4 R
--to_date函数是oracle独有的。
. H; d0 z3 a$ `- l9 Z--在oracle数据库中插入日期数据,一定要用to_date  R6 F/ d. e/ j" f/ z" Q
处理,不要采用默认格式,比如:'10-OCT-11'。
$ k4 _" v2 k9 n" o% U! ?5 x3 f3 A$ t
--建议采用:写列名的方式。即使是插入全部数据,也
* A# I- a' P4 b; q! [+ |( u建议把列名写全。# g. ?3 J$ V$ d0 G( T4 O8 [" h
--复制全表
6 i. \/ \( p5 c+ W6 z# v: \# Qcreate table 表名4 g+ {& U5 B  o- g, F7 {
as
+ r+ ]. z- {" M& I3 Q) X查询语句;: x6 i8 |" r* }8 ]. a8 U& N1 O

" i- H$ ~8 N8 k1 N4 \6 }  v. V--只复制结构,不复制数据
: m: `& x% v; ~+ ^4 w$ K2 E5 Mcreate table salgrade_ning1' a* _" ^# s, n9 r2 ^% @& s4 L
as
( r* o. }3 w' N8 Mselect * from salgrade_ning
" k  b& \+ }5 x" A/ zwhere 1 <> 1;# Q; k: O* y1 t5 R: {. F# w8 y
2 u( y$ r6 b- y
--复制一部分数据:给查询语句加条件。% E8 e6 [4 c: `, h4 q" K
--如果查询语句中有表达式或者函数(包括单行函数和
* C& v" K) D) z' g: g组函数),必须指定新表中的列名, n' ~& F( A& p; F4 ]& \. P
--指定方式:给列设置别名;或者在新表后指定。
* J3 x- C& H% v) _5 y/ Ccreate table emp_ning1
0 i9 `1 d9 {5 A: A: H1 \as
: P: c2 J: ?9 R) Q" p  `3 Pselect empno, ename, salary*12 year_sal8 _1 I5 y; l& @5 x) e+ `
from emp_ning
; R4 J3 u! F& I; l# j% p2 zwhere deptno = 10;
1 |0 q* h+ [( ]" b+ G
3 H  X! s8 r) X& Dcreate table emp_count(did, emp_num)8 ?) r4 S! c5 u, z9 t: Q' D
as2 O1 o% i' z! f) h
select deptno, count(*) / \' d5 e5 r8 Y
from emp_ning
, z$ ]4 K; |2 U+ l4 z3 q# Zgroup by deptno;1 Z8 l+ {. w0 n6 c! q: E) C

- a' s' g) b: {! t' B--创建一个空表
8 q/ ^) T4 F& F; {2 V; \# [create table emp_bak1  W+ }1 M2 c; R  x0 D% s
as
6 S& B1 \, L9 J7 w* S1 |select * from emp_ning1 m% _8 w. p$ G# P2 L
where 1 = 0;
2 ^3 t) z1 z3 f$ @
# A7 {, C" @# U--向表中插入多条记录
2 M" J( N; Z" q& I8 [4 V, [insert into emp_bak1+ W& H4 I7 ~, ~/ a4 Q  x% u
(select * from emp_ning
5 q( O6 f: {# y. z+ p$ o8 ~ where deptno = 10);
: b7 t4 K; v, D2 ?% x
9 Q( O# _; E& g( g--把表中的数据换为部门20和30的员工记录
8 R7 M* A1 f8 _* L2 Wdelete [from] 表名; --删除全表的数据。. h7 s3 V8 e, z; w9 T$ v
delete from emp_bak1;- `4 i/ W+ i8 `" Q* ]$ ]

$ E0 Y0 M0 S, Rinsert into emp_bak18 n7 q% u( @. z' M8 }
(select * from emp_ning- S# Y1 f, c& d4 m+ m) t
where deptno in (20, 30));4 R! `4 g% [2 O8 s% Y

" E  S, [6 O( b) a' A' p--向新表中插入指定记录数的数据,比如前8条。
8 Q9 G3 `) L3 |& K7 Sdelete from emp_bak1;! B2 \& h) d( \+ t

. w2 i6 {, n0 p, sinsert into emp_bak1% [$ P8 j9 C7 c* A6 v( K1 J
(select * from emp_ning' b$ W2 e8 {% [# K$ o3 @
where rownum <= 8);( L+ H- [  t( `2 o

7 _" G2 n4 `) ]5 [小结insert:
: e3 i8 O& \7 L, D, M1)insert into 表名(列名,...) values(列值,...);
; y/ x/ T. {0 D$ `: d8 S一次只能新增一行。
0 T, i9 K) s9 l9 T2)insert into 表名 (查询语句);
/ s$ }2 l% i" ?) n* w# N( ]一次可以增加多行。
; A. }. U7 g9 V$ m; Q$ x$ h1 A' s1 [, k. B6 V/ G" |1 @  F
2.update:更新数据
8 {" ]2 A3 }! K5 I# Gupdate 表名 set 列名 = 新的列值,
* B% p: x9 E( }6 O                列名 = 新的列值
, F. U& q  }. L# rwhere 条件;( h* W& E# v$ s# x) f, h9 [
3 q$ B6 Z. Y2 ^
update emp_ning set salary = 3500, 1 a3 o; Z- }. ^' @
                    job = 'Programmer'
. L5 g5 r( m8 Z9 M! R3 o6 c" f7 l( v0 Swhere empno = 1012;6 V2 E# k2 t5 O# h, c) J) H

- R& X% q( _! V  R0 c--部门10的员工薪水+1000
1 A* {9 i$ E7 T8 Bupdate emp_ning set salary = salary + 1000
* t8 N  C6 W+ G, R0 k" x( mwhere deptno = 10;, r2 |- `7 ^/ T- W
3 J) O' a% _: Y* x! p- g( v; s
--更新数据表时,注意条件。4 {+ h! S( A6 z' t
--如果不加条件,影响的是全部表记录。
/ U1 q3 q; C( }$ t1 B
5 q2 s$ f" u+ v" l- p3.delete
' m7 j* q5 f# y- Z+ C! Y3 w--注意条件。# m2 Z: X  l6 K
--如果不加条件的删除,将删掉表中的全部记录
. s/ s' t& f1 L! S: R0 i& o--rollback 回退,commit确认。
9 j& g8 N; _2 T! o! k2 gdelete [from] 表名 where 条件;
2 R* g7 l' F, g) L* B5 \; `( l5 W# j' h, P  q( H3 ^
delete emp_bak1 where empno = 1002;9 }$ u8 v# J2 l. ]3 M) a) k% k

8 s, w( F$ U& L( a6 l$ Fdelete emp_bak1 where deptno = 10;  Y; B1 H( O; w& J
9 A6 v, ^- M4 U3 {' q' I
delete emp_bak1;3 b# H# K. i# Q1 r$ D! w8 y8 K
% W' U9 `# i3 m% |5 @3 J4 T6 ^
commit;5 \* |( r% Y0 u0 ^
--执行了3遍
- D3 B/ u2 g6 }* K. Q6 Einsert into emp_bak1(empno, ename, salary)
. \0 ^& `8 D; ^3 v9 Ovalues(1015,'amy',4000);
) ^& l* g" U' {" A; f--执行了2遍
0 A: y' `# H; p9 E/ x( g6 kinsert into emp_bak1(empno, ename, salary)8 _% M$ Q1 n5 i9 l! m' n0 J. _" l
values(1016,'rory',5000);& }2 j' Z. i& g  c$ |% U
--执行了1遍。
" o3 \' w# H% y- F; Cinsert into emp_bak1(empno, ename, salary)
( q% C0 `" ]3 b9 o# Y, ivalues(1017,'river',6000);
0 k) V: D# F2 s; l& r--创建表emp_bak2,只存放不重复的记录
! |0 E5 u- `: U3 r% M" ccreate table emp_bak2: f0 K2 F+ n6 o9 \$ l3 h5 p
as
( v* H/ n( t, f5 v& lselect distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr$ _# i1 @; O! s# ]$ D
from emp_bak1;
. Z" U! [& \- |- R--删除表emp_bak12 m! N( {; u& y8 H
drop table emp_bak1;
* T& o" \2 }( ~( J--把emp_bak2改名为emp_bak1) i1 ?7 P  y) n- @/ d: B. Q. A
rename emp_bak2 to emp_bak1;
* O7 P+ E# Z5 z5 o: ]# O  S3 x$ D+ e8 j+ x4 g0 t! B) h  ~
___________________________________________, g- J5 j: L6 t5 k' F- Q  g; E4 i

& M& A8 r; K  c( @5 @. r; }7 V- y
delete emp_bak1;
- a) c" w1 n3 A9 W) F
# D5 G! n4 g# p1 `insert into emp_bak1(empno, ename, salary)
/ X2 a% L* j; ^8 gvalues(1020, 'amy', 4000);. C+ G, K* i. b' \5 ]8 ]2 `& x
insert into emp_bak1(empno, ename, salary)( e# k1 y7 O- r8 X- M
values(1021, 'roy', 5000);
9 n/ n  Z% u- p" {7 Y0 cinsert into emp_bak1(empno, ename, salary)
( `! @: p4 |3 A$ I9 y: avalues(1022, 'river', 6000);
. a6 F8 z  @+ }5 g9 J0 ~
/ {7 X( P+ a( a' W8 }--rowid是Oracle数据库的伪列。3 p2 p% ?! C, q" w. J
--rowid是Oracle数据库独有的。7 o9 f7 X: h. W' i: s5 _7 u
delete from emp_bak1
" l! \6 ^7 p* r- a$ |5 z where rowid not in (
! G2 ^) w0 ?. b  |' w$ Z/ x4 j   select max(rowid) from emp_bak1
- n# s3 I. T7 _, Y! m" _   group by empno, ename, salary);% `- j, I9 p* b5 `
% y+ F) o; {4 Y4 [  [
二、事务:Transaction8 o9 E6 q& W. r, A
TCL:Transaction Control Language% {: j' g/ T8 b  l$ U5 N; x
commit / rollback / savepoint9 E8 [8 v  Z7 N* s& R
事务:一组DML操作的逻辑操作集合
) D2 }2 B; P; S! s% ]  w1 M% N* S          ***. P- Z( V! G2 ?
1、事务的开始和终止$ [$ G1 W1 ~4 s: H$ i
1)事务开始于上一个事务的终止或者第一条DML语句
4 f3 j# t0 K/ P2)事务终止于commit/rollback显式操作。
# W+ C, ~) h3 A. a  连接关闭:隐式终止
5 s! m3 ?, p, M- n  DDL操作,比如create:隐式提交。0 \& Z" [$ y9 f( f9 U+ S- w

; ^) `/ R: {" o3 N' C5 e! binsert into ...values.... ~( K5 G7 y0 {7 P  \% E# e4 S% g
update ...
- Q& m# ~5 q  u! {) r# ?# o& tdelete ...
& E( G% J0 t( v6 G2 S, c7 _insert into ....4 C8 {: l& `+ a. g7 U$ z
--rollback;--回退到事务之初,数据的状态和事务8 ~7 x8 ^8 q& }1 |8 P
开始之前完全一致。
3 J- `- ~/ |1 h* d, X$ f# Zcommit; --所有的数据改动提交。
1 W7 }' K$ y, p2 W; q2 x
. j! F: D& e8 m) X- h2、事务中的数据状态2 p. p! z5 _9 N6 G2 B
create table mytemp_ning(
: ]- K% Q7 `, Y; bid number(4));
% H  [3 w2 O: G! iinsert into mytemp_ning values(1);2 J8 l: K) [# x
insert into mytemp_ning values(2);5 ~2 f' ~8 J5 @6 W) I0 `

+ o! z& N* R9 C--事务内部的数据改变只有自己的会话能够看到  n* E" P1 T: K
--对事务改动的数据加锁,事务之外不允许操作。
0 T. h7 h& Q1 U5 }
2 O: S  M" W' o. v如果提交:commit
! k- e) x% R" |数据的改变被确认。所有的会话都能看到这种改动。
/ ^) N) T9 f, G5 h2 f7 O, j- J. m数据上的锁被释放。
5 ~( h+ S) ^. T5 i保存数据的临时空间被释放。
! u  R  y* T% g6 r. P; W7 Z0 k+ \$ ?) Z3 {0 X3 h! \3 a" m
如果回滚:rollback
% W7 m+ C9 p. ~' v" o  i数据的改变被取消。/ m& Y  L- |( l6 r
数据上的锁被释放。5 k) A" G/ l, p+ ^! F
临时空间被释放0 A: o7 K/ D% _( e' r! G# B. X8 P: N
create table mytemp_ning(id number(4));( M. ^2 R) w$ ~% r! [
--事务起点, V$ U" H+ {4 Q- w5 k4 x/ ^  i
insert into mytemp_ning values(3);
$ a! R  }4 d9 f$ v* `3 j6 y* s2 _savepoint A;; G' o3 k7 I' q2 f9 K+ [
insert into mytemp_ning values(4);' j3 _/ a0 D/ w3 F6 Y6 J
savepoint B;2 L" }/ `/ h6 w4 p
insert into mytemp_ning values(5);
" ]' Z6 j5 M  G. r' s& @rollback to A; --回滚到保存点A,A之后的保存点全部被取消
5 n$ m& i. ^" Kselect * from mytemp_ning; --3保存,4、5回退
1 g& E3 J  p$ y  C; E. x& S- I( W; F. a) D5 E
三、DDL7 g, ]) E, }: Q5 H
create / drop / alter / truncate
+ X1 _2 Q7 M! q4 g' V9 \& I" i0 d' y4 u9 @6 }# x& ~5 G3 C: P+ T
数据库的脚本(script)文件main.sql:! B4 ~1 |6 s/ E0 F) B
------------begin--------------------
6 e; R6 M* H' ]9 N+ q, Q) t+ C--删除表emp* z7 l0 p8 }; _, ]
drop table emp;
- q# V, _- T' F1 a9 C9 }--创建表emp
1 P' D/ m0 d, E& j  Q2 xcreate table emp(id number(4),' }! I4 v! [! x1 i$ j) n* B4 X
name char(20));
  b8 t+ m, T: z/ Z2 Dinsert into emp values(1, 'amy');8 k) m9 a. D' N% U1 ~; h; j
commit;
, n0 t8 r% p+ g& v6 `! V; X1 }# K+ s/ J- N  C* R

1 V% J8 R/ ^  ]$ e3 S2 e% E8 G

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


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

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

   

关闭

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

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