该用户从未签到
|
1.内连接0 C8 b3 }+ b6 c( X2 c1 [% I
+ N, R L4 Y+ P" x S
t1 join t2 on 条件
4 H+ ?$ F7 [4 w) S7 k8 n9 ^+ x' X! x; W; J' ]5 v2 O4 w
1.1.等值连接:如果on后面的条件是等于。
, z; V- g; Y5 R$ qt1 join t2 on t1.deptno = t2.deptno3 O4 H- B1 Y/ V+ @
1.1.1.等值连接的一种形式:自连接
! Q0 Z4 Q+ x7 s: p) R* Z3 Zt1 join t2 on t1.mgr = t2.empno/ F5 `/ t$ d( \0 H" n( Q0 `2 H
* p+ M1 m0 @4 @0 a1.2.非等值连接:on后面的条件不是等值操作0 E" Y( H# @7 M9 X Q
empno ename salary grade lowsal hisal
" |, |" i. g$ F; x- p7 K------------------ -------------------
% e: V! v+ g1 Z- v. q1001 zhangwj 10000 1 10001 99999. t; K& q- f7 M
1002 liucs 8000 2 8001 10000
# n$ P9 u; \0 D( d9 n1003 liyi 9000 3 6001 8000) o1 ]8 }2 Q; ^; s$ U
1004 guofr 5000 4 4001 6000# j0 }/ ]' s6 z I
5 1 4000
( ]1 G, _6 M1 y8 x--步骤:1.建表;2.插入数据(commit);3.查询3 H9 U! F6 m& e8 _6 g
create table salgrade_ning(% A& h% k+ ]0 i
grade number(2),
# `8 b2 N- i) `0 i' alowsal number(7,2),
- ~8 l4 g) `2 a! q4 [: A* ]6 a/ H, bhisal number(7,2)
5 O, p4 N( e" E" I);5 K' c% j, j0 b/ S: E
insert into salgrade_ning values(1,10001,99999);
7 T; o. C9 ]9 {$ p& Z: rinsert into salgrade_ning values(2,8001,10000);+ y& {4 e6 K% m; e
insert into salgrade_ning values(3,6001,8000);
) ?5 E# E/ S2 A( binsert into salgrade_ning values(4,4001,6000);5 \9 I7 i1 w4 Y. P: x( x! [- U
insert into salgrade_ning values(5,1,4000);) Z9 D S6 ~% T" p; D
commit; Z T" f( a' }
--计算员工的薪水等级:1 T6 z; D1 D; v* h
select e.empno, e.ename, e.salary, s.grade
* F$ |% T: ?0 Z% h8 Jfrom emp_ning e join salgrade_ning s) |2 a- T5 b9 \
on e.salary between s.lowsal and s.hisal;
& ?9 r1 C! V8 q; t, @; d$ ?9 T--最终查询结果的形式:
* e% |" P x1 { G1 S1 q- Z1001 zhangwuj 10000 2! G& R6 E$ I2 @( B
1002 liucs 8000 3
5 B4 o C0 z* a. h" b1 ]
0 `; t |5 i, _( n2.外连接( M4 ^+ ?6 A% v" I9 h) P* `$ c
t1 left | right | full outer join t2 on 条件9 R: J" h$ V# r/ w8 \. v4 v9 }
( L9 x9 F8 _, Q( A
SQL语句的种类:
5 C- N/ W+ n4 v0 K9 K: v, a& nDQL:select) y2 o2 q* y) [: K+ {. w# H+ i0 ^, N
DDL:create / drop / alter / truncate
, N2 W5 _! {- k4 J2 D4 DDML:insert / update / delete
v2 e3 @( H/ g/ H, BTCL:commit / rollback / savepoint
9 P$ i1 P- O1 Q; e% F0 o. TDCL:grant / revoke
) p& ^5 n/ W+ b h5 _- Y3 [0 l2 n0 I( j# H, K; I0 M9 O) d0 e
一、DML操作
, o# P4 {9 k5 `2 b7 j1.insert into...values...
% U9 i! f3 J) Z* R--1.1.不写列名
2 B9 s7 V% x: [* M6 z- ~' y$ _--必须提供全部的列数据,数据的顺序必须按照表结构: _: B6 @& u, ^4 I$ X
--如果有数据没提供,用null表示
% g: u2 A) P! N$ rinsert into dept_ning
4 {/ L, k- A g2 b: d. ?values(66, 'market', null);2 C: c( _; ]( h; b
) r1 y. b+ A' m7 E3 ]insert into emp_ning, \/ d+ U# A# c+ u
values(1020,'rory','Programmer',6000,null,null,( L1 D# S6 F/ ?6 R [1 l* h! h
sysdate,10);
; ` y$ S( O# J$ W1 t& p% S" o9 E( u3 r2 d7 G. G) y$ |
--1.2.写列名/ z& @1 Q$ g# |' N
insert into emp_ning(empno, salary, ename, hiredate)
* F5 t7 r/ k+ `8 I) avalues(1020, 6000, 'rory',
: S; ^3 s/ ^) t2 _1 C9 cto_date('2011/10/10','yyyy/mm/dd'));( q" H- m% g1 W- I
( e _; Z W; v# W. E1 S, |1 E
--to_date函数是oracle独有的。
2 U k( _# k3 H# G* v$ x, ` S--在oracle数据库中插入日期数据,一定要用to_date/ X+ A6 \3 k F- E/ l
处理,不要采用默认格式,比如:'10-OCT-11'。6 l5 u' t9 r; r2 W8 J) O
8 g" g, d9 B6 e& B+ g) V, ]% U--建议采用:写列名的方式。即使是插入全部数据,也
* Z/ V' O$ w. k* M- N7 U# q建议把列名写全。' ?( t" a( a3 }9 R" v( c$ l& b8 k6 Y
--复制全表
7 s- a9 K3 k, \create table 表名. x% }7 P! F7 B# V* t# {; [7 p- G
as
1 H8 k' j3 A V/ ^7 T5 {查询语句;
: {0 C. n Q5 W- f& H, r3 Q" s* X. ]( `; g
--只复制结构,不复制数据3 U1 s" k' {/ \* b5 ]+ f7 [
create table salgrade_ning16 b, i! \/ c6 Z: s1 @
as+ P% ?& D7 P5 a/ V3 A7 K
select * from salgrade_ning2 y; ~' e3 C o3 i" k1 n+ G) ?
where 1 <> 1;
( S$ o3 p' c7 K+ [# a( p" g$ r5 D H" N$ G* _ ~! H, C1 K
--复制一部分数据:给查询语句加条件。4 T$ ?( ^; t6 _7 ^$ J* t* c; D
--如果查询语句中有表达式或者函数(包括单行函数和
% \/ C/ h* @" \' f组函数),必须指定新表中的列名2 y! q& t7 S- D2 t7 c
--指定方式:给列设置别名;或者在新表后指定。3 [5 {, {$ C: ?' L* y
create table emp_ning1
6 u. z" h* l4 J7 R2 O3 {5 Yas
* `3 a' H2 N/ F- i, }select empno, ename, salary*12 year_sal
, s* e ~) [! ^8 z from emp_ning8 Z) [9 u' R4 X1 ?
where deptno = 10;
5 P0 N/ y/ R4 D( n0 d
B; U. Q( S+ i3 R5 X) c1 ^create table emp_count(did, emp_num)' @, t- v$ J p1 w+ {! s5 e
as$ N" \8 r1 }- Q( r- {+ F7 N
select deptno, count(*) / b/ \) u. f9 b V/ T
from emp_ning
! j3 r r5 C2 p5 Ngroup by deptno;
( e8 T1 }' O4 {5 E- ^0 m/ F* t& b7 z
--创建一个空表) j3 p$ q* U6 X$ b5 Z0 W
create table emp_bak1$ @# d+ q$ ^/ f# o
as2 c) A, d% Y. V) l: M
select * from emp_ning) I$ R5 D3 _0 c* E
where 1 = 0;
5 Z9 D _" E1 Y4 t" H+ y1 ~6 J0 S: s' N( } x* Q% S9 T: I
--向表中插入多条记录( J6 } d2 |0 ~! s6 X# |3 i" ]" D( v- {
insert into emp_bak1 t- P1 z0 p$ C) ~; ~
(select * from emp_ning; y: U% F/ {6 T* g4 Z! ^
where deptno = 10);+ ^7 R* w. q0 r
U4 \" A7 ^7 e& Y& [--把表中的数据换为部门20和30的员工记录6 T# h6 ?# z7 B, m! |5 J
delete [from] 表名; --删除全表的数据。& p: X5 x& p/ H# Y/ B. g
delete from emp_bak1;
6 C) y7 g; J. ^; v, Z9 d2 \. t3 g& p! m2 X8 `- V8 _6 y% t1 B; X
insert into emp_bak1
- A8 x8 X9 {3 R/ k4 P! R(select * from emp_ning
% ^$ l, h* X) S* D2 nwhere deptno in (20, 30));6 K5 s+ d% z; g- f. {8 I0 ~
" X& v! q- M' k% Q; o- y+ }% x$ F9 g--向新表中插入指定记录数的数据,比如前8条。/ a+ n p. ^' A; o7 l
delete from emp_bak1;
( _) v, E8 i* L |& s' W
# |* ~+ |6 Y0 T% x$ U6 M/ x+ j7 xinsert into emp_bak1
3 N, t2 [# L$ i7 M(select * from emp_ning& n$ v+ o) O2 ~
where rownum <= 8); @0 [" ]* J) A( Y0 r! i
8 C$ b9 P5 Y% x" [" ~
小结insert:
5 D" w! B5 z9 b1)insert into 表名(列名,...) values(列值,...);
6 [$ ^: J$ s) z一次只能新增一行。
: U# t# t% [' ?- @3 k4 D0 k7 L2)insert into 表名 (查询语句);& s. c. s1 g7 |
一次可以增加多行。
/ w1 v5 g2 v7 P- ~4 n8 k9 y
$ [) O( p/ H( o2.update:更新数据8 M( p- s! c6 Z$ ?! c6 w
update 表名 set 列名 = 新的列值,! y% T( @) B- C: r% d( }
列名 = 新的列值9 U! O1 a" L1 F9 d; A6 y
where 条件;
4 ?% |4 I3 B+ }. i6 \ ^' h5 z9 A3 D4 l$ o3 u# e+ U( j! F. m) x
update emp_ning set salary = 3500, 5 q `1 _$ Y& ~3 Y3 W9 O0 [
job = 'Programmer'
( S/ A! g2 W4 H/ ~" k3 Bwhere empno = 1012;
- K% L& z8 B- E; O- P% V/ j2 B
9 a5 M* s6 \, ^2 E* T! N7 d--部门10的员工薪水+1000
3 J6 J+ O; i) E/ N) Lupdate emp_ning set salary = salary + 1000- q$ x* u# L* M0 R% s) {. g# |
where deptno = 10;$ u6 T6 L% @9 i
) }. r ~8 Q' M* Y4 Z" k8 B
--更新数据表时,注意条件。* d v: X2 G/ j s% n
--如果不加条件,影响的是全部表记录。
$ O$ \, D* {8 L% P6 \+ e" F' p& s5 |
3.delete
7 o% ^1 i9 W" P4 N: X( k--注意条件。
0 r" _ b: ?' F4 ]+ g- S% r--如果不加条件的删除,将删掉表中的全部记录1 ~6 L& E* r( {9 B8 s+ X
--rollback 回退,commit确认。" h# b3 W! D+ G9 t
delete [from] 表名 where 条件;
" B, p* [6 L) q% h6 P" U$ Q7 _; n# J# r: P- M& I: d2 H9 w) s
delete emp_bak1 where empno = 1002;
" g1 u$ g2 X5 G* x" F2 S, i+ b$ {" v, x) ^, o" n# I( w
delete emp_bak1 where deptno = 10;, y9 U# c( s. _3 D* o! ]; P, j2 J! h
( \% c k7 z3 A4 F# J. X
delete emp_bak1;
4 K" i+ ^0 p+ H# x
" K) o5 Z/ \) S3 `) Z4 a4 ncommit;3 D( l6 r! Y9 o( A6 z# j( v, T& O
--执行了3遍
" Q) m7 L+ ?+ tinsert into emp_bak1(empno, ename, salary)$ m9 \+ n) N. }; j' W! t# d
values(1015,'amy',4000);- M- A, @5 E$ g# b" X0 T @
--执行了2遍
! b. ?& a* u( V; F; d2 [; h& ~! b9 linsert into emp_bak1(empno, ename, salary)* C8 }! Q9 q2 d8 U# ]2 N% }
values(1016,'rory',5000);
: z! I& Q. I8 O6 v* f--执行了1遍。
' U' C, Z+ s) u( sinsert into emp_bak1(empno, ename, salary)( A( b# _( H* i" Q$ e
values(1017,'river',6000);
: C, p# H3 N' R6 r% B" g- g8 N--创建表emp_bak2,只存放不重复的记录0 r) V, F4 W% E% y- X$ o! ?+ F8 o& L7 h
create table emp_bak2
/ w/ n8 S, w- R4 o9 j* f9 }3 das
% n4 d# i% ]8 J& R+ cselect distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr O( n9 {! c- c9 R/ k7 b
from emp_bak1;
# u/ H' M% W; @5 i9 y0 |! R--删除表emp_bak1 e' U; h, q! h& @2 G- N; K" h( @
drop table emp_bak1;$ Y A5 q+ {$ K
--把emp_bak2改名为emp_bak12 [8 a& z' F) G% u" l
rename emp_bak2 to emp_bak1;
& K6 |8 e$ D1 S" @8 X" d: g- U8 N8 `- v' _( M- W+ D( v
___________________________________________
! f4 b. \1 L- H0 {2 {/ z- x. S
' P( s: r- B9 e! T$ G1 a0 x7 S2 D: e: O) L/ \4 d& z
delete emp_bak1;
5 g8 {, s8 v& `3 H/ t, B# S" q( T' I. X- _. d
insert into emp_bak1(empno, ename, salary)
. U, @2 l7 l) ^values(1020, 'amy', 4000);5 t; _3 l: N$ i
insert into emp_bak1(empno, ename, salary): {( U( I* I3 H3 T
values(1021, 'roy', 5000);% R/ g6 N5 E/ J
insert into emp_bak1(empno, ename, salary)) n( [2 c$ p- M' D
values(1022, 'river', 6000);
& F0 y+ j9 E( C9 ]' V0 O& i, a2 x% B( h3 L, w: C' N
--rowid是Oracle数据库的伪列。
C4 P7 M3 I T v--rowid是Oracle数据库独有的。
8 y: h# `) ]- z3 i/ ^, U delete from emp_bak1
; _% {2 k' z$ } where rowid not in (% c2 Z" Z3 n8 c& d/ t$ i
select max(rowid) from emp_bak1' Q/ `) D! o, d" v
group by empno, ename, salary);, d* G' o' ]3 l7 f% j% m* a
8 w/ t( }5 v' r& Z二、事务:Transaction5 Z# q0 z8 Z( g7 p$ K1 ^* p. Q
TCL:Transaction Control Language
0 \$ I) e( i( f4 Q c6 ?/ Jcommit / rollback / savepoint
5 |2 E; L/ i( f/ e事务:一组DML操作的逻辑操作集合/ C9 z2 j1 I( Y/ s/ f8 u0 _
***8 Q& `8 V J8 z0 g! Q- p+ [) a
1、事务的开始和终止
1 d' M v/ n2 g8 p. R9 X6 C1)事务开始于上一个事务的终止或者第一条DML语句
$ v" i" H& U$ ?1 v' d3 |6 z) K2)事务终止于commit/rollback显式操作。5 M) l8 {+ S( @, P0 c4 i+ Y
连接关闭:隐式终止
, D- f) e7 b) R2 ~+ c6 j DDL操作,比如create:隐式提交。
. D4 W' C: w) t
* P6 ?: i/ e( p! G: xinsert into ...values...
) R, g: l: \! Q, P. bupdate ...
% c/ k# D$ R6 h9 Adelete ...* y( k3 Z5 q+ E9 v, |0 n/ C
insert into ....
; q% f: L( z( Z5 n* q# T% O--rollback;--回退到事务之初,数据的状态和事务" N, w; \' `) s; }6 `; L. e& s
开始之前完全一致。
& Q7 ]7 d& W( y0 R( i6 vcommit; --所有的数据改动提交。7 k* ]8 Z( A/ F, @: u
. {! F) s; m/ J8 o0 R7 u2、事务中的数据状态5 b1 k4 d; Y: _* Q- |
create table mytemp_ning(
- Z0 o) \7 F* uid number(4));/ u# |5 C% y* _4 ?" \# T
insert into mytemp_ning values(1);* R* q; w4 I% a" c% T! R
insert into mytemp_ning values(2);% z: m6 M4 O/ C# C. M |2 p/ c) H& f/ s c
& O. B! X5 y; m6 F8 T* |--事务内部的数据改变只有自己的会话能够看到
+ y9 u! b8 P# u. g/ U* E7 z& W4 x8 b--对事务改动的数据加锁,事务之外不允许操作。
; |' ^( |: f- x- I1 y# S: r3 U/ q$ O! M, I
如果提交:commit
2 p) t0 R+ t! e: c: {/ _1 i4 a. t; G* q数据的改变被确认。所有的会话都能看到这种改动。
* o/ F* ]" u5 p- r( E数据上的锁被释放。6 `7 e% }8 G4 \* s
保存数据的临时空间被释放。! z6 }$ c9 W$ W5 C6 r
- W' M( E- [( k2 X5 P如果回滚:rollback F; \- k0 y3 [# |& w8 ?
数据的改变被取消。" O" g5 b5 n/ P) m' z0 r. {( c
数据上的锁被释放。! ]7 L8 L! Q7 _8 p* m
临时空间被释放
6 P# z: E5 m% Y/ h1 Gcreate table mytemp_ning(id number(4));) } I% \8 l" j9 L( Q" l
--事务起点
" U, s9 O# q0 s+ x! l1 i9 Yinsert into mytemp_ning values(3);
4 D) b/ r# ^# |$ D- M+ Gsavepoint A;
9 v$ ]# d" k# Sinsert into mytemp_ning values(4);8 a; l7 @2 h6 _3 T+ p: [+ a; h& F
savepoint B;) Z1 q L8 D2 u3 N" ?5 f
insert into mytemp_ning values(5);
! y- h4 H% z% c4 Srollback to A; --回滚到保存点A,A之后的保存点全部被取消- l2 @" P2 d6 i% E/ ]
select * from mytemp_ning; --3保存,4、5回退6 A' J* A; \: S: R
" g9 a: M. `! T8 Z& {8 A' h
三、DDL* N; s L) _. y" ^# V! @4 D
create / drop / alter / truncate" m7 G0 q: V. U0 m
; Z+ o. W: v+ U9 N8 z' e9 I$ ]
数据库的脚本(script)文件main.sql:
/ V) {1 N% L: }; h/ {------------begin--------------------/ N5 R7 H( j2 @7 X0 M
--删除表emp+ C& e& E. i' W
drop table emp;) u+ [8 O' o8 M& b1 X: F
--创建表emp
' {' u% L5 B$ t# s5 ?create table emp(id number(4),
9 t0 [3 m: Y2 m3 U7 tname char(20));% M) P& [. [7 G6 _ I
insert into emp values(1, 'amy');& ]% }% F, f& ~* f
commit;1 z( A) k& V+ U/ p+ F" {
- ]8 L. W( w# Q1 m8 g
; o2 M* n' E5 ~+ P# }* _
|
|