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

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

动态微博

查看: 1721|回复: 0

Oracle增删查改 day04

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:42:13 |只看该作者 |倒序浏览
1.内连接
4 ^8 u/ m) I+ k& X5 f# d( ^' l9 ]+ Z1 H' D& K
t1 join t2 on 条件
  e1 d7 o2 }0 x/ r* f: [
4 r% }' O* }9 p2 T' y* t8 D0 h  i1.1.等值连接:如果on后面的条件是等于。5 T/ M; z; {+ m. I/ }9 r+ q
t1 join t2 on t1.deptno = t2.deptno
$ h+ ^( O5 J9 m0 A& Z1.1.1.等值连接的一种形式:自连接
7 I6 N/ U- T( O; lt1 join t2 on t1.mgr = t2.empno; f$ T* ~7 g1 }% X) y
: d/ j6 e; A- T" P7 E0 t. ?7 h
1.2.非等值连接:on后面的条件不是等值操作2 q$ E- T- U8 [1 j; U9 T
empno ename salary         grade lowsal hisal7 P1 f! D! c0 V; _  V' Y2 l5 @5 }
------------------         -------------------
# z! ?5 r) c3 Y0 b9 i6 ~1001 zhangwj 10000          1    10001  99999$ J. i- O- I, D( {) U
1002 liucs   8000           2    8001   10000  
1 _; ]6 m( ]3 p* o: s1003 liyi    9000           3    6001   80006 m2 E! P& e+ ]3 i4 W* Z$ x! H& p
1004 guofr   5000           4    4001   6000% J! `) u% I0 F' V$ \6 W2 Q
                            5    1      4000
& e# W! o4 M5 K; a5 I6 P--步骤:1.建表;2.插入数据(commit);3.查询( n% Y, o( }- J' ?- U2 Z
create table salgrade_ning(
( F7 J2 v  F" c, D/ }& Bgrade number(2),9 _9 o' D( i7 N7 i4 w4 C
lowsal number(7,2),# C$ `. k9 _; I3 O0 L3 {
hisal number(7,2)
. X6 `, K/ f, O. i1 y9 X4 F" U- J);8 F! u, H) p' ~/ Q
insert into salgrade_ning values(1,10001,99999);
* }5 ^0 P) p7 H( f, @insert into salgrade_ning values(2,8001,10000);
/ O$ o, E+ b& L0 ]4 w$ Ninsert into salgrade_ning values(3,6001,8000);$ i9 |; o1 q6 D7 P5 s. @. P9 i
insert into salgrade_ning values(4,4001,6000);
- E8 f5 @0 n) |6 @( s4 T( Rinsert into salgrade_ning values(5,1,4000);) J4 N7 _6 t4 H; Q
commit;
! {( O, Y- P9 ^% o--计算员工的薪水等级:* g: i+ q; q  O1 s) a  N
select e.empno, e.ename, e.salary, s.grade
7 A5 H% u5 D- ^6 P) |4 l+ H( Rfrom emp_ning e join salgrade_ning s- T$ G% E( R0 S4 X' a
on e.salary between s.lowsal and s.hisal;
! q! h5 h. Y# z2 e$ J' V" U--最终查询结果的形式:- F* h0 u# G% c) Z2 n' C7 a$ Y
1001  zhangwuj 10000 2. P- N  R2 C3 Q2 t7 R  y
1002  liucs    8000  3  
, U- b% w( Z5 l5 o5 w$ }
- D  D9 m0 R9 S: H/ v% }; L2.外连接; J2 ?9 l! G1 a+ r* I4 m
t1 left | right | full outer join t2 on 条件
8 B: n6 M; w: I6 a; O
% v. J. ?6 j' r; @% K2 K$ aSQL语句的种类:+ n! F6 U$ b& R9 q- K
DQL:select
6 @) e) q- E9 cDDL:create / drop / alter / truncate$ r  X6 Y) N6 {6 g8 l& x' b
DML:insert / update / delete
" K6 t! R3 k: ]8 |# g# `TCL:commit / rollback / savepoint+ E5 _5 D% [9 [1 a. {
DCL:grant / revoke# E) e3 Q* R, L) u$ a+ c$ u/ b
1 l/ K' \- O& M7 U1 b
一、DML操作; _' T& V  e6 H  ]
1.insert into...values...
/ z" ]: ^7 T, f--1.1.不写列名7 V8 v; I: n4 B. @5 ?
--必须提供全部的列数据,数据的顺序必须按照表结构7 c; l4 _( r! z* n7 k6 T
--如果有数据没提供,用null表示
8 P# v: A  Z# D$ a2 Finsert into dept_ning1 F. R" |* z7 X$ ^2 W/ K9 H+ p
values(66, 'market', null);
2 N5 l3 n) b; v0 c$ N/ |; w5 y9 ~
insert into emp_ning  z$ V# J, a' [+ n4 _5 s% \
values(1020,'rory','Programmer',6000,null,null,
2 j4 N4 u0 ~$ u8 r; e* J( N* asysdate,10);
5 @$ W7 |/ U$ m' h& U, \8 u9 {- C3 {& M- c9 s$ r' w9 A, H
--1.2.写列名4 z2 e6 Z2 ]; i+ Y+ r# \
insert into emp_ning(empno, salary, ename, hiredate), ?9 Y; o. f! \4 I! C
values(1020, 6000, 'rory',  6 E' x+ }: b: O
to_date('2011/10/10','yyyy/mm/dd'));; g4 R8 G( M: I

! B7 C- k  D8 x0 |( }  Z--to_date函数是oracle独有的。
4 M0 l4 ~+ J# r* ]. g+ J--在oracle数据库中插入日期数据,一定要用to_date
% D) o6 T+ p, }. ?1 i  x2 Y% n3 ]处理,不要采用默认格式,比如:'10-OCT-11'。0 P) B+ C4 ]1 Z6 A; w3 j8 ?3 c8 ?, p

