我的日常

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

动态微博

查看: 1827|回复: 0

Oracle增删查改 day04

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:42:13 |只看该作者 |倒序浏览
1.内连接
& o4 n) ~! J' o. @. |! [% i3 D7 J0 A  @
t1 join t2 on 条件1 r. a8 G2 F6 @* K- Q$ }5 _

) j% Y$ }. y' f! y( ]1.1.等值连接:如果on后面的条件是等于。: ?" q, H0 N. {* Y' z  [, p# e
t1 join t2 on t1.deptno = t2.deptno9 C0 \2 n) g* g0 r8 b
1.1.1.等值连接的一种形式:自连接
6 j2 x* {9 f1 G0 y8 ^& q+ B& \& S% k5 Tt1 join t2 on t1.mgr = t2.empno
* i% M9 c/ h; U, S% K
+ n( B; E$ T& F5 v8 y2 f3 {1.2.非等值连接:on后面的条件不是等值操作
9 j- u% d8 }/ G" `7 I# Uempno ename salary         grade lowsal hisal
% Z# g' C" q, v  }" F------------------         -------------------# W- L5 U* |" G5 G2 c
1001 zhangwj 10000          1    10001  99999% y! O! z* E3 K# ]; _" T* k
1002 liucs   8000           2    8001   10000  . {) n4 V* z* ]7 A) t
1003 liyi    9000           3    6001   8000, R& X+ }, L( Q& N, `1 u
1004 guofr   5000           4    4001   6000# G: t% g: O" c2 }$ w( Y
                            5    1      4000
$ @5 x( y8 ]$ l' [8 u) W: {--步骤:1.建表;2.插入数据(commit);3.查询" ^' ?3 ~6 r' `. {7 N
create table salgrade_ning(
7 u: t, a. P: `5 U7 O& X1 @grade number(2),
" ^5 J( N. z: e1 U6 O8 e  ulowsal number(7,2),) ?$ M+ V; k8 [* T% X6 K% p
hisal number(7,2)
& Y7 Q- D+ m- C);7 c' }# v2 [- v4 W
insert into salgrade_ning values(1,10001,99999);
0 m+ A/ {2 X0 i9 Linsert into salgrade_ning values(2,8001,10000);1 J$ ~$ p# x+ U; ^! A) ^. J
insert into salgrade_ning values(3,6001,8000);
" f, Q7 S+ F+ C% a4 v2 e- Pinsert into salgrade_ning values(4,4001,6000);
9 n- z- x' u) R, E+ s; r0 W4 v# Y+ c6 |insert into salgrade_ning values(5,1,4000);
, n" T0 N' q& R! C- U+ T3 P7 ?commit;
0 ~. [7 c% N9 H( a. b6 ^# _# t--计算员工的薪水等级:
9 S: K' f  ]% ?1 h1 Y7 Q2 w( pselect e.empno, e.ename, e.salary, s.grade4 J) n, v, o1 N6 p9 ~: u7 e
from emp_ning e join salgrade_ning s6 Z  B7 Y, K: m6 S8 K5 V
on e.salary between s.lowsal and s.hisal;# I* [, t- C/ c/ \+ C+ j* J
--最终查询结果的形式:
5 O9 w, s& |: B$ H+ f1001  zhangwuj 10000 2) _+ C. r! C6 g( J8 t' H& G5 z; m  I
1002  liucs    8000  3  ; n! I) h3 p7 w4 f  g" h% a9 z: R

4 E0 c! U7 C) [* d2.外连接
- M: `' n8 j2 x" l5 dt1 left | right | full outer join t2 on 条件
% X5 m  h! k2 W9 Z1 y( h, E5 `, N7 O" w8 v6 k' q- g
SQL语句的种类:7 ]/ N' h6 V: w9 L; V! h2 q: e! Z
DQL:select, C% h! P! U4 n6 g, F
DDL:create / drop / alter / truncate; V8 ?, G) E4 N9 t* ]" S% U+ {
DML:insert / update / delete8 R5 G( |2 |& w# O8 w
TCL:commit / rollback / savepoint
$ O# l( y9 d+ W% p8 NDCL:grant / revoke
8 S. s' U; A' b" E( ~% O% L, _
6 Y) e# g5 e4 D# O: H$ h2 C一、DML操作, a6 s% Y( \  N: J# ~+ t' w8 \
1.insert into...values...& n, j" k* Z# A# r
--1.1.不写列名  }2 Z' E. r& Z- L
--必须提供全部的列数据,数据的顺序必须按照表结构1 F/ }  O2 p* T9 I7 z5 L
--如果有数据没提供,用null表示
. J4 R; O# n  p4 @- [$ ginsert into dept_ning
. ?  T2 P7 R! F# tvalues(66, 'market', null);: [# ^7 c' \* h

" v2 c$ i- n# z% \! n$ p7 Tinsert into emp_ning( D/ i! y/ u/ s+ Z+ b. \3 i9 p9 S
values(1020,'rory','Programmer',6000,null,null,* N; b! d" N/ @! M, I" [
sysdate,10);3 i+ ~( k8 `/ a/ ]; {$ m7 V: f
/ e, q( x9 K  ~/ d
--1.2.写列名# |% p" s6 m$ t" i- N* }1 ?5 F% f& X
insert into emp_ning(empno, salary, ename, hiredate)
9 r0 s' L/ N. W/ g7 Y$ d1 Ivalues(1020, 6000, 'rory',  8 _+ N6 N  y! ^+ t6 m1 s
to_date('2011/10/10','yyyy/mm/dd'));
" D8 r0 |5 G& D# G8 u
' R. D! `' i0 ^( H* m' m--to_date函数是oracle独有的。
) K' d, W- L. ^3 B; y- M--在oracle数据库中插入日期数据,一定要用to_date$ X, f3 n5 F& F8 n) B
处理,不要采用默认格式,比如:'10-OCT-11'。
; ]9 `/ M6 h. Y; D* [# h/ O& X9 R* ~! L/ ^) q0 G
--建议采用:写列名的方式。即使是插入全部数据,也
! R8 i' C: Z2 x. p2 j: m建议把列名写全。* }3 j' k6 [: M8 v' `8 d- R) E
--复制全表8 F. H' {- w# o& R
create table 表名$ H8 B  i" j- O8 v0 {
as- A% H0 o* F' P& T( p
查询语句;8 d9 [3 w8 P5 J( A; C; E4 H5 E
! ~4 K, o0 G- ^: Q* n
--只复制结构,不复制数据
4 s% j4 @: l6 ]* o5 s0 j* T7 ?* \create table salgrade_ning18 X: y7 f% T3 ]" y0 [
as
) k% b4 x+ N4 r9 G4 X, E5 I+ Xselect * from salgrade_ning
. F1 k6 d2 k1 @0 I1 w! a1 u& dwhere 1 <> 1;
5 `7 w* }1 _  m0 Q! r
7 @1 A+ x, O" U% q1 A* e--复制一部分数据:给查询语句加条件。9 v2 Z1 h0 J1 ^, M6 g" Q% F3 a) O: `" w
--如果查询语句中有表达式或者函数(包括单行函数和
2 R: g; I' W1 ?组函数),必须指定新表中的列名
$ \* r% y( b9 B3 P' D: Y; h% k--指定方式:给列设置别名;或者在新表后指定。
  i2 ~' I) |0 @7 s3 Z- ~create table emp_ning1
5 O( c7 H$ v5 ]: was
+ x) d1 s' {5 @" v2 c  s8 u( `select empno, ename, salary*12 year_sal: `! k5 E6 o. J8 {% X# @
from emp_ning8 a- j4 K/ m0 `) Z& e
where deptno = 10;+ T: Z8 \% h# z8 O/ U

! X5 k: H( f; {- c& _5 x, ncreate table emp_count(did, emp_num)5 d) |+ j) L' T. `
as" C$ o+ E$ a- M( Q2 h/ W$ e' o
select deptno, count(*)
! ]% Q: C% N4 b5 \+ H$ j5 B: j. wfrom emp_ning& Q! Y8 f' [0 f0 N4 A$ u+ G, {  ^3 T
group by deptno;
+ I# J7 D( E* W2 W# J& U: H5 Z
/ ~' P0 e, |, s" K6 g5 [--创建一个空表
  a" G& M, ^) Y2 r# gcreate table emp_bak1/ I- O5 B2 b% ]# H6 s
as
7 _# B5 Y2 r- K4 s9 w" }select * from emp_ning: K* M5 T, _$ r4 P
where 1 = 0;) y# h' m4 U5 l6 p4 I
: w0 g% `% c: Q8 Z
--向表中插入多条记录+ U* m) e0 X* L& V2 ^
insert into emp_bak1- v+ h: ~: C9 _
(select * from emp_ning
8 O, w# g# `+ _7 y. s7 Z4 m4 e where deptno = 10);& n6 K. d  D/ d* T" v& S
; H6 Q9 ?5 I2 @* q$ Z# }
--把表中的数据换为部门20和30的员工记录8 b2 Z0 X& G5 ?0 l
delete [from] 表名; --删除全表的数据。" B; q* M3 _2 T' R6 P
delete from emp_bak1;; b1 V/ i1 g8 ?/ z$ _5 }/ T
$ }& u# r+ t7 S
insert into emp_bak1: j3 s  x0 }- w: i9 K* `" {& i7 X9 T
(select * from emp_ning
( W) M: x7 @4 E$ z! Nwhere deptno in (20, 30));9 x+ W9 G4 h* F
! }6 \8 }4 _. w' ?) A5 @
--向新表中插入指定记录数的数据,比如前8条。
9 T4 S1 u1 v: I# @- wdelete from emp_bak1;$ ~9 J4 m8 }/ M% T! q% I  \. b
9 D& o. v4 m1 m8 H9 R
insert into emp_bak1* v8 x  K8 a3 V5 w
(select * from emp_ning
' Q' ?6 {, z. qwhere rownum <= 8);
5 y& l7 r1 p& B3 C3 Z9 z5 e9 H8 X6 `& P/ t  i8 l8 v
小结insert:
/ X5 U5 ?5 X2 e& h" T1)insert into 表名(列名,...) values(列值,...);1 {; M6 @' R7 D" ~9 T5 N; I7 F
一次只能新增一行。
. V2 A# x7 `- |4 n; v4 u2)insert into 表名 (查询语句);
. [7 v& g8 g. w( v) |# d9 `' M; |一次可以增加多行。8 P$ D" ^: h6 q3 f) X, m' M

" s- ~" P& d9 L9 l! J2.update:更新数据0 L0 U8 l% c% _/ N1 _
update 表名 set 列名 = 新的列值,% R5 i3 ]. H$ r5 |9 @8 o/ Z
                列名 = 新的列值
