|
该用户从未签到
|
1.内连接
+ d% n# Q! R% ^( @
, Y& z- B1 H! \0 kt1 join t2 on 条件
$ ?8 \. b* {5 k2 k' i/ b- y% m& m; z% t t; ~1 l
1.1.等值连接:如果on后面的条件是等于。1 l$ E; p+ q5 W
t1 join t2 on t1.deptno = t2.deptno; y& N; ^' ` J, ^, l& n/ C
1.1.1.等值连接的一种形式:自连接
0 q, a0 o2 f5 i, T" ?t1 join t2 on t1.mgr = t2.empno
! f! Y+ ?4 s& S& b/ e b# ~2 p, W* B: d6 J. a0 E9 H3 h
1.2.非等值连接:on后面的条件不是等值操作
; P0 R& s+ i( }& }. \empno ename salary grade lowsal hisal, J* i# G- A7 E$ r! U7 e
------------------ -------------------
5 @9 c$ B: c- x7 z- A3 [& v& c1001 zhangwj 10000 1 10001 99999
$ G& |2 |+ T: M7 o" K3 l4 A3 d) b1002 liucs 8000 2 8001 10000 ; G; D, y7 b0 r. L/ I7 U
1003 liyi 9000 3 6001 80001 A3 I4 E% E n" N' Y
1004 guofr 5000 4 4001 6000& u9 U I2 x& |# P% v$ D
5 1 40004 c4 Z* ^% B$ x% R8 z% f
--步骤:1.建表;2.插入数据(commit);3.查询
0 n$ {3 X# s) z& r7 k$ D* A0 Vcreate table salgrade_ning(
2 ^4 }" @; g! `6 C" B( ygrade number(2),
! B! h1 c* e1 w! j& rlowsal number(7,2),
1 y4 G- R7 t \" ~* t fhisal number(7,2)
2 J5 M& D; T, o* G);
9 [# w% H. `- x2 y- Uinsert into salgrade_ning values(1,10001,99999);
1 n" S- r! g: j1 t h* Qinsert into salgrade_ning values(2,8001,10000);5 }$ N: X+ ` n
insert into salgrade_ning values(3,6001,8000);1 b! ]7 Q8 j+ T. W
insert into salgrade_ning values(4,4001,6000);
. s. W+ b3 o- Uinsert into salgrade_ning values(5,1,4000);) w( E5 S* s( W$ `, t
commit;1 e% a! M, L/ p- ~* S/ X
--计算员工的薪水等级:& C3 P) r0 g3 |1 Q3 k
select e.empno, e.ename, e.salary, s.grade
! N( y9 Q# E8 y; @; e# sfrom emp_ning e join salgrade_ning s
' {5 e- H, k' C# ?/ N, ]" Von e.salary between s.lowsal and s.hisal;
+ e- e8 q' N a) w# C* @--最终查询结果的形式:
+ Z- I5 V6 W& Q1 s5 v1001 zhangwuj 10000 20 G% u# K/ H4 I, P% q& _
1002 liucs 8000 3
1 z8 k% L! P: x: }! a# _* {8 Y! z: l4 Y
2.外连接. e0 P, `( X, A% O4 ]( o
t1 left | right | full outer join t2 on 条件
3 r2 B V- Y3 f0 I+ z h8 M0 a- V9 l$ y7 q5 F' B% j
SQL语句的种类:
+ t! u5 g/ v7 O e: P- {DQL:select
, Q/ M/ a1 F7 W( fDDL:create / drop / alter / truncate
+ c% S* |2 o1 Z7 n% UDML:insert / update / delete
" |4 f" d; T1 |4 F* WTCL:commit / rollback / savepoint
6 ]' `! r3 ?: E) ~4 o$ K4 fDCL:grant / revoke, K( n; n, |1 v
! {# n F; ~: }5 S* a
一、DML操作" S' @; m2 k( t% p
1.insert into...values...' W/ }* X1 ?! q
--1.1.不写列名 d8 U9 i, M" x" P& R( z
--必须提供全部的列数据,数据的顺序必须按照表结构 f$ U) ~9 v: J, @
--如果有数据没提供,用null表示7 e* i' h8 ?: x1 g; b) w
insert into dept_ning* y# E8 j! k- B- G. D: F4 ^
values(66, 'market', null);2 l& z" E( D8 A$ l
6 t$ `) `! ~& t/ J; yinsert into emp_ning
4 j- x# o0 Z: T$ Gvalues(1020,'rory','Programmer',6000,null,null,' A Y0 B( r% l" g/ n/ D6 A
sysdate,10);
+ h+ d! {. u" [& g# N x! e4 {) n' Z4 G* Z2 l9 t6 C9 P
--1.2.写列名0 v+ y0 ^$ U* b; }) ]0 t
insert into emp_ning(empno, salary, ename, hiredate)8 S, A( Z( [7 \+ H4 S6 {1 B
values(1020, 6000, 'rory',
% [( o# t2 @: B* z! c: K" g( p" \to_date('2011/10/10','yyyy/mm/dd'));1 D' a4 S, B, \$ v
0 G8 N' i, r2 ~; v--to_date函数是oracle独有的。' T* k+ L% ?: e+ o9 d+ f: S; d; o' W
--在oracle数据库中插入日期数据,一定要用to_date) ^! X' S4 T% p C" Y" _
处理,不要采用默认格式,比如:'10-OCT-11'。9 O' T! B! ^7 F) X; q4 h# I
8 O/ n0 B/ ~' B' W5 J! m--建议采用:写列名的方式。即使是插入全部数据,也
. A6 z7 S, z9 L8 K建议把列名写全。
$ c4 f0 S5 ~% ]# Z% z6 y& S$ A' g6 w--复制全表$ `1 N( }4 R% N: t$ E" P/ ~ M8 R
create table 表名
3 H4 x8 T5 k9 e; ]5 }as
3 z* q' j% q1 g1 t8 P. P7 P查询语句;- V2 Y) L! Y8 K8 a
! ?% m+ s0 l) C; J8 f; B
--只复制结构,不复制数据" U3 g) |0 ^7 P# V" d& k
create table salgrade_ning1+ m) j" R5 `8 b! D; m
as
1 z4 S' l: L) y* `9 B" r/ Xselect * from salgrade_ning
8 | M5 x9 y. i( _, N( fwhere 1 <> 1;$ W; w; M' n, z0 L& @0 G
: c2 N4 d% l- t) u$ T* p--复制一部分数据:给查询语句加条件。
5 E$ l8 j% f( x5 D j--如果查询语句中有表达式或者函数(包括单行函数和
Z& T" M1 e2 Y7 E7 b1 _: W组函数),必须指定新表中的列名1 g. B( \! A8 p! f- o1 G
--指定方式:给列设置别名;或者在新表后指定。+ W0 q _7 V1 Y! f' `3 F1 k
create table emp_ning1
8 w+ _# h! u J! D4 i$ d1 j( n9 zas
9 ?3 Q+ r% g& F9 {select empno, ename, salary*12 year_sal1 A7 l- H$ z2 I
from emp_ning
# g- y# }. m+ M- A- k6 Mwhere deptno = 10;6 V1 I. T, V. j* w" r* j: f; u$ P
6 |" ~! }; z2 [9 L) Z8 T( m
create table emp_count(did, emp_num)
, X' I1 j/ K" H1 \# Jas
' [0 h k( @- `8 ^: \3 ~! Yselect deptno, count(*)
; N7 J+ e- g. ?8 {. V# Lfrom emp_ning) p7 H' l+ @7 c
group by deptno;1 `$ `- X& G& z' p4 }3 ^
5 Y* `8 T$ P* c
--创建一个空表5 p9 ^' e4 P) w3 w9 \8 U- ]" F+ g
create table emp_bak1
, g% ~0 ~" U+ J' m, tas
; t j) n, P- B1 V3 oselect * from emp_ning
* f6 X& x" M w! X @4 zwhere 1 = 0;
" ?8 Z1 h5 h- S6 r' v% Q9 e6 M9 ~, d( \1 Y7 c( H; O s( [
--向表中插入多条记录$ O3 ?: d( d( z, a& c2 d
insert into emp_bak15 q! h$ w/ V+ ~9 }2 V; { G
(select * from emp_ning
0 i& k7 p7 G4 j$ R8 J3 P where deptno = 10);2 ]3 C/ f$ l7 L
& ?* O2 J) T; K5 o5 p--把表中的数据换为部门20和30的员工记录, L$ d( H. B s: ~. V
delete [from] 表名; --删除全表的数据。
" @: D0 [$ f- _& ]* y5 `$ u5 Kdelete from emp_bak1;
" x- p5 A2 K- y# p; V* w
7 ~' j& b$ G. b& V n' M0 Rinsert into emp_bak1
- X' t7 ?6 L" \! w) n/ k(select * from emp_ning
9 s8 Z, u4 O8 B8 [where deptno in (20, 30));
' O! x" J2 z# Z7 m% X' X _% V ^2 J" B$ ]0 v$ J' f
--向新表中插入指定记录数的数据,比如前8条。
J2 X- ]* o8 [! C0 Cdelete from emp_bak1;
d# o. P2 U/ k; F
; M& Q$ ~, n: D v2 `insert into emp_bak1
& g, N0 B; D' L$ a(select * from emp_ning: e5 ?/ X1 r7 r5 ~+ _
where rownum <= 8);
6 w4 k' h$ l( H' H9 B6 @; X# R+ ^1 l0 |* ~: s
小结insert:, a6 z8 l' E7 o H0 Y- _5 Y, j$ h
1)insert into 表名(列名,...) values(列值,...);
$ ]1 p/ y, }+ q+ B2 X% K一次只能新增一行。
: s7 w# e: Y0 x2 B1 D. V. S2)insert into 表名 (查询语句);
, l. A, v4 ]+ \! N$ Z: v( f4 d一次可以增加多行。
; e! l, @( L* N# v" A+ i* k4 R* H
2.update:更新数据
8 n7 A# ^- L. `1 L$ I" n( Bupdate 表名 set 列名 = 新的列值,2 {5 Z* f; \& D9 [7 Y# R
列名 = 新的列值* q# g3 V! y+ t6 [! h, A; s
where 条件;
/ v8 R% ]: }) j- N2 Q
9 R$ i% d0 h C. Dupdate emp_ning set salary = 3500, ! M" p' W2 ]- N' |7 m( T
job = 'Programmer'
) } k" c$ L1 k! bwhere empno = 1012;
" l% Q" D8 k% b
: W# s, G: a$ O" [" c" s. r. g--部门10的员工薪水+1000" Z N2 Z7 l, O+ h1 I+ P
update emp_ning set salary = salary + 1000: }; k4 | c; b1 i7 o
where deptno = 10;
+ U* n( T1 P C6 W U2 W: k
9 r' h. Z, `- m8 e--更新数据表时,注意条件。
+ c. a* N( L# X; }' S+ D--如果不加条件,影响的是全部表记录。9 D3 C) J8 o8 R# M; C2 [
. K8 ^+ A5 u) u3 [8 K5 ~3 z$ v F$ ^
3.delete
* p; p/ O8 _5 B/ X9 o) i+ j--注意条件。 y& k8 s7 {; i X# Q; ?
--如果不加条件的删除,将删掉表中的全部记录
) }; _8 Q6 w: n--rollback 回退,commit确认。4 ?- z6 b! F5 ^
delete [from] 表名 where 条件;
5 x) l4 r2 y4 D6 ]/ {8 m% S: m, I: e
delete emp_bak1 where empno = 1002;
$ Z, e, M2 S' ^; d8 A9 s$ K. q# S6 q) K6 f, ]
delete emp_bak1 where deptno = 10;
$ E( {4 O) h4 \5 k% m; Q3 [6 m j" I( S" k) R8 A1 T
delete emp_bak1; n+ b( w& L4 L$ a" x, w
+ v9 c* k5 e( d: z, Ucommit;) \0 Q' f( w) H T) _. d9 N
--执行了3遍
5 W4 y! @5 F6 m# y% Z' |9 hinsert into emp_bak1(empno, ename, salary); ^! E! {: T; h) w2 q( G$ m
values(1015,'amy',4000);: w, ^+ F0 D4 D! m, p, \
--执行了2遍4 b+ \* Z5 {' Q
insert into emp_bak1(empno, ename, salary). M4 m: W6 J1 U9 }3 i
values(1016,'rory',5000);
2 ?8 n/ `* a ~% G5 w8 D6 p* O--执行了1遍。
: u8 p4 Y4 _" F% Uinsert into emp_bak1(empno, ename, salary)) K" j' p( _8 ^
values(1017,'river',6000);4 y6 s: |( E7 A+ K* t4 K% H. u
--创建表emp_bak2,只存放不重复的记录. u" [ Q% H. V0 X, R8 C% u. z
create table emp_bak2
+ x- s. F" I& F0 O) K) uas
4 J8 F+ x9 q! r# A) ^select distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr
7 d9 ~5 D+ T/ m/ v: s; mfrom emp_bak1;% w0 K- I) a, M2 L
--删除表emp_bak1. J/ x0 N! m' ?& f# i8 M* M
drop table emp_bak1;& `' p# P$ p" j w5 v) M! t& v
--把emp_bak2改名为emp_bak1! h0 i" @+ k- K8 a- e
rename emp_bak2 to emp_bak1;' k% {- F, e' \( f, ~! \& p
2 E2 g" Y3 w& \% O/ b# T
___________________________________________
\) E8 k( O& Z, [9 H+ n7 Y$ k% O
+ Y3 g+ H4 S# E, `8 h% C. [6 c
% P$ m6 O; E; }* \! Fdelete emp_bak1;
: ?6 }7 U7 Z: ~% {
8 T$ [( @" k1 o- N5 D" P0 F' Finsert into emp_bak1(empno, ename, salary)' l) |* o* c4 b/ e" `( t8 L
values(1020, 'amy', 4000);
( B6 h! y2 w3 K3 K' a5 sinsert into emp_bak1(empno, ename, salary)8 a8 p7 t, ^" V0 x+ h# q' L; V2 [
values(1021, 'roy', 5000);
5 S& h( ]6 D) |( J, N6 Y0 u) r$ Vinsert into emp_bak1(empno, ename, salary)8 M* [ A& {1 |' X/ a) ~
values(1022, 'river', 6000);
3 q0 R, H1 E u7 Y# h
' e# C2 o$ c3 I--rowid是Oracle数据库的伪列。
9 b0 s1 S p2 F/ W8 P ]$ |--rowid是Oracle数据库独有的。
" U# L6 H- N0 {6 z delete from emp_bak1
" x2 m6 I7 h- [5 I2 f where rowid not in (- c; Q# N% h$ `
select max(rowid) from emp_bak1
( j" R) ^' Z( o& N& p+ @ group by empno, ename, salary);
* B* L+ X0 k% v3 ~, X' w* q* f* M2 n$ L( _. \2 |
二、事务:Transaction" V7 S8 m& z2 _+ {! ]; y" t/ H
TCL:Transaction Control Language* r* w# r1 @" p1 ^3 s
commit / rollback / savepoint' K9 y8 F4 T& j- l
事务:一组DML操作的逻辑操作集合 {6 I0 E1 }3 M
***) Z/ R- T8 A$ Q7 Y+ S1 }+ Z8 ]$ p
1、事务的开始和终止
, [1 s+ B5 S2 |9 N# r) S/ N& w1)事务开始于上一个事务的终止或者第一条DML语句
2 g' b3 A* z; V2)事务终止于commit/rollback显式操作。- l% X% z) P/ f1 O$ v6 x( R( C
连接关闭:隐式终止
% b% k. X& P7 O DDL操作,比如create:隐式提交。
: `" M# |) p. W, D9 a) f: @, A- J7 c" F& p7 p! K
insert into ...values.../ w% C$ a$ @+ f
update ...
: v- S4 @8 F. y4 {7 j+ O. Ddelete ...
( L6 s3 V9 I4 e( T' g; yinsert into ....
* {1 w8 s2 e. R- G" F* k5 E--rollback;--回退到事务之初,数据的状态和事务
4 _$ v; n: H$ S0 n4 z, q8 D" ^开始之前完全一致。; H: N) n8 Q5 X0 F! q6 x
commit; --所有的数据改动提交。
8 q% x- u& x' F: P. S T+ n `! |, b5 }/ } b" v
2、事务中的数据状态
; e1 d8 h/ K. F G2 Q4 jcreate table mytemp_ning($ E8 S- y; t- A S0 C+ K1 T
id number(4));, c! w3 f1 H$ q% k& |1 Y
insert into mytemp_ning values(1);! X, k1 O( L! ^/ a- s* S4 y5 F6 Q
insert into mytemp_ning values(2);" D. {( s! U0 v$ r5 _/ t/ w& S; L
! h1 }2 s! e& g* ]: h& z7 n--事务内部的数据改变只有自己的会话能够看到
9 \% t6 }& u$ c ]# ^5 C; M--对事务改动的数据加锁,事务之外不允许操作。
2 r: f6 N6 a: ?" W
7 ^; I) Q2 [* U( ^' ^% w, v- f如果提交:commit8 }9 P4 q5 ^; K$ _. R* Q z3 x, D& s
数据的改变被确认。所有的会话都能看到这种改动。+ [7 x3 X3 ]: _! R- F% W2 V' V% ?" Z
数据上的锁被释放。2 h L1 ?2 V% `+ l+ ]0 c9 Z4 X" @6 y" R
保存数据的临时空间被释放。
2 \; f3 O8 ^) w- [( J) R9 M: Q" O8 S, u3 d3 G
如果回滚:rollback4 g" S) W& Y3 G; h6 h
数据的改变被取消。
V( N" X4 A0 e数据上的锁被释放。! @% d* Z8 e6 u! C( O9 h$ W
临时空间被释放
* E0 D t( i A2 @create table mytemp_ning(id number(4));
/ }( h( k1 ]* `% k/ \% F0 P6 I5 ?' w--事务起点- P: {5 B- G1 l- a2 f: i
insert into mytemp_ning values(3);
% ?: g& q1 ]5 H; D6 g9 csavepoint A;
+ a3 |' k! Y5 w3 g$ o- qinsert into mytemp_ning values(4);
5 |+ J0 o) p7 |savepoint B;
9 I* L( S8 H4 {: k2 Zinsert into mytemp_ning values(5);
; @% N, I/ D6 J' c7 P4 w3 g9 grollback to A; --回滚到保存点A,A之后的保存点全部被取消
1 v) t% s& G5 j& p+ \' z8 A2 uselect * from mytemp_ning; --3保存,4、5回退
9 V& }/ U' J- R6 Y& O4 c9 g% e# w1 W% E1 y2 }9 ~
三、DDL A- n1 ~2 V2 l! _9 j9 @4 X6 z
create / drop / alter / truncate
$ Z- k& S2 V4 U+ {3 D
) [1 m0 _3 B* a6 d数据库的脚本(script)文件main.sql:, n" t( c. ^ n: |0 w
------------begin--------------------
, o& m7 ~" O3 f3 ^' ~8 K0 N8 k4 h--删除表emp
* ]- F5 l! g4 E. Ydrop table emp;3 `8 x% h/ r5 M% B5 v
--创建表emp
" m5 i6 ]* R! R, h" w6 P. icreate table emp(id number(4),' P" o( q1 E7 t8 n
name char(20));$ H Q/ A3 U) M' Y' e
insert into emp values(1, 'amy');
, O" ?0 p7 p# U, Bcommit;& o% f; j# ~( k" x
( F$ v Z, k' V! L( @* }
: ]! Y$ O' n6 h6 R& _+ @ |
|