我的日常

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

动态微博

查看: 1852|回复: 0

Oracle增删查改 day04

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:42:13 |只看该作者 |倒序浏览
1.内连接
* h( p! V  e. e7 S! A& f
7 k, u- S9 g, u6 q2 `4 {t1 join t2 on 条件
3 U2 k8 D/ O. I2 O  G& e5 v# Y- ~" a! v/ u# v" P
1.1.等值连接:如果on后面的条件是等于。
" u+ a; y+ L' \! ?. A5 ~6 |t1 join t2 on t1.deptno = t2.deptno
1 L0 R+ R+ J( c! o* K4 }6 C+ i! Z" Q1.1.1.等值连接的一种形式:自连接- b( `$ C$ {3 J- _" A/ q  u- {
t1 join t2 on t1.mgr = t2.empno
2 x+ q8 C1 P" ^6 f: g1 N0 @5 B% Z; M" S* G) S4 \2 \& D
1.2.非等值连接:on后面的条件不是等值操作* w+ Q. Z- y9 }: ~5 r9 q3 U; D
empno ename salary         grade lowsal hisal& T" E' B1 G9 s3 t7 V6 W' F, C8 v
------------------         -------------------
9 A3 s" z4 N* f, z! n1001 zhangwj 10000          1    10001  99999# d+ g. B2 ]. V* z* K/ J# y
1002 liucs   8000           2    8001   10000  
1 |9 S$ m6 O' L! ~' ^# S9 s9 U1003 liyi    9000           3    6001   80003 z1 }  \% T, D* O7 q* P* B6 y
1004 guofr   5000           4    4001   60007 f; O8 Z- n5 G- \
                            5    1      4000
; j; ?$ h9 m6 P8 u8 t--步骤:1.建表;2.插入数据(commit);3.查询; p% v+ _2 C# R" z, C
create table salgrade_ning(
" e. p: C' c9 `grade number(2),
# l& D8 {4 {+ \0 u. T8 elowsal number(7,2),
) ~  y, G* ^# H1 w1 {hisal number(7,2)+ e7 V6 s2 N9 N  b
);5 A/ @* ^* E0 e/ Y# B
insert into salgrade_ning values(1,10001,99999);
; M& t( U  x" u3 e2 O2 k9 W' dinsert into salgrade_ning values(2,8001,10000);
7 S3 j% [9 }, I8 sinsert into salgrade_ning values(3,6001,8000);
8 u& c9 v, ]; C2 @5 _/ `) Z, S; oinsert into salgrade_ning values(4,4001,6000);
9 s# Y! C+ J% {) t( d3 }1 a% Xinsert into salgrade_ning values(5,1,4000);# G! G# a+ k2 D4 E# a
commit;% U% p5 _( Z+ i
--计算员工的薪水等级:
1 t% M, w3 |. e* s; x. e" vselect e.empno, e.ename, e.salary, s.grade
' u  Z! s" s' D# `6 wfrom emp_ning e join salgrade_ning s
6 x$ t0 G+ i$ ?6 Yon e.salary between s.lowsal and s.hisal;0 }) u) t! x. d6 ^2 `& h
--最终查询结果的形式:2 q( u6 K( a# i6 s5 s8 n- {
1001  zhangwuj 10000 2
! z( T7 |1 J- J7 O2 U0 _" z7 ~! V1002  liucs    8000  3  , X; G& a. g/ r6 o

2 Q: ]/ r$ ?7 M# p2 B5 X2.外连接
1 V3 j, H1 O/ s3 {" `t1 left | right | full outer join t2 on 条件
3 t2 O4 B; }( E2 _6 l) B1 o! w% I- e4 d  }, P6 [
SQL语句的种类:
1 }! S9 n. W5 X+ @' p( z" pDQL:select
+ K( t" [8 ~2 tDDL:create / drop / alter / truncate6 e2 ?$ e( I; x# i: s
DML:insert / update / delete
2 r8 s! A2 B3 \4 w' L% FTCL:commit / rollback / savepoint
7 Z/ t! d5 k5 [DCL:grant / revoke
7 [, A4 K/ Z3 O9 T* A, w$ r& G/ e0 x6 F, Z
一、DML操作
+ }- d6 i6 i9 D8 C# W/ d7 ~! h2 o  y( i1.insert into...values...
  }/ l) ]) u  {: D4 b5 D& a--1.1.不写列名
& M; ^# R/ H$ x! _) F4 o' x--必须提供全部的列数据,数据的顺序必须按照表结构9 g% F5 {4 t) G; w: U  A
--如果有数据没提供,用null表示
" m$ s8 E$ d: [3 H! d3 @+ |insert into dept_ning( r( ?; o) l% r8 g* T
values(66, 'market', null);+ e1 n. ?1 X- U, l! y& v' g
- @2 h7 g$ s3 z! [+ w0 M
insert into emp_ning
0 c9 y- r3 e) z" }- xvalues(1020,'rory','Programmer',6000,null,null,! J$ t$ p7 ~6 ^  k" G
sysdate,10);# @2 h9 Z% c1 L7 c

