我的日常

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

动态微博

查看: 1764|回复: 0

Oracle增删查改 day04

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:42:13 |只看该作者 |倒序浏览
1.内连接
8 G7 }0 M- r$ }* d
! K. c: t; b2 a4 c; C9 Xt1 join t2 on 条件- U+ J+ k: B" [1 l

% c7 A% S/ {4 D1.1.等值连接:如果on后面的条件是等于。- N7 V/ ~/ D' e3 T: _5 z6 Y
t1 join t2 on t1.deptno = t2.deptno
; M$ ?  Z/ Y. u1.1.1.等值连接的一种形式:自连接/ X; [( h# H: p5 g) Z" t
t1 join t2 on t1.mgr = t2.empno
, S8 k' y6 n& b0 Z) m* K5 F% W% s3 v4 k/ }0 \6 z- }
1.2.非等值连接:on后面的条件不是等值操作
' z) j( `2 c2 O' p+ [empno ename salary         grade lowsal hisal
$ n; t+ Z6 h$ S+ H5 {& D------------------         -------------------+ o$ d) J& L9 }; y/ e
1001 zhangwj 10000          1    10001  99999: l- m; X& \( Y. Q' x
1002 liucs   8000           2    8001   10000  
. o" `) f1 [! v0 K; {1003 liyi    9000           3    6001   8000
( e9 p( E+ ]2 s1004 guofr   5000           4    4001   60005 O9 ~" w/ y+ W0 b
                            5    1      4000$ b+ t1 T; p% g3 O! w2 D+ H
--步骤:1.建表;2.插入数据(commit);3.查询
$ C+ [; N4 |% _8 jcreate table salgrade_ning(
7 G: a, q+ R3 t, u( q) h9 q& Ygrade number(2),& [( V, t: T1 N  y# X
lowsal number(7,2),
$ D* T$ @7 C9 @5 U0 A# _, nhisal number(7,2)
% O+ g6 J- f7 C4 E" @, });
5 F1 f3 C$ F- V1 a! z6 s7 A: }insert into salgrade_ning values(1,10001,99999);
" ?1 F/ ~3 U) A# i9 G  h" T: |insert into salgrade_ning values(2,8001,10000);* K, A- z9 r! m+ P7 s9 m
insert into salgrade_ning values(3,6001,8000);
+ X# \1 I) a6 ^" ~0 ]& t$ w; I4 |insert into salgrade_ning values(4,4001,6000);
) A5 ]! M4 p0 L  t+ Yinsert into salgrade_ning values(5,1,4000);& G! I, v' x# d% w1 Q# u
commit;
' G6 H; a: _/ ?- O$ X--计算员工的薪水等级:
' p$ o( M+ U3 i/ L) W' Fselect e.empno, e.ename, e.salary, s.grade
: w+ `1 S/ l. F: |+ ^6 j. ^from emp_ning e join salgrade_ning s1 c3 Y. t5 ]' h; G6 h
on e.salary between s.lowsal and s.hisal;
7 G/ D/ A, l$ w9 M9 D5 n--最终查询结果的形式:, f1 o0 `( q8 q) V4 N4 F9 H7 K8 i
1001  zhangwuj 10000 2
1 {& z; g; I: T$ F: r+ {9 h( I1002  liucs    8000  3  0 d, h2 [& v. M% ~8 z& X+ v" p7 p

. \. A5 b7 y1 F, l" T4 b2.外连接; Q* Z, ]7 t6 y4 X/ X, Z! w5 j* \; R, M
t1 left | right | full outer join t2 on 条件
/ w# v' w$ _0 p) t: z4 p* U8 i* R6 y- C$ G3 @
SQL语句的种类:
& @# L9 R( Z& E6 R9 GDQL:select3 ?( n. \8 r. }: G3 J0 q5 O& i
DDL:create / drop / alter / truncate" N) W3 T% h/ W( f3 _. \* {, M
DML:insert / update / delete
0 B# z1 H  q  X/ S3 tTCL:commit / rollback / savepoint
+ e2 @$ A  ?- A/ ?" J0 w8 R: {DCL:grant / revoke9 y% D9 T9 Z6 Q3 I
7 n7 S5 S0 I( w$ `+ `8 g
一、DML操作/ W( H1 T, n! F3 |2 u  h
1.insert into...values...) C, O0 Y: X* |& v; ]2 ~. t6 T
--1.1.不写列名6 P2 L3 M( O7 |6 b" L9 E2 t- M
--必须提供全部的列数据,数据的顺序必须按照表结构% }5 l& a% W/ {' k
--如果有数据没提供,用null表示9 F! D% q8 f9 Z
insert into dept_ning
& \  C- u* l! p+ `/ @3 W' y) Zvalues(66, 'market', null);0 L+ S5 J( z8 M8 Q5 X0 B; G7 i

) T7 H; |+ x# L/ a- b9 `( E1 K! h: Pinsert into emp_ning2 a2 }% g9 O# ^! }! @
values(1020,'rory','Programmer',6000,null,null,) L" [; t, e* g5 l& c
sysdate,10);
6 Z; M7 r7 u1 p! G3 q. X2 L8 u3 H" ]7 ?$ V" ?( [5 v0 H
--1.2.写列名
8 U- u) B1 O$ b( ^) V  o5 z' \7 w5 Xinsert into emp_ning(empno, salary, ename, hiredate)
$ B9 p  |( p/ V  A8 Qvalues(1020, 6000, 'rory',  
* e7 v/ v" ?* w8 q) bto_date('2011/10/10','yyyy/mm/dd'));
% d+ j2 Y: A, t9 Z+ T; F, w) u3 S
5 a: r/ d; j' \5 M6 o2 _  e9 h--to_date函数是oracle独有的。
5 K' f+ K. b9 n6 }2 l--在oracle数据库中插入日期数据,一定要用to_date
; M1 v/ g! @; x# i+ I- z% g处理,不要采用默认格式,比如:'10-OCT-11'。
0 V* z3 M; X$ |; G
$ J* E9 U/ S2 ]% I' }4 Z$ C4 L  g+ C--建议采用:写列名的方式。即使是插入全部数据,也
6 h5 v, X+ a; H9 V) W2 P% }9 o2 Q建议把列名写全。
9 `. V/ O2 _0 x--复制全表# J: y0 n; F! K
create table 表名
$ K1 H' c2 s( F" q& Was- s5 L) K- l! ^- o9 m5 o1 K
查询语句;
( h* H" W" X9 X5 q3 k3 I6 v. K6 `
7 y. M6 o! |% R' a# I! t--只复制结构,不复制数据; Y$ L% f. B  J9 }% Z+ w% q
create table salgrade_ning1
" n6 M. H* S7 z9 zas
' L, T  |. Y4 C, jselect * from salgrade_ning
7 b5 L- i7 C+ O4 e0 Lwhere 1 <> 1;) m# V8 T! S: U; ]4 i: w

2 p# Z- I. r8 |--复制一部分数据:给查询语句加条件。
' P" z% _+ K' a& m5 l  o6 w--如果查询语句中有表达式或者函数(包括单行函数和0 n2 @2 s$ e5 D
组函数),必须指定新表中的列名
5 w! s- V1 ^" o3 n* L--指定方式:给列设置别名;或者在新表后指定。4 l' J( n3 t1 A3 M% ?
create table emp_ning19 [3 J4 L4 q+ y/ y" I" H
as7 O8 \2 ]+ B) y6 N- M$ M3 Y0 Y8 P* y
select empno, ename, salary*12 year_sal
  b& K/ F, p7 k8 v from emp_ning
0 X) ~) }% f0 @! wwhere deptno = 10;9 U5 V6 e3 e+ D7 }& m2 u8 \

  C5 H  T6 ^/ n  kcreate table emp_count(did, emp_num)" k" Z9 o% j8 c8 y
as+ I7 ?" c/ r5 \9 G9 w# ]2 o/ F
select deptno, count(*)
, S& ~$ R, {3 Ifrom emp_ning/ f# l; |& a  V
group by deptno;
: d0 m( X0 m' N0 j! c9 j" u* }$ [1 q8 T( ^+ F. C; K
--创建一个空表
$ F  m3 P: ?# L4 A5 x9 acreate table emp_bak1
6 P/ ?5 b  T; ?; Oas- u: g5 i) o+ p, ?% `
select * from emp_ning, J$ \" X' i4 F# n3 M
where 1 = 0;3 O* W% ]4 C: y% e! B

3 x0 R" p3 J1 ^6 d$ G  j--向表中插入多条记录7 O6 X+ q# ~9 d! \
insert into emp_bak1
) `! m8 S# q- K) l1 `, q(select * from emp_ning
, d4 c9 ^$ N$ n( ]& t7 |+ k- @ where deptno = 10);, u2 p) X+ k( x# P2 e

& p, b' h+ _1 c$ |" A" X--把表中的数据换为部门20和30的员工记录9 p0 o! b" L4 e& L( \
delete [from] 表名; --删除全表的数据。* V" K' }. {: ^$ U
delete from emp_bak1;) E- G# @6 Q8 Z4 [, h+ q( |) X$ G

- D. Z0 f) a! ?* A% C1 f/ uinsert into emp_bak11 B1 V3 t# C2 j
(select * from emp_ning' F* v$ p4 [- q# ]7 J2 ]; I
where deptno in (20, 30));
' ?: C9 \0 C" }) ]3 c* m) e
$ s/ C: ?9 Y+ h. B7 V  @& b--向新表中插入指定记录数的数据,比如前8条。9 ?  I& r8 B& z+ S, B4 m. K6 A
delete from emp_bak1;, Q$ x' E9 U) I% q' T2 T

# g- I9 P/ r; m% Zinsert into emp_bak1
: }3 x. d* M( y3 P7 _0 |- p3 V(select * from emp_ning
8 [4 F5 [1 ?9 Iwhere rownum <= 8);
* K% Q1 W/ Z! A0 z  v0 s2 Z% f. s; a4 ~
小结insert:1 T9 o* W, L- Y( j# q- m6 w8 h7 u& p
1)insert into 表名(列名,...) values(列值,...);: f5 f, \( p" m* b# N
一次只能新增一行。
  G( P" a! H8 @; ^" ?4 n' c2)insert into 表名 (查询语句);
' E$ A* C0 |1 m' B一次可以增加多行。
; U, @# u4 Y' [! Z
; e* V9 C+ ~0 `2.update:更新数据
9 g- u6 v8 r- C1 g" cupdate 表名 set 列名 = 新的列值,( c$ ]% `& r+ b1 R
                列名 = 新的列值: |/ h7 C5 e( G! u% n" y- K
where 条件;1 }/ }- L: I6 N. R7 p

! v3 O( `" M( l/ `* z  S5 pupdate emp_ning set salary = 3500,
0 k% K" l: N3 _, B) O                    job = 'Programmer'( e+ e; N. x& ]* R
where empno = 1012;4 d2 T- c  Q7 O! ]: t

& H2 o( {( Q7 K% x  w5 L8 B--部门10的员工薪水+1000
+ o5 _, ^4 ]% x" D# pupdate emp_ning set salary = salary + 1000& q: U7 f1 i- `$ B0 A+ C
where deptno = 10;" B( k: N- [, K3 E8 w# r% ^* `) B

  @* U* [4 A% V5 ~: q1 Z/ u--更新数据表时,注意条件。1 v6 w' ?: Y2 _% ]5 w
--如果不加条件,影响的是全部表记录。1 R8 g* x7 r2 z3 P1 N3 a
* T# Y! a+ \% V9 q& w3 W0 Q
3.delete
& u- B. p# T9 b" R2 U--注意条件。; J1 ^3 G2 S2 l( L4 o
--如果不加条件的删除,将删掉表中的全部记录3 c1 U8 X# I9 E" I9 S3 s4 Z
--rollback 回退,commit确认。
: W; J* V8 w( h: N8 ^; ]& f; O0 Cdelete [from] 表名 where 条件;. u  c& ?; B% x' t/ t

, e8 E6 a9 B( x9 ^delete emp_bak1 where empno = 1002;
" [6 ]  M" Y( |2 ~3 p* [' ]8 E9 K% I6 e. V/ b2 H
delete emp_bak1 where deptno = 10;9 a4 x! q* H( [& O" K( @8 c2 g: P0 A
6 I+ O7 q+ x) P/ C0 \
delete emp_bak1;
/ k" t. w$ x! ~" {  w" M/ Q; y
6 ~4 [0 e2 `- B3 T4 L" @7 N6 j# gcommit;
! ~, m( l- B9 c  ~' G7 O--执行了3遍- V7 `: @* ~" e" e, k. P0 Q: C
insert into emp_bak1(empno, ename, salary)
( k# D* S0 z# O  G6 \. y2 hvalues(1015,'amy',4000);# t: y. T8 S% [$ g
--执行了2遍
. d8 T0 n1 S! s) l9 W0 M. Iinsert into emp_bak1(empno, ename, salary)
. z5 ?4 r1 r6 L! A+ Pvalues(1016,'rory',5000);
& o) h( m2 {% V7 |6 T8 d  p# Z4 }--执行了1遍。% V6 I+ a7 @; N$ r4 ^) @% R1 b0 R8 P
insert into emp_bak1(empno, ename, salary)3 e) ~: Y; i# L7 ^# g
values(1017,'river',6000);6 p# `' t% O# e7 z8 X* ?6 S, S
--创建表emp_bak2,只存放不重复的记录
7 {* C4 \2 S" n4 ?create table emp_bak2' a& B* F) w- S6 w) ~
as% y) o& \& i; m! Q: {
select distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr# D4 y! C1 W3 W
from emp_bak1;
4 n' c" c, m) C. r, U0 z--删除表emp_bak1% x$ M  `, `- W0 T* e$ i, \
drop table emp_bak1;
; |0 B+ z( ]; S1 a! F* x--把emp_bak2改名为emp_bak1
  h7 F, R* u* A* B2 B6 m6 j+ V; rrename emp_bak2 to emp_bak1;4 S  E  G4 y/ E6 o& v
/ w9 U- _$ _# [$ a
___________________________________________) o2 X8 Q: |- P( w
8 r1 @3 R0 l; V) ]: s- v/ ~
$ |9 Q) F# b6 ~' ^# S" B2 o; o
delete emp_bak1;
' O& h/ q* ]' A3 d' Q0 h( y+ n
( r  t, O( g; g* f: r, h( Uinsert into emp_bak1(empno, ename, salary)
( x5 J4 x; L/ S. b2 t$ d  ^values(1020, 'amy', 4000);4 z* O  K. \3 L9 D
insert into emp_bak1(empno, ename, salary)6 y0 j  p9 p; j; M* e1 O
values(1021, 'roy', 5000);$ T9 E" k9 s/ C$ |% H( [8 F" R
insert into emp_bak1(empno, ename, salary)7 F1 U% N( `) W# Q- l: d
values(1022, 'river', 6000);4 |8 J: C2 H8 k+ H( ]

$ V' l8 a" g: T--rowid是Oracle数据库的伪列。
/ x4 \# F* }" o* |" a8 T/ ~--rowid是Oracle数据库独有的。
% e/ Y2 I  Z4 K4 c delete from emp_bak1
$ \2 u$ ^$ w7 ^# A* `, ?7 E3 z where rowid not in (
; [: z7 H2 e/ [! j( A   select max(rowid) from emp_bak1( K- |' x& A" M; U$ p7 }$ h2 A2 ^
   group by empno, ename, salary);
$ w+ f5 Z3 ]1 F; m
1 p  S) G- D5 T' a4 k* M4 S二、事务:Transaction! [! C/ o# {: |* Q: A+ b5 z
TCL:Transaction Control Language& X! ^* i% n( O1 A- _
commit / rollback / savepoint. s3 L* h* W: I
事务:一组DML操作的逻辑操作集合$ E; [5 l& K  p3 z/ [
          ***
5 k9 ~' }& N3 O! t1 a8 h3 K, e1、事务的开始和终止
. d4 d) [9 u, E1)事务开始于上一个事务的终止或者第一条DML语句" s* M; ]1 q6 G7 q4 a- g* I
2)事务终止于commit/rollback显式操作。
2 H' C: t  E" V; e$ i2 S$ l  连接关闭:隐式终止
* X- l, Q+ b  t  DDL操作,比如create:隐式提交。% f% e/ g. p/ p
8 z. X! g# K1 p" J6 n
insert into ...values...
0 j" z' W, A: k% Uupdate ...
4 `$ r# _1 ]% T: U3 t3 Zdelete ...
4 A+ q9 d% P" T; h5 ~  Uinsert into ....7 }9 _) ^2 l' V; {2 f9 u
--rollback;--回退到事务之初,数据的状态和事务. F; j+ e- x* n* G
开始之前完全一致。
6 r2 L8 K: x6 k0 S/ q5 ycommit; --所有的数据改动提交。$ X9 X8 P% t$ J% G& D- Y& ~
8 W9 D6 U! x' M& k; I% X1 D/ j# G( ]
2、事务中的数据状态
/ Y$ e( \, E) L* h7 Q# S8 [+ ]' U' e  }create table mytemp_ning(; M  b0 K; V4 D6 i+ S8 O
id number(4));& n" O7 d3 D6 c6 f' Z( X
insert into mytemp_ning values(1);. t, {9 k4 M3 b0 T
insert into mytemp_ning values(2);
" h, A1 U( c5 v( ?
4 q( T4 ]0 T0 \! |--事务内部的数据改变只有自己的会话能够看到* y1 D5 s! L! {1 L, P3 m
--对事务改动的数据加锁,事务之外不允许操作。( M7 h: }* X- M$ _, A; }
* b; p6 ]$ t, @6 J' E+ {
如果提交:commit: O- s& G4 P  Y
数据的改变被确认。所有的会话都能看到这种改动。- ^* V" I1 z/ W  o% p
数据上的锁被释放。
" g+ u- C- \; a: T! |保存数据的临时空间被释放。6 R6 S$ W# B" _$ P2 x9 a9 V, U4 N3 ]% P

. K" T' t' |+ S* _8 j如果回滚:rollback
( a! D  @4 D# u1 V/ X2 c) ^数据的改变被取消。5 P( T$ t; l! C, p2 A. [
数据上的锁被释放。
% L5 {( b( R3 h$ E临时空间被释放
; t$ `, t) J+ K$ ~5 P$ r% R# Ucreate table mytemp_ning(id number(4));
3 T' y9 ^7 c. A9 A--事务起点
, W; T' H7 `% [( b" X* m5 H! d  ?insert into mytemp_ning values(3);, F$ _* C3 x9 K
savepoint A;" n+ T1 P" d# g9 {) |$ d7 k8 L  u' K
insert into mytemp_ning values(4);* N0 y$ o. p% Q% u# j8 n
savepoint B;% m2 k+ U0 F4 c0 o/ l7 k1 S
insert into mytemp_ning values(5);
! ~6 h8 k2 m: n* ~0 @7 lrollback to A; --回滚到保存点A,A之后的保存点全部被取消% Z2 w' ?! K& d) Y2 ?6 E$ C% _: [
select * from mytemp_ning; --3保存,4、5回退5 B- r& Z1 A8 r% P5 t

' z+ c+ B* @5 X3 O三、DDL. i" V$ I! I; V# q9 |
create / drop / alter / truncate
/ J1 a. |7 K* H" I& l0 W) `9 F9 Q6 {! }9 U/ w
数据库的脚本(script)文件main.sql:
7 L2 p/ f5 M* m------------begin--------------------
% c2 J& g+ U+ }3 b- i--删除表emp
, |, G7 c: x- F3 w  c8 d; s! Y, Adrop table emp;1 w5 W2 _7 M' \3 |& r) \# \
--创建表emp/ v  v1 C9 D, Y6 \
create table emp(id number(4),. P/ ^* B, _1 R
name char(20));3 x5 N4 [: ?. q, m# Y% c+ [' X) M
insert into emp values(1, 'amy');
4 K2 c7 q' g! s* u9 b! ncommit;
5 M' H7 `" ]+ K/ O
, B3 z+ G$ x+ d( U, X( F/ z* A7 G4 {  c4 N! |' m/ r: W1 V; H8 a

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


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

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

   

关闭

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

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