& U. S8 N2 R; ^$ A0 p- K' m2 Cwhere 条件;
: A0 ~2 C0 X) t: Q3 q! ^4 G
6 F" N1 R1 q& I3 Yupdate emp_ning set salary = 3500, - D' Z5 ~) }* O+ D: a6 M
                    job = 'Programmer'
4 z& f! g( j) Z/ Pwhere empno = 1012;* q8 j! D1 y' w' j5 Q

0 W7 G0 i& x. l* h3 b! a$ c% e4 W& u--部门10的员工薪水+1000
8 y; O  y0 W; C7 Z2 {6 H4 W6 |' ]update emp_ning set salary = salary + 1000
/ T1 G2 ]! G( Vwhere deptno = 10;
$ [: j8 w( Y4 D: q
4 O7 @/ |9 G1 m6 v* l' n--更新数据表时,注意条件。* X% o, g* ?5 _4 |
--如果不加条件,影响的是全部表记录。
6 u# m& ?% C$ X3 K+ i6 G. y2 }, I
) H! X0 f% r( E! d2 `& ?3.delete' O5 a  [; V8 E+ m" Q) o3 i: l$ v
--注意条件。
3 A; }" a4 J, s4 Z- P--如果不加条件的删除,将删掉表中的全部记录  ?9 n, v; A5 n
--rollback 回退,commit确认。
& y. S  y5 Y) E7 k9 tdelete [from] 表名 where 条件;7 e/ U- E% Z3 r& W

- s: z. y+ P; d6 }8 Tdelete emp_bak1 where empno = 1002;
3 H" {# ^; G! M% h, d3 `4 {8 B% F! E8 @* A2 z3 _0 r- n
delete emp_bak1 where deptno = 10;2 M* i$ h' V7 D/ L

& o: b6 f4 b4 }) H5 C0 x3 \delete emp_bak1;
) O/ Q3 @1 F  l  f4 U  f
5 b$ F. {- h& s  q4 Ccommit;
$ j0 S+ _/ O1 \& {1 x  z--执行了3遍, n) E3 Z( |% V' i
insert into emp_bak1(empno, ename, salary)3 T$ N" q) ]# x# S
values(1015,'amy',4000);% F) ^; ?( e* c- N( X* _) c
--执行了2遍
: U6 l& m! t8 \5 G! U7 d3 W& Iinsert into emp_bak1(empno, ename, salary): j$ s) r* h0 y! I7 L
values(1016,'rory',5000);
; n4 d; Q! d' Z--执行了1遍。0 L+ j; F- k' B! H) @3 D
insert into emp_bak1(empno, ename, salary)
, D; e* g7 U  b( Z' jvalues(1017,'river',6000);" {: d$ B" z' g+ o0 v' B
--创建表emp_bak2,只存放不重复的记录& I$ j( g1 z) ~5 C
create table emp_bak2
  D3 ^8 p+ j9 Las
% c2 J/ P2 x6 X1 Rselect distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr1 U3 k- o: t9 v5 Q0 K
from emp_bak1;
# Q4 s' @6 }: Q9 F--删除表emp_bak1
1 B8 {! N/ ]" s2 Ldrop table emp_bak1;
& _6 @# B+ ]" z--把emp_bak2改名为emp_bak1/ X7 _# w9 }4 e) e* U- w. o+ b3 G
rename emp_bak2 to emp_bak1;
/ N+ k6 o+ ~1 i  a' o& H/ p  A' _  m* p. n0 r1 `# m+ e7 y
___________________________________________2 @" L6 M2 j0 z8 ~. ]1 q: V. r
3 i) e5 o% ^9 A# O6 F
8 S, l. D( p. X+ ?, ]
delete emp_bak1;) r* P6 j4 {# k; B

9 J8 u5 p6 J- linsert into emp_bak1(empno, ename, salary)
$ f, c- G; c8 }- \! ~) g( @values(1020, 'amy', 4000);
# K) i4 D* O  G# p- \0 [4 {$ _insert into emp_bak1(empno, ename, salary)
' S5 E* {" i% M" s: U- r- rvalues(1021, 'roy', 5000);- {, C4 p) a/ z$ a
insert into emp_bak1(empno, ename, salary)
8 z) n  |- Z1 M; B3 L% @4 svalues(1022, 'river', 6000);% y9 U& Z, _" s7 w7 E

+ b( u6 @5 X0 p" L; ?--rowid是Oracle数据库的伪列。1 L( n3 J4 e; T3 K+ {$ w% {
--rowid是Oracle数据库独有的。
7 a3 \3 v- ~% W5 B delete from emp_bak1- g: r) y6 }& d# v+ A% J
where rowid not in (
" y' q8 s: W4 J4 T5 X; o4 l   select max(rowid) from emp_bak1
* \/ v6 N8 L2 W0 D   group by empno, ename, salary);
$ y3 j! `) K; \2 L- k: r. ]9 s  J9 U+ h8 e; b; w- q7 v+ \0 L
二、事务:Transaction
) ?! l: H8 i0 l" w2 |8 {3 k; FTCL:Transaction Control Language
$ k7 I* E5 u! p: t, Ncommit / rollback / savepoint
  R- S  ^2 {. I* H6 G& _8 o事务:一组DML操作的逻辑操作集合
) P' b4 ~2 p+ h7 o% m2 y          ***1 Y/ ~5 ?- X' S
1、事务的开始和终止
) p7 L7 q: q& m; j+ P7 h1)事务开始于上一个事务的终止或者第一条DML语句
" p- D( F" f' O  v2)事务终止于commit/rollback显式操作。3 Y5 Y) w' @$ c- I5 e
  连接关闭:隐式终止7 Y  [: j4 z  H1 H/ k9 p6 C' N
  DDL操作,比如create:隐式提交。: l1 ?! ?' c8 O. g% ?  o& A- O- H

7 N# y6 R1 L* O  q& [) Minsert into ...values...- m- z- d+ j  ~# u* H
update ...
- G2 ?; ~% X8 H" ldelete ..., O6 M1 X5 s- L  h, T( H7 q9 l2 j- p* u6 e
insert into ....% v3 Q# |2 Q! O3 K5 t1 C$ k
--rollback;--回退到事务之初,数据的状态和事务; f9 \% `1 ?; _. Y* _0 r
开始之前完全一致。' r( b, ~% w1 N# O
commit; --所有的数据改动提交。
2 U# C' m) C) a4 W+ [2 h# d' x" k) V4 Y, A
2、事务中的数据状态/ ~* K4 y, I% V" e) m
create table mytemp_ning(
7 t/ F6 n. @% ?) |; ?/ K) Uid number(4));9 D2 h+ e4 g, n# {
insert into mytemp_ning values(1);  t! m7 G. R, Z8 u7 n' c
insert into mytemp_ning values(2);
5 r9 h7 [+ L$ [& G0 C2 I+ L- }, h. Q1 K, Y+ N/ a
--事务内部的数据改变只有自己的会话能够看到
0 Z2 N! g: U9 K% c--对事务改动的数据加锁,事务之外不允许操作。
. o# c7 E4 m/ {) m0 Y2 ~1 Q
- H& v9 b$ {7 B' y如果提交:commit+ ?4 b. j: s% ]+ [  I, i% H1 o
数据的改变被确认。所有的会话都能看到这种改动。9 v0 n, h1 U5 o/ A0 U. T( G1 Y
数据上的锁被释放。
) b3 M( o7 o0 w8 ]3 D4 L- U保存数据的临时空间被释放。5 E  {; Z7 n" J. t4 T
' ^( _; M) n" @. T8 j
如果回滚:rollback
" e3 z8 R: O% N8 T数据的改变被取消。' y; O& G# t7 a5 t
数据上的锁被释放。
- z, x7 L, Z6 T/ J- r1 o7 j9 c临时空间被释放/ J7 t% @  t/ O/ W6 I
create table mytemp_ning(id number(4));
& t4 P* ?( K7 F# i, o, Z! G--事务起点8 D' _9 N9 a2 `1 \% P' e
insert into mytemp_ning values(3);  N; G4 l+ x3 E6 F
savepoint A;7 x0 l, w& x0 N% p; U% y7 g9 l
insert into mytemp_ning values(4);
0 k9 v0 E- n2 m4 n( W- ~savepoint B;
9 Z! u1 `+ a/ C5 L0 e( t5 w+ H! q) Winsert into mytemp_ning values(5);
  P( f& N4 F4 h3 s# _; Crollback to A; --回滚到保存点A,A之后的保存点全部被取消( h' h4 O, p% T! ~' i/ b
select * from mytemp_ning; --3保存,4、5回退. _  b$ a% E, U4 ]' P- |+ _

! a4 R2 E' ^1 ~$ Y/ u3 h' F三、DDL: W& n7 B+ B/ C* {7 t
create / drop / alter / truncate6 Q' k+ `2 D/ w( K

' A- f1 E$ `  E0 b! Z+ ^9 s; Y) ?数据库的脚本(script)文件main.sql:2 N) b( M4 Q+ v/ C
------------begin--------------------0 k3 J# s# y4 d' b: d) m
--删除表emp( F2 r  V$ v  @# J
drop table emp;2 \) L, R2 D/ H- l& C) |
--创建表emp
/ G+ |5 a) f! B  K% {create table emp(id number(4),
0 D) j9 Z5 R* o1 k( i% y# m' E# ]/ Mname char(20));
  n0 n1 N; c- [1 d( Xinsert into emp values(1, 'amy');
5 R8 a% K  M% S  Q. Ocommit;
, L1 V: u3 s" c& Y6 w8 x: _! i4 s: }3 C7 S/ N: S
2 ~4 e( E8 g$ u' e, k

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


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

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

   

关闭

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

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