1 }1 x6 r: {5 J2 e8 a) V7 w--1.2.写列名
) M/ l" _; Z/ m2 Iinsert into emp_ning(empno, salary, ename, hiredate)
& M- j+ B' L- _8 i  i4 K8 o  Nvalues(1020, 6000, 'rory',  9 p' P, O3 ^3 C* i9 v! Z
to_date('2011/10/10','yyyy/mm/dd'));# k* X  u4 U, t( R+ ]
' }0 }* Q: r+ W; B$ ?
--to_date函数是oracle独有的。
0 b, V4 B& U5 e2 T+ c--在oracle数据库中插入日期数据,一定要用to_date
* g9 D3 N% o7 g  w' z处理,不要采用默认格式,比如:'10-OCT-11'。
8 t& v% q$ @  g) ~7 w) F0 D# r  w" Q  C* U
--建议采用:写列名的方式。即使是插入全部数据,也2 i+ N7 W# l. p! S) K& v6 _# r
建议把列名写全。
' R9 x5 X- K' E+ A- h/ T0 U: `--复制全表
  E% f6 O+ F* h! Jcreate table 表名4 b3 Q2 M* q/ R3 @3 o4 Y
as( P% _+ q: w) L6 Q! T( e% k- f
查询语句;- e- W& R6 X$ L% E& C/ C$ U# X

/ l! b5 c. @5 g! R7 n# _$ @& X--只复制结构,不复制数据
3 R+ `. K& l+ b0 T: u$ Tcreate table salgrade_ning1; [' M) z% u. O9 R4 j& m6 X, C
as
1 M6 D9 A5 x/ Q7 Rselect * from salgrade_ning
4 H' e0 ?- ?: qwhere 1 <> 1;! u  ?3 }6 h2 Z0 Z' q8 Y# P
: ?5 D4 T( J7 a6 b$ C6 R
--复制一部分数据:给查询语句加条件。
5 ]. n% J7 i9 V. B--如果查询语句中有表达式或者函数(包括单行函数和& b- I' _1 C: @
组函数),必须指定新表中的列名
& k( c* R" q; S- Q. g2 x* X+ B--指定方式:给列设置别名;或者在新表后指定。
4 O8 b/ x+ G6 Jcreate table emp_ning1; n  z  g5 L3 _) |  k$ W: m; o6 _, i5 P
as
7 w" l0 [8 Q7 G, ?+ }select empno, ename, salary*12 year_sal
0 I( t( N2 g" q1 V1 k from emp_ning
2 i% D! }( o7 j1 [2 j1 F/ s1 i- Kwhere deptno = 10;
( c* w' [9 m: i8 Y* l7 Q4 N
/ _1 P& z$ |( e' T/ O/ Acreate table emp_count(did, emp_num)- Z+ o  W8 p, R# |2 @
as
+ A! ~/ ~& R0 O" Dselect deptno, count(*)
8 p/ M6 v4 b" k) ?7 {from emp_ning1 I% N" Z. a# h( ]" z0 g9 T; V
group by deptno;
! R: v! I9 J" f, y: G4 G" ~  D1 ?' X
; _9 t9 I1 @, G" j; |8 g--创建一个空表/ x+ x% z0 a4 l/ L; S/ [2 `" _2 V8 t
create table emp_bak13 O5 W% q  R) _7 o* H- q, m# ~" @. p
as- Z2 e) g7 p' t* W8 a
select * from emp_ning* I2 \8 G; e7 m& n7 t' P
where 1 = 0;" o8 }; X+ ]+ S: R

7 K, N( V! N" _; y# n; M( c9 u--向表中插入多条记录+ D  b3 d3 w9 n9 U! a" ~' B! u- ^
insert into emp_bak15 C3 @6 I9 _4 {4 R. ~
(select * from emp_ning
0 u9 b# A9 @7 Y# s% e& u where deptno = 10);
9 f' `; }  \5 h5 w" t. B4 @& b4 Q; Y; {3 r' |" m
--把表中的数据换为部门20和30的员工记录% w5 b& P" m. B6 Z! O
delete [from] 表名; --删除全表的数据。
. v+ E0 b4 N. W8 Ndelete from emp_bak1;( @, k; f+ g1 _, O
. V& n( e! k$ y1 p  H  T0 g" l
insert into emp_bak10 F) D# M& [6 h+ ]& m& U* v
(select * from emp_ning3 A# ]$ }9 N+ ?/ @, i% w' \+ ?! h$ h
where deptno in (20, 30));- ]7 L! Q7 ?. x
1 V* u& i7 n4 n! d' m
--向新表中插入指定记录数的数据,比如前8条。1 L' m# N$ i/ Y  V
delete from emp_bak1;/ q4 X( `5 i+ M- f8 o3 \
; o, Y; P2 d2 p/ |7 o
insert into emp_bak1
" g/ N8 Q! i/ E. x3 T/ X(select * from emp_ning
8 Y) X+ b5 }( d/ A+ Cwhere rownum <= 8);* D2 ?+ C- ~% ?0 Z7 W' G

7 J; G- W! a, \- |4 r- |* s小结insert:/ l: a* B* b4 q4 Y+ w
1)insert into 表名(列名,...) values(列值,...);8 _- a& m, Y/ P# _& q
一次只能新增一行。
: Z7 y6 I3 E/ p3 D6 C0 Q3 Y2)insert into 表名 (查询语句);
3 r. z; x! }# G! u1 s一次可以增加多行。
0 t1 ~) U+ `/ o+ h% p) o$ B5 W0 \- U/ b& u
2.update:更新数据" C1 o% P, C8 U" R
update 表名 set 列名 = 新的列值,  F& c, Y& A5 K2 o/ }! i4 Z' o6 I
                列名 = 新的列值
) y, x( Z: G8 w% w* S6 F. q- ~( j1 Bwhere 条件;
* m1 _+ t3 u; W/ Y
7 D/ l2 Y. ?2 Pupdate emp_ning set salary = 3500,
! E* {9 z: |4 w7 b. T/ x# k4 [                    job = 'Programmer'
; b- J  @$ o8 K8 D# S2 ?where empno = 1012;
6 i4 c- x# d( P6 A2 g
. {2 R. e) k7 [5 g" t--部门10的员工薪水+1000
) y: a9 z; |6 U  vupdate emp_ning set salary = salary + 1000
! M) |- C$ f- Rwhere deptno = 10;
5 i: f( K7 E& q' H3 P0 I
  O+ k8 I. }' w3 f; M6 z. |--更新数据表时,注意条件。2 g/ D' m) y$ p3 \
--如果不加条件,影响的是全部表记录。
# E+ {8 [% ]9 U3 ]( H  n8 w) \2 e6 W
3.delete: p. \6 Z% [( }) p/ s9 O$ ^
--注意条件。$ m2 H* t2 q) }: `+ k  b
--如果不加条件的删除,将删掉表中的全部记录
- k9 o/ x) U1 ]( a/ e# S: Z' F--rollback 回退,commit确认。- ]/ P. Y6 k$ I$ t% h! I
delete [from] 表名 where 条件;4 t3 G" a1 x* T  T# D; L

; x1 Z" I; \" R' P1 x* _9 U" Jdelete emp_bak1 where empno = 1002;; W: M8 W0 @7 Z
" j3 p+ \+ \$ V1 A5 G% A- W$ m
delete emp_bak1 where deptno = 10;
$ p$ K& k' {# w; z8 ]% O4 K' b
$ s6 c2 N' O4 K4 ~3 ~& Z0 cdelete emp_bak1;
5 n/ e( ?* O  ~: E5 J: M6 Z; D7 E+ y, D9 s
commit;/ ]- e! q! n) h; @
--执行了3遍
* H! o, z" ^( y* Zinsert into emp_bak1(empno, ename, salary)
" O$ v7 H$ ~! l' u, d5 J: ~values(1015,'amy',4000);
4 ]) ]$ w$ Q1 y: w- F6 g--执行了2遍
( ~) {2 S* v: C7 @4 Linsert into emp_bak1(empno, ename, salary)
# [2 b5 P. E; [- Svalues(1016,'rory',5000);
2 [2 Y' r2 \) P$ q! M6 P--执行了1遍。# N7 f, ]) L) W! z9 o- v! k) }/ |
insert into emp_bak1(empno, ename, salary)% O' e  l3 m, l/ A# H
values(1017,'river',6000);
# R$ W- d0 w* [" H: x--创建表emp_bak2,只存放不重复的记录
& x; I# g4 b. E1 D+ N- ]1 Acreate table emp_bak2
0 K( u3 `& h9 T" A8 p: Xas9 _4 \' k* x2 N( b
select distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr
+ T- g' r5 b) S- S: y6 s* D' Lfrom emp_bak1;
$ J; X1 n/ x$ S4 N% @--删除表emp_bak1
1 c' u- T6 @# w2 G, Qdrop table emp_bak1;
9 \4 x: J- @* @, r4 v8 [--把emp_bak2改名为emp_bak1
/ G+ Z& [/ m: lrename emp_bak2 to emp_bak1;
, N; g/ }$ A9 E5 m
8 a. Z) R8 q; r" o___________________________________________% M8 F7 x- Q  ?  k1 ^7 A5 T# Y

+ t; _: |; j! k8 M# p, B3 ^/ i' f6 b7 R5 x7 k& C& b) |. L
delete emp_bak1;
7 K  q$ F$ K; ]9 f7 M4 Z
" P7 Q. d/ ?/ r2 N8 G; linsert into emp_bak1(empno, ename, salary)
! F1 w' E3 _; V1 w8 Uvalues(1020, 'amy', 4000);+ J, Q2 a2 Y, E- I
insert into emp_bak1(empno, ename, salary)4 I" T/ R- [  g% s9 C4 B0 d& D
values(1021, 'roy', 5000);
/ p8 L6 ?) e* S+ q; G' z- _insert into emp_bak1(empno, ename, salary)" E! o: s; u5 ?1 k
values(1022, 'river', 6000);; s" [! T0 s% j7 g4 Y% q  A

" U4 j7 [  q; B6 H) X8 ^& S--rowid是Oracle数据库的伪列。
6 W; n8 e3 f7 O--rowid是Oracle数据库独有的。
3 K* Y* C' q2 x& u' d* [ delete from emp_bak1( c0 l& V# \" q' N* c) w: E" l
where rowid not in (. N. A7 y7 u& `* W4 U
   select max(rowid) from emp_bak1( ?% Q7 T( h5 K: F$ ]3 m, |8 k
   group by empno, ename, salary);, d7 G8 |: H$ L, m

. v& p1 f- k; K9 x二、事务:Transaction
# R; K+ o7 `2 j' _6 ?3 U' ]  zTCL:Transaction Control Language
9 I8 q0 O0 c0 L! n+ _commit / rollback / savepoint
" a: p' _. C5 _$ S7 F事务:一组DML操作的逻辑操作集合! s+ T, t  c7 V5 }# ?
          ***3 P& W  X3 V$ B" S) z3 B
1、事务的开始和终止5 q, y1 |8 `  B6 F" n
1)事务开始于上一个事务的终止或者第一条DML语句, W  F- Y, B. D4 W8 T' j
2)事务终止于commit/rollback显式操作。6 _: V/ b8 j" Z5 o! f1 _" c9 f% q3 W, N( D
  连接关闭:隐式终止2 w* v6 b6 o- y7 N: ^3 W  P2 _
  DDL操作,比如create:隐式提交。
- U/ o& O+ X" X) m9 w: x* U3 T3 E8 [( }$ P6 A
insert into ...values...
/ F. A. u# `$ |: k* Aupdate ..., e/ N. v) T) x+ j8 s& O
delete ...+ t5 ]4 E  H+ v) z6 O- S
insert into ....; J% C1 U3 [, i9 |' y  j# W8 t
--rollback;--回退到事务之初,数据的状态和事务* g- j2 E; S" \7 E9 b
开始之前完全一致。
  [: d' {( }8 i" _4 |6 `commit; --所有的数据改动提交。) M  X; n' j, H; N
4 Y1 u; n4 T9 I: s
2、事务中的数据状态3 y4 T, b7 D! ^+ s3 [5 N" g' g5 s- L
create table mytemp_ning(
/ s8 u1 g( F  S2 }2 h$ |" Pid number(4));
- e# \: U; W( J/ v( z  ?! k) [' T' Ninsert into mytemp_ning values(1);( R5 f* A, p8 e) `
insert into mytemp_ning values(2);! d# \% D9 @8 D, j7 _0 W- l
. x" S& c# R5 T- p; E5 F3 C
--事务内部的数据改变只有自己的会话能够看到
- c5 y3 x* ?- }. f--对事务改动的数据加锁,事务之外不允许操作。" R9 z" j- T2 |' s: c

* C" T$ s" ~# E( E如果提交:commit( o# b0 K* \' ~& O
数据的改变被确认。所有的会话都能看到这种改动。: U8 t$ O. L* l. y/ @3 Z
数据上的锁被释放。
8 V# r# }" Y6 y! d保存数据的临时空间被释放。
) j( x8 i$ E) m  @- Z8 {9 V/ t2 B
如果回滚:rollback
8 p# P4 O( N8 y- z" g数据的改变被取消。
9 j' b. p0 B/ ?4 x: y数据上的锁被释放。" [( R9 X! l, S* s0 I, V
临时空间被释放
% g4 |2 I# p2 E6 _+ s/ @create table mytemp_ning(id number(4));
" L' r6 @+ O% d6 b--事务起点' O+ M4 u6 a- T4 h) Z8 d' O! ?
insert into mytemp_ning values(3);9 M. h( {% h# N- |- ?; T+ v
savepoint A;4 ]8 C5 C. G! K) y& G$ P4 f% S
insert into mytemp_ning values(4);
1 k9 j4 o* y, r0 i: m5 zsavepoint B;
# h7 C/ _& I4 pinsert into mytemp_ning values(5);
( t1 |1 {6 _% Krollback to A; --回滚到保存点A,A之后的保存点全部被取消2 [& ]7 s" {6 ^2 d* s
select * from mytemp_ning; --3保存,4、5回退
4 e, _4 T3 Y9 I& U# c. A- t; X8 H5 ^2 K8 I
三、DDL
7 V* y; V% l) G* N  `create / drop / alter / truncate
0 ^" R* |! ^/ m2 J+ h9 U3 P
' k5 d# w; U: y, v; I4 K1 }数据库的脚本(script)文件main.sql:
; n7 U' {2 r$ U7 P------------begin--------------------& W* a5 {0 X7 r2 p* R4 b( V
--删除表emp, e( U% z9 H! ?8 a* Y
drop table emp;# G% ?$ m8 v! p8 L# P1 ?0 [
--创建表emp* Z9 ^6 t6 J4 I" g! N- T/ A+ s
create table emp(id number(4),% T7 B% y, {* N
name char(20));
' c5 r" p  d2 J" K2 Hinsert into emp values(1, 'amy');
0 ?, H5 a9 n! t9 X, w! Wcommit;4 p( N9 ?2 W( ]( C6 E
0 Z; d8 k6 u9 t0 n: O8 j/ z4 v
& V0 Z7 H: y5 x5 U$ u" I  [' ^

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


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

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

   

关闭

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

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