1.内连接 * h( p! V e. e7 S! A& f 7 k, u- S9 g, u6 q2 `4 {t1 join t2 on 条件 3 U2 k8 D/ O. I2 O G& e5 v# Y- ~" a! v/ u# v" P
1.1.等值连接:如果on后面的条件是等于。 " u+ a; y+ L' \! ?. A5 ~6 |t1 join t2 on t1.deptno = t2.deptno 1 L0 R+ R+ J( c! o* K4 }6 C+ i! Z" Q1.1.1.等值连接的一种形式:自连接- b( `$ C$ {3 J- _" A/ q u- {
t1 join t2 on t1.mgr = t2.empno 2 x+ q8 C1 P" ^6 f: g1 N0 @5 B% Z; M" S* G) S4 \2 \& D
1.2.非等值连接:on后面的条件不是等值操作* w+ Q. Z- y9 }: ~5 r9 q3 U; D
empno ename salary grade lowsal hisal& T" E' B1 G9 s3 t7 V6 W' F, C8 v
------------------ ------------------- 9 A3 s" z4 N* f, z! n1001 zhangwj 10000 1 10001 99999# d+ g. B2 ]. V* z* K/ J# y
1002 liucs 8000 2 8001 10000 1 |9 S$ m6 O' L! ~' ^# S9 s9 U1003 liyi 9000 3 6001 80003 z1 } \% T, D* O7 q* P* B6 y
1004 guofr 5000 4 4001 60007 f; O8 Z- n5 G- \
5 1 4000 ; j; ?$ h9 m6 P8 u8 t--步骤:1.建表;2.插入数据(commit);3.查询; p% v+ _2 C# R" z, C
create table salgrade_ning( " e. p: C' c9 `grade number(2), # l& D8 {4 {+ \0 u. T8 elowsal number(7,2), ) ~ y, G* ^# H1 w1 {hisal number(7,2)+ e7 V6 s2 N9 N b
);5 A/ @* ^* E0 e/ Y# B
insert into salgrade_ning values(1,10001,99999); ; M& t( U x" u3 e2 O2 k9 W' dinsert into salgrade_ning values(2,8001,10000); 7 S3 j% [9 }, I8 sinsert into salgrade_ning values(3,6001,8000); 8 u& c9 v, ]; C2 @5 _/ `) Z, S; oinsert into salgrade_ning values(4,4001,6000); 9 s# Y! C+ J% {) t( d3 }1 a% Xinsert into salgrade_ning values(5,1,4000);# G! G# a+ k2 D4 E# a
commit;% U% p5 _( Z+ i
--计算员工的薪水等级: 1 t% M, w3 |. e* s; x. e" vselect e.empno, e.ename, e.salary, s.grade ' u Z! s" s' D# `6 wfrom emp_ning e join salgrade_ning s 6 x$ t0 G+ i$ ?6 Yon e.salary between s.lowsal and s.hisal;0 }) u) t! x. d6 ^2 `& h
--最终查询结果的形式:2 q( u6 K( a# i6 s5 s8 n- {
1001 zhangwuj 10000 2 ! z( T7 |1 J- J7 O2 U0 _" z7 ~! V1002 liucs 8000 3 , X; G& a. g/ r6 o
2 Q: ]/ r$ ?7 M# p2 B5 X2.外连接 1 V3 j, H1 O/ s3 {" `t1 left | right | full outer join t2 on 条件 3 t2 O4 B; }( E2 _6 l) B1 o! w% I- e4 d }, P6 [
SQL语句的种类: 1 }! S9 n. W5 X+ @' p( z" pDQL:select + K( t" [8 ~2 tDDL:create / drop / alter / truncate6 e2 ?$ e( I; x# i: s
DML:insert / update / delete 2 r8 s! A2 B3 \4 w' L% FTCL:commit / rollback / savepoint 7 Z/ t! d5 k5 [DCL:grant / revoke 7 [, A4 K/ Z3 O9 T* A, w$ r& G/ e0 x6 F, Z
一、DML操作 + }- d6 i6 i9 D8 C# W/ d7 ~! h2 o y( i1.insert into...values... }/ l) ]) u {: D4 b5 D& a--1.1.不写列名 & M; ^# R/ H$ x! _) F4 o' x--必须提供全部的列数据,数据的顺序必须按照表结构9 g% F5 {4 t) G; w: U A
--如果有数据没提供,用null表示 " m$ s8 E$ d: [3 H! d3 @+ |insert into dept_ning( r( ?; o) l% r8 g* T
values(66, 'market', null);+ e1 n. ?1 X- U, l! y& v' g
- @2 h7 g$ s3 z! [+ w0 M
insert into emp_ning 0 c9 y- r3 e) z" }- xvalues(1020,'rory','Programmer',6000,null,null,! J$ t$ p7 ~6 ^ k" G
sysdate,10);# @2 h9 Z% c1 L7 c
1 }1 x6 r: {5 J2 e8 a) V7 w--1.2.写列名 ) M/ l" _; Z/ m2 Iinsert into emp_ning(empno, salary, ename, hiredate) & M- j+ B' L- _8 i i4 K8 o Nvalues(1020, 6000, 'rory', 9 p' P, O3 ^3 C* i9 v! Z
to_date('2011/10/10','yyyy/mm/dd'));# k* X u4 U, t( R+ ]
' }0 }* Q: r+ W; B$ ?
--to_date函数是oracle独有的。 0 b, V4 B& U5 e2 T+ c--在oracle数据库中插入日期数据,一定要用to_date * g9 D3 N% o7 g w' z处理,不要采用默认格式,比如:'10-OCT-11'。 8 t& v% q$ @ g) ~7 w) F0 D# r w" Q C* U
--建议采用:写列名的方式。即使是插入全部数据,也2 i+ N7 W# l. p! S) K& v6 _# r
建议把列名写全。 ' R9 x5 X- K' E+ A- h/ T0 U: `--复制全表 E% f6 O+ F* h! Jcreate table 表名4 b3 Q2 M* q/ R3 @3 o4 Y
as( P% _+ q: w) L6 Q! T( e% k- f
查询语句;- e- W& R6 X$ L% E& C/ C$ U# X
/ l! b5 c. @5 g! R7 n# _$ @& X--只复制结构,不复制数据 3 R+ `. K& l+ b0 T: u$ Tcreate table salgrade_ning1; [' M) z% u. O9 R4 j& m6 X, C
as 1 M6 D9 A5 x/ Q7 Rselect * from salgrade_ning 4 H' e0 ?- ?: qwhere 1 <> 1;! u ?3 }6 h2 Z0 Z' q8 Y# P
: ?5 D4 T( J7 a6 b$ C6 R
--复制一部分数据:给查询语句加条件。 5 ]. n% J7 i9 V. B--如果查询语句中有表达式或者函数(包括单行函数和& b- I' _1 C: @
组函数),必须指定新表中的列名 & k( c* R" q; S- Q. g2 x* X+ B--指定方式:给列设置别名;或者在新表后指定。 4 O8 b/ x+ G6 Jcreate table emp_ning1; n z g5 L3 _) | k$ W: m; o6 _, i5 P
as 7 w" l0 [8 Q7 G, ?+ }select empno, ename, salary*12 year_sal 0 I( t( N2 g" q1 V1 k from emp_ning 2 i% D! }( o7 j1 [2 j1 F/ s1 i- Kwhere deptno = 10; ( c* w' [9 m: i8 Y* l7 Q4 N / _1 P& z$ |( e' T/ O/ Acreate table emp_count(did, emp_num)- Z+ o W8 p, R# |2 @
as + A! ~/ ~& R0 O" Dselect deptno, count(*) 8 p/ M6 v4 b" k) ?7 {from emp_ning1 I% N" Z. a# h( ]" z0 g9 T; V
group by deptno; ! R: v! I9 J" f, y: G4 G" ~ D1 ?' X ; _9 t9 I1 @, G" j; |8 g--创建一个空表/ x+ x% z0 a4 l/ L; S/ [2 `" _2 V8 t
create table emp_bak13 O5 W% q R) _7 o* H- q, m# ~" @. p
as- Z2 e) g7 p' t* W8 a
select * from emp_ning* I2 \8 G; e7 m& n7 t' P
where 1 = 0;" o8 }; X+ ]+ S: R
7 K, N( V! N" _; y# n; M( c9 u--向表中插入多条记录+ D b3 d3 w9 n9 U! a" ~' B! u- ^
insert into emp_bak15 C3 @6 I9 _4 {4 R. ~
(select * from emp_ning 0 u9 b# A9 @7 Y# s% e& u where deptno = 10); 9 f' `; } \5 h5 w" t. B4 @& b4 Q; Y; {3 r' |" m
--把表中的数据换为部门20和30的员工记录% w5 b& P" m. B6 Z! O
delete [from] 表名; --删除全表的数据。 . v+ E0 b4 N. W8 Ndelete from emp_bak1;( @, k; f+ g1 _, O
. V& n( e! k$ y1 p H T0 g" l
insert into emp_bak10 F) D# M& [6 h+ ]& m& U* v
(select * from emp_ning3 A# ]$ }9 N+ ?/ @, i% w' \+ ?! h$ h
where deptno in (20, 30));- ]7 L! Q7 ?. x
1 V* u& i7 n4 n! d' m
--向新表中插入指定记录数的数据,比如前8条。1 L' m# N$ i/ Y V
delete from emp_bak1;/ q4 X( `5 i+ M- f8 o3 \
; o, Y; P2 d2 p/ |7 o
insert into emp_bak1 " g/ N8 Q! i/ E. x3 T/ X(select * from emp_ning 8 Y) X+ b5 }( d/ A+ Cwhere rownum <= 8);* D2 ?+ C- ~% ?0 Z7 W' G
7 J; G- W! a, \- |4 r- |* s小结insert:/ l: a* B* b4 q4 Y+ w
1)insert into 表名(列名,...) values(列值,...);8 _- a& m, Y/ P# _& q
一次只能新增一行。 : Z7 y6 I3 E/ p3 D6 C0 Q3 Y2)insert into 表名 (查询语句); 3 r. z; x! }# G! u1 s一次可以增加多行。 0 t1 ~) U+ `/ o+ h% p) o$ B5 W0 \- U/ b& u
2.update:更新数据" C1 o% P, C8 U" R
update 表名 set 列名 = 新的列值, F& c, Y& A5 K2 o/ }! i4 Z' o6 I
列名 = 新的列值 ) y, x( Z: G8 w% w* S6 F. q- ~( j1 Bwhere 条件; * m1 _+ t3 u; W/ Y 7 D/ l2 Y. ?2 Pupdate emp_ning set salary = 3500, ! E* {9 z: |4 w7 b. T/ x# k4 [ job = 'Programmer' ; b- J @$ o8 K8 D# S2 ?where empno = 1012; 6 i4 c- x# d( P6 A2 g . {2 R. e) k7 [5 g" t--部门10的员工薪水+1000 ) y: a9 z; |6 U vupdate emp_ning set salary = salary + 1000 ! M) |- C$ f- Rwhere deptno = 10; 5 i: f( K7 E& q' H3 P0 I O+ k8 I. }' w3 f; M6 z. |--更新数据表时,注意条件。2 g/ D' m) y$ p3 \
--如果不加条件,影响的是全部表记录。 # E+ {8 [% ]9 U3 ]( H n8 w) \2 e6 W
3.delete: p. \6 Z% [( }) p/ s9 O$ ^
--注意条件。$ m2 H* t2 q) }: `+ k b
--如果不加条件的删除,将删掉表中的全部记录 - k9 o/ x) U1 ]( a/ e# S: Z' F--rollback 回退,commit确认。- ]/ P. Y6 k$ I$ t% h! I
delete [from] 表名 where 条件;4 t3 G" a1 x* T T# D; L
; x1 Z" I; \" R' P1 x* _9 U" Jdelete emp_bak1 where empno = 1002;; W: M8 W0 @7 Z
" j3 p+ \+ \$ V1 A5 G% A- W$ m
delete emp_bak1 where deptno = 10; $ p$ K& k' {# w; z8 ]% O4 K' b $ s6 c2 N' O4 K4 ~3 ~& Z0 cdelete emp_bak1; 5 n/ e( ?* O ~: E5 J: M6 Z; D7 E+ y, D9 s
commit;/ ]- e! q! n) h; @
--执行了3遍 * H! o, z" ^( y* Zinsert into emp_bak1(empno, ename, salary) " O$ v7 H$ ~! l' u, d5 J: ~values(1015,'amy',4000); 4 ]) ]$ w$ Q1 y: w- F6 g--执行了2遍 ( ~) {2 S* v: C7 @4 Linsert into emp_bak1(empno, ename, salary) # [2 b5 P. E; [- Svalues(1016,'rory',5000); 2 [2 Y' r2 \) P$ q! M6 P--执行了1遍。# N7 f, ]) L) W! z9 o- v! k) }/ |
insert into emp_bak1(empno, ename, salary)% O' e l3 m, l/ A# H
values(1017,'river',6000); # R$ W- d0 w* [" H: x--创建表emp_bak2,只存放不重复的记录 & x; I# g4 b. E1 D+ N- ]1 Acreate table emp_bak2 0 K( u3 `& h9 T" A8 p: Xas9 _4 \' k* x2 N( b
select distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr + T- g' r5 b) S- S: y6 s* D' Lfrom emp_bak1; $ J; X1 n/ x$ S4 N% @--删除表emp_bak1 1 c' u- T6 @# w2 G, Qdrop table emp_bak1; 9 \4 x: J- @* @, r4 v8 [--把emp_bak2改名为emp_bak1 / G+ Z& [/ m: lrename emp_bak2 to emp_bak1; , N; g/ }$ A9 E5 m 8 a. Z) R8 q; r" o___________________________________________% M8 F7 x- Q ? k1 ^7 A5 T# Y
+ t; _: |; j! k8 M# p, B3 ^/ i' f6 b7 R5 x7 k& C& b) |. L
delete emp_bak1; 7 K q$ F$ K; ]9 f7 M4 Z " P7 Q. d/ ?/ r2 N8 G; linsert into emp_bak1(empno, ename, salary) ! F1 w' E3 _; V1 w8 Uvalues(1020, 'amy', 4000);+ J, Q2 a2 Y, E- I
insert into emp_bak1(empno, ename, salary)4 I" T/ R- [ g% s9 C4 B0 d& D
values(1021, 'roy', 5000); / p8 L6 ?) e* S+ q; G' z- _insert into emp_bak1(empno, ename, salary)" E! o: s; u5 ?1 k
values(1022, 'river', 6000);; s" [! T0 s% j7 g4 Y% q A
" U4 j7 [ q; B6 H) X8 ^& S--rowid是Oracle数据库的伪列。 6 W; n8 e3 f7 O--rowid是Oracle数据库独有的。 3 K* Y* C' q2 x& u' d* [ delete from emp_bak1( c0 l& V# \" q' N* c) w: E" l
where rowid not in (. N. A7 y7 u& `* W4 U
select max(rowid) from emp_bak1( ?% Q7 T( h5 K: F$ ]3 m, |8 k
group by empno, ename, salary);, d7 G8 |: H$ L, m
. v& p1 f- k; K9 x二、事务:Transaction # R; K+ o7 `2 j' _6 ?3 U' ] zTCL:Transaction Control Language 9 I8 q0 O0 c0 L! n+ _commit / rollback / savepoint " a: p' _. C5 _$ S7 F事务:一组DML操作的逻辑操作集合! s+ T, t c7 V5 }# ?
***3 P& W X3 V$ B" S) z3 B
1、事务的开始和终止5 q, y1 |8 ` B6 F" n
1)事务开始于上一个事务的终止或者第一条DML语句, W F- Y, B. D4 W8 T' j
2)事务终止于commit/rollback显式操作。6 _: V/ b8 j" Z5 o! f1 _" c9 f% q3 W, N( D
连接关闭:隐式终止2 w* v6 b6 o- y7 N: ^3 W P2 _
DDL操作,比如create:隐式提交。 - U/ o& O+ X" X) m9 w: x* U3 T3 E8 [( }$ P6 A
insert into ...values... / F. A. u# `$ |: k* Aupdate ..., e/ N. v) T) x+ j8 s& O
delete ...+ t5 ]4 E H+ v) z6 O- S
insert into ....; J% C1 U3 [, i9 |' y j# W8 t
--rollback;--回退到事务之初,数据的状态和事务* g- j2 E; S" \7 E9 b
开始之前完全一致。 [: d' {( }8 i" _4 |6 `commit; --所有的数据改动提交。) M X; n' j, H; N
4 Y1 u; n4 T9 I: s
2、事务中的数据状态3 y4 T, b7 D! ^+ s3 [5 N" g' g5 s- L
create table mytemp_ning( / s8 u1 g( F S2 }2 h$ |" Pid number(4)); - e# \: U; W( J/ v( z ?! k) [' T' Ninsert into mytemp_ning values(1);( R5 f* A, p8 e) `
insert into mytemp_ning values(2);! d# \% D9 @8 D, j7 _0 W- l
. x" S& c# R5 T- p; E5 F3 C
--事务内部的数据改变只有自己的会话能够看到 - c5 y3 x* ?- }. f--对事务改动的数据加锁,事务之外不允许操作。" R9 z" j- T2 |' s: c
* C" T$ s" ~# E( E如果提交:commit( o# b0 K* \' ~& O
数据的改变被确认。所有的会话都能看到这种改动。: U8 t$ O. L* l. y/ @3 Z
数据上的锁被释放。 8 V# r# }" Y6 y! d保存数据的临时空间被释放。 ) j( x8 i$ E) m @- Z8 {9 V/ t2 B
如果回滚:rollback 8 p# P4 O( N8 y- z" g数据的改变被取消。 9 j' b. p0 B/ ?4 x: y数据上的锁被释放。" [( R9 X! l, S* s0 I, V
临时空间被释放 % g4 |2 I# p2 E6 _+ s/ @create table mytemp_ning(id number(4)); " L' r6 @+ O% d6 b--事务起点' O+ M4 u6 a- T4 h) Z8 d' O! ?
insert into mytemp_ning values(3);9 M. h( {% h# N- |- ?; T+ v
savepoint A;4 ]8 C5 C. G! K) y& G$ P4 f% S
insert into mytemp_ning values(4); 1 k9 j4 o* y, r0 i: m5 zsavepoint B; # h7 C/ _& I4 pinsert into mytemp_ning values(5); ( t1 |1 {6 _% Krollback to A; --回滚到保存点A,A之后的保存点全部被取消2 [& ]7 s" {6 ^2 d* s
select * from mytemp_ning; --3保存,4、5回退 4 e, _4 T3 Y9 I& U# c. A- t; X8 H5 ^2 K8 I
三、DDL 7 V* y; V% l) G* N `create / drop / alter / truncate 0 ^" R* |! ^/ m2 J+ h9 U3 P ' k5 d# w; U: y, v; I4 K1 }数据库的脚本(script)文件main.sql: ; n7 U' {2 r$ U7 P------------begin--------------------& W* a5 {0 X7 r2 p* R4 b( V
--删除表emp, e( U% z9 H! ?8 a* Y
drop table emp;# G% ?$ m8 v! p8 L# P1 ?0 [
--创建表emp* Z9 ^6 t6 J4 I" g! N- T/ A+ s
create table emp(id number(4),% T7 B% y, {* N
name char(20)); ' c5 r" p d2 J" K2 Hinsert into emp values(1, 'amy'); 0 ?, H5 a9 n! t9 X, w! Wcommit;4 p( N9 ?2 W( ]( C6 E
0 Z; d8 k6 u9 t0 n: O8 j/ z4 v
& V0 Z7 H: y5 x5 U$ u" I [' ^