该用户从未签到
|
1.内连接0 z0 [( S+ a: s7 \' c
0 A$ L; O; Q7 y, T/ i ?! _$ [
t1 join t2 on 条件
4 l( {: D: U" g. ], o( @" w5 M6 i% W( T
6 F# Y$ @, x0 U6 N1.1.等值连接:如果on后面的条件是等于。
3 \4 v3 K# [' r% m9 K- ~' Dt1 join t2 on t1.deptno = t2.deptno+ m. B6 [) ~6 L8 d" O
1.1.1.等值连接的一种形式:自连接
* I6 l" v' {% y/ @$ [! r$ [/ J8 A; J3 lt1 join t2 on t1.mgr = t2.empno
+ n6 G& W l+ J6 W6 D8 L* }. ]- [/ o3 v$ @( Z2 \
1.2.非等值连接:on后面的条件不是等值操作
, E: n) L' p2 K$ Aempno ename salary grade lowsal hisal
: S3 W3 w K! |2 M! y, b------------------ -------------------
6 s1 F) ^- }0 G+ s& p2 r1001 zhangwj 10000 1 10001 99999* j5 H2 \: K- z7 a
1002 liucs 8000 2 8001 10000
9 t& z1 ~% g$ E/ e& _1 J1003 liyi 9000 3 6001 8000
1 E% k4 J j. n+ L3 P7 \1004 guofr 5000 4 4001 60000 X5 g. n0 Z3 D
5 1 4000' d' A0 ~5 y5 e* H' u& }- Q& H
--步骤:1.建表;2.插入数据(commit);3.查询
* Q$ d' P' {$ G( B: h2 {; [create table salgrade_ning(
( E, T7 v) h1 {1 d2 |; a* Kgrade number(2),
6 n( i' I- l5 b( l- p. }lowsal number(7,2),% f5 s) V; a$ a7 j
hisal number(7,2)7 n, S e+ L P4 M/ H8 U
);- u3 E! U7 Y7 F6 h6 z* w$ b& `+ [
insert into salgrade_ning values(1,10001,99999);4 b( h, u" }( I
insert into salgrade_ning values(2,8001,10000);+ j0 w( h5 v% f
insert into salgrade_ning values(3,6001,8000);
# T8 Y# X: v9 vinsert into salgrade_ning values(4,4001,6000);9 R, o4 I! @! j
insert into salgrade_ning values(5,1,4000);% P$ y; l# V0 d4 g
commit;/ z. `6 H! Z0 R5 Q
--计算员工的薪水等级:: i$ ^" n5 b0 q2 Q2 z9 F
select e.empno, e.ename, e.salary, s.grade% C, o3 t4 J4 x* g9 c& u7 u
from emp_ning e join salgrade_ning s; i9 u1 {5 z0 |& P( G2 R! Q
on e.salary between s.lowsal and s.hisal;
4 y/ R5 \' f" `8 r; C, f3 C--最终查询结果的形式:" A. d! s3 L0 Z* i( ]
1001 zhangwuj 10000 2, S b4 y9 E% C, }% ]" K
1002 liucs 8000 3 # J; R. M$ H+ W) k8 ~9 @# d
' T6 ]5 [- c1 u6 v4 y! |0 P8 p, h4 Z2.外连接8 m& J# A, V. L: I
t1 left | right | full outer join t2 on 条件
% _8 J6 _" c& N; ^1 v: d5 V- h7 ], N7 z6 ^1 c0 G
SQL语句的种类:$ B; w! l- D; e% L& z$ z, R
DQL:select& r# W/ g$ M3 `. [% O+ H7 m
DDL:create / drop / alter / truncate
' o6 V2 M6 n% R3 y2 V. R4 YDML:insert / update / delete3 E1 K1 I: I& Q& f. O9 ?
TCL:commit / rollback / savepoint% f" a2 s! u$ U# [6 q: @, i) i* m9 @: I6 n
DCL:grant / revoke5 c& V. m% P# u2 U/ b& K! \2 X
9 v5 K9 Z- ]" \7 y" \8 B一、DML操作- @0 B! D* C* K2 d0 ?
1.insert into...values...
6 U: Y& \, t/ ^--1.1.不写列名1 F/ w) _6 a; w- ^9 k: x" U, c3 b* q
--必须提供全部的列数据,数据的顺序必须按照表结构
( ~# R$ G' i* t8 n--如果有数据没提供,用null表示7 |6 n, t" ~* R! v7 q4 I" C& L; c
insert into dept_ning
0 a9 b# Z7 K# Hvalues(66, 'market', null);0 ~) ~8 b, s- K2 a1 Q
2 g& d2 V1 W# E; C/ ]insert into emp_ning- J2 d( E8 @ u' {
values(1020,'rory','Programmer',6000,null,null,: W2 ~2 m) G7 q5 F
sysdate,10);
. D0 d/ ]7 p% ^) @5 b7 q0 ?: X+ m( A2 b; S" ^
--1.2.写列名
( S# L5 @ _* P3 n; Sinsert into emp_ning(empno, salary, ename, hiredate)
' F" C5 y. u: ~9 f% @% Ovalues(1020, 6000, 'rory',
0 H: y% Y0 b( L: Dto_date('2011/10/10','yyyy/mm/dd'));3 i- Z& A3 \ W U
' t; [- C8 L4 X5 x- m# A; c--to_date函数是oracle独有的。9 Z; `. e s" ?# E- D
--在oracle数据库中插入日期数据,一定要用to_date
3 ~% g( t4 ^! u' _处理,不要采用默认格式,比如:'10-OCT-11'。
8 }' _- j1 m4 ]9 G- Q8 Q5 l1 v& `5 T I- q/ P
--建议采用:写列名的方式。即使是插入全部数据,也" s- I8 X0 |+ i0 n" o( {7 m
建议把列名写全。7 J; x9 ^- l C4 H& [* x' Q% g
--复制全表- D8 m& \, _/ y' e5 F6 d
create table 表名' N) h r- h) l
as& q' x% o' h! X+ Z0 p& l
查询语句;+ W% J& u5 v* \0 j
# r. Q+ k$ I& P" r
--只复制结构,不复制数据
, R1 r0 [$ L6 P* a5 I3 Ucreate table salgrade_ning1
! K4 ]+ F+ c" Y2 ias
# C6 e. K0 n5 I( V M: U( S1 Eselect * from salgrade_ning8 S1 s) k9 @, c! J( F4 m
where 1 <> 1;; L/ E0 O0 y" \4 M% V& _7 X2 F
% Z3 ^2 `4 s3 l, R. ]
--复制一部分数据:给查询语句加条件。
' j8 F/ X" O( j, I0 ]--如果查询语句中有表达式或者函数(包括单行函数和# }6 q' E2 N4 T: n
组函数),必须指定新表中的列名* ~8 q; w) c$ O) f8 |5 w* k9 D! q# Y6 a
--指定方式:给列设置别名;或者在新表后指定。
4 Z* u( D, X+ U" [# ocreate table emp_ning1
9 E9 C) L! h/ s+ C% h% Zas( O0 h" n$ f; j2 t& ]6 w8 _0 y
select empno, ename, salary*12 year_sal
9 d9 P6 @1 u/ P( R6 b0 ? from emp_ning
* ^" ^& s( j* N8 D# G% p" Ywhere deptno = 10;
3 S* L0 r0 o, m0 @- v& N& S: ?' `( W/ K( W3 {# [
create table emp_count(did, emp_num)
# _3 o4 v0 F. h- b8 w( b3 Fas
) v, d0 U, v( y# W! G6 D7 _( Nselect deptno, count(*) 8 K1 r7 n1 `! g+ z* _# }/ m
from emp_ning
" \1 R& ^4 `9 A6 E- p0 {# `group by deptno;/ @$ y; [7 J9 J; f9 p
3 a5 k4 L- ?$ h$ e
--创建一个空表% ^) Q9 e6 A; S! Q7 n0 X1 H4 T" y
create table emp_bak15 k' }7 \' l2 O; ~: b n
as2 ]4 q" L* n2 g7 g& w; g& f" G
select * from emp_ning
3 B0 `% Z# g" ^5 x# s$ R+ n7 _where 1 = 0;
3 x& n1 x: U/ X# h- b# q) b/ y
--向表中插入多条记录
* m) h' l1 |! s' H; tinsert into emp_bak1
- q% q9 k" D, O(select * from emp_ning4 w4 Z h4 B; C! F! M
where deptno = 10);
5 F, W' Y" v' r: [
+ h3 Q2 l& O/ V# l/ c--把表中的数据换为部门20和30的员工记录
+ U5 g4 A* O- t2 y% F" q) ]delete [from] 表名; --删除全表的数据。# e a. G0 a3 L; W/ B; k9 v
delete from emp_bak1;9 x1 e& L9 a# T9 r, s* l
6 S. P. i# M; V' ?2 U& W9 n9 Linsert into emp_bak1" \5 Z3 P J. l( U; P4 u
(select * from emp_ning
; A; P M1 |+ I% j. I: h, swhere deptno in (20, 30));
/ g9 h( v$ x+ f+ j5 d+ l! m
8 N0 C: A8 t# {/ G--向新表中插入指定记录数的数据,比如前8条。. c3 W8 X+ X- {% {
delete from emp_bak1;
5 Z9 l7 o& x9 P4 e- K! }8 _) N6 c* o8 D/ `4 j+ ~" V2 F) E
insert into emp_bak1" j3 `" u+ [% J2 Y l) k4 \
(select * from emp_ning& ~2 ^+ z# }" h& C2 U' F
where rownum <= 8);0 ]& `5 w( L R* `/ z) W. _! Y
3 R) F V4 W6 q* B' |& a小结insert:
3 Y- q+ u h( D5 i+ D1)insert into 表名(列名,...) values(列值,...);
2 G$ p' i8 h! `% _+ L一次只能新增一行。9 s/ ?+ t! H4 h# G8 ^; N: G' B
2)insert into 表名 (查询语句);
8 i Y& ]. [( q8 z* D8 s一次可以增加多行。
: F2 S7 R/ } N& Q5 F T* U+ u {# I
$ K4 J4 Z7 R; c t. U- ?. o2.update:更新数据, o( a8 G P8 @9 y" A, U* r9 ]
update 表名 set 列名 = 新的列值,
6 F3 \8 T. A" {# U9 _' J# a 列名 = 新的列值
- ]* C) n, @( `7 X7 g" ?where 条件;
: n8 W6 x. E1 ^1 W# C! R1 p5 C2 @: c$ f2 @
update emp_ning set salary = 3500, " t+ A0 h/ \ q8 G0 X
job = 'Programmer'
" z U. z8 P3 i3 Ywhere empno = 1012;
: U/ P. w! }0 l! z+ G
: Z$ R. B0 Z: ?& C2 n--部门10的员工薪水+1000
2 C+ z, ^4 C; \update emp_ning set salary = salary + 1000
8 I& b9 v- P5 @; Q" n1 g( |where deptno = 10;
) N6 P' D# c2 `1 i! x# _
5 k# L; ~' d1 l# P7 h4 J( p--更新数据表时,注意条件。 _+ h9 K5 J0 S3 j
--如果不加条件,影响的是全部表记录。
- } ^2 C6 D" w5 J3 ~; @1 c, Y4 ]
' o- A! I: k' [; r# A3.delete% @ L! {) j9 h' f5 Y7 C
--注意条件。
: L2 ~ V" I. [9 A3 w9 C--如果不加条件的删除,将删掉表中的全部记录0 Z( D) C% r- {& }$ o: ?
--rollback 回退,commit确认。
2 i6 L q* m0 X# z4 ~delete [from] 表名 where 条件;& K7 R& `1 n4 r$ \* K2 Q* Y6 E; _
, S' o ]) I2 a |8 S# ^8 c
delete emp_bak1 where empno = 1002;
2 s; t! y i* U: ^; Q0 K/ z- }0 f, l _3 F
delete emp_bak1 where deptno = 10;
* f4 \9 p; n0 C) {/ Z* u/ h5 z" q5 K7 E8 K+ J6 H; Y1 o( g
delete emp_bak1;
3 _# \) E0 E2 z. V$ q: H! j) d8 e: x# n4 K4 s$ ?7 m+ H
commit;2 n; {8 i& E% L, o5 ~
--执行了3遍
' V+ S3 l5 |5 y$ z8 Sinsert into emp_bak1(empno, ename, salary) [/ O$ J1 p% D8 @/ m2 D1 M
values(1015,'amy',4000);
, E/ F) M1 _! ?2 z" N+ F--执行了2遍
% |9 ?$ W( P- R2 y0 t* Q7 Sinsert into emp_bak1(empno, ename, salary)
- b5 z5 z7 \ h6 D' k% gvalues(1016,'rory',5000);3 o# `. u3 P' Y+ ~# N7 P
--执行了1遍。
) P7 L9 j$ m: s( x- t9 k2 I" q. m+ X" kinsert into emp_bak1(empno, ename, salary)5 U; `) z- l% N8 J6 v& \
values(1017,'river',6000);
; f2 {2 t9 a' I# W t& _--创建表emp_bak2,只存放不重复的记录
5 K0 W' u5 j( V8 |create table emp_bak2
+ e" X% t3 M1 K. ^6 T6 s \as
' |5 P/ t9 V8 A {select distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr
; Y" V3 p' y8 J' k7 {- L( M! ifrom emp_bak1;
% B/ ~. m& u, P5 Q& S--删除表emp_bak1
8 f$ M/ F: ^; Gdrop table emp_bak1;
( _0 g; t2 X+ f; o {--把emp_bak2改名为emp_bak1
& E! [3 \/ `6 F- O5 J# J8 ^rename emp_bak2 to emp_bak1;
4 D( _% `- p6 p, K
a; q' Y0 G% H% d2 B4 s___________________________________________
5 i2 s3 z0 q; {6 S1 s1 D O! [% g3 z0 T; c
8 [0 h" K8 g8 C
delete emp_bak1;5 t! u5 P" S( ~+ B& h
. W% O( y! v8 G& N3 m& r* einsert into emp_bak1(empno, ename, salary)( Z9 V/ y, ]% {+ X8 P. q; \
values(1020, 'amy', 4000);8 ?( t; ], ?$ L) t# l
insert into emp_bak1(empno, ename, salary)
4 ?- \) a/ A \4 X rvalues(1021, 'roy', 5000);5 P3 A" j* W# t8 y
insert into emp_bak1(empno, ename, salary)
m9 u; U3 M& f4 [0 Vvalues(1022, 'river', 6000);2 S/ E1 S0 G( d( z' }" ?
9 ?, g8 N# Y( U5 j0 |--rowid是Oracle数据库的伪列。: F0 M H; a- f. \& Q% n- g! S
--rowid是Oracle数据库独有的。 ^) v7 Y2 ?5 \6 _( |. s
delete from emp_bak1
' r3 ~* i6 Z4 ?8 [ where rowid not in ($ U7 h' q$ B8 m
select max(rowid) from emp_bak1
; v$ V5 r& q2 j+ u group by empno, ename, salary);! N7 [( m5 \( f) W' m' V, T4 N, C
3 L( w* L- ]/ y& h
二、事务:Transaction! Y8 c5 ^6 [! `$ h* t6 @
TCL:Transaction Control Language
4 q# ~* _6 `0 S% ^# wcommit / rollback / savepoint
0 |3 m _; r/ y% ]" X事务:一组DML操作的逻辑操作集合
3 L; r4 q9 t( X! I ***
1 G$ @" k6 z# D' f1 [1、事务的开始和终止" H0 H7 @1 o0 Y' @8 k
1)事务开始于上一个事务的终止或者第一条DML语句' z: q7 N: o6 ?+ ?/ ]4 z
2)事务终止于commit/rollback显式操作。1 B& K. c6 `+ D) K
连接关闭:隐式终止
7 `3 p' r2 V8 ?) M DDL操作,比如create:隐式提交。( p9 o7 h4 m1 S- ]6 J9 V; n' E
% M' S( ^3 G! ^4 Ginsert into ...values...& u, }5 }& f# O% ]* a' Q! Y
update ...
! r6 z, D$ X$ O& Z7 bdelete ...
! A$ M Y! t( n% f! ?insert into ....- X7 D0 g7 m1 V
--rollback;--回退到事务之初,数据的状态和事务9 v; M" U r0 ?
开始之前完全一致。
: V E3 f5 K" m2 a2 x3 s5 f3 b3 Pcommit; --所有的数据改动提交。6 b1 X$ g1 U3 @) G
; b+ c$ l3 ^7 v& s2、事务中的数据状态
( b6 X- n! U F6 U% O A9 i/ N3 vcreate table mytemp_ning(
2 |5 ^% s- \. O& xid number(4));
& n5 g/ r5 w" K1 b! n% I7 t& ~insert into mytemp_ning values(1);$ Y8 \) D0 T. x, d" F
insert into mytemp_ning values(2);
) N* T, S* S- a/ H$ I% Z4 [1 k4 `
* Z. i! \8 [$ l) Y6 c0 B" d/ C( j--事务内部的数据改变只有自己的会话能够看到
, H2 A/ z9 y7 R--对事务改动的数据加锁,事务之外不允许操作。" i; p; `. h& f, \) ]" g
( X/ u4 a; b9 y2 |' Y
如果提交:commit8 ^1 j: w. v+ [1 v$ M
数据的改变被确认。所有的会话都能看到这种改动。
% ]. y5 J% V/ V& G; m5 Y数据上的锁被释放。
! w0 I* H5 @0 O1 f) ^# i* d; b2 k保存数据的临时空间被释放。
6 K: J, y' e9 O% M+ [
, ?8 u6 L8 H) v; p8 ?3 Y8 y如果回滚:rollback
# T( G$ r L3 V, N数据的改变被取消。0 \- T% C2 d/ m8 u. K F: j
数据上的锁被释放。: @. e3 h9 N5 a
临时空间被释放3 p7 J: Q# C# Q7 z8 o7 ^
create table mytemp_ning(id number(4));6 O7 P7 S5 o2 ^; O7 x, r
--事务起点
6 y& Z# ]. l7 pinsert into mytemp_ning values(3);
" h) O8 A9 B/ e( t# esavepoint A;1 g3 E" i$ ^9 V2 D: _$ X# c/ I/ p
insert into mytemp_ning values(4);/ {3 A, z! c' m* R& u6 w H3 e. b$ b2 Q
savepoint B;
! \ T% v Z- K. \9 U( ~insert into mytemp_ning values(5);
) e* a( H9 z( J5 }rollback to A; --回滚到保存点A,A之后的保存点全部被取消7 j& {9 f- \9 \+ G& N
select * from mytemp_ning; --3保存,4、5回退
2 G; T! H+ k3 ?, Y: {; z3 D) }1 R2 w( X
三、DDL1 Y5 w6 ~/ ^' F3 M* r$ q" a& P
create / drop / alter / truncate5 j1 l4 v; f% C- s% w2 D
$ v# b1 s: C# w2 O6 X. m
数据库的脚本(script)文件main.sql:
: \ B6 F! H0 N2 X. K1 P; Z% n------------begin--------------------& t" ]( [# @5 d0 X" U3 `' G
--删除表emp- ?4 [6 I8 x" \* J6 k
drop table emp;6 l" _- u" r1 s @" t2 ?( b
--创建表emp
8 t& c) M# {8 \1 r- c0 o* Tcreate table emp(id number(4),7 J) \& t' T" s% \8 n
name char(20));
- h1 J7 ?/ `9 t8 C' Sinsert into emp values(1, 'amy');
/ o3 ~' c" \2 a' {commit;) q4 |- P7 S! Y6 u
$ j, Z( J6 P% m$ R/ q/ z% K/ z
3 X& w9 j4 Z! {, o( r |
|