1 t. F4 |+ g4 H--建议采用:写列名的方式。即使是插入全部数据,也6 O; k; Z1 r2 @* }
建议把列名写全。
! g/ H$ F( W% L6 P--复制全表4 u, n/ c  V2 |# N
create table 表名
, L  Z) T! b. {6 ~3 p, Y1 bas1 H5 S% q4 `, T, }
查询语句;$ c) K" Z2 K6 F: d" r1 r# ]. s( ]3 ^
7 g4 H1 m1 e6 {7 ^4 S. @
--只复制结构,不复制数据
* H: ^  K! t% j2 N! Ucreate table salgrade_ning1
8 o# G# i- A; i' l7 ?as
6 E/ h# s7 H' f- {9 o* @select * from salgrade_ning& r" T; m: d9 K. g* k. q1 A
where 1 <> 1;
7 B0 B$ ^- j3 S) R/ o5 H$ A/ w' J* h" }! J* P& h
--复制一部分数据:给查询语句加条件。5 L) b; b4 \/ P. _* f
--如果查询语句中有表达式或者函数(包括单行函数和
* w, r' F; v- e4 G& ^组函数),必须指定新表中的列名
" F" l& w: c, R# Y--指定方式:给列设置别名;或者在新表后指定。, Z# @! j) C2 [3 i: E1 o1 e
create table emp_ning17 h6 g8 W1 r: V: H7 V
as
* `+ e2 o+ D: {" l" r- lselect empno, ename, salary*12 year_sal
2 U5 l( v! w: H% l from emp_ning
7 J/ _& s) |+ i0 F, H' Q" lwhere deptno = 10;
2 D7 z( L8 O" y' K% z+ l0 J; w8 s( w/ P/ @" u6 {
create table emp_count(did, emp_num)
$ X3 X, p: W/ E! Zas/ X# s, \' h5 }' i! H7 y
select deptno, count(*) ( D- Y3 {! Z" P# m
from emp_ning
4 @7 J  s' j) N; G' P6 Rgroup by deptno;+ e/ B& m2 ^$ o
* I  J# f- C; y; _. X8 s
--创建一个空表0 }" K" p# y" K# K
create table emp_bak1
, Q  R# m9 X7 L3 b+ ?as& f2 z: Y. D0 `+ z" i
select * from emp_ning$ U7 f) d- C- D, s: e( q( u& ^
where 1 = 0;
: k6 b. @, \8 U! D( t6 O
$ b# d3 [" p8 U5 z+ z2 E--向表中插入多条记录
9 ~2 m0 ~1 p% P2 Oinsert into emp_bak1) Z! r7 _5 ]  G- x% [$ \. z; m) ]7 Z
(select * from emp_ning
0 ]0 I2 ^% X+ w- j8 H where deptno = 10);
1 ?+ N) k5 R9 F7 F3 k4 y* `( d. o7 \, J! Z5 Y' J+ i
--把表中的数据换为部门20和30的员工记录! V: O: j6 [; x
delete [from] 表名; --删除全表的数据。
$ |3 B/ X  H) K7 ~3 pdelete from emp_bak1;) w3 S8 k5 C' q% y0 B8 L
0 F2 Z8 A+ D% k  s4 v- }% u
insert into emp_bak1
0 H5 c1 I0 I+ i7 I- i) f7 V5 [(select * from emp_ning
' b0 T4 X8 z# L( d* r% Bwhere deptno in (20, 30));
$ _: u+ Z7 `) T! c' |5 P" I0 Q6 T5 }1 X
--向新表中插入指定记录数的数据,比如前8条。
- F* K# N, ?& u3 o  ^1 Wdelete from emp_bak1;
1 M7 u" Z, N2 s& l! N: G
. O2 o2 I% |" u+ {6 I2 L: m# Cinsert into emp_bak10 K( _1 @/ M7 Q; u; i
(select * from emp_ning
+ A! y# M- Z8 [+ \- mwhere rownum <= 8);2 i+ y9 d3 X* y5 B" ^2 d
1 }, O' L# {! u$ ]7 n. t
小结insert:
4 k: d/ Y. I5 I6 V# N1)insert into 表名(列名,...) values(列值,...);2 `0 X2 h6 G5 ^/ h  @4 L
一次只能新增一行。
( e7 f+ O) @1 Y8 h! q2)insert into 表名 (查询语句);  Z5 L1 }7 m/ Q3 K  ]" S/ ^! h
一次可以增加多行。
5 V/ v1 I& w4 U$ A% o) @9 V- _+ ?$ A! u, m2 J  j& l7 U* g/ g
2.update:更新数据' e1 a, u8 g* [- g
update 表名 set 列名 = 新的列值,
3 F8 ~) c1 O; C5 Y1 W3 I                列名 = 新的列值8 U" E/ U9 Y) ~7 O& b- l
where 条件;
) i$ F9 M2 B" M) u( O$ U2 n
: p8 @% y" j1 o" S2 g/ oupdate emp_ning set salary = 3500, * f$ T1 a1 j" _5 v9 [4 n
                    job = 'Programmer'
