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