该用户从未签到
|
1.内连接5 b& S C5 H8 r- j2 X$ y
+ G) |1 ]9 o+ }5 s1 v* F# ?
t1 join t2 on 条件5 D2 c' w4 u+ Z
^8 ^1 b5 G" a z* s% Q1.1.等值连接:如果on后面的条件是等于。
$ Q# I: S' Z! n- `: d# Dt1 join t2 on t1.deptno = t2.deptno
2 ~$ d9 D3 K/ n" J& c& F: w/ E) P1.1.1.等值连接的一种形式:自连接2 q( l% U5 b9 b! l) V" P) d
t1 join t2 on t1.mgr = t2.empno2 \5 S. X1 |2 ]4 C* ~5 B( x
5 n( {0 ^* D( z1.2.非等值连接:on后面的条件不是等值操作
) u$ }- ?9 C2 n& nempno ename salary grade lowsal hisal
+ E- I3 M4 g& G------------------ -------------------
8 [6 ?) B. i: i% N; O1001 zhangwj 10000 1 10001 999994 ^# h( ~* `$ N7 l! T" G
1002 liucs 8000 2 8001 10000
: B" `0 v Y2 q6 M1 |8 B/ `1003 liyi 9000 3 6001 8000
1 i" G( H7 U2 r. d( L& @4 @1004 guofr 5000 4 4001 6000
& n Y+ V3 V; G6 d0 C& l3 P; y 5 1 4000
9 F* Z+ z8 O' C--步骤:1.建表;2.插入数据(commit);3.查询
! T( n! g7 w2 O1 m; h9 Fcreate table salgrade_ning(2 o s+ `/ e3 `* {2 ~
grade number(2),' Q- f& @. w6 K% E
lowsal number(7,2),$ s2 T% ^1 J& n* J: N) \
hisal number(7,2)
; ^+ G8 ?7 }3 {- J# _3 J H);
; I3 C' S4 I1 R4 uinsert into salgrade_ning values(1,10001,99999);4 p1 K+ N2 n2 N0 h1 I! C& f. U
insert into salgrade_ning values(2,8001,10000);8 O7 j; C* F7 D) j3 C9 i/ J( s
insert into salgrade_ning values(3,6001,8000);
, J, t0 g0 Y. e* I& rinsert into salgrade_ning values(4,4001,6000);3 ~7 e( k# h+ |7 t
insert into salgrade_ning values(5,1,4000);: k3 Z: I8 w, E- L& F+ o" K) M
commit;
* I5 U4 i; {2 @, f! T--计算员工的薪水等级:- P- B8 K3 c& Y% Z1 _; ~. X6 P
select e.empno, e.ename, e.salary, s.grade
6 T5 g5 K( V5 b Xfrom emp_ning e join salgrade_ning s
( w0 D' |# B6 i2 [5 e9 B+ c. H: won e.salary between s.lowsal and s.hisal;% k! w x3 u- V6 ^3 _! W
--最终查询结果的形式:
5 i/ G, ]+ V/ \( Q$ o1001 zhangwuj 10000 2' r& s+ {0 V9 u2 u9 E4 o' D
1002 liucs 8000 3
* x! c9 s' V4 b6 Z- _
5 m9 f' a0 a. M7 c2.外连接
4 i6 c/ W* p: j+ g( st1 left | right | full outer join t2 on 条件4 V1 h4 { k% ]* d
. s$ Z( @4 ~# Y) p2 X) }4 F$ c
SQL语句的种类:. ~ t3 c% ?- j4 y; `+ Y
DQL:select
2 l. v) V- W2 V; u c; C. C4 z2 `DDL:create / drop / alter / truncate
8 e$ c2 c5 p" D+ V( PDML:insert / update / delete
b0 K6 u- C0 v# y5 STCL:commit / rollback / savepoint
+ t5 {9 \* Q6 }DCL:grant / revoke" f; H7 K& ~( k1 d* f0 S: C
# l+ _: d4 x" U4 f) p1 G
一、DML操作* c: F& y* j6 E/ k; Q
1.insert into...values...
% B V- a+ D9 F9 _4 Y4 r% O+ T--1.1.不写列名7 z9 l% C: P9 t' G! j( s
--必须提供全部的列数据,数据的顺序必须按照表结构
2 v/ e5 t2 E! X--如果有数据没提供,用null表示# C6 d- o+ j! X! y# D- {
insert into dept_ning2 j$ X9 j6 P0 B
values(66, 'market', null);0 j6 ]& k* X2 s0 M* i; e" y; F
V }8 d2 K9 D Y% t& k
insert into emp_ning
! u( v: y' H) k4 T# Y$ ^) k8 q; U; s5 Yvalues(1020,'rory','Programmer',6000,null,null,
/ ]9 k7 w$ f; A2 l' J* I, ?sysdate,10);
& L1 K" `1 Y2 x, L* f3 _! ?+ e
" N$ M0 b# f X' }& j! ^--1.2.写列名8 n9 ?) A5 A# m
insert into emp_ning(empno, salary, ename, hiredate)
* t3 H' L& e# e3 y$ l% Svalues(1020, 6000, 'rory',
9 w9 _* |- {( `3 U% ^# Xto_date('2011/10/10','yyyy/mm/dd'));" k8 M/ F y8 C ~! ~2 t
2 p5 ^; A) M' @& a: r--to_date函数是oracle独有的。. L0 j% a- h6 f, ~; h% T* g* P
--在oracle数据库中插入日期数据,一定要用to_date
7 W5 v0 q/ x4 b: ^7 b3 d% u处理,不要采用默认格式,比如:'10-OCT-11'。
0 G. s6 E. V6 E; i# `" j" F: F" B s, S$ r
--建议采用:写列名的方式。即使是插入全部数据,也" ^0 d% X& P. T
建议把列名写全。
: ~) {# {/ b' j" i, L- ~--复制全表8 Z4 q; [& ?5 c1 m
create table 表名
0 j3 Q8 F. {/ T: kas! D C' R( f! Z- I' q9 I
查询语句;
' J& z$ |% Y9 {" Y, {; U. j2 r8 j: Q f, y1 p
--只复制结构,不复制数据
8 \4 ^5 a8 q3 f0 S2 N+ V' }0 J, jcreate table salgrade_ning1
* a( m0 N3 H( ]2 Y$ l8 M$ L/ M+ ~as
/ J' k, _' Y' T7 f9 a& Vselect * from salgrade_ning
- V- D* \, z$ C: wwhere 1 <> 1;; W$ \# i9 C/ w7 b% e3 L
. u( ]+ i' p, ~9 T& c. d
--复制一部分数据:给查询语句加条件。- W' M4 L8 i8 M: D, J) u: e
--如果查询语句中有表达式或者函数(包括单行函数和& x; R5 K% }3 s) p; k
组函数),必须指定新表中的列名% S+ f4 d9 J# m9 y( _( z
--指定方式:给列设置别名;或者在新表后指定。
- S3 I+ H. G# `) d! L# U8 Kcreate table emp_ning1# b8 F+ u8 W! H
as
5 K" L% Q* Y# z1 ~3 \: }select empno, ename, salary*12 year_sal0 @5 k* y3 D) a# x! L! s1 g
from emp_ning4 f7 |$ K2 Z" L
where deptno = 10; L, @- b2 G& }: w6 m$ r1 U
5 ~9 d7 z) s4 V; B3 mcreate table emp_count(did, emp_num)
$ R5 g" Z& O% l, t' f+ jas
+ e; ?; q6 w3 a& Nselect deptno, count(*) 2 f, X. T5 H7 K
from emp_ning
; m; v* g2 o* M, P: Igroup by deptno;
9 l8 ~& \ T; @/ ?: F, n+ O$ C+ h b$ F: G
--创建一个空表; \7 j! m4 _6 [8 `0 k. ~7 W
create table emp_bak1- S \- o1 I# y1 @8 m- D" m
as
' C+ W- N! B# j0 l/ Fselect * from emp_ning4 d7 R: O$ k! A8 J* p4 Y: P2 P" o0 k# D
where 1 = 0;( A: j: j4 m( j5 b4 ]( p& _
' [& V9 K5 T9 ?6 ? j0 E* ]' \--向表中插入多条记录* v/ D6 R. h. S( L
insert into emp_bak10 @2 p+ Q$ Y: m. V/ q; G5 @
(select * from emp_ning
# t' s9 s T; i6 j4 S! S% @ where deptno = 10);
. m5 b% G$ n# @
1 J! B! g [+ N. {--把表中的数据换为部门20和30的员工记录% d: u! i, h W1 Y
delete [from] 表名; --删除全表的数据。( E m6 M; L: i* r& a5 u+ j
delete from emp_bak1;
! [. V1 N! V2 _' x8 q5 N. }+ }8 v- _- n" ]# _# P7 Y- ~1 f
insert into emp_bak1) J2 N! j) W/ `+ i+ R3 ~
(select * from emp_ning. |5 c# [2 K. |6 X" x) ?; P
where deptno in (20, 30));
9 r, Q4 M0 W& w. Q( Y4 d- @- @; t, z8 f; K6 n+ H$ x' b" X
--向新表中插入指定记录数的数据,比如前8条。
2 G3 {0 Z& |' t* u6 |delete from emp_bak1;- w: W+ Q) X' m2 R" ^4 e
_% S1 X3 m. R0 @; A( Z
insert into emp_bak1. g$ P5 Z; m7 \9 ]# ^' }; y y4 f
(select * from emp_ning6 C! q6 A7 l( V2 B
where rownum <= 8);
2 d S- e! Q4 b' v% R
0 G* t1 l' Z4 G# D% L/ @小结insert:" {. i+ d b6 C# p. B" Y+ X
1)insert into 表名(列名,...) values(列值,...);- J7 s4 m; c' j/ r l% k
一次只能新增一行。
4 Y: V b" b# V8 ~- B- n! W2)insert into 表名 (查询语句);
% ]' }+ O2 i/ `& e$ F. R一次可以增加多行。+ L3 q2 B- b Z0 y
* G0 e; L I* ]) _% I* b B2.update:更新数据
3 t S' M% Y, `3 l1 s& A' q& [update 表名 set 列名 = 新的列值,
) M8 ~* ^0 o2 r0 U 列名 = 新的列值
! B9 S. l* K5 B( m/ ywhere 条件;+ J- I. ]/ p; P. W& p8 n# S
P9 S! ?. Y8 O* U
update emp_ning set salary = 3500,
' L/ @1 y" i/ m6 y6 v8 | job = 'Programmer'9 _6 N! [2 \% |2 O
where empno = 1012;
! N0 {; _- X0 g. X; O" H2 y$ N H1 w2 V: n6 o6 k. S }2 z
--部门10的员工薪水+1000
* Q+ Z1 v% I6 G3 S+ Hupdate emp_ning set salary = salary + 1000) X7 _( N# j5 w/ k
where deptno = 10;
) ^. e( p+ ]* S( E& _
$ H9 C* L, r) p0 I--更新数据表时,注意条件。; x% T V! [3 c( X' O
--如果不加条件,影响的是全部表记录。
( a& i5 y# Z T! q( m% h5 m
, o1 v* W# n+ H9 m9 O9 G3.delete( I: b6 \: Q0 [9 ~$ e8 f J4 A. [
--注意条件。
2 t8 l& l6 K/ _1 ?% a. t1 @--如果不加条件的删除,将删掉表中的全部记录
7 U, g/ @ g9 H( d* O: C: G) l V--rollback 回退,commit确认。
% o: E6 K9 e3 Zdelete [from] 表名 where 条件;
' Y5 m1 s' h q# U3 M: T4 B% v, \$ Y2 p5 c- v, U% ~" u; c
delete emp_bak1 where empno = 1002;
, [9 Y3 k O3 N6 O+ L" a& t& _; k
delete emp_bak1 where deptno = 10;
. ~2 o6 h4 \1 w5 u# z2 S
( A( c7 c+ d6 _8 e# rdelete emp_bak1;% v% x0 p/ D1 \2 @5 d$ I9 z- X% z
3 Z4 C* i9 N% {; i' W2 Wcommit;" [( J1 d- e8 o5 C
--执行了3遍
( y# k; U W# V6 Winsert into emp_bak1(empno, ename, salary)
. B+ L7 d3 y- X- ~) N* ovalues(1015,'amy',4000);. o$ }* Y z8 a& q
--执行了2遍
# R( W& ?, R( |7 n: yinsert into emp_bak1(empno, ename, salary)
) ~1 N& _- f* P7 S/ R2 Y% W/ evalues(1016,'rory',5000);: f# j/ s( T- ~' H
--执行了1遍。1 W! s+ z: h1 f0 m6 g
insert into emp_bak1(empno, ename, salary)2 Q7 E4 G: c; ~% @& s
values(1017,'river',6000);
1 ], E& R" V+ r--创建表emp_bak2,只存放不重复的记录
4 N4 l" F6 x# E7 n0 S: Vcreate table emp_bak2( e" K8 N. \7 Z) {+ f2 x2 t* i
as
6 g# ]0 `$ { N1 r Dselect distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr
" r$ k1 A) I" A+ R Q4 dfrom emp_bak1;3 m5 ?6 Y; x6 n& U: K
--删除表emp_bak14 {- n4 q9 s( \1 `# C
drop table emp_bak1;
" J% Z+ Q) H/ y--把emp_bak2改名为emp_bak1
0 P4 i8 l- J7 I& k& \2 crename emp_bak2 to emp_bak1;
j, G! m+ ^/ A- @) E" s0 U; u7 }+ U6 V, \/ \# |+ D
___________________________________________2 H. a$ C ^' i; U
4 D' {# I# [7 B( j4 ^2 _) c0 i, g
delete emp_bak1;
* d V$ M; D* x" ^
^, w3 b% x- I* E* k5 T4 D ]5 R* w# tinsert into emp_bak1(empno, ename, salary)
0 F0 A" O7 m0 H/ X; q: ?* gvalues(1020, 'amy', 4000);
0 m1 m0 e& N. cinsert into emp_bak1(empno, ename, salary)
; L. x, V4 U/ ?values(1021, 'roy', 5000); b$ _. H' ?+ O2 ~- s: t3 h w
insert into emp_bak1(empno, ename, salary)3 g. Z, Z6 b8 `7 Y. w; J7 L% r
values(1022, 'river', 6000);
! \( S2 g" q& i. s l" r3 Q* q( @6 v* z
--rowid是Oracle数据库的伪列。* o' D+ ^/ s. G1 V* Z
--rowid是Oracle数据库独有的。
9 o5 D b3 I$ v- o delete from emp_bak1
/ w# U9 P* y8 P) U' i where rowid not in (4 b2 x1 A4 ~+ Y9 C9 D. |
select max(rowid) from emp_bak1/ s0 e: v! l: I
group by empno, ename, salary);. a, o1 g, z6 W ~7 V( J9 r
) E0 W8 k2 N6 }8 [
二、事务:Transaction
2 L% J% P% ^5 d( q, f2 _TCL:Transaction Control Language, L# F) i% ~9 A! ^
commit / rollback / savepoint9 \% ^) G% W. l
事务:一组DML操作的逻辑操作集合
, i/ l/ R# t" Z ***& I& H& L& Y- N$ K* f* a0 g
1、事务的开始和终止& I* Z7 s/ I! `2 P2 ~4 j, i* F
1)事务开始于上一个事务的终止或者第一条DML语句
1 w! g L; k/ |2)事务终止于commit/rollback显式操作。7 c- i- D- O( T8 ?/ L, O* s7 R. [. n
连接关闭:隐式终止, j |1 ` u, v7 C
DDL操作,比如create:隐式提交。% {6 q, I6 c4 l( n, i A
. X/ h+ P; D6 V3 Xinsert into ...values...0 |' D3 W- g* B2 D6 J
update ...
( e3 r0 H& ^' odelete ...
6 m# m/ i7 z' R8 h9 V. H5 s) o7 yinsert into ...., M: {6 h6 q1 P9 z r3 {1 l
--rollback;--回退到事务之初,数据的状态和事务
" V1 W$ ?$ a( T! t开始之前完全一致。# d0 }7 d" q+ n" F# ?7 B
commit; --所有的数据改动提交。- a% M' w+ w3 M5 P
; b6 _8 ?; b! {+ C
2、事务中的数据状态
8 B: U" R5 c4 ]$ C$ E, | Ecreate table mytemp_ning(
$ n" c4 a! k" h1 iid number(4));
1 i E" l' d4 B; ]8 o$ A9 Zinsert into mytemp_ning values(1);! }* [# }9 Z( e4 y- ]% i2 Z
insert into mytemp_ning values(2);( c4 K/ x. B0 N) Y H+ F8 Z! Z
& S: W5 L. h5 `0 ?9 K$ R3 _--事务内部的数据改变只有自己的会话能够看到' M1 ]; L# P( f% ?6 J$ K: v
--对事务改动的数据加锁,事务之外不允许操作。$ v% D$ l. m. C! p x
; ^! m4 G* m2 Y8 @$ ]3 {如果提交:commit
! F. a+ I- d4 F, D: M数据的改变被确认。所有的会话都能看到这种改动。# b: [3 k0 J) F! F6 ?0 |+ G
数据上的锁被释放。
+ z. N; ]3 d7 R保存数据的临时空间被释放。
: y. s# X/ V; E4 d6 [$ g2 m
# G3 J1 K* L3 O如果回滚:rollback
# N% \+ D4 t& F! q+ G3 Z数据的改变被取消。
& ?4 g' A8 a# J. x# }4 X+ d4 z4 q数据上的锁被释放。8 r' f& F. K- ]4 m5 {8 N
临时空间被释放2 G$ V; Z: @' m
create table mytemp_ning(id number(4));5 ?# ]4 A4 L, J ~# u, @- ?
--事务起点; B2 t; _6 j) y# d8 |- G( K6 }
insert into mytemp_ning values(3);
7 \# D( K- p2 E+ c/ `4 tsavepoint A;4 t3 t% R2 m2 k O
insert into mytemp_ning values(4);
* I' [; I" Q; F. u5 M' a9 o, G4 bsavepoint B;
% s$ H8 ]% J1 e5 e: J0 Xinsert into mytemp_ning values(5);
3 a8 ?8 w2 p2 r1 S0 c( a# Krollback to A; --回滚到保存点A,A之后的保存点全部被取消
8 @4 ^! q) k+ H! W7 oselect * from mytemp_ning; --3保存,4、5回退
/ w2 H5 L7 i* c+ e0 s
2 r/ n8 m7 o/ x( l/ z! d三、DDL
( [3 Z* r7 j1 w) d" p5 kcreate / drop / alter / truncate
6 R6 p* m) x" Y0 L& h
% w3 a5 v5 \/ J) n& i% X- q! S数据库的脚本(script)文件main.sql:& M8 H6 H e8 r: w- ?! N% R, _
------------begin--------------------$ Y8 H7 U# b- o0 x0 _- ]
--删除表emp
: i$ B+ d6 X. s* ~. qdrop table emp;
: X" F, p( \; F" v6 ?. {$ l--创建表emp
6 M; j" |2 P, }3 |# i9 g2 X2 l' O Acreate table emp(id number(4),
2 J: i, w+ d; Y8 {# X1 H$ dname char(20));, o, h* U. T0 M% L4 x6 b, B0 g9 R2 v
insert into emp values(1, 'amy');3 G( g2 e9 s8 |; h2 H9 T$ S
commit;
K0 ]" g L1 r: J0 ]
3 C# j9 Q( t% R1 T, @
5 u2 T6 q* n/ R8 y: t8 w |
|