该用户从未签到
|
1.内连接! p$ L/ ?+ |) Z; v% V8 F
$ h# c" g' D5 N( R9 }2 s, u
t1 join t2 on 条件
; N, x- e+ f1 x3 c% `
1 S6 E1 W; L/ i! |8 `1.1.等值连接:如果on后面的条件是等于。
% F, D: L' Z5 W, D( xt1 join t2 on t1.deptno = t2.deptno
. A$ S. x7 ~( F) ~2 h, X9 |1.1.1.等值连接的一种形式:自连接' {, t* ]# h8 O: `
t1 join t2 on t1.mgr = t2.empno
, o, p+ x& W; L) q
2 Q8 d$ ^& }0 J; F1.2.非等值连接:on后面的条件不是等值操作( Q5 P G7 U! d) h l( N: _. ~! X
empno ename salary grade lowsal hisal
" @4 O" w7 @( v; b------------------ -------------------
0 I) I0 v' \) H1001 zhangwj 10000 1 10001 99999
1 J9 [6 s# Z+ Y: q1002 liucs 8000 2 8001 10000 " G2 c* H( L1 ]7 {. G; p
1003 liyi 9000 3 6001 8000- l& u9 }# r; t \
1004 guofr 5000 4 4001 6000
- A: Y0 m0 y! { i" [ 5 1 4000; z5 r3 Y2 s7 x& a3 W3 v9 F
--步骤:1.建表;2.插入数据(commit);3.查询! B' d8 L6 _7 X4 C; f$ }
create table salgrade_ning(
. u, n! b: B6 P0 fgrade number(2),
& I' a2 s+ x1 t# ?. v9 dlowsal number(7,2),/ m6 |$ O: L; R& E1 \9 v$ g3 `
hisal number(7,2)
1 e, m0 ~$ {5 h/ Q9 I7 ?1 L: W);
+ D/ Z8 k4 Z1 `$ l |2 ?% winsert into salgrade_ning values(1,10001,99999);" v( n) B$ U$ V$ n- \7 p6 L
insert into salgrade_ning values(2,8001,10000);4 U# S8 E5 B3 a" ]
insert into salgrade_ning values(3,6001,8000);
+ B; @4 Q/ N1 _" Q" [insert into salgrade_ning values(4,4001,6000);
- [2 U- v5 S1 g6 B8 A' ~8 ~insert into salgrade_ning values(5,1,4000);
+ A. Q9 c% J) p3 U$ C! K+ w/ Gcommit;- _ X: l* b+ i8 W- \7 N
--计算员工的薪水等级:( U. z0 G( K* s& W
select e.empno, e.ename, e.salary, s.grade' E& R5 q* N8 l8 n) q; D
from emp_ning e join salgrade_ning s" I4 J0 z* m; i* U# {( D5 L
on e.salary between s.lowsal and s.hisal;
" ?1 K* n F0 N' t. E7 }- Z& @--最终查询结果的形式: O- o7 _" U+ c6 I$ b/ v
1001 zhangwuj 10000 2
& ?' u. B: `1 }1002 liucs 8000 3 % J, K% p+ W! ~
" X+ d8 `/ I, q5 m& n! f! Y6 i {" c
2.外连接
5 X- I0 p6 E& i+ A. c" P, Qt1 left | right | full outer join t2 on 条件
- p3 |( V4 ]; W
: m6 l$ M2 L& a' {7 K$ C- {SQL语句的种类:
7 a( Y+ H' Q0 n B' Y" ?DQL:select
R2 x/ H( |& E! Z W. j# Q- ^7 TDDL:create / drop / alter / truncate2 r2 S7 M q1 k# U8 g* V# m
DML:insert / update / delete# ?3 _8 F1 H" J( d2 a9 `
TCL:commit / rollback / savepoint
' _" a; p$ J: [( O( C J, dDCL:grant / revoke
2 C( E# S" _% N
6 T3 @8 W5 X1 k |- U2 {( Y一、DML操作4 j' ~- B5 D0 r- U t
1.insert into...values...
/ C i+ u5 X, M' k0 a( C" X--1.1.不写列名
( {9 G: |8 Y, @5 V--必须提供全部的列数据,数据的顺序必须按照表结构
9 c* N$ r, h G+ G: O9 a% Q9 V--如果有数据没提供,用null表示
: d0 V/ y" X3 |6 g q6 k: }% R1 Rinsert into dept_ning
4 x0 G" d2 B- O" i- z3 h6 svalues(66, 'market', null);4 }0 t& d4 ^: N" \7 W
: k$ X0 Q7 d: ^, {" m" L
insert into emp_ning
7 U' }, \/ u3 I9 v$ nvalues(1020,'rory','Programmer',6000,null,null,8 P% t1 r) d& D1 X \! ~
sysdate,10);% G" a% L2 C: h0 t4 ~/ p& d$ H9 w
9 Z' o# l* D6 l% c, O8 Z" u* |8 a
--1.2.写列名# a- m* S* p% G* ^" i2 s
insert into emp_ning(empno, salary, ename, hiredate)" H( E! q% {3 N4 a
values(1020, 6000, 'rory', 9 h T, v' [! {- ~( e/ R
to_date('2011/10/10','yyyy/mm/dd'));
+ Y; f1 j% K$ z8 p/ y& S! i! p7 G9 [$ D
--to_date函数是oracle独有的。
* y' k/ i$ m( \. s7 n--在oracle数据库中插入日期数据,一定要用to_date9 k" L7 B t3 ?
处理,不要采用默认格式,比如:'10-OCT-11'。9 I% i v$ c, n* M
o( Z. G; P" u) y7 s--建议采用:写列名的方式。即使是插入全部数据,也' \# q: y+ {5 b) c
建议把列名写全。
' y5 b/ t( K! D. w--复制全表% w) Y3 |2 t+ n+ W4 W G
create table 表名1 N. ?* o1 x7 T) I
as
) D( Q' `" W, d; x' ~查询语句;
3 t$ I3 m/ @8 L+ P5 E
# |- h. h% Q8 i. z ?/ Z; }--只复制结构,不复制数据0 N% R7 V( e- K: _2 o* j' K# s4 O
create table salgrade_ning1
( S; I0 r' [6 Z) W1 X* Mas
6 e: v& O# N2 Y( y" vselect * from salgrade_ning; Q; G% j& S' `5 r+ e
where 1 <> 1;
+ F# J% U. Q: u% P- l, v( L, f" D) y$ Z' f' d: U4 T& {
--复制一部分数据:给查询语句加条件。7 ?3 |( w# d8 c9 N
--如果查询语句中有表达式或者函数(包括单行函数和 O# m4 x) G5 V& D
组函数),必须指定新表中的列名$ l. M* |3 e- G) J
--指定方式:给列设置别名;或者在新表后指定。- q- \* V% ^! `3 _
create table emp_ning1$ Z$ D. T; N7 O- d1 b
as* p; P$ W+ F3 O ]! I
select empno, ename, salary*12 year_sal
/ u; x# t# a! T# Z# R( k) o from emp_ning1 Z+ F1 a: ] r9 S
where deptno = 10;$ C+ N6 R# q% s' B4 g. s
. }# Q" `$ y0 _create table emp_count(did, emp_num), V( e, ^- ]1 O9 q* b8 E
as
4 x$ D4 q* f5 U3 g" gselect deptno, count(*)
0 n7 I% O2 v0 I" Z# |, cfrom emp_ning _. O: L$ w% ?; N( ~0 g+ L2 }
group by deptno;
5 D9 f ?# K+ l0 i: {( v# a7 A( J$ S# f9 S: v
--创建一个空表+ @0 J9 X, W3 C# u b
create table emp_bak1
7 r) M. p5 R# B8 L: P8 [ j, N: `as
: X x. y }& h. S6 I. ~5 N! zselect * from emp_ning
1 L! y) X" }% B4 C O# V* mwhere 1 = 0;$ F. g! s4 ], G, H- r
) M W% p1 i. J2 j+ B
--向表中插入多条记录7 Z+ l8 J: @/ s6 \* O
insert into emp_bak1
6 O: |9 L$ x8 A5 ~8 {6 [(select * from emp_ning
$ T# N- d, l" i C# w where deptno = 10);
2 `& D' M6 W: t' k1 e* ^- G6 o- k
3 d* A% g( v8 }: `--把表中的数据换为部门20和30的员工记录7 Z9 H; `0 b) W( ^* k+ _
delete [from] 表名; --删除全表的数据。
" d) g) S' Y( p9 ldelete from emp_bak1;% y% D+ |/ o% r
# U+ D# z6 G o5 K$ t- |insert into emp_bak1" d, @7 s- n; w: a! R
(select * from emp_ning* z( {+ J v9 U: _/ R' b$ ?. Q
where deptno in (20, 30));$ P2 B% y) N- s
4 o/ \6 }. O" S+ G--向新表中插入指定记录数的数据,比如前8条。
2 Q9 ]/ a, f6 {6 M- r7 Ydelete from emp_bak1;! c# L. b- K; {. {' J" k
6 X; W% V) r) N0 y* j
insert into emp_bak1
) \% I Y* @9 m( H' n4 F7 G(select * from emp_ning8 D8 x0 q9 z6 c, P h- ?
where rownum <= 8);
( ?2 a0 z) F, p1 V9 T7 y/ [( i& P1 @$ G E6 s7 v9 V; {
小结insert:# c7 k# k# X6 i. x- j" n1 z
1)insert into 表名(列名,...) values(列值,...);
2 t3 m& H% {8 R. S& |1 h一次只能新增一行。2 k6 \' r9 G. h5 |, h }
2)insert into 表名 (查询语句);: A' {. m, ^1 A5 W4 i
一次可以增加多行。
0 F) a6 `1 z7 e5 G2 `: I7 Y7 Q- @) {1 n7 Z/ ^* Q
2.update:更新数据6 m& |% \+ ^5 I8 ` D7 o k0 K4 f
update 表名 set 列名 = 新的列值,
: B; ]8 D, D* Q- W R 列名 = 新的列值
( o. Q* G/ p* Z n& f3 X5 hwhere 条件;: d. m. A) ]% J5 ]
* Y; a, K1 n4 P9 j$ u, p9 u5 yupdate emp_ning set salary = 3500,
3 ^; Q2 g: Q ?, K. Y9 F job = 'Programmer'
6 Y& b! b" ~4 s2 j% q3 gwhere empno = 1012;# z, b# _& ~8 e- U7 r t0 {
+ @7 A" T7 M0 l& S--部门10的员工薪水+1000/ J/ G$ W& M) U4 t# O; l
update emp_ning set salary = salary + 1000
: n5 Q1 l6 o! X% v4 A* m" e. fwhere deptno = 10;
3 L! u1 B8 r( A+ E! H8 V6 S0 `
6 n6 O6 A& [$ U# P: R1 d--更新数据表时,注意条件。
5 `/ x9 D/ l* }2 a! k0 K--如果不加条件,影响的是全部表记录。3 s. z, X" r, k. b. b4 ]
, E7 }' U- Z3 j# f
3.delete
& k) {) f" I$ N7 o: T8 H--注意条件。
+ t d5 L3 h0 K" l5 u. r! ^, A6 B--如果不加条件的删除,将删掉表中的全部记录: N- z: D" i+ b0 e
--rollback 回退,commit确认。
7 c9 P( C! _0 ]: E) X3 v ?delete [from] 表名 where 条件;! b4 J/ |4 J" L# c" h
% Y# `! L2 a% T _9 `6 V/ T" | l
delete emp_bak1 where empno = 1002;
3 B6 L3 ?( I% o/ \ @$ }4 z
9 K; t0 Q, b9 c7 N" n0 o1 ddelete emp_bak1 where deptno = 10;; Q8 P/ }# Y1 y8 H) G
* |6 @6 x: z8 }7 }2 L% L K: ^( X
delete emp_bak1;# K0 p0 }' R$ M+ f
U. P5 r- `9 l# m) D4 ^; ^, h
commit;
# q" B+ t( |4 G* Q2 u5 D--执行了3遍
" I) q% s& {- ?5 P" Ainsert into emp_bak1(empno, ename, salary)
- X. e8 o) U8 ]1 a0 jvalues(1015,'amy',4000); x' @# \( `. H. s- l" x! n- {
--执行了2遍4 t6 B3 M' ]' T# }9 N
insert into emp_bak1(empno, ename, salary)
% b0 V3 s, o7 x6 v! F4 x" Z% {values(1016,'rory',5000);
9 ^( k4 t' h1 U$ x--执行了1遍。* H0 j* e$ H" [* x, ^
insert into emp_bak1(empno, ename, salary)9 O' t) y0 A! O* v, x
values(1017,'river',6000);
1 ]& v/ j7 c4 ~. F5 @4 U }--创建表emp_bak2,只存放不重复的记录
' q, N+ u% x% Acreate table emp_bak2
) ], T- ^6 _5 S" S2 u$ _4 was
5 w H. _& q% k/ c9 z- hselect distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr
/ y! v d" b- n' Kfrom emp_bak1;6 E/ z, y2 z8 I& g! T: M
--删除表emp_bak10 {2 w3 @4 r3 S" q& R/ a" Q
drop table emp_bak1;
7 i3 u( T% r& z' \--把emp_bak2改名为emp_bak1
4 B0 g) J; V5 u. mrename emp_bak2 to emp_bak1;. X5 q1 V, r1 B2 H8 Q' F+ A7 q
9 i% G1 D; V5 ]8 Z \2 o
___________________________________________6 t$ T: @* q; F3 e. J
$ X. b7 o! _4 z7 }( u6 Y1 _ q
, Q0 `4 |8 R9 O+ b( e
delete emp_bak1;
8 A7 N, j: J7 L7 `! y7 \
# F g- `: R$ y; ginsert into emp_bak1(empno, ename, salary)
* L# y- [. o/ \+ svalues(1020, 'amy', 4000);
$ p2 s0 a8 P* E+ v2 \insert into emp_bak1(empno, ename, salary)
4 a5 L# X. p; R9 h7 p0 [values(1021, 'roy', 5000);
8 M* w0 v0 B5 T% q$ Q- i- R. E0 V- ?insert into emp_bak1(empno, ename, salary)1 u1 B# e1 f: W& G h
values(1022, 'river', 6000);
, |6 p/ U* O- \$ w1 a5 B
1 v1 R+ ~. t9 _* O! M. k" h+ n--rowid是Oracle数据库的伪列。
% `0 ^9 I2 {3 d: |" |--rowid是Oracle数据库独有的。
% J6 Q5 W& y9 w1 V! f, b5 ~, E; X delete from emp_bak11 G( A. P+ a% m, Y+ J
where rowid not in (' e5 M8 u% H" i2 E
select max(rowid) from emp_bak1
; T4 S; ^; ^ Y, j; e) \8 J group by empno, ename, salary);
' I) q; Y. n" A6 [2 T$ P, ]+ d0 Z* M) N6 H3 W
二、事务:Transaction
6 Y* i) s0 B: D: b) }TCL:Transaction Control Language
9 a7 R% x4 }3 qcommit / rollback / savepoint1 \* N+ @; g) g. `; {5 P
事务:一组DML操作的逻辑操作集合
0 C0 M( M( z; i# q4 v ***
3 c1 o2 {' A+ u, \3 { Q1、事务的开始和终止5 N4 w7 O8 ?- N; D3 v
1)事务开始于上一个事务的终止或者第一条DML语句
: G3 ]. ]5 ~+ w& b# \2)事务终止于commit/rollback显式操作。4 F8 `8 t) L5 a& ~9 W6 l2 h. { f- A
连接关闭:隐式终止. k" V2 M, }+ x; f
DDL操作,比如create:隐式提交。( S G) f* }9 L) X+ }& C) M8 D
" v+ ?8 N' Z! p- w f2 W' z
insert into ...values...
5 O I, G) g% f; Zupdate ...- M% U5 V, l! {% C, ]3 l; Q
delete ...
* d0 }5 E5 u- T/ O2 |insert into ....: j' t" @- n8 v2 O) {
--rollback;--回退到事务之初,数据的状态和事务
& D* S# c/ _1 f# {$ o3 a" u% z开始之前完全一致。
; s# f1 z6 Z2 j+ x' S' m, V. k, N+ dcommit; --所有的数据改动提交。7 L9 |$ [% A# U' e
* d. O2 P7 A! Z+ C1 |
2、事务中的数据状态: e& P3 a: d0 i" q) x% U% j" |
create table mytemp_ning(
# U" A1 v% [) G% J6 U7 h) H6 Oid number(4));
# v- B) t$ R+ I+ G4 Sinsert into mytemp_ning values(1);
/ e9 B% Q; G7 Q5 P1 l* a. X' E! @insert into mytemp_ning values(2);
* a3 K( w# C9 t, F* G$ `' f) R6 \& }; B- q4 T9 j
--事务内部的数据改变只有自己的会话能够看到
; ?5 J! d2 c$ l) C--对事务改动的数据加锁,事务之外不允许操作。
. v3 [; M) c- X, l- ?4 Q: b0 [6 ^
如果提交:commit
% |( Z+ s' I3 o* R$ f6 W% R" b数据的改变被确认。所有的会话都能看到这种改动。
1 x4 T. M0 J) E. \* i0 J数据上的锁被释放。
# \0 o! |' x( D) B: Q) W: E& \" u保存数据的临时空间被释放。
4 h9 Q, ~4 R( K( h) G3 _* e
% s' T& _+ \# R$ X/ Y( q9 H9 N如果回滚:rollback
# `9 u6 @" O2 Y8 ~: @6 @数据的改变被取消。5 t$ {. \) h4 x- U& K
数据上的锁被释放。
# I5 f8 X0 |# S* |临时空间被释放
1 M% l; B- Y+ a6 w# gcreate table mytemp_ning(id number(4));
% a, q M+ \& d8 n! L/ f--事务起点0 T9 v2 Q; F$ W9 ]) r
insert into mytemp_ning values(3);
( z( v+ y. @( J9 T, E! ]( psavepoint A;
8 ?3 C: \) I* O# h( o p( C$ Einsert into mytemp_ning values(4);7 \' G- Q( i* m" w ]" l
savepoint B;) r/ r& g# z( a7 ] l! S }: [
insert into mytemp_ning values(5);& X( u) @2 z% ^1 x$ ^% X- {. A' t
rollback to A; --回滚到保存点A,A之后的保存点全部被取消* M7 M1 E; @3 d- ?
select * from mytemp_ning; --3保存,4、5回退9 W0 {8 h1 @) E" o! h: a* |
- e+ Z8 d' c3 X s% @" o
三、DDL: N, U7 [1 |6 O" \9 ]2 U' q6 g
create / drop / alter / truncate! | l) Q3 P& F1 J/ r
5 \/ @. Y/ c/ _; L8 d2 X
数据库的脚本(script)文件main.sql:
5 _/ [ S( N0 a. ~! ?# Z! e0 N------------begin--------------------$ I. s; b6 b5 S$ y! }0 D4 I
--删除表emp" [' d" d4 B! x; T, Y6 A7 N, \
drop table emp; _+ w% G B' u! }# y
--创建表emp
6 [9 V* m7 E+ F6 icreate table emp(id number(4),
4 P1 ?8 M; t: g$ Pname char(20));
o/ d9 k ~. o6 Q3 j t% qinsert into emp values(1, 'amy');( ^( o, q' m# V5 h1 ?# j
commit;
f+ j& b4 q n9 S1 s0 X. A; j9 C; q/ K2 j3 |: Q
: @( I( z- x; A* O0 ~2 n, y4 y5 s5 z* j
|
|