|
该用户从未签到
|
1.内连接
0 v- ~; i3 s4 K. c2 s4 N* s
& k- m h3 T9 f4 Jt1 join t2 on 条件
1 N! ?" q' x" _; t+ s+ p& X/ ~0 P
5 V$ I- P% n2 O6 ?/ S- i1.1.等值连接:如果on后面的条件是等于。
" O" t7 X7 a/ E9 Y7 T0 q3 kt1 join t2 on t1.deptno = t2.deptno
5 [9 ~ {% {$ w i1.1.1.等值连接的一种形式:自连接7 W' k3 v" o9 L+ K+ v
t1 join t2 on t1.mgr = t2.empno( i4 [% D/ ~) y# G
$ x5 C" u* R( q1 \8 }3 g* \
1.2.非等值连接:on后面的条件不是等值操作
/ w8 Z- t7 [/ K: G" P$ G. u7 qempno ename salary grade lowsal hisal
g. j. E! A8 x: b _6 ~' V$ O' A------------------ -------------------3 e2 n% u; J( K; a* h; r, ?
1001 zhangwj 10000 1 10001 99999" P u9 M$ K& @% x0 }% c$ e
1002 liucs 8000 2 8001 10000 ) F9 z3 s h' r% O
1003 liyi 9000 3 6001 8000
& [. B+ f# |: z8 \. z1004 guofr 5000 4 4001 6000, q) I4 F5 X" j
5 1 4000
7 }0 I y2 @8 w! X' Q--步骤:1.建表;2.插入数据(commit);3.查询
# D$ D1 L2 R* D5 E! j- vcreate table salgrade_ning(
# X; j) O6 _: r/ P2 P9 C: J: Lgrade number(2),/ i7 B7 g+ Y! `* z8 L+ f7 U- S" H
lowsal number(7,2),2 a; v8 S8 z: S9 ` e% Z) Y
hisal number(7,2)1 b+ @- S5 {$ M6 ]* k8 X3 i
);
7 ]: v$ B$ m+ g8 ~* s: x/ }insert into salgrade_ning values(1,10001,99999);( v Y6 T4 t' `) o& `; f# u7 G$ A( x
insert into salgrade_ning values(2,8001,10000);7 y/ h! T% W, J' b! N
insert into salgrade_ning values(3,6001,8000);
2 ~* s6 _) B. E( {insert into salgrade_ning values(4,4001,6000);
- C) G3 t/ j* @: N2 Ninsert into salgrade_ning values(5,1,4000);, G, W0 |0 n- V3 d
commit;
' t/ B; P3 Q( L--计算员工的薪水等级:( ~# B4 E7 X3 G+ K! [ u) g+ |
select e.empno, e.ename, e.salary, s.grade, j" R5 B+ u. [) C
from emp_ning e join salgrade_ning s
: \7 B* Y7 g5 u) L# M6 D }on e.salary between s.lowsal and s.hisal;
' T8 u# T7 ~" `' }- k--最终查询结果的形式:- U. d1 {( I' Q% M7 J5 q
1001 zhangwuj 10000 26 P' ?# k# h- U7 d0 ?9 U
1002 liucs 8000 3
0 L) `: v* @( W9 }& @$ x4 v8 F5 G' c% S# c7 }
2.外连接# P2 T, Y. {4 j9 ~* R8 h4 Y8 B
t1 left | right | full outer join t2 on 条件
1 k4 I2 }3 j9 B( c/ V) I5 G6 w* g8 Y
SQL语句的种类:) X$ ~: Q7 }+ v4 o! p: m, _6 H
DQL:select s+ E* _" d8 \0 \# S
DDL:create / drop / alter / truncate2 ]* @9 ]9 u7 J: U' v
DML:insert / update / delete8 b6 s8 \( \3 B2 b7 ~
TCL:commit / rollback / savepoint! T, Y' G. {5 N) o
DCL:grant / revoke# W( A& _ c% R3 P
, `% b: }7 v1 e ^7 k1 f- a
一、DML操作
1 ?9 Q" g/ j2 G' p1.insert into...values...- t6 L% l- ^( ]) |1 z" l
--1.1.不写列名
; N" P+ p# W/ u X @2 r* D4 A--必须提供全部的列数据,数据的顺序必须按照表结构8 i1 A* o' I* e
--如果有数据没提供,用null表示4 { S! O* R. v, r- Q
insert into dept_ning1 I' m6 H2 w/ |+ h9 }
values(66, 'market', null);: @4 t2 H, [1 {; P4 `3 J2 d
4 j$ M. h( a- ]! E; a2 K2 linsert into emp_ning
, n: ~# p) N7 i; s1 J, I) Nvalues(1020,'rory','Programmer',6000,null,null,
$ k0 }- [- U8 N* V- w0 H5 _sysdate,10);
! D+ M5 W1 d* {( y; S, z+ ?
; Z7 v. e8 U' H/ p4 ^6 _5 C--1.2.写列名, Z' R. Y, X$ X+ {
insert into emp_ning(empno, salary, ename, hiredate), X) x3 j: ^6 K* }+ i# I
values(1020, 6000, 'rory',
& z1 W7 c8 a2 ^# u0 l8 [8 cto_date('2011/10/10','yyyy/mm/dd'));( U. B% [" p1 [8 z
- ~3 s: X1 F/ h3 ]' j--to_date函数是oracle独有的。0 s+ `0 W/ e: I" Y o1 s8 D
--在oracle数据库中插入日期数据,一定要用to_date
& a5 |8 G# z# ~5 `处理,不要采用默认格式,比如:'10-OCT-11'。
& R# x: ~2 E: r5 Z# S$ Q) Q3 ^. t1 n
--建议采用:写列名的方式。即使是插入全部数据,也
; ?1 {& y3 u/ T. a4 i$ v6 t建议把列名写全。
% w2 j; P: U# t1 x' X) V--复制全表2 l" ]5 b# ?$ [& K
create table 表名8 }. A# e1 n* I" ~8 Y% H
as2 y! \) ]6 T, S; d! c; \4 s# s
查询语句;
& N) O. y: z* @0 e0 I6 K/ z/ N c& B9 X
--只复制结构,不复制数据- y1 |# f. x4 p0 b6 f5 K3 ` U
create table salgrade_ning1
' \. T3 y, ^6 _/ ?, T9 g3 C5 C& m( eas$ ~0 P4 o9 Z& O3 v+ \& b
select * from salgrade_ning3 b9 J$ P3 u! W, Q1 m
where 1 <> 1;0 c# Q% o- e( M. X' E+ E
" l4 j& | B5 H9 s6 h, R, C
--复制一部分数据:给查询语句加条件。
* c7 ?7 @) y' @; u( z. I1 ~--如果查询语句中有表达式或者函数(包括单行函数和- A, U" o9 }& b5 G8 r
组函数),必须指定新表中的列名2 C# I( ]6 }. D! o% |
--指定方式:给列设置别名;或者在新表后指定。
, C3 c" h& s% D5 _" c ~create table emp_ning18 `( g4 W6 B& t2 W. \8 D
as& K0 i9 s: J ~) q
select empno, ename, salary*12 year_sal: W* ?4 @7 @. I H8 {# m
from emp_ning! o- G! Y3 j( w. M5 c0 F
where deptno = 10;
, F5 f* h$ h8 p# W/ `' B. \
* l7 t6 ]+ \$ z2 r4 V+ x( fcreate table emp_count(did, emp_num)+ I5 e* T. k- `" K
as6 y- K" `5 p* w) a
select deptno, count(*)
- u) O1 P" `6 vfrom emp_ning0 `* C, `8 a! F* {, Z2 ^
group by deptno;5 @$ V- H7 |8 e" q% u9 l
3 w! c; ?, x) R, U
--创建一个空表# {2 z Y* G) f1 ~, Y1 N
create table emp_bak1' }2 ]( |$ C1 I5 D/ X
as
$ X$ {. N; Z; G4 v; v( tselect * from emp_ning$ s& e J. {, x: c
where 1 = 0;
( ~9 ]* V1 l: E; X8 Q4 s& R
4 R% F- Y5 {3 j2 j/ u* r8 N/ x! h--向表中插入多条记录% v) \5 ]0 J) V2 z
insert into emp_bak1
1 ^" j# j2 [) B' H) t+ u' U(select * from emp_ning% Y2 T( {8 _5 `1 \' V0 Z: N9 ~
where deptno = 10);% z: {/ K5 e, L' i
6 f3 E$ Q* V; m) j$ \- Y7 D; T% L- v& ]--把表中的数据换为部门20和30的员工记录
- x+ M3 V7 q- {8 `delete [from] 表名; --删除全表的数据。% \, |& X0 ~4 l) v4 ^
delete from emp_bak1;: a" t$ A$ Q# C4 R9 ?8 n
. K" x$ q4 \: |3 Y( l F, g H6 G
insert into emp_bak14 Y! ]) N% X7 r1 b: O9 F
(select * from emp_ning
" u* z$ G8 b8 a$ k! K6 o8 ]where deptno in (20, 30));
1 \0 X+ h1 C) z1 w, w& @' } b! M2 S
--向新表中插入指定记录数的数据,比如前8条。
' }7 T. d. h& a# ^: G8 Gdelete from emp_bak1;: Y) g$ P! b/ G& d
4 Z- v" P# i# `8 h. p/ ^
insert into emp_bak1
0 w9 }/ B$ r& |! N- f(select * from emp_ning
H8 ~3 R: i% K# m1 [where rownum <= 8);
3 M) R3 K& ] l, U- g# u' }: [& a1 X
小结insert:: Z3 ~; g8 X, y
1)insert into 表名(列名,...) values(列值,...);5 K' @) e) q+ V) k; W% X
一次只能新增一行。
" l( c. U- r, ~) [" ]0 s2)insert into 表名 (查询语句);
+ M2 d* K6 O7 g+ D4 S2 R( [% u一次可以增加多行。! }) u' u4 q& W7 B& ?* D. S! a
7 m0 f2 B* \5 K7 v
2.update:更新数据
: A9 a9 N4 V, ?' v( S1 p0 ?update 表名 set 列名 = 新的列值,
" c2 G; M* L, N! l& Y' l( R. Q. S 列名 = 新的列值1 R% ]( E7 E4 A R
where 条件;
- M3 X9 @, ^' u+ p% u- b- m
: }5 }) |0 g9 c' @( |update emp_ning set salary = 3500,
$ |3 w# R. g7 ^( r) z9 U: r' F job = 'Programmer'
8 y( L4 `1 b! A2 F: Y3 _- Xwhere empno = 1012;
& e: j5 U5 P; u, ^; W* ^8 k( d
--部门10的员工薪水+10001 Z. M+ g: ]# W# f& l
update emp_ning set salary = salary + 1000) r, ]) X8 M: W9 L
where deptno = 10;
, g* N; f5 P8 ~" z0 `5 E& B) e% X( X+ \5 r3 Y7 o- c0 N
--更新数据表时,注意条件。- t- h1 v. l r1 y* L7 c/ [! T
--如果不加条件,影响的是全部表记录。' y: r7 i# ?8 W5 Z$ d2 @, t
* c0 {1 S7 B( `3 x. g3.delete
1 V& W8 \' ~7 j% O% Q" K--注意条件。
) d! V j! t. e/ ?/ D$ x--如果不加条件的删除,将删掉表中的全部记录+ J: C$ c, }& L
--rollback 回退,commit确认。! }1 n/ O* D- p
delete [from] 表名 where 条件;
3 |0 _7 {9 Q; C. b1 y/ ?' M* |' Q& b, V7 ?( e( x, k4 \. M" m$ e+ H
delete emp_bak1 where empno = 1002;
. e( k) h n7 e& t5 h5 d" ~- _3 d, T9 \1 S) C5 d
delete emp_bak1 where deptno = 10;- f9 I6 u( A' Q# I) ^- h
- ~+ H% d- W, t2 i& V- j
delete emp_bak1;
% I5 `6 u" M' i8 d$ z* ?
2 r& H3 g, y6 l( H6 d$ scommit;
! A+ `: U4 {( W0 m5 w6 ?" F& v--执行了3遍
' F/ V" e3 g( t' X3 ~; rinsert into emp_bak1(empno, ename, salary)
* X# z( z; u9 ?values(1015,'amy',4000);
$ j: V$ n# x' [--执行了2遍
2 f6 C: Z& U/ H/ r) u5 R+ ~insert into emp_bak1(empno, ename, salary)& w6 _+ n. C# f
values(1016,'rory',5000);2 n( q |9 |5 ^( x% M9 F) F* h
--执行了1遍。9 g1 ]# { Z8 E5 ], A' r( n
insert into emp_bak1(empno, ename, salary)
2 L+ c* l R3 zvalues(1017,'river',6000);( b( U1 g4 t# V; W. F( a: I" s6 }
--创建表emp_bak2,只存放不重复的记录) }9 d( y. C# {2 y. n. x
create table emp_bak2# J* k5 y$ z2 j0 i. j
as# d7 x8 D+ W0 i
select distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr
5 q5 s; [# R5 m8 B! [from emp_bak1;3 n* s; G4 C4 u/ J6 O
--删除表emp_bak1. Q8 @$ T5 n1 q# U8 o. B3 M
drop table emp_bak1;
# S/ C4 i* P6 E( J0 n* Y--把emp_bak2改名为emp_bak1* w3 C, i' `1 r/ ]; ~0 {1 ^7 L. A
rename emp_bak2 to emp_bak1;6 `, N7 o: G% q3 E+ o; F$ d
- O6 E( e4 z7 b1 Q' R4 T___________________________________________
1 M7 t1 d' t& A7 D( B) D4 N* q; J: W
, D U& ]% ]% I8 L$ ^' `delete emp_bak1;
$ E/ T% w' c, x1 G# w0 N) I# y
# X) E9 f# t# winsert into emp_bak1(empno, ename, salary)- K) ]: `- D8 r" p+ X9 ?( B
values(1020, 'amy', 4000);/ ]. g/ I' ?$ Y" ^2 g1 Z9 P4 a
insert into emp_bak1(empno, ename, salary)# c% G+ H' E, Y
values(1021, 'roy', 5000);9 c0 V% h: `; }1 P& S
insert into emp_bak1(empno, ename, salary)$ r9 O5 S$ O. ?& R" V
values(1022, 'river', 6000);0 P/ x: Q1 l* v- N3 ?% H
8 r5 f# z' D7 r- ^3 o. s$ `--rowid是Oracle数据库的伪列。- h% |( ?- s% a& e, {1 p* s0 L+ p
--rowid是Oracle数据库独有的。
5 W5 a( t; H6 u4 P0 d delete from emp_bak1& S& Y1 L! o- g, R6 D; \0 H( `+ i
where rowid not in (
# O, U) S, H n' j" b select max(rowid) from emp_bak1! W4 |5 I0 W$ I, r$ K
group by empno, ename, salary);
. y% J# E6 L- Y. J/ Q" ~' {
0 D. k6 h$ a& h# O二、事务:Transaction
: W- \$ Y0 [! m) ?1 ^3 L$ GTCL:Transaction Control Language# H4 n w) z# N3 n: Q1 H- Y: r
commit / rollback / savepoint- y4 v, ^* u# m4 z" n
事务:一组DML操作的逻辑操作集合" }) g- \* R$ t# m% `, Y# d: y4 a
***
+ u8 F8 }$ M! f: v# f! ]% o3 B1、事务的开始和终止
6 ?" M% r4 q6 D( I' s( c* v4 F$ d1)事务开始于上一个事务的终止或者第一条DML语句! w5 n' ^% Q( M7 o2 I3 D9 X; q+ U& C
2)事务终止于commit/rollback显式操作。
& g! s, K3 _ S- M# _ 连接关闭:隐式终止/ F0 S% A$ V% Z% S& r$ [
DDL操作,比如create:隐式提交。 S2 i- e" F5 V0 h; ]% Y
6 U; c/ }4 d0 g: l ?5 t8 Iinsert into ...values...
* J9 t4 @; c9 C0 z7 w! jupdate ...
0 f" ? D/ O3 H- edelete ...
p/ J$ @; @5 j2 U7 m1 H8 `insert into ....4 J% [. M4 d+ S
--rollback;--回退到事务之初,数据的状态和事务" J7 `9 V$ [+ s2 E5 T
开始之前完全一致。
7 i. q1 r! t! W& t4 x0 vcommit; --所有的数据改动提交。! j& ? K5 Y' _/ O& P- f/ ~) Y
3 r8 A9 F4 I. s9 L( J) M2、事务中的数据状态0 s/ i$ b) z: ~6 E5 V$ g) X
create table mytemp_ning(
( }8 o; G. S3 p/ [id number(4));
7 \7 \ g( g4 H! yinsert into mytemp_ning values(1);
$ k' f N/ d y; c' `insert into mytemp_ning values(2);% U# a2 c A5 ~: C2 c( b! _
8 S l/ {! b# q0 `5 S4 S--事务内部的数据改变只有自己的会话能够看到3 `. Z( s% W7 g' w: F5 D1 a3 b
--对事务改动的数据加锁,事务之外不允许操作。8 m! w0 ?: P: r* z
5 W* q3 @& C6 B1 x
如果提交:commit0 O6 \" [4 b1 Z% j! f' W# @) m
数据的改变被确认。所有的会话都能看到这种改动。9 k9 D1 }1 C' |7 F
数据上的锁被释放。
& Q# O* `. N8 i3 ?" B* p4 J% R保存数据的临时空间被释放。
" d+ c$ r: N* G/ |; l9 @
4 \, ?# K" I" p$ C如果回滚:rollback
' m) j' Y. F% S& Y. E; J数据的改变被取消。
& `& D9 T, X# d, X数据上的锁被释放。, j6 }1 Q5 X/ e7 L
临时空间被释放" V N0 M" ?$ o; l
create table mytemp_ning(id number(4));
; M% i5 I' K/ Y" j6 W--事务起点
1 h. T2 \- x* t0 e& Ginsert into mytemp_ning values(3);) i+ `2 e- M! i* ~
savepoint A;
y2 M9 x; J- x# Dinsert into mytemp_ning values(4);
0 [1 R, |5 g( n" h' T$ Gsavepoint B;
) X0 |, X: l( _ i7 [1 _6 linsert into mytemp_ning values(5);
- {( N/ _2 V f* rrollback to A; --回滚到保存点A,A之后的保存点全部被取消
$ ]6 m# k$ y$ N: z! ?! O: H: Gselect * from mytemp_ning; --3保存,4、5回退& O+ N' s! w. z+ u( \ h
) ?4 d& M2 O$ Y/ E" j7 T
三、DDL" J' C# Z" g5 z# C* x+ i8 @3 a
create / drop / alter / truncate2 p. b0 M; ^+ X% j& ^) _
- @8 x4 H+ t4 F( C& Z Z
数据库的脚本(script)文件main.sql:. `2 v% l5 m6 z7 n. b
------------begin--------------------
: Z" S2 [ i \3 L ?--删除表emp
. Q) h w) K3 J; l: @' Ndrop table emp;
2 n2 V6 g; C4 s9 N- K7 J3 f--创建表emp
) R8 m) L6 F9 g( icreate table emp(id number(4),2 c( p* y+ a: q1 q, e
name char(20));) ~3 j* {6 C9 s- T7 {
insert into emp values(1, 'amy');; f: z' j8 m! |! R
commit;# W9 C* b0 f) f7 e) V( E0 P
; y: ?- d: T7 b4 ^* ]3 o( `- A; j$ N& g; s4 c0 @* }" C
|
|