我的日常

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

动态微博

查看: 1766|回复: 0

Oracle增删查改 day04

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:42:13 |只看该作者 |正序浏览
1.内连接" u* u" |- r; j3 @+ E; H

* x. C, e: q* s' `$ s' W) e; _; c3 H7 Ct1 join t2 on 条件* D4 m% |5 z2 q, |4 |3 F7 y, |

6 ]4 ~  |6 L, _+ y; {1.1.等值连接:如果on后面的条件是等于。' P8 c! o& ]2 G) t( z: d
t1 join t2 on t1.deptno = t2.deptno# ^- j% l) M' h. t3 [
1.1.1.等值连接的一种形式:自连接4 l3 C' Q* Z  S8 f" A4 j0 P  u
t1 join t2 on t1.mgr = t2.empno
' K8 O* I1 M, y) Q1 X4 l) q2 Y3 }9 Z+ l5 F. M
1.2.非等值连接:on后面的条件不是等值操作
8 p1 ~. D* X( D1 jempno ename salary         grade lowsal hisal: D* G' J. r% E7 B9 h) L# R
------------------         -------------------
5 d: ?: `8 T/ p  {* O1001 zhangwj 10000          1    10001  999990 `; Z% k2 z" s' G
1002 liucs   8000           2    8001   10000  7 e' Y* G. u/ X6 E6 I
1003 liyi    9000           3    6001   8000
. p3 p* J# h$ J: D% i7 r! X/ Y1004 guofr   5000           4    4001   60004 E3 ]/ s+ w7 B* T4 M
                            5    1      4000) q4 u8 r1 e) ?. i& ^0 E3 T0 U6 q
