|
该用户从未签到
|
1.内连接0 h: ?# k5 o" ~: n
" B9 m# R3 u, J8 }4 V: }& Y, |; E2 Ft1 join t2 on 条件 w4 j! ~9 a! k4 y
. h3 Y8 P d& h+ Z+ ]1.1.等值连接:如果on后面的条件是等于。
/ a* g! X3 I) ~t1 join t2 on t1.deptno = t2.deptno
g+ ~1 g' P/ G9 P7 ]5 ^1.1.1.等值连接的一种形式:自连接
& F3 n5 B' m) k5 V5 l1 U/ Q" At1 join t2 on t1.mgr = t2.empno- E; x1 g- D; j) ?
& ~5 p9 x0 Q ~( L9 q4 Y
1.2.非等值连接:on后面的条件不是等值操作8 F, f1 p+ c6 P, w ~
empno ename salary grade lowsal hisal$ g7 b* P+ U5 I. a+ ^
------------------ -------------------3 e# j: e/ s7 C- P5 p$ @
1001 zhangwj 10000 1 10001 99999' k* }+ d% ]* n
1002 liucs 8000 2 8001 10000
4 I8 g4 d8 d! O; E" ~6 r$ J1003 liyi 9000 3 6001 80001 u5 W3 @+ c" n' Q/ k* }; a1 T& j: \# \- ]
1004 guofr 5000 4 4001 60001 Z8 C5 w$ d5 p$ w" [& A( N
5 1 40004 p l( D6 L2 Z/ |2 s: |
--步骤:1.建表;2.插入数据(commit);3.查询
# X( m# d8 r; a3 S3 wcreate table salgrade_ning(
/ W- Q9 m" R3 z) p1 t8 f8 Dgrade number(2),
$ k4 u1 W' F0 S4 ^lowsal number(7,2),
" ? F: m) p8 \" W" Phisal number(7,2)2 Z+ F% X9 d' u1 ~
);* D1 ]7 j k Z1 U/ O
insert into salgrade_ning values(1,10001,99999);
P" D4 E$ J. b7 ~( |5 pinsert into salgrade_ning values(2,8001,10000);# s1 y1 y4 Y, H8 }( d; f
insert into salgrade_ning values(3,6001,8000);
% R* ~4 d" D* f$ w9 Pinsert into salgrade_ning values(4,4001,6000);) P0 F; S/ X9 B. v: }: T) \
insert into salgrade_ning values(5,1,4000);
& }' M: B/ V: K4 Hcommit;9 l4 U) p8 ^: u" g* t8 @
--计算员工的薪水等级:) h# m: H( H( Y% t! _
select e.empno, e.ename, e.salary, s.grade
" [1 B, h) h& K$ @2 _+ {from emp_ning e join salgrade_ning s" |+ `/ B' N" v! A" h+ H6 U
on e.salary between s.lowsal and s.hisal;6 D/ F5 k. o# D5 e3 {9 L! d
--最终查询结果的形式:
. Y8 ~# j! F9 w5 D( |1 s1001 zhangwuj 10000 2) G; X! Z# |( ?( ?' ~ u
1002 liucs 8000 3
% q& e8 \' f- ]5 M9 V H' _
$ u ]) p2 X. X! Q" ]. @2.外连接
7 S5 _5 D {- x, ~$ M1 @7 W( Dt1 left | right | full outer join t2 on 条件$ S' |6 K. o5 `1 z7 S. A% a4 L H h
6 ~9 N2 {, {! ?. L. A- U# t: o
SQL语句的种类:
, N7 V! n5 F2 F5 p( u8 e/ yDQL:select; j! K+ {% e8 l5 {$ Q
DDL:create / drop / alter / truncate
4 L7 T3 z6 \ K9 l9 mDML:insert / update / delete/ H+ v! o; |3 W9 R2 A
TCL:commit / rollback / savepoint
6 A' i% ]; n8 v5 h; e( ~DCL:grant / revoke8 D7 ^: f; C8 V% q+ |
5 w: l) p/ H: g( e( F$ H. A8 i一、DML操作
' r/ {, r( [8 D6 M, R0 H/ E1.insert into...values...
/ i, R5 w2 v( ~% q$ H; r--1.1.不写列名$ l' ~0 S0 N. L
--必须提供全部的列数据,数据的顺序必须按照表结构. S7 T+ R2 t+ O/ C7 A! J+ T9 E
--如果有数据没提供,用null表示
2 N. ~& M5 M/ W- ]* v% @insert into dept_ning
. _: g2 N+ W/ @/ I; X3 K4 kvalues(66, 'market', null);3 ~; {( o% z5 ?1 Q' |! R$ \
" C1 [' L" W. f
insert into emp_ning
! @# M; d0 T0 m$ \% { a' hvalues(1020,'rory','Programmer',6000,null,null,; ^; i2 G3 c5 r2 T! B) F
sysdate,10);! J9 l1 F) m- n' p$ V7 t
" {9 E8 p2 K* V8 a--1.2.写列名
+ f0 b/ m$ ^# j3 finsert into emp_ning(empno, salary, ename, hiredate)1 t" p0 E" e K
values(1020, 6000, 'rory', 7 C4 y2 U4 Y* M5 d X1 f
to_date('2011/10/10','yyyy/mm/dd'));
* s* b$ e5 {7 f/ z* Q( l6 f) K3 l1 z- N$ N
--to_date函数是oracle独有的。
) ~7 F4 J/ I5 |--在oracle数据库中插入日期数据,一定要用to_date9 ?5 g, C0 z: v
处理,不要采用默认格式,比如:'10-OCT-11'。
- t8 r) ]0 H- X) Q7 g3 a2 B- ~( B9 j1 V$ ?: i- v4 l' N! a+ Z, B. h
--建议采用:写列名的方式。即使是插入全部数据,也
& O/ u+ y* R1 B w, n建议把列名写全。8 L/ J$ b. L& L+ ~2 P1 }* p2 T6 r
--复制全表, h8 O; J; z( C' d
create table 表名/ ~0 t" h; }4 B" l4 c( Z5 W
as
* S7 g# P9 N, n6 J7 k0 @2 @查询语句;
8 d! s" |. d/ j2 F+ i0 i6 o: U1 f$ M, ~. S% f+ q+ o9 c
--只复制结构,不复制数据. k% z7 q7 D6 w N% ?0 ~
create table salgrade_ning1
* W! c! @: M9 z- q0 kas
+ h2 f7 T& {/ lselect * from salgrade_ning) r5 V9 o, X- _ }2 T
where 1 <> 1;
+ U0 q' k0 K( ?3 U" Y ]1 @, ?: a, i7 @1 z
--复制一部分数据:给查询语句加条件。
; Z+ |" D+ z( \/ Z- `9 N4 J, w--如果查询语句中有表达式或者函数(包括单行函数和
I$ r. `- v r2 w' ?组函数),必须指定新表中的列名- z: P* t# a+ s9 t: C! V
--指定方式:给列设置别名;或者在新表后指定。2 q, f5 V5 R# o& _
create table emp_ning1 a2 r8 P. m0 P' X9 b3 |
as
1 h1 f' p/ R8 d2 Hselect empno, ename, salary*12 year_sal9 d3 f l7 B& H# X" l; i* q
from emp_ning* [" c7 F7 L% k
where deptno = 10;0 x B) r/ a/ \# e& G5 [( l7 ?8 t
( m. c8 j& J5 ?, {7 pcreate table emp_count(did, emp_num)
' U7 g$ o. J- P- Q3 l. ^: ]as
8 L, ^1 }% `3 D) D5 mselect deptno, count(*) 0 v0 ^1 T* ?' w5 J: [8 v
from emp_ning
' f/ d! D1 _. e2 q& _- cgroup by deptno;) o+ K: d8 ^ L4 m# C$ s
' U7 N) }: L6 s# O3 s2 E% }& a, R--创建一个空表
+ Y/ Z9 |$ Z% Lcreate table emp_bak1
8 ]1 o9 x- @" s4 t' Eas
a( g) y9 D( u4 [+ C8 ~8 Jselect * from emp_ning9 _. w8 I+ F3 {; u! u0 P( v
where 1 = 0;: c8 p4 v m; Q% _4 y# r6 _
0 y! k. z& n9 L- g
--向表中插入多条记录! ^+ R% P8 _, n' _
insert into emp_bak19 `6 g- _. \1 [ {- B1 t B! M
(select * from emp_ning
) B. h/ \) K, l& }$ }) Y where deptno = 10);7 Y5 l. \& M `1 e9 |" t: b: a
' D8 P3 `& L7 O0 f7 t
--把表中的数据换为部门20和30的员工记录
% S% _4 A% V- Rdelete [from] 表名; --删除全表的数据。1 S, ^) Z2 C+ W B E: P
delete from emp_bak1;
' z. N5 e O8 A
8 K1 x1 s @+ B" t& V& l$ n1 P( M+ Cinsert into emp_bak1
8 c! y7 \8 L/ ~! Q(select * from emp_ning
5 |. a9 l" b" `3 Y- _ y! i uwhere deptno in (20, 30));0 P. Y1 @- h( V$ R+ I% I
7 U, ]1 K8 |( c; [$ o
--向新表中插入指定记录数的数据,比如前8条。
; u( i3 ]" ~" \/ {9 \delete from emp_bak1;. u+ c) J' }( R3 {, T
+ p1 F( N/ ~. I( ]2 ~
insert into emp_bak1
2 f5 i( j+ g; E' @& b) S(select * from emp_ning
- ]7 b- w1 t0 W8 {2 [where rownum <= 8); ?3 V6 |# C( }% Y- Y
3 n/ e1 K$ p" x% H/ @+ c, Q% c8 A$ G/ d小结insert:
" I8 t) @' l5 T" ]1)insert into 表名(列名,...) values(列值,...);, X, p$ p) ~) ^1 d: C
一次只能新增一行。
( L; l9 [0 \$ }1 L6 L2)insert into 表名 (查询语句); h2 C |( Z+ S. o
一次可以增加多行。
2 S! M* y2 }' {) y0 t; H' e$ S9 ~
2.update:更新数据0 M' z8 m2 e3 I7 z
update 表名 set 列名 = 新的列值,2 x. {# [/ H. y: ~) c) o" a% D
列名 = 新的列值, [& A: f2 a3 }3 E( @8 |( d
where 条件;/ S4 N6 U0 ~. i% K* ~1 G" L
9 s+ E# D, Y$ U! O% |6 M
update emp_ning set salary = 3500,
; Y2 O$ a( J8 f+ j job = 'Programmer'
1 k: A6 j" R: ?+ E& K8 C B2 Iwhere empno = 1012;
/ D6 J/ v- M ~$ }1 ?4 H9 r4 E8 u/ |" f* h+ j6 F$ J) \" T/ s
--部门10的员工薪水+1000. g G, o# i. `# z- w
update emp_ning set salary = salary + 10008 n) ~1 T7 d3 ~
where deptno = 10;
3 u7 w" M3 B0 I1 a5 x
+ t2 c1 h$ w& w8 ?' D d6 C/ I; s--更新数据表时,注意条件。( U0 ^$ a8 p/ P" O
--如果不加条件,影响的是全部表记录。
/ Q( |& n: y( |9 ]& e- }, Y2 K6 H5 ]* h8 o; i7 [; s
3.delete2 f: s- y. V. N& H, O- K
--注意条件。
* |- f+ R& G2 S4 f0 m--如果不加条件的删除,将删掉表中的全部记录7 K% w4 ^& O8 V# ^; W+ c
--rollback 回退,commit确认。
/ O6 x' D3 H8 O6 [4 c0 F3 P* zdelete [from] 表名 where 条件;9 g7 M$ ~3 H4 m$ R6 V
+ U/ b: ~% \( ~. T5 ^
delete emp_bak1 where empno = 1002;# j; w( Q5 ]* [- K" n
n) a0 m" ^ @6 C) F0 `
delete emp_bak1 where deptno = 10;& D3 E! p: o8 P% ~
5 _% F. W2 c& i! i' G" R; Odelete emp_bak1;, A" O& G7 y# O* o+ P
( C& B! z' n% Y5 q! w7 ^/ r2 Ycommit;0 F+ l. q: _% l% P3 I! v2 U1 r
--执行了3遍: V) t$ c7 _' N6 P
insert into emp_bak1(empno, ename, salary)! T9 t4 y& Q a# w
values(1015,'amy',4000);
8 t+ z0 u) c& e6 i3 p--执行了2遍
$ C% S8 i7 _! V) l7 m( z) Finsert into emp_bak1(empno, ename, salary)
: c2 [: H7 o2 qvalues(1016,'rory',5000);
$ K) y4 a0 A! z--执行了1遍。8 t f6 w. J" E9 U9 Z: a6 m `# v0 m
insert into emp_bak1(empno, ename, salary)
# ~6 m1 U+ e9 g3 ]5 k% Kvalues(1017,'river',6000);! G+ K7 x: y* t3 K/ H f7 p
--创建表emp_bak2,只存放不重复的记录
, V" v# y% e$ qcreate table emp_bak20 R5 \2 u0 a$ G$ i9 O
as
( @6 A0 e! y- Q% ]1 } Pselect distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr
0 O3 X$ D1 W+ t2 G$ ffrom emp_bak1;
1 V/ V, z2 e- W3 C/ w--删除表emp_bak1
9 h8 P0 j- z% x) a; t/ C2 O* n$ b+ J# Kdrop table emp_bak1;
$ y( v# Z) i( d& T P9 }" a--把emp_bak2改名为emp_bak1/ f9 B5 \/ \8 f5 Y& F0 |( R
rename emp_bak2 to emp_bak1;
8 F* T. i8 y9 C: E8 O+ T8 @$ G& S& E
___________________________________________' H- \! r! j! }& c2 R W7 y( F
! z/ M; h M/ d* z6 F( Y+ h3 q3 Y, N. P2 @- K6 u
delete emp_bak1;
) b; @' f3 U' C4 [ Q" z8 D& \* k9 j! z1 ?4 K. a q% q% _- C
insert into emp_bak1(empno, ename, salary)
0 E3 a/ `- m0 gvalues(1020, 'amy', 4000);5 y) u$ S2 s' K$ ^, ~
insert into emp_bak1(empno, ename, salary), C) c0 @7 ^. w0 e- s
values(1021, 'roy', 5000);! W& A3 ]* O' { I
insert into emp_bak1(empno, ename, salary)
# q' B4 T7 u- u' j4 Kvalues(1022, 'river', 6000);
% y( F: }" {$ G* t! {7 C1 s8 x% R9 E
--rowid是Oracle数据库的伪列。
3 O0 b% D3 T7 n--rowid是Oracle数据库独有的。
" i! _0 `/ D$ E% l delete from emp_bak1
0 ?0 k. c! X5 P( i7 j" g- t& ` where rowid not in (5 r/ }: u$ n' h0 W
select max(rowid) from emp_bak1
4 l0 d* C: ^- k+ d group by empno, ename, salary);
6 K; b( x, P/ l) x3 ]+ m: m
# q, u7 Q# t5 U4 [7 R$ v二、事务:Transaction5 J- q3 J6 [* N! v4 n( j4 D
TCL:Transaction Control Language& n+ Z: b' w* |0 w4 {$ N
commit / rollback / savepoint( \4 F4 h4 h9 z, Q3 U
事务:一组DML操作的逻辑操作集合) k: K; M$ P9 _7 i p$ \1 j: A0 P
***
7 x' N8 G/ ~' ]" t' y( P9 }5 y1、事务的开始和终止. t- G7 L: A1 N _0 u- M, I x
1)事务开始于上一个事务的终止或者第一条DML语句 A9 M4 _3 g( V$ b
2)事务终止于commit/rollback显式操作。 d; q. \: m' \8 c& k% s
连接关闭:隐式终止$ B* o2 f c8 X0 T- ^ j# I1 r; t
DDL操作,比如create:隐式提交。. j% S1 C' W( g# y) s4 Y4 V
* X6 d0 y. T; P6 N0 Y2 W
insert into ...values...
" U6 d7 B7 S4 n* g5 @update ...
* [7 q* p4 A7 Edelete ...# _. V5 p( r3 p
insert into ....
% E$ m3 N$ J: A" e& h: I2 ~--rollback;--回退到事务之初,数据的状态和事务
/ y8 x$ N/ U+ S开始之前完全一致。2 [7 L- C+ c! Q. n
commit; --所有的数据改动提交。/ x V1 F8 |1 b7 @* T
2 H$ _0 X8 g" x/ S6 a2、事务中的数据状态' I5 _$ r. M" f, y; _/ i4 `
create table mytemp_ning(( P2 q9 n- E" |: ?- N# b- r
id number(4));# i/ ~; x/ |; W h& ~; y, m
insert into mytemp_ning values(1);
- H& B* q! T- g4 {, C4 [insert into mytemp_ning values(2);, ^0 o7 ^/ y% M2 ^$ v* C6 p: v' S5 o
+ {- s5 z0 N* G( @) v; o
--事务内部的数据改变只有自己的会话能够看到
: E% R Q& C8 @$ F: Q* l--对事务改动的数据加锁,事务之外不允许操作。
3 h4 P) l3 W3 N9 m! _0 H
9 {2 N/ t0 }) n/ d9 V1 H如果提交:commit
6 D/ E+ O. u% g( L数据的改变被确认。所有的会话都能看到这种改动。" } |8 ~! c, @$ `
数据上的锁被释放。. Z5 n; V, |$ x+ i( d
保存数据的临时空间被释放。
3 A* r O& U/ |; m2 q( q+ \' B0 y" ~
如果回滚:rollback
+ Y; [ L* ?- @数据的改变被取消。
3 B7 n" _" u6 _$ }5 x' R数据上的锁被释放。
- C5 |0 @( ?3 I1 `5 V' Y9 T( t临时空间被释放
8 A, R1 J( e0 _) U3 J% e8 Tcreate table mytemp_ning(id number(4));
" C8 {% ~& V0 v/ K* p4 o--事务起点$ a" U! Z* H3 s) l8 u: J( A
insert into mytemp_ning values(3);$ T# Z- p5 ^$ L8 @. |% t
savepoint A;
' ~; | D3 |- C. ~1 ginsert into mytemp_ning values(4);
! n& y j1 M$ Osavepoint B;
% L/ A8 C' i. P2 ~/ l+ h: h* hinsert into mytemp_ning values(5);) G# p- W6 L+ g/ L! b- W* T
rollback to A; --回滚到保存点A,A之后的保存点全部被取消
4 ^6 P8 z0 I' H' Kselect * from mytemp_ning; --3保存,4、5回退8 O: C/ ^8 w% x( _
8 F& A' f. L1 k: ^
三、DDL
) A$ }/ d0 Y5 l7 K% v9 A* Ucreate / drop / alter / truncate9 Z; |: u5 c9 {: |* G; R; T$ ]
2 q0 u: ]1 E. t3 g$ h* E
数据库的脚本(script)文件main.sql:
3 l) H9 n' p4 r------------begin--------------------
5 a6 p/ P {* e. H( y" l$ I* x--删除表emp) C0 O, |. i7 F* A- H
drop table emp;
5 t! Q6 T+ ^( p2 J+ u--创建表emp
5 I% t0 n! p# }create table emp(id number(4),# r* V( l4 |0 g" c& g3 n O
name char(20));
% o+ S% ^3 ~. w) P6 B0 i- rinsert into emp values(1, 'amy');
4 g$ T6 ^0 k9 Z" xcommit;7 z% Y) x1 [2 L& Y1 ^# J8 d
, o8 T" T7 X+ {8 O& [1 W
( L- u/ o n) H3 Y: b1 P2 d |
|