我的日常

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

动态微博

查看: 1826|回复: 0

Oracle增删查改 day04

[复制链接]

45

主题

5

听众

119

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-06-02 19:42:13 |只看该作者 |倒序浏览
1.内连接
7 c( M. @6 z1 B- S% G2 I! F. n  b
: I) }! Q3 O4 i6 n2 H" ut1 join t2 on 条件
/ @" r0 R7 K; s7 q/ ^! \0 J+ e* H1 @5 g2 y; Y$ e, }
1.1.等值连接:如果on后面的条件是等于。
3 X+ _' H! V% U; F) Z( I& \7 D9 gt1 join t2 on t1.deptno = t2.deptno" J' ~! j, U6 V& b9 B' p: n0 C# I
1.1.1.等值连接的一种形式:自连接
$ O7 e% O* o, J7 y" Y/ i# \" V, ft1 join t2 on t1.mgr = t2.empno
" C$ @& u8 _, w# r
1 \, @! L& r- a1.2.非等值连接:on后面的条件不是等值操作* ~, b2 a3 L2 e9 ^8 ?% @
empno ename salary         grade lowsal hisal
7 E& v* c8 I# h, J/ q------------------         -------------------
6 b! ?; C) [) _+ ~2 d& b1001 zhangwj 10000          1    10001  999991 ^0 D1 T+ i: X* g
1002 liucs   8000           2    8001   10000  9 u( m, M" Y  N. v
1003 liyi    9000           3    6001   8000  {+ h/ Y" y% @- A
1004 guofr   5000           4    4001   6000
/ m- A0 k- v  z4 Z# G# L# G                            5    1      4000
* {; V1 ~; W* a$ C/ f--步骤:1.建表;2.插入数据(commit);3.查询- c* x/ ]7 s7 z) B, Q' r: g
create table salgrade_ning(
3 w9 V2 f1 Z9 Q  @0 `grade number(2),
8 U6 L6 j) \' ?- Dlowsal number(7,2),
% X( e5 ]4 B% S- l% B) Ghisal number(7,2)) u$ `; T  ~. C) z6 h* ~3 a
);. U0 |' b  T/ E* c8 [
insert into salgrade_ning values(1,10001,99999);
2 g8 x* T% ^4 z6 H( U1 rinsert into salgrade_ning values(2,8001,10000);
0 v$ y. W5 P1 C4 ~4 finsert into salgrade_ning values(3,6001,8000);: o( q  F. v" I
insert into salgrade_ning values(4,4001,6000);0 a) b* v, r* \# L: N  h; Z" ~* O/ F
insert into salgrade_ning values(5,1,4000);! }; y$ V5 [: J7 Q2 K  s0 w, Q
commit;2 M% |6 P6 J  L5 p+ W0 `- R/ J3 }
--计算员工的薪水等级:! [5 N' ^9 X  H
select e.empno, e.ename, e.salary, s.grade' ~  o5 ^$ P- Q$ s. I5 P. T( ~
from emp_ning e join salgrade_ning s5 M. V, h& G; l, d
on e.salary between s.lowsal and s.hisal;9 p$ ^' {7 ~5 ]+ Z/ j, w5 v' l3 Q
--最终查询结果的形式:
$ N: T9 Y4 t4 B+ e1001  zhangwuj 10000 2
" S- h. `2 b/ e* [/ Z1002  liucs    8000  3  
& p( Y/ O, s& @3 L# D
2 a. S) S0 i% C. o" t2.外连接3 P* d( o' y" {6 g& A+ F
t1 left | right | full outer join t2 on 条件
1 O' t8 t/ D, @0 F0 g, L3 G" U3 ~) n, N  n
SQL语句的种类:1 ]- y' }# [) e$ U; T0 H+ ^1 p( D2 \6 ]
DQL:select
( x5 e9 g. S4 u9 p! F/ mDDL:create / drop / alter / truncate
0 Y/ c- g8 ?$ i% T. ?- yDML:insert / update / delete
$ c- r! D  u; ~2 w4 ^% ?( YTCL:commit / rollback / savepoint
, H1 [2 h" y0 k$ IDCL:grant / revoke! j6 c- n% @: U' _  g$ W

1 p) E' t  S- x; f9 u6 i1 s一、DML操作1 `) `% C4 f* d; _1 t% T
1.insert into...values...* I. ^3 L, ~, p. j' q) b. M
--1.1.不写列名  j' y4 V% c, P  O" i9 u
--必须提供全部的列数据,数据的顺序必须按照表结构/ z8 v0 I/ x* H% x% i
--如果有数据没提供,用null表示
2 O1 i* v) H& F4 r3 Vinsert into dept_ning
( n& @- _5 A) T9 U1 P/ Zvalues(66, 'market', null);
2 T4 ^* B/ a, p# p9 u3 \
( C  z) w: E$ A4 O6 X) Uinsert into emp_ning1 _" O. `0 {& X# Q- y
values(1020,'rory','Programmer',6000,null,null,
6 t7 s! i5 c; f4 W+ c- Tsysdate,10);. }% e9 N8 j5 ~  Z% q6 F! J

) j' `1 U* p: o--1.2.写列名
7 n$ j& G/ ^+ U8 W4 y' N  winsert into emp_ning(empno, salary, ename, hiredate)
: }4 W2 m0 a0 ivalues(1020, 6000, 'rory',  
2 {4 z  Q/ \; {$ {7 bto_date('2011/10/10','yyyy/mm/dd'));
) U; j% s# l7 j; v8 O
/ p+ `* G( i& `( t--to_date函数是oracle独有的。
2 c' `/ h% V  z# m* ?: A--在oracle数据库中插入日期数据,一定要用to_date/ Q+ i1 H6 C1 |  y/ \3 d7 t6 w
处理,不要采用默认格式,比如:'10-OCT-11'。
* G% A6 \4 S4 G# h
0 j# d- u4 e, X! ~, l: l2 h--建议采用:写列名的方式。即使是插入全部数据,也6 F% Q( T8 G* {2 ^
建议把列名写全。) d# I0 n0 [; k  {; n
--复制全表( h5 ]0 K/ W1 x7 L
create table 表名
8 t! m& B) ^3 p- P$ Vas& X2 q: n! y. r0 j/ T
查询语句;. B) ?8 \7 }' t" y- W, I, b) [
: Z$ \  A" i. Z+ a5 t% z9 ^
--只复制结构,不复制数据
/ d1 [# K& r& k; H, Vcreate table salgrade_ning1
* ^$ C( ]6 Y- s& B# Aas' W0 `$ b- C7 q9 M4 @$ p
select * from salgrade_ning% `) u$ n8 a9 P! e4 V& L# A
where 1 <> 1;
" I1 y( C' i! |% `$ J7 C5 h. r- O/ {1 J: P
--复制一部分数据:给查询语句加条件。
3 Q7 W1 ~+ m% r# M& f  M0 S--如果查询语句中有表达式或者函数(包括单行函数和
4 ]6 j, B9 N0 p3 a组函数),必须指定新表中的列名3 }) Q6 \1 t3 v9 D; [# I
--指定方式:给列设置别名;或者在新表后指定。7 @+ E! Q' ]% N# @5 n
create table emp_ning1. W# S! u1 Y, M
as
. C3 ^* k" m& t& k1 }. |" ]select empno, ename, salary*12 year_sal& u: I4 h- \' t+ [. [* v, I  U
from emp_ning5 U: Y. s8 U* k# y5 x7 p
where deptno = 10;
$ {. v. _6 H% g2 {3 n+ r$ Q# @/ O; o8 X( f- v
create table emp_count(did, emp_num)/ j& E0 U- A5 P6 H" h$ f
as
8 v  B  F5 j1 Y$ `; Bselect deptno, count(*) & s3 W' |4 H+ u2 }( r+ w" K
from emp_ning* w* [0 H& t# G# ~
group by deptno;% ]) @3 w  b4 @0 o$ r
9 r* \, ^3 f( y+ W$ f7 d4 `
--创建一个空表, o" ?2 c0 m; |. m
create table emp_bak1
/ V* f+ h+ G2 N& w) C" ~5 z# U# Vas/ |# K3 C3 s" i4 L3 {% B
select * from emp_ning
' \7 N3 {! |  F4 J) U7 kwhere 1 = 0;  i" Y$ F8 N: X& ]

' d0 D9 Z# C9 O5 U--向表中插入多条记录
' {* S5 _5 U/ ^6 u7 |) R# b% Winsert into emp_bak1
/ F( N( [; A1 _4 ]9 ~. i& b(select * from emp_ning
& j5 a) g3 G) K5 {& i9 { where deptno = 10);
( p4 h" i! U. q1 [9 y' W1 X  D# a3 f* e: ?8 y$ ~
--把表中的数据换为部门20和30的员工记录
: U% F+ G. S% N3 _! \' idelete [from] 表名; --删除全表的数据。
# H6 ^, w! d9 Jdelete from emp_bak1;7 }; ]# Q/ ]- r! M1 P  i

3 J" G3 K5 i0 k: x4 k+ a. rinsert into emp_bak1
2 ]* ?1 u1 l6 n% ^0 f(select * from emp_ning
5 p5 j8 o( ~/ b4 G- Swhere deptno in (20, 30));
/ T/ T* [5 A. I' P: n) s) v: O, p9 V1 R/ n# g8 K1 g  J
--向新表中插入指定记录数的数据,比如前8条。
  |3 a/ W7 P3 Y% ~! b& a" Zdelete from emp_bak1;
4 c) h9 J1 Y% i/ _; N
. N/ ?8 @' U* S) ^$ s- j% y) vinsert into emp_bak17 n1 q% ?- O. K% w& X- k& a
(select * from emp_ning
3 j9 c+ f& j2 i& M1 c, h/ D+ K/ gwhere rownum <= 8);- e, S5 E+ f: q4 k

: X8 k7 F, V6 n  N小结insert:
& C& W1 m% R9 b! ^2 H# @4 z7 P1)insert into 表名(列名,...) values(列值,...);
" r$ L- N" m: E- L3 X' r一次只能新增一行。
' Q/ W( K- E( q, _2 D2)insert into 表名 (查询语句);+ r' P) S; u0 s2 v+ W, z
一次可以增加多行。; B% o% ~* I5 V' a9 @" J, p

1 \/ v0 W& _' W2.update:更新数据; \- G9 p8 O+ y& I; T. d5 V
update 表名 set 列名 = 新的列值,0 j; n2 X9 }% P% v+ ^5 E; a( N
                列名 = 新的列值7 S+ _: v' s% s/ h+ d* i
where 条件;% B5 P5 L4 {" g

. r" p( H9 ~8 W3 }* P! v, ]update emp_ning set salary = 3500,
- h3 O# F( g3 V* t3 K' G+ @  y2 L                    job = 'Programmer'! F  J& M* c9 P" ~
where empno = 1012;- l% @0 b  a( e" I/ u, D! b5 A
# Z' z* {/ `* ]3 U( X
--部门10的员工薪水+1000
# Z- `. y; z/ Wupdate emp_ning set salary = salary + 1000) X# _* w  c- D8 V1 j7 K3 @5 n
where deptno = 10;* `+ E2 a$ A2 r! Z
* \9 Y! B8 Y7 E( P7 X6 i
--更新数据表时,注意条件。
9 ]6 m3 r1 t: O: V--如果不加条件,影响的是全部表记录。
; s) a% C; A7 J1 V, r
" M# h- G" ^6 n3.delete% r+ ?) W, M: [$ X; C) w
--注意条件。' q9 h% A6 N4 ]. V$ I8 `; |1 {  z, q
--如果不加条件的删除,将删掉表中的全部记录
* r8 k, R% `3 }8 D# B0 y--rollback 回退,commit确认。+ n3 T8 n! |# N1 X$ D
delete [from] 表名 where 条件;
: T4 j" d7 D  k1 V# M$ a) n  |8 L$ P2 S
delete emp_bak1 where empno = 1002;) Y4 K/ p/ L1 m/ I. |0 o) T
/ \. h" y5 [9 m; x
delete emp_bak1 where deptno = 10;
- B; Q5 d* q* d* n( b; s* i
" {: w* A9 h2 V; `* B% xdelete emp_bak1;
, F% q8 n* a  }
5 J6 F4 M# s. A  b/ ycommit;
6 f+ ?' u* I$ C9 P7 e--执行了3遍+ p( `- m8 B4 d8 D8 b0 E" x2 m& a
insert into emp_bak1(empno, ename, salary)4 ~% b  W$ u! R! ^
values(1015,'amy',4000);
+ M5 O  f$ h/ d  b! f+ r8 Q--执行了2遍# l# m& g$ @# i* {- K# l
insert into emp_bak1(empno, ename, salary)( s9 M6 W% a, b  o: u% M6 ?
values(1016,'rory',5000);
) i& z0 a, f# l! }4 |5 _--执行了1遍。
! {) P7 b/ N1 @( t, Oinsert into emp_bak1(empno, ename, salary)9 y: n2 _' B1 }8 W6 o2 }& E, I
values(1017,'river',6000);
  v+ u' p( a* u$ x$ ~0 N--创建表emp_bak2,只存放不重复的记录1 l# B1 F6 i# w9 S8 I
create table emp_bak2) |2 D% P  N3 ~3 \6 {  G- |
as
" W; a  B9 f+ s/ K/ f  U$ Wselect distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr, {4 o3 I4 Y6 I) e8 B
from emp_bak1;0 u% X% }0 |" e/ H9 p& ^- ?5 Q- G
--删除表emp_bak1$ y8 o! W. V! ]( p6 U6 H
drop table emp_bak1;/ N- ?6 ~& Q7 L# u- |" n) \4 I8 |
--把emp_bak2改名为emp_bak16 U$ e& {7 J! c- e& u, @* y
rename emp_bak2 to emp_bak1;
! L- l$ L( R6 m! z. A" o4 F/ P. s# O! J# w! N1 e
___________________________________________; p1 d9 s# W3 C9 g4 K3 A6 L! X

' D% I8 I5 V) M4 ]7 l+ F& Q: k* y6 q9 V
delete emp_bak1;
8 {0 \. Z0 W+ v' l6 T$ u% E* ?% e! \9 k6 l
insert into emp_bak1(empno, ename, salary)$ a  ?, m+ l$ [+ p* L' M* k+ e4 N
values(1020, 'amy', 4000);. {- o) `$ W0 \: S
insert into emp_bak1(empno, ename, salary), P! y7 X9 S) O! z" R+ u
values(1021, 'roy', 5000);
" N6 [9 z: h8 }insert into emp_bak1(empno, ename, salary)2 z+ N! f9 s( R2 s% D; O
values(1022, 'river', 6000);& H0 V0 ]! _0 ^$ i0 b

$ T' ^, @* V7 m  Y, ?6 ]$ e--rowid是Oracle数据库的伪列。
2 W9 y( r! M7 W9 n$ D' s; f--rowid是Oracle数据库独有的。
- m) X; b: Y1 l! n& G2 D# Y! V delete from emp_bak1! s0 C% w- W8 H' l7 K
where rowid not in (
# s$ M6 C0 F% Y$ R/ r   select max(rowid) from emp_bak1% j7 J7 n5 t, v% L6 M
   group by empno, ename, salary);9 T' }- H, q- o' H8 b* n

; p6 b/ Y2 e" E6 e二、事务:Transaction  e- k' K) k* h0 C
TCL:Transaction Control Language9 q7 T) |# M' [" u" v
commit / rollback / savepoint
3 v4 t  E# b7 ?+ M9 u) M+ Z事务:一组DML操作的逻辑操作集合" m$ R* I. u$ [" p
          ***
0 H; a' W/ L( ]1 L7 q1、事务的开始和终止& V0 u6 F: ]! A( n/ V3 a
1)事务开始于上一个事务的终止或者第一条DML语句
3 q8 y( a/ k) X* }' w3 U6 U7 i2)事务终止于commit/rollback显式操作。# k' Z# g8 S1 J: E3 u$ B
  连接关闭:隐式终止( S' |4 T, I- o: P! z# J
  DDL操作,比如create:隐式提交。7 b( L. b* U7 q4 I" L
7 e- @! v2 q- q- p& G' o( @( ~
insert into ...values...
& m7 g5 I  k7 i6 Jupdate ...
  O0 m' R3 d8 b4 d# z& {+ o+ v0 B' Vdelete ...
) N) E! n' {8 D# ]: p& q% Finsert into ....9 d0 U+ g) }% p0 K8 j8 ~7 E
--rollback;--回退到事务之初,数据的状态和事务: r1 x1 `, [% p2 {
开始之前完全一致。
3 K' G  n& L( o% h( c+ _0 w' kcommit; --所有的数据改动提交。
, h8 {/ T/ e" x* N2 W. Q' A$ O$ A& C2 A( i& v9 x  S* x) F  l
2、事务中的数据状态
5 i* d% h! H: @6 x9 icreate table mytemp_ning(
+ Q2 P9 \: r# u0 C% `id number(4));
& X% T+ C7 k- v5 Pinsert into mytemp_ning values(1);+ I/ K3 u; S- [
insert into mytemp_ning values(2);
) N* Y1 P3 N' v3 ]+ p% ?3 r
6 _+ R- O4 i* Q4 B7 C" e  O--事务内部的数据改变只有自己的会话能够看到& O3 P0 k7 v* n$ F; M) j
--对事务改动的数据加锁,事务之外不允许操作。
8 ^! |2 M4 F4 @& Q/ m. T8 Q/ @9 I5 S) F1 s& S
如果提交:commit
8 k7 U& [, A/ }* V9 d$ d数据的改变被确认。所有的会话都能看到这种改动。
# U/ r  v: n0 ^- L: Q: G; d/ k数据上的锁被释放。
. m% k( Q! B+ q, J, l保存数据的临时空间被释放。9 P3 M  M# o) r

; D' i) M  g( u+ u1 P) Q) o如果回滚:rollback
+ J  E3 v* m+ e9 e* M* ~$ I: p5 j数据的改变被取消。$ N. S6 B. M4 ]4 P, x& v
数据上的锁被释放。
0 Y! x6 m* H) @临时空间被释放4 O* h6 \9 Q3 I1 F7 ^8 g
create table mytemp_ning(id number(4));0 M3 [3 ]) L& z+ b8 c4 s) M
--事务起点
3 P7 `8 q$ `& H8 @1 Q. {, winsert into mytemp_ning values(3);2 u1 ]8 K# Q' M% ?/ M
savepoint A;
4 J! B/ T5 v7 i! {% y: ]insert into mytemp_ning values(4);
6 t, O& ]3 j, e3 Lsavepoint B;( O2 M) s  ^  X5 C7 P6 J0 c9 A
insert into mytemp_ning values(5);
. }9 Y$ N, r5 Orollback to A; --回滚到保存点A,A之后的保存点全部被取消
6 b' ?/ A1 u6 n+ R0 U" d# pselect * from mytemp_ning; --3保存,4、5回退' g7 i2 ^$ I2 |5 z3 ]4 L8 Q. W
0 d* T* z. L$ v* p; X4 e; _( E4 R
三、DDL5 N% W8 W0 B& e9 `- I) O) Q
create / drop / alter / truncate4 Z) @  f9 N6 k1 t

& S$ }9 P$ C$ A# T1 ^$ ~6 b数据库的脚本(script)文件main.sql:
! X1 b. [& K3 b  D$ B# \------------begin--------------------5 C8 K$ j0 w5 J+ g. R3 T* R$ O7 G5 A
--删除表emp
6 J; ]4 |$ t* I7 `5 mdrop table emp;9 R9 q  \0 U* i7 X+ K3 n. n
--创建表emp/ @! z9 U& ]% I' z1 G8 e
create table emp(id number(4),
! ?- f4 E2 D' d0 P2 n+ N8 Dname char(20));
. a1 W0 P$ L0 p) g% E: o% V) |insert into emp values(1, 'amy');$ l4 A$ P9 E+ \# @  t
commit;/ {2 j3 |0 d' v+ h( ~% ~( r

2 J! a8 }) }% u4 V+ [+ u6 Z* ^0 M4 k, X

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


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

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

   

关闭

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

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