该用户从未签到
|
1.内连接
& o4 n) ~! J' o. @. |! [% i3 D7 J0 A @
t1 join t2 on 条件1 r. a8 G2 F6 @* K- Q$ }5 _
) j% Y$ }. y' f! y( ]1.1.等值连接:如果on后面的条件是等于。: ?" q, H0 N. {* Y' z [, p# e
t1 join t2 on t1.deptno = t2.deptno9 C0 \2 n) g* g0 r8 b
1.1.1.等值连接的一种形式:自连接
6 j2 x* {9 f1 G0 y8 ^& q+ B& \& S% k5 Tt1 join t2 on t1.mgr = t2.empno
* i% M9 c/ h; U, S% K
+ n( B; E$ T& F5 v8 y2 f3 {1.2.非等值连接:on后面的条件不是等值操作
9 j- u% d8 }/ G" `7 I# Uempno ename salary grade lowsal hisal
% Z# g' C" q, v }" F------------------ -------------------# W- L5 U* |" G5 G2 c
1001 zhangwj 10000 1 10001 99999% y! O! z* E3 K# ]; _" T* k
1002 liucs 8000 2 8001 10000 . {) n4 V* z* ]7 A) t
1003 liyi 9000 3 6001 8000, R& X+ }, L( Q& N, `1 u
1004 guofr 5000 4 4001 6000# G: t% g: O" c2 }$ w( Y
5 1 4000
$ @5 x( y8 ]$ l' [8 u) W: {--步骤:1.建表;2.插入数据(commit);3.查询" ^' ?3 ~6 r' `. {7 N
create table salgrade_ning(
7 u: t, a. P: `5 U7 O& X1 @grade number(2),
" ^5 J( N. z: e1 U6 O8 e ulowsal number(7,2),) ?$ M+ V; k8 [* T% X6 K% p
hisal number(7,2)
& Y7 Q- D+ m- C);7 c' }# v2 [- v4 W
insert into salgrade_ning values(1,10001,99999);
0 m+ A/ {2 X0 i9 Linsert into salgrade_ning values(2,8001,10000);1 J$ ~$ p# x+ U; ^! A) ^. J
insert into salgrade_ning values(3,6001,8000);
" f, Q7 S+ F+ C% a4 v2 e- Pinsert into salgrade_ning values(4,4001,6000);
9 n- z- x' u) R, E+ s; r0 W4 v# Y+ c6 |insert into salgrade_ning values(5,1,4000);
, n" T0 N' q& R! C- U+ T3 P7 ?commit;
0 ~. [7 c% N9 H( a. b6 ^# _# t--计算员工的薪水等级:
9 S: K' f ]% ?1 h1 Y7 Q2 w( pselect e.empno, e.ename, e.salary, s.grade4 J) n, v, o1 N6 p9 ~: u7 e
from emp_ning e join salgrade_ning s6 Z B7 Y, K: m6 S8 K5 V
on e.salary between s.lowsal and s.hisal;# I* [, t- C/ c/ \+ C+ j* J
--最终查询结果的形式:
5 O9 w, s& |: B$ H+ f1001 zhangwuj 10000 2) _+ C. r! C6 g( J8 t' H& G5 z; m I
1002 liucs 8000 3 ; n! I) h3 p7 w4 f g" h% a9 z: R
4 E0 c! U7 C) [* d2.外连接
- M: `' n8 j2 x" l5 dt1 left | right | full outer join t2 on 条件
% X5 m h! k2 W9 Z1 y( h, E5 `, N7 O" w8 v6 k' q- g
SQL语句的种类:7 ]/ N' h6 V: w9 L; V! h2 q: e! Z
DQL:select, C% h! P! U4 n6 g, F
DDL:create / drop / alter / truncate; V8 ?, G) E4 N9 t* ]" S% U+ {
DML:insert / update / delete8 R5 G( |2 |& w# O8 w
TCL:commit / rollback / savepoint
$ O# l( y9 d+ W% p8 NDCL:grant / revoke
8 S. s' U; A' b" E( ~% O% L, _
6 Y) e# g5 e4 D# O: H$ h2 C一、DML操作, a6 s% Y( \ N: J# ~+ t' w8 \
1.insert into...values...& n, j" k* Z# A# r
--1.1.不写列名 }2 Z' E. r& Z- L
--必须提供全部的列数据,数据的顺序必须按照表结构1 F/ } O2 p* T9 I7 z5 L
--如果有数据没提供,用null表示
. J4 R; O# n p4 @- [$ ginsert into dept_ning
. ? T2 P7 R! F# tvalues(66, 'market', null);: [# ^7 c' \* h
" v2 c$ i- n# z% \! n$ p7 Tinsert into emp_ning( D/ i! y/ u/ s+ Z+ b. \3 i9 p9 S
values(1020,'rory','Programmer',6000,null,null,* N; b! d" N/ @! M, I" [
sysdate,10);3 i+ ~( k8 `/ a/ ]; {$ m7 V: f
/ e, q( x9 K ~/ d
--1.2.写列名# |% p" s6 m$ t" i- N* }1 ?5 F% f& X
insert into emp_ning(empno, salary, ename, hiredate)
9 r0 s' L/ N. W/ g7 Y$ d1 Ivalues(1020, 6000, 'rory', 8 _+ N6 N y! ^+ t6 m1 s
to_date('2011/10/10','yyyy/mm/dd'));
" D8 r0 |5 G& D# G8 u
' R. D! `' i0 ^( H* m' m--to_date函数是oracle独有的。
) K' d, W- L. ^3 B; y- M--在oracle数据库中插入日期数据,一定要用to_date$ X, f3 n5 F& F8 n) B
处理,不要采用默认格式,比如:'10-OCT-11'。
; ]9 `/ M6 h. Y; D* [# h/ O& X9 R* ~! L/ ^) q0 G
--建议采用:写列名的方式。即使是插入全部数据,也
! R8 i' C: Z2 x. p2 j: m建议把列名写全。* }3 j' k6 [: M8 v' `8 d- R) E
--复制全表8 F. H' {- w# o& R
create table 表名$ H8 B i" j- O8 v0 {
as- A% H0 o* F' P& T( p
查询语句;8 d9 [3 w8 P5 J( A; C; E4 H5 E
! ~4 K, o0 G- ^: Q* n
--只复制结构,不复制数据
4 s% j4 @: l6 ]* o5 s0 j* T7 ?* \create table salgrade_ning18 X: y7 f% T3 ]" y0 [
as
) k% b4 x+ N4 r9 G4 X, E5 I+ Xselect * from salgrade_ning
. F1 k6 d2 k1 @0 I1 w! a1 u& dwhere 1 <> 1;
5 `7 w* }1 _ m0 Q! r
7 @1 A+ x, O" U% q1 A* e--复制一部分数据:给查询语句加条件。9 v2 Z1 h0 J1 ^, M6 g" Q% F3 a) O: `" w
--如果查询语句中有表达式或者函数(包括单行函数和
2 R: g; I' W1 ?组函数),必须指定新表中的列名
$ \* r% y( b9 B3 P' D: Y; h% k--指定方式:给列设置别名;或者在新表后指定。
i2 ~' I) |0 @7 s3 Z- ~create table emp_ning1
5 O( c7 H$ v5 ]: was
+ x) d1 s' {5 @" v2 c s8 u( `select empno, ename, salary*12 year_sal: `! k5 E6 o. J8 {% X# @
from emp_ning8 a- j4 K/ m0 `) Z& e
where deptno = 10;+ T: Z8 \% h# z8 O/ U
! X5 k: H( f; {- c& _5 x, ncreate table emp_count(did, emp_num)5 d) |+ j) L' T. `
as" C$ o+ E$ a- M( Q2 h/ W$ e' o
select deptno, count(*)
! ]% Q: C% N4 b5 \+ H$ j5 B: j. wfrom emp_ning& Q! Y8 f' [0 f0 N4 A$ u+ G, { ^3 T
group by deptno;
+ I# J7 D( E* W2 W# J& U: H5 Z
/ ~' P0 e, |, s" K6 g5 [--创建一个空表
a" G& M, ^) Y2 r# gcreate table emp_bak1/ I- O5 B2 b% ]# H6 s
as
7 _# B5 Y2 r- K4 s9 w" }select * from emp_ning: K* M5 T, _$ r4 P
where 1 = 0;) y# h' m4 U5 l6 p4 I
: w0 g% `% c: Q8 Z
--向表中插入多条记录+ U* m) e0 X* L& V2 ^
insert into emp_bak1- v+ h: ~: C9 _
(select * from emp_ning
8 O, w# g# `+ _7 y. s7 Z4 m4 e where deptno = 10);& n6 K. d D/ d* T" v& S
; H6 Q9 ?5 I2 @* q$ Z# }
--把表中的数据换为部门20和30的员工记录8 b2 Z0 X& G5 ?0 l
delete [from] 表名; --删除全表的数据。" B; q* M3 _2 T' R6 P
delete from emp_bak1;; b1 V/ i1 g8 ?/ z$ _5 }/ T
$ }& u# r+ t7 S
insert into emp_bak1: j3 s x0 }- w: i9 K* `" {& i7 X9 T
(select * from emp_ning
( W) M: x7 @4 E$ z! Nwhere deptno in (20, 30));9 x+ W9 G4 h* F
! }6 \8 }4 _. w' ?) A5 @
--向新表中插入指定记录数的数据,比如前8条。
9 T4 S1 u1 v: I# @- wdelete from emp_bak1;$ ~9 J4 m8 }/ M% T! q% I \. b
9 D& o. v4 m1 m8 H9 R
insert into emp_bak1* v8 x K8 a3 V5 w
(select * from emp_ning
' Q' ?6 {, z. qwhere rownum <= 8);
5 y& l7 r1 p& B3 C3 Z9 z5 e9 H8 X6 `& P/ t i8 l8 v
小结insert:
/ X5 U5 ?5 X2 e& h" T1)insert into 表名(列名,...) values(列值,...);1 {; M6 @' R7 D" ~9 T5 N; I7 F
一次只能新增一行。
. V2 A# x7 `- |4 n; v4 u2)insert into 表名 (查询语句);
. [7 v& g8 g. w( v) |# d9 `' M; |一次可以增加多行。8 P$ D" ^: h6 q3 f) X, m' M
" s- ~" P& d9 L9 l! J2.update:更新数据0 L0 U8 l% c% _/ N1 _
update 表名 set 列名 = 新的列值,% R5 i3 ]. H$ r5 |9 @8 o/ Z
列名 = 新的列值
& U. S8 N2 R; ^$ A0 p- K' m2 Cwhere 条件;
: A0 ~2 C0 X) t: Q3 q! ^4 G
6 F" N1 R1 q& I3 Yupdate emp_ning set salary = 3500, - D' Z5 ~) }* O+ D: a6 M
job = 'Programmer'
4 z& f! g( j) Z/ Pwhere empno = 1012;* q8 j! D1 y' w' j5 Q
0 W7 G0 i& x. l* h3 b! a$ c% e4 W& u--部门10的员工薪水+1000
8 y; O y0 W; C7 Z2 {6 H4 W6 |' ]update emp_ning set salary = salary + 1000
/ T1 G2 ]! G( Vwhere deptno = 10;
$ [: j8 w( Y4 D: q
4 O7 @/ |9 G1 m6 v* l' n--更新数据表时,注意条件。* X% o, g* ?5 _4 |
--如果不加条件,影响的是全部表记录。
6 u# m& ?% C$ X3 K+ i6 G. y2 }, I
) H! X0 f% r( E! d2 `& ?3.delete' O5 a [; V8 E+ m" Q) o3 i: l$ v
--注意条件。
3 A; }" a4 J, s4 Z- P--如果不加条件的删除,将删掉表中的全部记录 ?9 n, v; A5 n
--rollback 回退,commit确认。
& y. S y5 Y) E7 k9 tdelete [from] 表名 where 条件;7 e/ U- E% Z3 r& W
- s: z. y+ P; d6 }8 Tdelete emp_bak1 where empno = 1002;
3 H" {# ^; G! M% h, d3 `4 {8 B% F! E8 @* A2 z3 _0 r- n
delete emp_bak1 where deptno = 10;2 M* i$ h' V7 D/ L
& o: b6 f4 b4 }) H5 C0 x3 \delete emp_bak1;
) O/ Q3 @1 F l f4 U f
5 b$ F. {- h& s q4 Ccommit;
$ j0 S+ _/ O1 \& {1 x z--执行了3遍, n) E3 Z( |% V' i
insert into emp_bak1(empno, ename, salary)3 T$ N" q) ]# x# S
values(1015,'amy',4000);% F) ^; ?( e* c- N( X* _) c
--执行了2遍
: U6 l& m! t8 \5 G! U7 d3 W& Iinsert into emp_bak1(empno, ename, salary): j$ s) r* h0 y! I7 L
values(1016,'rory',5000);
; n4 d; Q! d' Z--执行了1遍。0 L+ j; F- k' B! H) @3 D
insert into emp_bak1(empno, ename, salary)
, D; e* g7 U b( Z' jvalues(1017,'river',6000);" {: d$ B" z' g+ o0 v' B
--创建表emp_bak2,只存放不重复的记录& I$ j( g1 z) ~5 C
create table emp_bak2
D3 ^8 p+ j9 Las
% c2 J/ P2 x6 X1 Rselect distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr1 U3 k- o: t9 v5 Q0 K
from emp_bak1;
# Q4 s' @6 }: Q9 F--删除表emp_bak1
1 B8 {! N/ ]" s2 Ldrop table emp_bak1;
& _6 @# B+ ]" z--把emp_bak2改名为emp_bak1/ X7 _# w9 }4 e) e* U- w. o+ b3 G
rename emp_bak2 to emp_bak1;
/ N+ k6 o+ ~1 i a' o& H/ p A' _ m* p. n0 r1 `# m+ e7 y
___________________________________________2 @" L6 M2 j0 z8 ~. ]1 q: V. r
3 i) e5 o% ^9 A# O6 F
8 S, l. D( p. X+ ?, ]
delete emp_bak1;) r* P6 j4 {# k; B
9 J8 u5 p6 J- linsert into emp_bak1(empno, ename, salary)
$ f, c- G; c8 }- \! ~) g( @values(1020, 'amy', 4000);
# K) i4 D* O G# p- \0 [4 {$ _insert into emp_bak1(empno, ename, salary)
' S5 E* {" i% M" s: U- r- rvalues(1021, 'roy', 5000);- {, C4 p) a/ z$ a
insert into emp_bak1(empno, ename, salary)
8 z) n |- Z1 M; B3 L% @4 svalues(1022, 'river', 6000);% y9 U& Z, _" s7 w7 E
+ b( u6 @5 X0 p" L; ?--rowid是Oracle数据库的伪列。1 L( n3 J4 e; T3 K+ {$ w% {
--rowid是Oracle数据库独有的。
7 a3 \3 v- ~% W5 B delete from emp_bak1- g: r) y6 }& d# v+ A% J
where rowid not in (
" y' q8 s: W4 J4 T5 X; o4 l select max(rowid) from emp_bak1
* \/ v6 N8 L2 W0 D group by empno, ename, salary);
$ y3 j! `) K; \2 L- k: r. ]9 s J9 U+ h8 e; b; w- q7 v+ \0 L
二、事务:Transaction
) ?! l: H8 i0 l" w2 |8 {3 k; FTCL:Transaction Control Language
$ k7 I* E5 u! p: t, Ncommit / rollback / savepoint
R- S ^2 {. I* H6 G& _8 o事务:一组DML操作的逻辑操作集合
) P' b4 ~2 p+ h7 o% m2 y ***1 Y/ ~5 ?- X' S
1、事务的开始和终止
) p7 L7 q: q& m; j+ P7 h1)事务开始于上一个事务的终止或者第一条DML语句
" p- D( F" f' O v2)事务终止于commit/rollback显式操作。3 Y5 Y) w' @$ c- I5 e
连接关闭:隐式终止7 Y [: j4 z H1 H/ k9 p6 C' N
DDL操作,比如create:隐式提交。: l1 ?! ?' c8 O. g% ? o& A- O- H
7 N# y6 R1 L* O q& [) Minsert into ...values...- m- z- d+ j ~# u* H
update ...
- G2 ?; ~% X8 H" ldelete ..., O6 M1 X5 s- L h, T( H7 q9 l2 j- p* u6 e
insert into ....% v3 Q# |2 Q! O3 K5 t1 C$ k
--rollback;--回退到事务之初,数据的状态和事务; f9 \% `1 ?; _. Y* _0 r
开始之前完全一致。' r( b, ~% w1 N# O
commit; --所有的数据改动提交。
2 U# C' m) C) a4 W+ [2 h# d' x" k) V4 Y, A
2、事务中的数据状态/ ~* K4 y, I% V" e) m
create table mytemp_ning(
7 t/ F6 n. @% ?) |; ?/ K) Uid number(4));9 D2 h+ e4 g, n# {
insert into mytemp_ning values(1); t! m7 G. R, Z8 u7 n' c
insert into mytemp_ning values(2);
5 r9 h7 [+ L$ [& G0 C2 I+ L- }, h. Q1 K, Y+ N/ a
--事务内部的数据改变只有自己的会话能够看到
0 Z2 N! g: U9 K% c--对事务改动的数据加锁,事务之外不允许操作。
. o# c7 E4 m/ {) m0 Y2 ~1 Q
- H& v9 b$ {7 B' y如果提交:commit+ ?4 b. j: s% ]+ [ I, i% H1 o
数据的改变被确认。所有的会话都能看到这种改动。9 v0 n, h1 U5 o/ A0 U. T( G1 Y
数据上的锁被释放。
) b3 M( o7 o0 w8 ]3 D4 L- U保存数据的临时空间被释放。5 E {; Z7 n" J. t4 T
' ^( _; M) n" @. T8 j
如果回滚:rollback
" e3 z8 R: O% N8 T数据的改变被取消。' y; O& G# t7 a5 t
数据上的锁被释放。
- z, x7 L, Z6 T/ J- r1 o7 j9 c临时空间被释放/ J7 t% @ t/ O/ W6 I
create table mytemp_ning(id number(4));
& t4 P* ?( K7 F# i, o, Z! G--事务起点8 D' _9 N9 a2 `1 \% P' e
insert into mytemp_ning values(3); N; G4 l+ x3 E6 F
savepoint A;7 x0 l, w& x0 N% p; U% y7 g9 l
insert into mytemp_ning values(4);
0 k9 v0 E- n2 m4 n( W- ~savepoint B;
9 Z! u1 `+ a/ C5 L0 e( t5 w+ H! q) Winsert into mytemp_ning values(5);
P( f& N4 F4 h3 s# _; Crollback to A; --回滚到保存点A,A之后的保存点全部被取消( h' h4 O, p% T! ~' i/ b
select * from mytemp_ning; --3保存,4、5回退. _ b$ a% E, U4 ]' P- |+ _
! a4 R2 E' ^1 ~$ Y/ u3 h' F三、DDL: W& n7 B+ B/ C* {7 t
create / drop / alter / truncate6 Q' k+ `2 D/ w( K
' A- f1 E$ ` E0 b! Z+ ^9 s; Y) ?数据库的脚本(script)文件main.sql:2 N) b( M4 Q+ v/ C
------------begin--------------------0 k3 J# s# y4 d' b: d) m
--删除表emp( F2 r V$ v @# J
drop table emp;2 \) L, R2 D/ H- l& C) |
--创建表emp
/ G+ |5 a) f! B K% {create table emp(id number(4),
0 D) j9 Z5 R* o1 k( i% y# m' E# ]/ Mname char(20));
n0 n1 N; c- [1 d( Xinsert into emp values(1, 'amy');
5 R8 a% K M% S Q. Ocommit;
, L1 V: u3 s" c& Y6 w8 x: _! i4 s: }3 C7 S/ N: S
2 ~4 e( E8 g$ u' e, k
|
|