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

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

动态微博

查看: 1720|回复: 0

Oracle增删查改 day04

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:42:13 |只看该作者 |正序浏览
1.内连接) p, O( d. c+ \; Q- e7 i

% m# B6 a1 i. \  @; M( Pt1 join t2 on 条件& L$ g3 P, o1 `6 k- b! b! l0 k

$ J! d& h4 w; D0 r& W0 G0 {1.1.等值连接:如果on后面的条件是等于。
! g, y. J+ o7 M8 ]+ n! _; xt1 join t2 on t1.deptno = t2.deptno* T+ u8 e! R+ {6 Z1 }! ^5 L* Z
1.1.1.等值连接的一种形式:自连接# K, P8 k$ L9 U; S& N+ C7 k& W/ t) F
t1 join t2 on t1.mgr = t2.empno1 T7 t$ f  j: J% o

) {* K' [" _, B9 n; t% O  O1.2.非等值连接:on后面的条件不是等值操作: T- I' _+ Z7 L5 P( l" J
empno ename salary         grade lowsal hisal5 C0 y/ A6 o, b$ {+ ?1 a
------------------         -------------------
3 D+ L+ R6 m4 e& a1001 zhangwj 10000          1    10001  99999* O& O: z5 P. P6 e
1002 liucs   8000           2    8001   10000  
5 k/ c! W' ]% @; S9 l3 M1003 liyi    9000           3    6001   8000% K# z, `  P. W1 W6 j6 @
1004 guofr   5000           4    4001   6000
  R8 q( T6 n1 M  I- ^                            5    1      4000
6 Z6 s2 K* W5 D% [8 o& I--步骤:1.建表;2.插入数据(commit);3.查询
' B; t$ R/ M) P9 |3 Ncreate table salgrade_ning(
0 L" T( M) j8 U* pgrade number(2),
0 ?5 I" V0 }' z6 C; ?) H& Plowsal number(7,2),
; C* t3 r6 A/ M8 chisal number(7,2)
9 p8 ~  D! H+ s);. {% d5 [/ Y2 f! T$ H' H  j
insert into salgrade_ning values(1,10001,99999);* }1 P/ {$ e. f9 Q
insert into salgrade_ning values(2,8001,10000);
; n0 K3 Z, y( {+ `4 zinsert into salgrade_ning values(3,6001,8000);
0 P7 A! j" y2 v( E8 V2 O5 d8 kinsert into salgrade_ning values(4,4001,6000);
8 J, U0 _5 P" sinsert into salgrade_ning values(5,1,4000);
) z+ c7 j* |! w. ~& pcommit;
% f  }  X0 ^( q--计算员工的薪水等级:
, g; y$ W- K' u/ pselect e.empno, e.ename, e.salary, s.grade
; v" _6 p$ x* y* s  u# x# ~. _" ~from emp_ning e join salgrade_ning s
9 J" P4 i: W3 O6 `! `( Q! Ton e.salary between s.lowsal and s.hisal;: u8 M. |. r; q$ z9 H
--最终查询结果的形式:
1 J6 \/ Z0 w# r* d  t) e1001  zhangwuj 10000 2
7 [7 e( M0 T" m, V4 \* B1002  liucs    8000  3  : B6 X* j, k3 z, m
6 e2 `7 H8 S* e' q
2.外连接
2 D( |2 m2 V1 u  H  y0 ^+ n( Z& Yt1 left | right | full outer join t2 on 条件
6 Z$ j& t2 ~8 F: x. j0 W1 p4 q' |  U3 A4 f0 X
SQL语句的种类:6 \7 n0 b. i$ c$ [( _
DQL:select# `3 j% T/ G) o+ S* ^
DDL:create / drop / alter / truncate! v' t# _) R( G/ K, y& @) R# v- ?
DML:insert / update / delete
/ h5 ?: l8 E9 k  B* t( P# Z4 K* zTCL:commit / rollback / savepoint/ v# @5 Q- l- h: [
DCL:grant / revoke$ n! \9 j/ T0 m) ^
$ H8 D6 k0 e1 P6 |
一、DML操作
: u* R' V5 F3 @3 G1.insert into...values...5 g9 ]( ]% k3 [! F& f
--1.1.不写列名* Y/ @" V" a8 M4 o, W
--必须提供全部的列数据,数据的顺序必须按照表结构1 t2 E0 ?  C5 C+ }0 L( k
--如果有数据没提供,用null表示
! P( u; z1 |1 d/ j. rinsert into dept_ning! V+ u" q' z0 A3 M( ~. i" V
values(66, 'market', null);
7 A+ d% C* f& x8 _1 g2 ~# {( u4 ~. A
insert into emp_ning6 m0 E! ?' q- S5 [+ r! J* N2 q2 l
values(1020,'rory','Programmer',6000,null,null,$ i% P+ y) K) ^5 n7 L" k" \
sysdate,10);4 ]4 \0 C! J( S. K# T; q$ T
5 l  h* R8 u0 D, M
--1.2.写列名
& e8 z$ P9 N  Einsert into emp_ning(empno, salary, ename, hiredate)4 B/ ~4 M* o0 P* s7 E7 [9 a
values(1020, 6000, 'rory',  
% i3 \4 l9 l( |5 |+ v5 Eto_date('2011/10/10','yyyy/mm/dd'));
* X7 S; \, E9 c* B
  E0 a) M+ F6 L! f--to_date函数是oracle独有的。3 c5 Y. k" r# c- }
--在oracle数据库中插入日期数据,一定要用to_date
9 p3 L" Q2 T: ?+ _处理,不要采用默认格式,比如:'10-OCT-11'。/ \) D. t: \; X- I5 E- M
- ~( \0 p9 i2 ]4 g" ]% c& v
--建议采用:写列名的方式。即使是插入全部数据,也2 `7 Y: l5 u9 m. }
建议把列名写全。& y: H* H0 s! [; v! W7 A3 R3 `
--复制全表- p: b& r5 T' n8 t2 y
create table 表名6 p% q# y  E9 r
as
9 y! |2 y6 X& U# f查询语句;
; l4 g$ @- N1 C/ g
- j& |$ y$ k9 M7 P( V6 j7 c--只复制结构,不复制数据/ X! R1 K' p/ n4 V) X) z6 L
create table salgrade_ning12 v3 w7 F3 \- I/ N/ b# }& |
as
4 A! R9 F: W- ~$ ~2 j: jselect * from salgrade_ning
% F# O7 V0 @, U9 [2 e! Ywhere 1 <> 1;
$ b; c, h. E, I, ^+ _  W( N5 J1 i  u
--复制一部分数据:给查询语句加条件。& B+ Q$ U: ~( e( O# j0 W
--如果查询语句中有表达式或者函数(包括单行函数和6 O* u  e  q9 B
组函数),必须指定新表中的列名
( G+ V, y4 u6 n, `4 Q& V6 _! w--指定方式:给列设置别名;或者在新表后指定。
5 o2 ?; S/ K2 C, |4 s: |create table emp_ning1
7 D) y% ~) J$ Q% W+ B0 s2 T0 _as
$ ~" u3 W% J! }3 bselect empno, ename, salary*12 year_sal
2 P; y4 e5 O4 W from emp_ning
- k3 R9 w; n4 c. Cwhere deptno = 10;
6 q: ^7 _6 J6 l) |+ w* w$ x( w& D
create table emp_count(did, emp_num)
# u2 c6 n3 M+ t/ Zas2 k3 m; A+ T6 W5 L7 P3 m) |
select deptno, count(*)
- b8 Y  W& P0 Y' U) tfrom emp_ning
* \3 U6 o' I! ?  @& e$ Vgroup by deptno;
) {5 y* R$ o" J2 j' |& Z- Y9 _+ c8 I1 D/ c+ {
--创建一个空表
( S: m, Q( `. E% g6 t; @1 h( ~create table emp_bak10 u5 n+ v" g/ L* w9 M0 h
as, f, G; L! z7 Y. E/ I
select * from emp_ning
$ F1 o2 H2 Z6 v" ~where 1 = 0;! X: s% h- \0 k' h8 f8 K: E% C3 S$ S1 V
3 q  B1 m& m1 ]0 F& h" y
--向表中插入多条记录
6 B& s! |! [- r: I+ S& Minsert into emp_bak1& W1 a6 C  c: d+ \6 K: @- \" _
(select * from emp_ning
1 F; g3 p/ w! m  z) [ where deptno = 10);
4 ~0 ~) P' T# j# |1 o. o; s) u: p7 K- Y1 y+ W1 t
--把表中的数据换为部门20和30的员工记录1 `3 U) g+ a: Y) W
delete [from] 表名; --删除全表的数据。
6 A* B8 J7 |9 j: G" c- R2 q' ^+ [delete from emp_bak1;5 m1 Q6 `6 m+ q4 Y
' S8 E" @7 Z5 U1 f
insert into emp_bak1
- c: K2 L( F( G9 @2 d(select * from emp_ning
. j1 K& Q9 |8 _, Rwhere deptno in (20, 30));
  E3 o0 {5 i8 M- h
6 p/ @3 A  y8 l. G4 R6 k1 Z0 h5 A--向新表中插入指定记录数的数据,比如前8条。
& y' p+ M& `! u: w6 z# Zdelete from emp_bak1;- S1 w# A; k2 _8 D
/ e& u( V/ h8 L. o
insert into emp_bak1
% F8 `# I" {+ z& l(select * from emp_ning
, A4 p% h/ a2 `6 [" A& pwhere rownum <= 8);
5 p/ u6 X+ A: \+ P5 E, a' I
2 R7 u1 A3 Y5 z4 ]2 {小结insert:9 W5 G$ t# b$ w! E: A
1)insert into 表名(列名,...) values(列值,...);
; j1 _7 s1 L' d4 s7 E一次只能新增一行。; N8 U  Z, a6 n; V: ?( A
2)insert into 表名 (查询语句);. ]8 U9 K; F1 r1 x
一次可以增加多行。
. ?- e; J( {# d" l
( r6 p2 H! G7 ?" {2.update:更新数据% j# X8 Y1 n6 S$ f/ O
update 表名 set 列名 = 新的列值,9 ]0 d! u/ t$ D7 p, |" o7 W
                列名 = 新的列值* e! X; d$ p' |, N" k- n- P
where 条件;+ r4 [: a$ l% u5 Q

; l, C3 a  L* k" w) l, qupdate emp_ning set salary = 3500,
3 w0 N, H/ b, d                    job = 'Programmer'. ~) h/ o7 t3 n( |% p: S  m6 n7 f/ D! w
where empno = 1012;
% ~6 Y6 x; u% [  y# x! B; K/ w
8 t. \# t1 h5 X' u, R. A! X& l! H--部门10的员工薪水+10004 ]9 L& \: n4 y9 m
update emp_ning set salary = salary + 10000 r) ?# R6 t$ Y  S' p9 p! i
where deptno = 10;
! d' A* O; I3 L' w- D- U+ f% F4 [4 D" c, n% i5 i
--更新数据表时,注意条件。% F+ {$ Y: O, q# e8 C
--如果不加条件,影响的是全部表记录。
7 K. w, f& r1 D/ o5 `8 X/ v* K. }" r3 s
3.delete6 N  t! o0 {% |, S" m6 t
--注意条件。5 z4 u1 X1 l* R) Y4 Z4 c
--如果不加条件的删除,将删掉表中的全部记录& N  Q" a" o& G$ L- b. G% s' i
--rollback 回退,commit确认。
, W6 ~9 T% X9 I" T/ G! h; b- h& Mdelete [from] 表名 where 条件;
  F. G$ R) w' d+ C+ e* h& I7 A# U8 ]3 ?2 g
delete emp_bak1 where empno = 1002;0 A# p/ k& v) Q9 N% O) r

7 j. e: k4 `, }; u3 ydelete emp_bak1 where deptno = 10;
; Q1 I7 G( A/ g* u  {! M+ s1 F) t% C: y; |( `3 @( b
delete emp_bak1;
4 b, Q  x# v5 {' w1 N
. E6 `" r8 x( I0 M& Ncommit;* E) V% C4 y  }0 h: u' g
--执行了3遍
3 Z% P! j  ?6 I& f0 h1 d* h8 dinsert into emp_bak1(empno, ename, salary)2 x* H, P1 g4 k, C3 M$ ^5 _
values(1015,'amy',4000);  t$ ?* \2 r! d% {
--执行了2遍
& s* a2 D0 J. u7 Iinsert into emp_bak1(empno, ename, salary)
1 ?. f& D5 t# m. M+ n1 ^4 Z. ^: Yvalues(1016,'rory',5000);! `+ i7 _1 l7 i- p
--执行了1遍。# B6 v1 F/ E% P$ S6 H5 c
insert into emp_bak1(empno, ename, salary)7 k, ?& g1 f$ B7 O2 i5 O
values(1017,'river',6000);
5 ~4 [' E: a" f& z2 T7 R--创建表emp_bak2,只存放不重复的记录
) h# l4 T7 S! C# ?: a# c* kcreate table emp_bak2
2 d/ a) p' q; B, D/ ~) Kas
3 A6 ]7 `& @! W: o! r( [select distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr) b* W: C" O3 ^1 K8 g# `' a
from emp_bak1;4 m2 _$ L* g1 Q: Z/ e
--删除表emp_bak14 I3 x9 s1 q# r8 g3 t/ B0 o* E; `
drop table emp_bak1;2 Z9 t: A. B' q/ |- V2 D7 N
--把emp_bak2改名为emp_bak1
8 k9 K; w3 R$ s  }! G% Wrename emp_bak2 to emp_bak1;2 h6 c/ R$ @% n4 p; ^
9 e1 f9 M; J8 t! @: h! M
___________________________________________6 k' v( z& {3 F; y- J

& V* t# X' l6 y  O4 D: S) P+ p* i+ R/ L' d, z
delete emp_bak1;7 q! n# y& ~6 {9 |% x

4 r& R) z% G3 ninsert into emp_bak1(empno, ename, salary)$ q: {% ~; [9 [( @; U9 G( }- E6 L
values(1020, 'amy', 4000);
  C# G8 H2 V' H* [9 i7 q, cinsert into emp_bak1(empno, ename, salary)
, r' A8 c: p: X  C% |. kvalues(1021, 'roy', 5000);7 S' I) u. E: u$ O, M5 A
insert into emp_bak1(empno, ename, salary)# w6 k' y2 s& T# V, g8 w+ V
values(1022, 'river', 6000);
* X  x0 t0 t3 U" @6 y8 X3 h% ~+ H' V! X: O3 l2 o& ?- A. D
--rowid是Oracle数据库的伪列。
- N+ R! _2 P2 g& K" ], a--rowid是Oracle数据库独有的。- a/ U$ {4 a! I8 J  M
delete from emp_bak1
+ ?$ C, @& x1 \; }0 o( g1 [1 Y where rowid not in (
! U+ M- L1 O% l   select max(rowid) from emp_bak1
; u! C- }" j! }: [6 [   group by empno, ename, salary);
: a, b; u4 w& o, @# j, X! E& y6 x& _9 j& P8 s) B  ^/ R; K- G
二、事务:Transaction; f' z2 I  w1 j: Y9 d5 r5 m: V3 w
TCL:Transaction Control Language0 i' I+ g& o2 A! p  w: k
commit / rollback / savepoint
& U, v' K% G) ]  _, ~事务:一组DML操作的逻辑操作集合% \* X, f# p+ w9 t1 n
          ***
2 Q4 c: b) {  [/ }9 _0 V5 O! u& y1、事务的开始和终止' ]7 j4 h1 p& n8 Q: P  E" r
1)事务开始于上一个事务的终止或者第一条DML语句) I' t/ F3 P+ p( J% V1 R8 K
2)事务终止于commit/rollback显式操作。
9 K/ N8 c" @0 R8 ?$ L* K  连接关闭:隐式终止
! h) f: K1 F' m+ o; L7 u& G  DDL操作,比如create:隐式提交。5 T& k$ O: l6 C) X

& r0 S+ ], o8 P* w! u3 qinsert into ...values...* y3 ~, o% Q3 g( I( m* K5 }- K
update ...- ]8 R' k8 |7 x6 i5 G8 a0 L+ K
delete ...# ]( O- b: p$ F) R
insert into ..... f; n5 Z! K- O3 a. a0 `
--rollback;--回退到事务之初,数据的状态和事务
* m$ D0 Z% L* W开始之前完全一致。6 h7 s3 a0 d- K: J" J
commit; --所有的数据改动提交。4 ?3 M4 T$ X: D' e3 f. c

( s; ]: }- e9 o6 S4 D/ B0 P; X  R$ R2、事务中的数据状态
* p2 X( `2 E; }0 V' H# ?8 }create table mytemp_ning(
0 p% P6 ^- H8 m( H2 {& R3 Hid number(4));
7 r! D- [. R) Sinsert into mytemp_ning values(1);: Q$ P/ F! V) Z5 Y$ [* G2 D- o
insert into mytemp_ning values(2);
' ]* h2 p' M- b2 i) d0 J9 U& X* {" \8 a) R- I# F$ h
--事务内部的数据改变只有自己的会话能够看到
0 W: f  L. w3 D: o9 [5 a3 r  A5 K; h% W--对事务改动的数据加锁,事务之外不允许操作。# n. ?* ?: P( w7 {* L
) Y5 |# H9 M* T) ?/ U5 T& |, H! b
如果提交:commit
5 o0 ]+ H7 Z* r数据的改变被确认。所有的会话都能看到这种改动。5 s. |2 L) [- i& `  P* t
数据上的锁被释放。
; f5 y& D+ ?( `- a保存数据的临时空间被释放。
( U5 ^" X/ t9 Q! N( Q( K
. Y  m& e* x6 f4 u( o. r如果回滚:rollback
/ @8 l/ j) F( e5 O/ W7 u3 c数据的改变被取消。
" N" H# b; i0 p) Q) E数据上的锁被释放。
: D4 j/ w/ A* a) x临时空间被释放4 ]/ R9 S: a: S/ c* g- {% R5 X: ?/ L
create table mytemp_ning(id number(4));$ d. A8 L) J+ t% Y5 q& i8 l
--事务起点; e8 \6 C3 r( Z/ e3 z5 K* t3 |; b
insert into mytemp_ning values(3);
5 P4 C. L3 y$ }6 V) m! }, G. u8 ssavepoint A;  b9 G5 E3 C* ]* ^; p& v- f
insert into mytemp_ning values(4);
( Z9 H+ T! H$ [, a. Dsavepoint B;: T) R3 [. W) d9 l
insert into mytemp_ning values(5);
4 P% P" ]9 W/ Y& m$ grollback to A; --回滚到保存点A,A之后的保存点全部被取消
5 t1 [, Q! e0 |9 E1 _7 _% zselect * from mytemp_ning; --3保存,4、5回退8 ~# }2 p5 C- {  A: g+ h9 z# i( I1 @( ?

$ k2 j& A5 Y8 |1 M1 m0 Z6 B5 @* ]三、DDL/ G9 V" W7 I) I
create / drop / alter / truncate0 ]. x0 L, ]/ ~# K9 N0 H+ n

8 N+ F* Q* ^, n9 f" S; N+ L数据库的脚本(script)文件main.sql:
- R% d* E" V1 A% a3 U& z------------begin--------------------
( H5 @5 N/ o, b0 I0 W) e--删除表emp6 ?, ]( \2 e( Y
drop table emp;4 |+ p3 X8 r2 w6 V* u5 k* {. q# q
--创建表emp
$ R; U; R! V4 c& Y& Hcreate table emp(id number(4),
! |5 E8 u7 p$ p4 Z* t, Oname char(20));
' Y" l* o) R3 g: C+ Rinsert into emp values(1, 'amy');
2 y1 Z- D% u, ~, D$ lcommit;
1 ?* ?" L0 b$ |6 {; I5 ^4 Y5 R5 k0 T5 ~# e9 a: t: k& s

0 h* F" @4 [$ ?+ E

科帮网-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群 科帮网手机客户端
快速回复 返回顶部 返回列表