--步骤:1.建表;2.插入数据(commit);3.查询
9 Y# R  ?, M3 y: ?- G4 j  i/ tcreate table salgrade_ning(
# n' Y. \- K" b- l& _9 I* B# Pgrade number(2),# X% t0 k  D. ?- m
lowsal number(7,2),
+ K4 o* Y* i* b8 a' x7 ahisal number(7,2)9 y% j6 @( G4 N0 R
);
- d$ \6 X8 c; W- k5 C9 ]' ~  H5 }insert into salgrade_ning values(1,10001,99999);% S4 m; h1 a% E5 `8 ~
insert into salgrade_ning values(2,8001,10000);, D6 r: c9 s) m# S5 |) Q+ L
insert into salgrade_ning values(3,6001,8000);( `" b3 O& H* \9 n1 b
insert into salgrade_ning values(4,4001,6000);
8 W& \* p2 g2 u# H! X/ d0 `insert into salgrade_ning values(5,1,4000);# S) U1 W, |! Q: j* e" v! q" w
commit;7 m1 h3 f/ |9 T' x6 ]& o
--计算员工的薪水等级:7 J/ m1 S# q% J- J
select e.empno, e.ename, e.salary, s.grade
( c2 i% D- _! h' R" F" N: |from emp_ning e join salgrade_ning s
1 k8 |: d$ o2 }: x  v* qon e.salary between s.lowsal and s.hisal;; {4 [2 I" v3 A0 {' {1 [
--最终查询结果的形式:
1 C" J2 `! I& J1001  zhangwuj 10000 2
& h2 }- e5 O$ R" L% F# G1002  liucs    8000  3  
$ n1 v3 a- G/ }6 u! w7 P- L. c/ N+ a* F2 K- s: j
2.外连接2 K' M! O, t/ P) j; N, e0 O
t1 left | right | full outer join t2 on 条件
+ H/ J% i+ S5 n7 ^7 |7 W, T! E# h8 b4 v) B- V8 v. T0 U) P
SQL语句的种类:) ~3 H( m8 G. K+ M
DQL:select
5 }# K. ^5 T, x, S: SDDL:create / drop / alter / truncate
. L0 E3 o2 b2 T; T+ a' i5 a" c6 CDML:insert / update / delete0 Q' g& |) ^8 `& I: ^/ I+ H
TCL:commit / rollback / savepoint
9 C7 @- t! J% N' |DCL:grant / revoke" ^! \' O* k% l( D9 C! G0 \! r- W

& b! G# u' V' ?+ g" M1 M一、DML操作7 G( ]# O% m/ o& U$ Y! H2 |; E
1.insert into...values...
# w# g: w. R: k--1.1.不写列名. R9 \3 e" h& }- D  I" |& j& E: [
--必须提供全部的列数据,数据的顺序必须按照表结构; y& y. `4 ?4 d
--如果有数据没提供,用null表示
: z; b1 n1 J0 u! _9 j: m% B; Y* Iinsert into dept_ning# f' `% ^, F' j  S; Q
values(66, 'market', null);/ R7 K( y6 E$ W8 I9 S

  K: \1 s* ?% I9 K, Y' `insert into emp_ning' s  w( A, O/ h, B( Q
values(1020,'rory','Programmer',6000,null,null,
: a: x. Q, z+ A2 [/ hsysdate,10);
) X9 s5 R$ o. U6 E2 E7 G$ P  q; m
--1.2.写列名
2 ]" t- n; e, N4 U$ R: O1 P3 X. Yinsert into emp_ning(empno, salary, ename, hiredate)# T+ [! O# w4 U4 i
values(1020, 6000, 'rory',  7 J3 S0 X# k" Z0 ]
to_date('2011/10/10','yyyy/mm/dd'));2 w0 m: W. o' x, T; q

; A/ A6 }( b1 E- v% l4 }--to_date函数是oracle独有的。
: H/ r! Q7 I% @; k( D' O--在oracle数据库中插入日期数据,一定要用to_date
/ X" b0 w9 ^2 X& b  }处理,不要采用默认格式,比如:'10-OCT-11'。
  w$ @- m" P" b
2 W, [- J9 S% w0 S6 m--建议采用:写列名的方式。即使是插入全部数据,也' G* Q! L* n! P( y9 E5 u, V' Z8 {
建议把列名写全。" r/ {7 F' ^5 c, J5 h$ c
--复制全表
; S  E* j! N, f$ t2 f# Z" G8 r& Ecreate table 表名
+ y. O: I  X! d6 j. G8 k. \as
/ P6 g: r: L2 v/ |6 |查询语句;
' I9 h$ f! c6 r) d5 V+ i6 @+ e# o8 _' K$ b( ~
--只复制结构,不复制数据
" R7 B- @' V+ ?6 b" ~  g4 ~1 c6 Bcreate table salgrade_ning1
# l  I3 [: T- E/ c: D; T9 b! \1 tas
/ `! y1 z* q! O' B& nselect * from salgrade_ning
% [* I3 ^) O( g; vwhere 1 <> 1;
; L3 ~5 C# L. k+ t4 h
- e2 r  ?# n7 F* t8 G--复制一部分数据:给查询语句加条件。
9 |& R5 H! q  w) t/ ^--如果查询语句中有表达式或者函数(包括单行函数和
* _% w" {0 c& Z, M: \3 L组函数),必须指定新表中的列名" q4 X; m% T- x/ Z5 b
--指定方式:给列设置别名;或者在新表后指定。; Z0 v- b* ~# _; q
create table emp_ning1  b; ~2 q, C/ Q1 h4 r( N4 D2 H7 c6 p
as
; v, ^1 X, A: P9 v1 `4 J" Dselect empno, ename, salary*12 year_sal9 V0 q; f+ J% U$ m, u
from emp_ning1 `: d) c) {3 {: l  p
where deptno = 10;/ [5 E' ?+ T$ X8 G& o' S% z3 y

6 C  e4 o- y- r5 l/ zcreate table emp_count(did, emp_num)
4 N% S& t4 S2 O! T; [) o2 W/ H) l9 ias2 s1 }( {# e6 C, @2 B* I' R
select deptno, count(*) 2 c  r0 b/ t/ ^: h, G
from emp_ning. U5 S4 I" U  Q# u# y
group by deptno;: l: P+ ]& D6 a- A% v4 I7 x+ ~

; S# p8 i; k0 I) Z& t4 c! D* M; q--创建一个空表
; e+ v  Z/ E2 S' ^; G; M7 T% vcreate table emp_bak10 r7 Z- x0 _/ A& N: Q
as# L( @5 x5 M6 `: k6 r& o# D* {
select * from emp_ning( N5 b$ A* k6 l# D! _" S
where 1 = 0;
. K9 I' R" e# g4 z5 u8 B
. M2 e" K  _( G1 h" F! R; B--向表中插入多条记录
; Q; j8 `1 g6 t0 o7 X7 u% [insert into emp_bak1
& ]5 X" p" F% N; P9 c; f4 j  F( v(select * from emp_ning6 R+ t# g. q/ T' N) i
where deptno = 10);% }6 ~5 I& u$ Q4 n
" q1 D# B% D6 @$ D# n5 H
--把表中的数据换为部门20和30的员工记录- o2 B% Q! {1 ?( t4 B! s! M
delete [from] 表名; --删除全表的数据。/ i4 O. e8 f9 w, H0 P3 u$ N. V/ z
delete from emp_bak1;
& g8 ?3 O- m6 P$ Q6 ]: `5 u% w8 ]" w0 ?
insert into emp_bak1: G. g6 y3 l9 V  B/ W( G+ n7 z" S
(select * from emp_ning
$ {! \. d: k" e" L) Pwhere deptno in (20, 30));, k& t6 D; U. M$ ^

/ s  {; p+ W) v: b$ `! w( B* V--向新表中插入指定记录数的数据,比如前8条。
. |: V% F& V% V9 b$ D* Q7 idelete from emp_bak1;
. A$ `  o0 s, [. i6 g7 j
5 j5 j  b2 j' i% [( ginsert into emp_bak1! A7 O  `/ X8 F
(select * from emp_ning
' L/ [: {" ]1 Y/ j" mwhere rownum <= 8);
/ y9 E+ x' X9 c  y/ _9 l! J1 p: ~' {5 a& L- p$ q$ Y/ i9 s
小结insert:
$ t1 m: F4 y+ N& ]% L% W7 N1)insert into 表名(列名,...) values(列值,...);
* w& [$ z4 p9 w- ?: `' n/ K一次只能新增一行。
4 c) D! I' ?# F1 v0 P2)insert into 表名 (查询语句);: F, T1 e' O" J  I9 ^
一次可以增加多行。3 E, L6 \% J  J7 J* O: Q
9 q6 ^& a' @/ O9 P9 I
2.update:更新数据
# q2 b5 @# W7 D8 F6 hupdate 表名 set 列名 = 新的列值,
' ]; j$ n4 R3 k2 w  d) ?                列名 = 新的列值
4 m4 _2 R$ M( X4 g* dwhere 条件;  O3 }3 I" B& m0 G
% R9 t; ^2 F2 n3 q9 ^
update emp_ning set salary = 3500, 9 o; L) Q& n1 d' F8 G  j% t
                    job = 'Programmer'
7 p, a) m1 M: o5 dwhere empno = 1012;3 S; @. {: R0 m' F# t

6 y5 @. X% Q$ O--部门10的员工薪水+1000
* P5 Z7 V7 _  p( Mupdate emp_ning set salary = salary + 1000
9 B+ D& X1 c6 Dwhere deptno = 10;
! h( G+ T3 O$ w& w) x; Y/ w' w7 E9 H% a
--更新数据表时,注意条件。
- _" ]0 g, j! H--如果不加条件,影响的是全部表记录。2 N4 y: f9 }; c. S

3 r1 D, q7 S* \  C: f3.delete6 e3 b5 }8 v3 w7 Z
--注意条件。4 V/ @. D+ i) I1 [3 |* I
--如果不加条件的删除,将删掉表中的全部记录
  e- U+ @3 _) }. S9 H/ R. A% q--rollback 回退,commit确认。; {4 A  _# G! T  c1 w! @
delete [from] 表名 where 条件;- O9 z: \  r2 Z0 m5 `2 \
" H3 t+ l4 o) s- ]( t2 ~1 g
delete emp_bak1 where empno = 1002;
) {3 I1 ~0 `0 O9 d: Z- C: j- z4 S  ]8 R% @
delete emp_bak1 where deptno = 10;
9 }; H! g  h+ M6 r6 P  m. t! e. c% w9 A+ V
delete emp_bak1;& |. f# S1 r4 A

5 S* D& M( K) H8 q$ |/ V6 mcommit;
2 Z! H' w( G! k; I, X& O) n) b* H- P5 O3 X9 C--执行了3遍
) N  E& Y+ k  o% q' V  Ainsert into emp_bak1(empno, ename, salary)" K1 W4 o/ U1 }& X, \" A# e9 Y  e
values(1015,'amy',4000);$ o2 B7 c( w5 w* `/ M2 n9 u
--执行了2遍
1 x. C+ ^( |+ i, N& W* H& w3 h& Binsert into emp_bak1(empno, ename, salary)
/ E3 S0 }0 l7 C+ Y4 `) t+ A/ {values(1016,'rory',5000);
* v" |$ ?* A5 m- D--执行了1遍。
! f6 \, i4 w+ `$ V  J; Rinsert into emp_bak1(empno, ename, salary)
- Q# l- k1 N, K3 Y& n/ evalues(1017,'river',6000);
. H) \5 }9 C1 S+ R" g4 x* D--创建表emp_bak2,只存放不重复的记录
7 N/ w6 t" I4 m% G: Bcreate table emp_bak21 U7 |: m) P+ Y! c' I4 F
as4 e6 a( d- d! r; P' b# o- s: [
select distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr( p8 e. _  c: M& Y7 D9 f; g3 g7 W
from emp_bak1;% H2 \* W. z7 b2 I+ r
--删除表emp_bak1. l6 a( R) N: }7 H8 k! n( s
drop table emp_bak1;
4 s+ \9 E. X: ?5 F: I--把emp_bak2改名为emp_bak1
9 N  }7 {3 h) L7 a8 g) p& L: o9 Hrename emp_bak2 to emp_bak1;
; [6 H4 c& P+ ~% S: w0 w4 r
! D; g& U- \1 ?8 E( V___________________________________________0 `8 _/ E% P& Z  [6 f) E
$ V( E' k: y4 B2 G. t5 H

& N- T1 Z3 j" C" q9 y7 {delete emp_bak1;
" k% m8 P, I, q! v9 P: ], t8 J, M( t/ D
insert into emp_bak1(empno, ename, salary)
1 p/ }0 z* b; N4 P3 u0 D* zvalues(1020, 'amy', 4000);
! y1 p" a8 i: |( o& s+ |insert into emp_bak1(empno, ename, salary)
" \& F# I: Z/ I5 ]2 v* Ovalues(1021, 'roy', 5000);
4 {$ v2 X1 ~; \1 h% H4 @, ^9 X  einsert into emp_bak1(empno, ename, salary)
9 D% v* [# {& V+ d& b& Ovalues(1022, 'river', 6000);9 W* L: [2 L& m1 M! ]
: M; ^# B! O7 f
--rowid是Oracle数据库的伪列。1 x1 B4 h* s7 I
--rowid是Oracle数据库独有的。
. B/ b- v0 c' }( a7 C  m; F; g8 A3 g delete from emp_bak19 v7 L) k+ s: i6 f* N
where rowid not in (2 S7 |& d! L5 U" C  _3 ~2 A6 D
   select max(rowid) from emp_bak1
0 J# {6 }& _1 _   group by empno, ename, salary);/ l1 Z( y( \5 l) S' s6 o" u; J

  ~4 m% \8 O' x: H$ K/ K/ Z二、事务:Transaction+ V* w) j! w. C& J- n6 N- k
TCL:Transaction Control Language8 t/ m  q9 O: h7 N# R
commit / rollback / savepoint; N3 j) Y; V' K. L
事务:一组DML操作的逻辑操作集合9 N: h2 Q/ y5 k% W
          ***
9 I- j- o1 C. N7 \) }3 c4 _4 L1、事务的开始和终止& A6 }4 a$ Z/ k, N/ z$ w
1)事务开始于上一个事务的终止或者第一条DML语句; d. i) v  Q  n5 r' a2 M3 J6 h
2)事务终止于commit/rollback显式操作。" h5 y/ o/ I& v- G( V
  连接关闭:隐式终止
! H+ l1 K. f! N( N' X  DDL操作,比如create:隐式提交。
$ ~# F& K: L1 p" U( Y' n
$ \1 k/ L6 ~1 c" H- Minsert into ...values...8 Y5 l/ u9 ^) e5 Z: ]
update ...0 j' \' `7 S" v; Z5 u
delete ...
5 y% E; b7 w% l- e$ z+ ?1 ]0 i; Z/ Yinsert into ....5 D5 A& f: k" H' Y
--rollback;--回退到事务之初,数据的状态和事务0 l$ h  [% P5 r6 D
开始之前完全一致。2 d0 {4 v+ }0 S" f6 \9 L
commit; --所有的数据改动提交。/ z- a, ]8 J5 k" ]; w2 j

; V: D" n3 q  O7 u9 h# q& _2、事务中的数据状态
5 ]; w- [% n* k5 V& m0 Kcreate table mytemp_ning(& c" S7 J7 s6 D' \
id number(4));
) _1 _" T- J  D9 \5 D7 Sinsert into mytemp_ning values(1);
" u  ~8 [7 i& w( Z, r3 ?insert into mytemp_ning values(2);
7 K7 g0 m, U$ H3 |' x/ l. }5 U6 V; Y% K1 N9 |1 _( t- Y( H! X
--事务内部的数据改变只有自己的会话能够看到
7 V6 f8 ]* p( h8 Q& B2 c--对事务改动的数据加锁,事务之外不允许操作。2 F  Y0 s6 |2 o' r" R* F% q

" {1 l' n' W$ f; D如果提交:commit
. z2 G. I) w7 x0 O: T# V数据的改变被确认。所有的会话都能看到这种改动。
& X  C' E; c) W数据上的锁被释放。
9 y3 l3 r( {8 w9 Z: P4 H保存数据的临时空间被释放。
8 Y, R( E" I* O. D* \- [" t9 A" O  O! M* y6 a) l
如果回滚:rollback
6 ~8 [# l; |# w; @数据的改变被取消。- ?% }: t# h" w" \% C
数据上的锁被释放。. ?  C4 E  f3 m8 x
临时空间被释放: ]9 W# s% I2 w+ E
create table mytemp_ning(id number(4));
( |) Y6 Q/ [. h2 _; Q--事务起点
2 x" q+ c& V) S8 d* I$ r3 binsert into mytemp_ning values(3);3 i! f4 _1 [5 h( T
savepoint A;8 q2 x: G9 e. M2 H! }
insert into mytemp_ning values(4);, l% p7 f; u' `$ F
savepoint B;
! U5 Z* p( P+ [, e: s/ k- ?insert into mytemp_ning values(5);4 i! g! V. L2 _( r
rollback to A; --回滚到保存点A,A之后的保存点全部被取消
7 K* G. q6 R3 j2 R- U, S- oselect * from mytemp_ning; --3保存,4、5回退
" e6 b: c4 k( U& w* t2 {
; K1 u' D: z- ^- {- M* |三、DDL$ Z& O/ V$ v' ]0 o3 C! V1 u
create / drop / alter / truncate
0 N& e6 Y" q* d( k' R; t: x; |& E8 i# [) t
数据库的脚本(script)文件main.sql:0 V$ p! ?0 |3 X: j$ |) _% K
------------begin--------------------$ ]6 l/ z% F/ C3 a
--删除表emp) R3 [* w- h; ?1 r& b% h$ l! w
drop table emp;
7 {" P& Z1 R- j: w8 o' B--创建表emp8 A- t7 X6 n, I# C, V( A
create table emp(id number(4),; v. a; S* ^& B
name char(20));5 e4 U( x! I+ X5 X$ j
insert into emp values(1, 'amy');- ^+ R4 A* x! [
commit;9 _9 o5 X8 n1 L$ z8 b0 ~

* Y9 H4 y2 X- J) ^9 ?  O
* s1 S& M2 A/ x  e9 _

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


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

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

   

关闭

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

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