该用户从未签到
|
1.内连接
# {# V! f4 E* f P: N9 y0 K+ @1 ~; a, q% F- M- l( J5 H; }( L
t1 join t2 on 条件- W4 E& n/ d! d- S) I4 `# S B
" M$ r, T) }9 V; N1.1.等值连接:如果on后面的条件是等于。
+ `$ z0 ]3 m( G& m2 q( |4 at1 join t2 on t1.deptno = t2.deptno, O I1 B* V! h# Q& u( Y2 l/ r
1.1.1.等值连接的一种形式:自连接8 |& x8 A) A& G6 Y9 ?
t1 join t2 on t1.mgr = t2.empno
: B# c+ i! g# x+ o9 P4 }9 w2 Y+ t7 A; p
1.2.非等值连接:on后面的条件不是等值操作
W8 d2 }- I0 i" s1 U+ p+ Hempno ename salary grade lowsal hisal2 P7 N8 P- T0 u0 S7 @/ ~7 Y
------------------ -------------------) U. X1 v3 A! ?3 Z* N1 r. F4 E
1001 zhangwj 10000 1 10001 99999" m0 J0 k) Q3 u1 T
1002 liucs 8000 2 8001 10000
a: v7 n$ q) K' y5 {( u p1003 liyi 9000 3 6001 8000$ k0 F, V5 H9 `2 L
1004 guofr 5000 4 4001 6000
/ K; F! h8 u2 `& ?% ~ 5 1 4000
- H# T5 T* [) Q* t# s--步骤:1.建表;2.插入数据(commit);3.查询
6 _" q! ~8 B/ M6 [; s. R# W' Tcreate table salgrade_ning(( i. Z5 m+ ~" i
grade number(2),' Z( C+ C) O) G/ m- d2 Y& U
lowsal number(7,2),' |- p$ c: f3 c$ O- t" i) {: B
hisal number(7,2)6 e# `& S# q4 {6 J4 z
);
, k2 Y a8 {/ F+ Yinsert into salgrade_ning values(1,10001,99999);$ \ @, W2 d9 F' h! A# W5 u/ I
insert into salgrade_ning values(2,8001,10000);6 f* ~2 @" T7 X. u
insert into salgrade_ning values(3,6001,8000);+ e$ ^. L1 v& S6 @; g6 S8 V* l1 q- J7 W
insert into salgrade_ning values(4,4001,6000);
$ p7 w' f$ H0 k" A1 Hinsert into salgrade_ning values(5,1,4000);
, d6 k" G+ E2 v0 F4 A& ncommit;
) \8 b. t6 [; M Z( G: j--计算员工的薪水等级:
& u( B4 T; J+ H9 J& }select e.empno, e.ename, e.salary, s.grade) [$ z; h; k' u0 e. N
from emp_ning e join salgrade_ning s
" C* J; s W& w7 M# |3 \on e.salary between s.lowsal and s.hisal;5 W* T* u, e1 ]& M9 f* `' g
--最终查询结果的形式:
" T9 h7 ?6 r/ M/ P% }$ q1001 zhangwuj 10000 2
! _8 U% }% x# d5 r9 S( }1002 liucs 8000 3 0 G# C- N# J2 r ~& U/ Z' p! H
) T* h9 K* k) G5 J; i* r2.外连接
: r* v' `% d6 C% X. W" n& m/ Q, yt1 left | right | full outer join t2 on 条件. D4 i" H6 v6 S6 }9 Q9 z
; I+ [9 e# V8 I# h( d- |9 U
SQL语句的种类:
f4 @' Y* z4 g1 v! H; EDQL:select( D% e, t d3 S/ b1 t, E
DDL:create / drop / alter / truncate+ L$ {. x" F( U$ o8 v, C
DML:insert / update / delete
. S. K( C$ Z# B% o8 F3 k) }( LTCL:commit / rollback / savepoint* W/ n7 U0 H) u6 }
DCL:grant / revoke. R6 C4 m0 w5 ?# L- a) y
& j$ k. H4 [ c8 D
一、DML操作* }" R: z5 X- Z: s& [ O5 @ ]+ e
1.insert into...values..." i+ F1 P, h/ ?6 b+ F+ r1 O# K
--1.1.不写列名0 e" q/ d! z, C- m' P# R5 v
--必须提供全部的列数据,数据的顺序必须按照表结构
9 W0 q9 z d0 {--如果有数据没提供,用null表示
' W: N1 J2 k+ H1 Pinsert into dept_ning
2 e* l/ G) h. c0 B& N' nvalues(66, 'market', null);1 I' _; a9 L1 I. r8 S, O
( [. S. z4 Q6 Q4 w
insert into emp_ning
; X+ F. F% a" ?" i. I$ l; w: Xvalues(1020,'rory','Programmer',6000,null,null,# w5 X9 W8 F0 s' w% t" Z! s) j3 A' |
sysdate,10);% T. h3 ~! N ~8 L
1 Y# e4 u: t# c--1.2.写列名7 W0 S" C% {3 i5 G* b
insert into emp_ning(empno, salary, ename, hiredate)
0 S$ I5 `3 l/ `, } w' h# Avalues(1020, 6000, 'rory',
* I' [/ B' a' s3 @" k9 n* Z% pto_date('2011/10/10','yyyy/mm/dd'));
7 e3 W- c* X9 A2 ~, b" H1 ?8 b- s1 i8 b) ~8 g3 a
--to_date函数是oracle独有的。* y/ r: z2 A8 u: d$ p% g; Q
--在oracle数据库中插入日期数据,一定要用to_date2 C6 Z1 Z1 l7 i6 {
处理,不要采用默认格式,比如:'10-OCT-11'。
! x, c- I: _. @, t0 e& Q
# f3 w+ f& U8 t/ Q2 k5 }--建议采用:写列名的方式。即使是插入全部数据,也
* Q; ?- z) Y" h* [! v. u建议把列名写全。
! D9 G; U0 j: w, G7 r--复制全表
9 y! }: o3 S3 xcreate table 表名
( g L4 R- U& s* J/ b- Z# Zas e" D4 F4 R. R* \) j/ e, D3 M
查询语句;* a8 [- w; q+ Y5 y( G0 p: m
' V: d7 U9 N$ o! q g# x
--只复制结构,不复制数据# I0 z, C) x9 X6 `
create table salgrade_ning1
4 d V3 l2 {+ F( x# F. g% Pas, w- r$ x8 c% g( X; [" Q! e* V
select * from salgrade_ning
0 M- e2 s) [7 A" W$ hwhere 1 <> 1;
3 V; {' F$ G5 v' ^; X
, s& ~ e0 {. \: X--复制一部分数据:给查询语句加条件。
/ S7 j$ Y' F% i/ X+ `--如果查询语句中有表达式或者函数(包括单行函数和
A' e$ N8 y+ B组函数),必须指定新表中的列名
' O0 D% Q6 M- `--指定方式:给列设置别名;或者在新表后指定。
% i7 X r. u% O8 wcreate table emp_ning1
4 V5 v% G' e9 n; l' vas% Z: Z6 t8 O) |, H2 q3 r l1 B4 b$ p
select empno, ename, salary*12 year_sal8 L' j8 E! p4 I# p! F- [5 R0 |1 z
from emp_ning
/ W0 k6 H+ q9 O/ {; g8 A6 }$ Swhere deptno = 10;
: p! x; [+ l! X/ p8 `0 }# ^, O! T
! T1 ~' M* e) v% {8 f U% ?create table emp_count(did, emp_num)
" \- c7 b5 A+ g# Yas
6 Y6 Y! k8 F8 ?" U5 T8 }2 Z4 e# ?select deptno, count(*)
, w- ~6 b! N ]' ~& gfrom emp_ning
( S. A- h% @* G. V& \group by deptno;
2 ?4 l% H# e* Y9 [4 {; r
0 Y Y5 \' Q' b3 c. p' A" {& J5 m--创建一个空表
- V9 a( F6 e( Z/ |create table emp_bak1
% |* q: _6 H; v5 Las% I \6 P# L3 x Z! {9 ~# Y
select * from emp_ning! o% u* o c( w4 m6 \4 T
where 1 = 0;: W9 b' w, a: }* ]- l( `
9 V6 t6 n; `7 f l, A
--向表中插入多条记录6 A) z; S4 W N2 i" x- s
insert into emp_bak1
- ^. {( j! O5 Y& @(select * from emp_ning
3 }1 `. R+ r0 \' o0 }( \1 t where deptno = 10);
1 [! B' d! }6 }0 I. ]; [3 [+ f7 ~4 X0 L& g" W" r+ @7 x
--把表中的数据换为部门20和30的员工记录
! G3 A2 g6 f0 x# x/ I% l) e1 Jdelete [from] 表名; --删除全表的数据。+ n0 q6 E& {/ }+ {" _8 T+ ]0 D
delete from emp_bak1;" f3 L' c3 ?6 p: @: S) h! f5 w# s
8 l) w$ z; Q1 |
insert into emp_bak1$ @! M" @& h- \6 ?- _; h
(select * from emp_ning% W0 h0 f/ K4 e6 E, t# d* R6 w
where deptno in (20, 30));
: a( S" l4 V- t
7 O& q$ V1 b9 S, W# j; {8 S$ L--向新表中插入指定记录数的数据,比如前8条。
+ a* S9 g0 B* }4 [0 m4 u( Ddelete from emp_bak1;4 U E# i, ]& R3 E r
* }7 M0 }- B- Z3 e+ h% O$ \4 e
insert into emp_bak1
- F7 z: h# F1 }5 O3 e9 P$ K(select * from emp_ning$ s% [9 H$ [* y5 k) ]8 L- s) S9 D
where rownum <= 8);
: Q; g7 M/ I, C/ O2 C) N# O- T2 {4 D1 J
小结insert:
" T+ D, }4 O4 M7 V& a# L! S1)insert into 表名(列名,...) values(列值,...);3 g& A, e9 J5 u r! j( A; s
一次只能新增一行。; _3 D6 Y, k0 Q7 d( S
2)insert into 表名 (查询语句);
3 `% F# z% Q+ {! s一次可以增加多行。$ x2 y, E0 V$ T/ ]
6 s5 ^1 |7 T3 @
2.update:更新数据
: j. z5 ]+ I' M' [2 f% R% F+ N+ [update 表名 set 列名 = 新的列值,& a& n( f, D" g* C3 ~
列名 = 新的列值 y0 _0 Y4 ^% u* [
where 条件;0 Z$ X; h5 q- d" o! ~& Q! i
& ~0 h# X6 ^1 ~: c2 ?* J, d' ~
update emp_ning set salary = 3500, 0 W% e1 V0 ]1 x+ n1 a; p
job = 'Programmer'1 c% s5 O7 x3 ?2 F
where empno = 1012;
. y. J2 q2 H T4 e n* r! W' g
9 z, r7 P6 b( b( k! @" n--部门10的员工薪水+1000
2 n+ m7 }6 q% ~. e" rupdate emp_ning set salary = salary + 10000 k+ p! {- S. O0 L" ~
where deptno = 10;
9 n+ _. v) x( |% V! M8 A. y+ ?% L
. A* z0 B1 ^, V8 ^--更新数据表时,注意条件。2 d: L d6 i( f4 A7 A
--如果不加条件,影响的是全部表记录。4 }6 } A& D4 u, q; B
, D5 P6 h' m, H0 i
3.delete
. g/ o) ]7 ?/ s' f* Y5 x--注意条件。
# D! {1 S4 E2 _--如果不加条件的删除,将删掉表中的全部记录
1 _# k" k0 h' N1 z5 |5 x9 Z- D--rollback 回退,commit确认。
' ?% h3 H& O/ |# P8 U8 |0 J/ Sdelete [from] 表名 where 条件;
* @0 F3 K1 r4 ^( V+ y
2 y. {( s/ P( @% ^6 vdelete emp_bak1 where empno = 1002;3 r, v; f& C$ F3 j6 F" |
/ c, o6 s W7 s7 {delete emp_bak1 where deptno = 10;5 A) W$ Z4 i/ C3 a
! M) a7 P( p5 G- M% ^delete emp_bak1;
0 n' p- Y" p H- O5 ]2 A+ j) j4 ~, B, Y, g% \- g
commit;
( a, i, p* Y# O4 n% f- [& d7 W6 @* ^--执行了3遍! y! P8 u, `$ G! x$ W
insert into emp_bak1(empno, ename, salary)9 F: h6 s# N, f- D, H6 d
values(1015,'amy',4000); q" C5 R0 `& G7 N$ j: V
--执行了2遍
4 O# h+ r, Z$ ]- D& c einsert into emp_bak1(empno, ename, salary)1 s" ]: {3 e. w' W: g- [3 |* e7 F
values(1016,'rory',5000);) R/ m4 ], e$ Z8 v( o8 }" I4 C
--执行了1遍。
+ ]5 a7 f0 z! {( ~; ~; U+ f: I. q, [insert into emp_bak1(empno, ename, salary)
8 t- p- Q8 f, g5 ]9 ]- Hvalues(1017,'river',6000);1 N9 r6 Y) R0 p/ y5 D- n u4 N
--创建表emp_bak2,只存放不重复的记录0 F- e2 A6 y/ A! j
create table emp_bak2( b! F) I4 g9 u6 a0 u9 ^ Q9 L ^
as
2 {0 c8 q* l6 E( `select distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr& V$ J% w9 b6 X: O, U
from emp_bak1;
. d( ~, ~2 i! ^' ^4 h+ _--删除表emp_bak1& X0 v. Q/ ~. l2 n6 R
drop table emp_bak1;
5 B5 a% R) q. m! u% D9 f/ w--把emp_bak2改名为emp_bak1% [) N3 \& ?/ W/ g& m# }
rename emp_bak2 to emp_bak1;) Q* L: x9 A1 u* t
; y& M% X2 u( F___________________________________________ s5 ~6 I1 F9 _3 X; E
6 Y7 t& s& l, q: F
+ l8 t; d4 p% o1 E% p* ^5 Ldelete emp_bak1;
, r$ `5 G. {; k$ X$ z3 A
; Y; y7 ]) N" \insert into emp_bak1(empno, ename, salary)
- o2 N$ D9 @& c7 J% }9 ivalues(1020, 'amy', 4000);+ w5 ~/ G9 p2 r5 g5 c" I
insert into emp_bak1(empno, ename, salary)& d8 n; W0 C6 r0 Y% x- Q) P# Q/ n7 O- i
values(1021, 'roy', 5000);
( `0 n: {8 B( C! S8 Sinsert into emp_bak1(empno, ename, salary)0 V9 M( E4 @7 R' Q
values(1022, 'river', 6000);
3 _; n9 p: D) p$ x; d8 {3 t2 F! E+ J O# E+ |, u$ k( s0 r/ _
--rowid是Oracle数据库的伪列。
& e4 f1 C- ?3 w# F* e; R8 I' e--rowid是Oracle数据库独有的。& ?3 n) i: D0 c' ~6 y/ O
delete from emp_bak1: R3 [7 U+ y' ]1 ]& z
where rowid not in (' a( @/ k$ ^" H# n) S8 c
select max(rowid) from emp_bak1( K( B x1 W Y, m5 M
group by empno, ename, salary);" a5 H# x, k6 |! k* }, B9 Z4 s' b
* R2 J2 z! L+ d- T) u. P二、事务:Transaction" T0 @% S; W) B: M. F
TCL:Transaction Control Language
( j: b2 c8 H/ ^- S# @7 xcommit / rollback / savepoint0 S T' f$ u$ d' ^
事务:一组DML操作的逻辑操作集合
! @" b }3 W; r3 Z( x% f ***; {6 R3 D9 g3 r+ P D( ?- g
1、事务的开始和终止
. i! T. p- Q9 @8 F7 L7 L, i" y1)事务开始于上一个事务的终止或者第一条DML语句
& d1 Q. E7 N7 S: a6 E: c2 B2)事务终止于commit/rollback显式操作。
( k0 N* A* n* M" _$ }4 ^/ Q 连接关闭:隐式终止
$ _( j1 g& s0 z' G0 s5 v) m* P9 c( E& G DDL操作,比如create:隐式提交。
" E3 a' B! g9 X0 w v* H* n" s
. s/ P6 ?- s0 @' n6 vinsert into ...values...! f" A2 V6 T1 Q3 O: C
update ...
' b& _ K7 L! n: v* Odelete ... ^0 |% n" p1 N( u
insert into ..... M; v6 Y/ F5 h1 M. X
--rollback;--回退到事务之初,数据的状态和事务
, O+ C+ [1 W6 b7 r- c开始之前完全一致。
. F+ w& @9 M0 I/ Tcommit; --所有的数据改动提交。0 h: [$ q" v9 M5 h
8 B- p$ ~0 b5 d4 f! O7 P8 C2、事务中的数据状态) P( G; n* `" \5 _0 F
create table mytemp_ning(
7 ]7 K# _, J# O& [id number(4));4 |# N3 [' A5 V' r
insert into mytemp_ning values(1);; p P& Z8 `; A/ i$ ]
insert into mytemp_ning values(2);
( ^5 V. A1 O2 ?8 J1 c# D" n" f; ^
; @* \% B9 u, @. C--事务内部的数据改变只有自己的会话能够看到7 v( Y1 M* U& _! \9 c: c# r4 B
--对事务改动的数据加锁,事务之外不允许操作。
: I" J/ x. u; m2 T9 a+ o' z4 T1 }5 s9 R5 t h% c1 b
如果提交:commit
+ E& o4 w B7 _, w! J$ l- b数据的改变被确认。所有的会话都能看到这种改动。7 \. q* S& i" l4 Z
数据上的锁被释放。
0 G/ u0 {! q# A* w2 ?保存数据的临时空间被释放。
4 z5 ?+ m2 Z" l# c, k) _
; u4 \% p2 u8 z3 `如果回滚:rollback& n" ?7 R4 Y5 l }" }
数据的改变被取消。# d/ Z, b& W. P; b" A4 R. ]
数据上的锁被释放。
5 [* k- i2 F& r( ^% c临时空间被释放
# o4 r1 n- _. H1 s g0 D! g" ~1 Qcreate table mytemp_ning(id number(4));6 H& q0 Z+ D5 d7 _2 Y. R4 _
--事务起点$ `1 P$ b; P4 _$ g+ W. u# A0 c0 K
insert into mytemp_ning values(3);
* O. C2 l1 M7 Z& P% E( ssavepoint A;
( @4 S+ A: b; G) M* v, b) Linsert into mytemp_ning values(4);5 t3 ~6 a3 e5 p4 t
savepoint B;
7 J8 w( w8 ?2 cinsert into mytemp_ning values(5);
# o+ [2 `# L: q ]+ }rollback to A; --回滚到保存点A,A之后的保存点全部被取消2 q, j3 ?2 ^1 X6 |8 {# ~9 O' n; l
select * from mytemp_ning; --3保存,4、5回退& Y! C2 h: c' B) A% t
( ^: S4 R+ q2 W4 g+ U3 b
三、DDL
C; v+ b# ? _3 U6 J V2 B6 rcreate / drop / alter / truncate" H/ e0 J$ t6 X& W1 N; b0 w
3 e8 `0 q4 B3 \" u# S4 e
数据库的脚本(script)文件main.sql:' j- r0 K# Z2 R/ k$ R6 T B
------------begin--------------------8 V" Y1 W& _7 K0 C, Q0 o0 A- B O
--删除表emp, `; N% H% D- W: }- X3 B7 |
drop table emp;
# p. E: Q; V+ T q/ E* m c--创建表emp
) G7 T A9 ~; _# W3 Ecreate table emp(id number(4),7 s0 |# A3 z6 T7 _, d
name char(20));! o) ~1 W3 @! u9 z4 I
insert into emp values(1, 'amy');
# Y o; G" p' b) `1 Q4 ?% Icommit;/ c+ b: W- h2 v& v# ~" s# |# Y1 w
' z8 j$ Q* `4 l9 E/ M7 b
; B% p+ W$ x9 \6 b |
|