% d5 t1 n, `% _* zwhere empno = 1012;; ^9 |4 ]0 l9 s& {2 }5 k7 \0 f1 Y

3 Q' _& t9 ?1 B) t--部门10的员工薪水+1000
" ]5 T8 ]4 g# Q  S. w% c$ lupdate emp_ning set salary = salary + 1000  q6 [: D  S6 h, S2 B4 k5 Q
where deptno = 10;9 R( M3 l4 }* B" G

! |; j( y2 v& b$ R9 E. i--更新数据表时,注意条件。
  r0 m: I- L, Z  k! v5 p--如果不加条件,影响的是全部表记录。$ S2 A$ h" c" U7 E6 X6 d
6 A+ T- z- x& m4 |9 e/ v8 ?
3.delete" f9 G5 a0 ?! [/ L1 n0 b
--注意条件。
0 z6 B9 u/ B5 V) B5 |$ y--如果不加条件的删除,将删掉表中的全部记录
# B5 y9 I' y4 U& W# r7 E  d' N2 s- N8 V; M--rollback 回退,commit确认。9 |' y; t. u) y% }
delete [from] 表名 where 条件;
' v' C& T0 F- X: a; }8 ^5 s2 O% }5 C2 o
delete emp_bak1 where empno = 1002;
6 ]: O1 a, y; W5 s+ ?: V& {! L3 d6 L8 A5 Z
+ t! |. c3 S  n- m$ K+ f, Bdelete emp_bak1 where deptno = 10;, G( L# j/ h9 N3 M# C/ x# O1 s5 a
+ y& u" ^6 x2 ~  Y" _/ c
delete emp_bak1;2 l% @; E, a& Z) v8 t5 [3 M8 P, ?
! s9 y+ S: B  l+ @
commit;
" Z+ e6 T& P6 a% k! y( Q; f1 m, I! @--执行了3遍
! h  u( M, H+ v! O+ O! \insert into emp_bak1(empno, ename, salary)' x3 c. Q1 R0 G8 k7 l& a
values(1015,'amy',4000);
3 k+ \# a6 b+ ?2 x! \6 G--执行了2遍
* y  m1 X1 M" C; g6 ?$ F* linsert into emp_bak1(empno, ename, salary)9 N3 I2 U) m5 \3 O( p
values(1016,'rory',5000);; O  E2 X2 S# f& [' ~
--执行了1遍。1 e$ c8 `; o) w' S( w7 J
insert into emp_bak1(empno, ename, salary)
0 d- K6 k0 @& x/ Q  x5 O9 a: bvalues(1017,'river',6000);: _) `- z" p* }3 x" b2 _2 [( G' u
--创建表emp_bak2,只存放不重复的记录
) P; h  t0 ^* P5 K) Bcreate table emp_bak2
; Y  s. ]% G! d3 w$ k; tas
. c' `" r3 r) F- zselect distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr" M# i+ B1 `4 i5 y
from emp_bak1;4 e6 J$ i; W- k) d% `
--删除表emp_bak1& w2 H# o; ^" @
drop table emp_bak1;, G, k$ i5 u; i& f% O4 @5 F( R  Y
--把emp_bak2改名为emp_bak1
* I; z; ?; C3 \4 urename emp_bak2 to emp_bak1;
$ ?, C# m1 x5 a" N; [0 J5 h5 Y) K4 s% ^" b7 H! ^/ p
___________________________________________
9 p/ |+ q% j" v" L0 _' y0 X9 q, a0 w" g7 a2 l& J

+ h3 }4 E9 w* ydelete emp_bak1;
6 Q& w. p8 n, F6 c  L  ]: Q1 ]# Z( d
insert into emp_bak1(empno, ename, salary)% d- z7 C2 C- `1 O4 [1 @6 C9 j
values(1020, 'amy', 4000);  F' s: N/ _- s0 R* u. H. p
insert into emp_bak1(empno, ename, salary)& h% X& `& M# R0 s
values(1021, 'roy', 5000);/ {+ a- A' ]7 r, n4 a% {
insert into emp_bak1(empno, ename, salary)
9 E# N: z5 c" t: L: Xvalues(1022, 'river', 6000);0 U: t4 j7 A3 o  ^
  j1 z9 |% D/ J
--rowid是Oracle数据库的伪列。2 c* E; F6 S8 ?% I3 W. w+ N- a
--rowid是Oracle数据库独有的。0 ~. \4 k1 s. t+ ]/ j3 c: Y5 ^
delete from emp_bak1
: A  f6 w/ r* ]+ k- b7 T where rowid not in (
& U4 M2 q" R8 P" s% S4 u9 G   select max(rowid) from emp_bak1
; H% f$ m6 b# ]% q) u   group by empno, ename, salary);
2 {' _; g  N  f1 z
7 G; z8 P' b# c5 J3 b0 {$ h( |7 J( B二、事务:Transaction
5 s3 i4 N: T! |& Y( `7 D# {TCL:Transaction Control Language
) _9 x4 M+ U1 y6 Tcommit / rollback / savepoint
+ `$ _8 P. i* G6 H% Q$ a$ p事务:一组DML操作的逻辑操作集合9 H6 N9 {8 K: f. M" p" G
          ***
8 |7 `7 M0 V4 u- G" _1 d5 E' b1、事务的开始和终止& Q$ a# j* Y) {3 K' _$ b7 J
1)事务开始于上一个事务的终止或者第一条DML语句
5 {4 m3 \+ ~; n2 G9 `' w) Y# L2)事务终止于commit/rollback显式操作。, y7 N: c$ T6 S# ]
  连接关闭:隐式终止
: s9 c9 Y4 D# m- p8 O) E  DDL操作,比如create:隐式提交。
/ ?( J, M; w5 p* _* _3 l* w: Z9 J0 a+ H* b* L
insert into ...values...& C: Y5 ~4 F7 o) t" Q0 o: O
update ...
: J8 G8 l4 X9 p6 ldelete ..., ?: A. T$ d) A: k# J2 Y$ r! M( Z1 _
insert into ....* F4 h' e5 c5 c; V0 V# A
--rollback;--回退到事务之初,数据的状态和事务. l+ f9 V1 O: f( I, R* n; e' x- t0 a) W
开始之前完全一致。
9 Y1 u8 \0 Z  f3 q+ Y7 mcommit; --所有的数据改动提交。
1 q3 l; `; [% X/ }  R2 a
) I) p4 z. f& d: ~2、事务中的数据状态
6 ~! S, ]2 F9 r0 w, d, Vcreate table mytemp_ning(
9 N' q8 a2 ~$ P! sid number(4));
$ p- T# h3 l5 @" p. Minsert into mytemp_ning values(1);
' B. }5 K) q. R1 x: h! y! Finsert into mytemp_ning values(2);
% L! w5 E- t8 T/ K. D
( g- b5 x: t+ I8 ?, L$ B--事务内部的数据改变只有自己的会话能够看到
4 M, O% B* B% V4 u( c--对事务改动的数据加锁,事务之外不允许操作。
$ L+ \: X8 l2 [4 v4 t' U- L9 j# z/ j: V7 j
如果提交:commit
6 G0 O+ r! R) x$ z! M0 t3 K6 M! s数据的改变被确认。所有的会话都能看到这种改动。
, T/ l4 P/ o$ n0 X数据上的锁被释放。
( G. t. P1 X# P2 q保存数据的临时空间被释放。
+ K4 K3 |7 {' U2 l  R0 ~0 p+ _8 K' d6 v4 Z: M2 o' Q. V. L
如果回滚:rollback' ^% D2 P: l& @$ e- s5 ^
数据的改变被取消。1 E$ C, n) L  `% P1 k& I1 n5 o9 f
数据上的锁被释放。
8 c3 {: M" q0 x7 l! l8 n; G临时空间被释放
% ^/ x( t* s6 Tcreate table mytemp_ning(id number(4));+ h0 h# G% p& j. ]# p; l: M7 }
--事务起点
0 S7 G; n7 @" t9 J( ^* w) A% y# [* K8 qinsert into mytemp_ning values(3);/ Q& @3 T. m- w% o6 H( r' s
savepoint A;
% ?) I3 ~' e. K8 i. zinsert into mytemp_ning values(4);
0 S6 p0 g  x( r% _- ~/ x4 fsavepoint B;- H7 R0 \' C* z8 o' g: C
insert into mytemp_ning values(5);
  u5 b) W7 s" Y- E) H1 \" Crollback to A; --回滚到保存点A,A之后的保存点全部被取消4 C. C$ i- o3 I  t4 {/ t/ I
select * from mytemp_ning; --3保存,4、5回退+ j$ Q( s/ K" @0 u; m
' n" `/ K" e$ ~' n0 f4 y" ^2 r
三、DDL
$ Y1 F, I& [1 Y( X) B& q) Tcreate / drop / alter / truncate
: M5 G6 H* B, N; r9 ^8 R
) O7 O/ A  l2 @# S数据库的脚本(script)文件main.sql:
( Z: a( p* X% K! \9 C4 ?------------begin--------------------
, D* P9 P; M/ g! Q--删除表emp) n  s; I4 o) q* B# v
drop table emp;3 E) y; W0 w3 Y% X( M9 g. J2 S2 O/ Y+ b
--创建表emp# i, B( Y! \  ^9 q% j* V
create table emp(id number(4),
! r: ^6 P6 E$ Xname char(20));( `; ^& \4 b* M! u
insert into emp values(1, 'amy');
; X& h. _9 p& c# A% ], Rcommit;2 {, D. o5 _& B& s, @7 T; A
. |! s% w/ d/ t

; e; {  |2 S) E9 i  i) j3 Y

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