该用户从未签到
|
1.内连接
0 e) e% Y3 k6 u6 z
$ G* ] Y q" y! X' X# s: Rt1 join t2 on 条件+ L& C j6 S1 q+ I# `" A9 S; B
& D& F. G+ L2 o5 r' q$ X; A
1.1.等值连接:如果on后面的条件是等于。5 Z1 Q1 @" {8 g$ m
t1 join t2 on t1.deptno = t2.deptno
. l4 _3 ~) B9 D+ I6 M1.1.1.等值连接的一种形式:自连接) L' p; T9 v$ G5 D' H5 R
t1 join t2 on t1.mgr = t2.empno
9 a9 I$ A" f, x3 v' K$ u! B8 Z6 L" B r8 J% J
1.2.非等值连接:on后面的条件不是等值操作
2 C- ?7 S; [1 t6 Eempno ename salary grade lowsal hisal
) v% K7 Y- n: u% j3 Q" _) y9 j------------------ -------------------7 L& @. I' v7 L
1001 zhangwj 10000 1 10001 99999( `& u* e% b0 z
1002 liucs 8000 2 8001 10000 - C; y) x% Y& ^. e9 b& j+ ~* k6 r
1003 liyi 9000 3 6001 8000
, o; M) ?/ ^6 Y, a. n+ }6 N1004 guofr 5000 4 4001 6000
5 |1 D% w# [" T5 Q0 ?- A 5 1 40006 ]8 ~! g4 l; T* u6 c
--步骤:1.建表;2.插入数据(commit);3.查询
% R: Z4 u4 w5 A/ h+ h$ y* V* Ccreate table salgrade_ning(* h+ i+ Q0 i; m' R. A
grade number(2),
+ J5 }; o5 {( b S! ]5 G4 {( Hlowsal number(7,2),
" {# ]% c& ~/ ihisal number(7,2)- L/ e6 H1 I3 j$ f4 o5 u6 I
);* X" d5 }( t7 ~
insert into salgrade_ning values(1,10001,99999);
+ Z( A" g# F+ b+ g; [/ rinsert into salgrade_ning values(2,8001,10000);6 L7 B7 Q2 j4 M/ C4 i* ^
insert into salgrade_ning values(3,6001,8000);7 D+ V9 j' ^# ]& c; y
insert into salgrade_ning values(4,4001,6000); ?6 q( R/ N. @# b1 t% D1 p
insert into salgrade_ning values(5,1,4000);+ y* z, {1 n3 {' Q; H+ Q9 y3 \- \* J
commit;3 F2 Y- v- t3 F! {1 n& O6 S1 ^* r
--计算员工的薪水等级:' v, x0 L5 @3 |+ W W. N5 i: U
select e.empno, e.ename, e.salary, s.grade
1 Z) Z G! e9 A' Zfrom emp_ning e join salgrade_ning s6 h. q& ?" E2 m# [! d' m, Y0 M& N
on e.salary between s.lowsal and s.hisal;4 y3 I% a. K% Z* i. x
--最终查询结果的形式:% J# E8 s I; ?/ T; S8 J! s
1001 zhangwuj 10000 2
" l, R" b: C+ ^0 n1002 liucs 8000 3 1 p/ r5 E. X- \+ E; \$ H b+ O4 o
, U9 h: O9 C, H$ i" N$ I1 p
2.外连接) F5 x, d$ i) Y8 o
t1 left | right | full outer join t2 on 条件. L: P/ w9 w0 J4 N
; ^: h( b: K& V+ r9 |1 {- ?, F7 BSQL语句的种类:- d* ]1 L; Q5 J1 {) `
DQL:select5 L9 D/ f: D! O( A
DDL:create / drop / alter / truncate# A. [+ r1 V9 M8 J9 l! s# h
DML:insert / update / delete
4 H. ^- d7 x+ t7 ~: ?TCL:commit / rollback / savepoint
8 Z2 J' ^8 w5 ?8 N m" x- EDCL:grant / revoke
! G! P; V5 o* O$ |
T+ r4 N( w5 R( g) o/ c8 P一、DML操作 W8 O1 w: F+ _8 i
1.insert into...values...
" M4 a% } O+ i. {: a6 }--1.1.不写列名2 W3 B, h" u5 D" i H ~8 j
--必须提供全部的列数据,数据的顺序必须按照表结构
+ P, O6 Z( s% r3 c4 S# i--如果有数据没提供,用null表示
j7 D& s$ Y2 A$ ?8 D4 iinsert into dept_ning( ~1 q% `8 W+ B/ {9 C* b8 J
values(66, 'market', null);2 q8 d# E" `8 N6 Y8 w$ Z j0 P
% R7 P% l( ?7 minsert into emp_ning
! p% k% Z% T: Q6 \, }& Nvalues(1020,'rory','Programmer',6000,null,null,; \9 j1 l4 ~: s" Q! V f
sysdate,10);
( O. J$ x( v$ F1 ^) s, H" _5 `0 Q& t: Z
--1.2.写列名
3 c9 x/ p0 ?- A8 oinsert into emp_ning(empno, salary, ename, hiredate)7 I. F1 |0 _& D" k' Y" p
values(1020, 6000, 'rory',
0 e t; P" F% ^7 t$ h# {to_date('2011/10/10','yyyy/mm/dd'));" U" t% k/ d/ x
2 [& J; w* T4 j H! m+ U: `
--to_date函数是oracle独有的。3 q6 P1 m; S1 j2 X# u! O
--在oracle数据库中插入日期数据,一定要用to_date
* Q4 ?# l: y% J8 n* g# P* @& V' J处理,不要采用默认格式,比如:'10-OCT-11'。2 a ^6 t0 j( m) K
+ f* ` C8 H0 h5 A1 ^8 k1 E% Y
--建议采用:写列名的方式。即使是插入全部数据,也( X9 r9 G1 Z: d, V% j
建议把列名写全。; c& Z. a2 ]8 Q* m/ i) c- j
--复制全表* @" {$ e1 m" q& ~) b& N+ C
create table 表名
K! Z4 F) s! N7 d$ H4 F6 Xas
. p' K$ \# t8 @. ]' \查询语句;* M3 t* h/ M1 ]- J1 C5 r3 D D, @+ {
" n% v, D) S5 y6 _! E--只复制结构,不复制数据4 M( A* v7 B/ F( Q0 {4 W
create table salgrade_ning1
; H7 w9 N5 q( X7 c! H- d! qas
2 t( d2 M; ] P% Dselect * from salgrade_ning
|" f, Z5 J, z6 c: A2 cwhere 1 <> 1;
3 W2 j! A4 `( A9 Q- {3 {# p! M. t% l. Q( F7 W1 j
--复制一部分数据:给查询语句加条件。8 \/ F9 J8 f7 `
--如果查询语句中有表达式或者函数(包括单行函数和; L5 R. o& P2 q8 |; f& R: m" `
组函数),必须指定新表中的列名( z' L, ?0 Q7 @
--指定方式:给列设置别名;或者在新表后指定。
. B/ @! L. ]7 B& h$ Jcreate table emp_ning1
" ]& w+ }! e0 A1 F% `. R: f$ {as
7 @% w& _ k; S+ X9 N1 \, uselect empno, ename, salary*12 year_sal
4 \' t" s9 h$ U O5 K0 V from emp_ning
. f7 l: K2 @8 T5 P) s% Bwhere deptno = 10;3 w1 M: T$ J8 g: j
) j# D; [1 ?: |
create table emp_count(did, emp_num)2 j3 I, C: N( W
as
8 n/ P' l/ H+ m. a5 g; E: Pselect deptno, count(*) % }! ~+ E4 p% t9 F6 A+ U! [
from emp_ning0 k3 u) L; T( @# v! Y8 h
group by deptno;
5 {3 E9 C9 i5 J3 ]) k# r2 T9 {; x7 F7 V' A! P0 {. c
--创建一个空表9 k* y, w( i7 x+ a
create table emp_bak1: q$ V3 m; C- q
as
' s. ~6 T8 l, X' Gselect * from emp_ning
+ x* g2 i/ v. `1 }* @7 Hwhere 1 = 0;
5 U2 Z0 c$ z! |) d u/ W
3 t/ E. x6 r$ R1 A; {8 m--向表中插入多条记录
! q5 |, Q \/ Z9 v9 B+ u' Yinsert into emp_bak18 E. N% @. e" a! Y4 ?+ |6 U
(select * from emp_ning4 ^. m& Y$ N" ~
where deptno = 10);% c5 V5 b& Q1 Y$ a. _
3 v4 z. v( Q% k* L
--把表中的数据换为部门20和30的员工记录
8 C0 p+ n1 L2 Z3 M: z; k. Xdelete [from] 表名; --删除全表的数据。
! J9 H) o2 Y4 T! Y( o- gdelete from emp_bak1;
4 U6 l( E' U# z$ @0 T; N
$ ?* H" J. G& `" [: pinsert into emp_bak1( p) x4 N+ m! g5 z
(select * from emp_ning
. k! T, B4 M/ Q n1 nwhere deptno in (20, 30));
4 R8 E' V) T+ G4 H0 {% Y. ^0 m6 G0 j; W& @; I
--向新表中插入指定记录数的数据,比如前8条。6 R- g: a( [! w4 `
delete from emp_bak1;
2 B4 V) Q0 w @9 g& W8 \/ I5 |9 H$ a5 Z% Z# V
insert into emp_bak1
, G! L% P% D% m* Q(select * from emp_ning9 B; Z5 d4 \ K/ {7 r
where rownum <= 8);0 V: ^9 [" ?$ |: T* @+ c* Z0 q7 c
3 Q" F( d: E. @. {2 u& ^, j! O
小结insert: q# `* c, G. s2 ^
1)insert into 表名(列名,...) values(列值,...);
L$ b& a7 _1 c! b一次只能新增一行。* u3 {2 ~! ], m! N
2)insert into 表名 (查询语句);- L7 r4 J4 n' [
一次可以增加多行。 P2 _$ A) ^" R L. @ j
$ M# v/ {+ ]6 d# U
2.update:更新数据6 a* R- D, i) _& q' x5 R
update 表名 set 列名 = 新的列值,
: P) `0 y, ~+ @- g$ _% m 列名 = 新的列值4 p8 d4 q" v/ }: r. K- J) a
where 条件;
4 k/ T8 H4 V4 e. w" }, l4 e' A+ [% l- o6 | u1 y* _
update emp_ning set salary = 3500,
3 l0 v6 A. K5 t' d0 J job = 'Programmer'3 R0 M1 h" p! i' f. ~6 I# `$ b
where empno = 1012;; O3 } j: U1 E6 ?0 B9 \" k; r
& M) N& }# \# R9 F* D v& W; }9 v) X
--部门10的员工薪水+1000# | w; i# n$ b; t& X( h0 x9 U
update emp_ning set salary = salary + 1000! Y( d, m- {! I/ C: x
where deptno = 10;/ p% X' u1 h9 x6 A+ l+ t3 K
/ l4 p0 o- o% e2 T3 U* t--更新数据表时,注意条件。3 i8 K( M9 H( p( x, X x
--如果不加条件,影响的是全部表记录。
. I: z) T2 Z/ C. w$ V1 x% d% c) k& q
3.delete
( H! L, ^' m" f H, Y--注意条件。
+ B( q- |) f# {0 E* }: _--如果不加条件的删除,将删掉表中的全部记录, B W6 G/ i n
--rollback 回退,commit确认。
2 s7 N0 \6 w3 mdelete [from] 表名 where 条件;& l! |4 g; |* J v7 l4 E$ I
# h0 ~. X- [7 J) h* {4 Kdelete emp_bak1 where empno = 1002;& G" Z3 {* U, y& }+ P5 v
/ Q. D; e1 u6 C( [* j
delete emp_bak1 where deptno = 10;, w0 d( V" e1 o- c7 a8 U+ O
, ~! i; }7 j4 x" s3 i6 X
delete emp_bak1;
0 n. _# A( S7 h$ p% @+ C& G1 k3 t
commit;& J& L$ g0 f( G: B# c! B
--执行了3遍
/ x3 s) x: ?9 I; einsert into emp_bak1(empno, ename, salary)
1 S; V7 R/ C7 O$ x! P3 evalues(1015,'amy',4000); G" I, d1 h/ ]! @' p" K
--执行了2遍0 \7 I& P3 G( _
insert into emp_bak1(empno, ename, salary)
" R; D! L* ?6 C5 ~" r0 m& m, mvalues(1016,'rory',5000);5 ]# r A# s! }/ `9 r, z4 l0 t
--执行了1遍。
# r1 J; I9 l+ b9 Z, _, j k4 [* `insert into emp_bak1(empno, ename, salary)
2 B' h3 B8 j; _8 {values(1017,'river',6000);
! Y' J* ~) b6 v1 b9 u3 A9 V. U. G--创建表emp_bak2,只存放不重复的记录- O! b& p6 \7 r; G% Z: E) i$ G0 P" \
create table emp_bak2! x/ C3 H4 e" r* ?! L7 q
as4 \9 R3 `4 C' D8 X
select distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr
, C7 K! W, k4 J- lfrom emp_bak1;
' a1 _1 B8 O( t/ F0 g--删除表emp_bak1
3 n; f4 E1 q: W) @7 y7 ?drop table emp_bak1;
# j3 r6 k- e9 p1 j--把emp_bak2改名为emp_bak1) \8 p# W" R4 T% ^$ Z( T, j
rename emp_bak2 to emp_bak1;
+ n0 O7 t8 ?& R$ q( b1 J: y u# F+ z2 L5 Y1 j6 r' ^: e
___________________________________________
/ W. c! [" ]* Q' v
+ {+ X. v# T. |; K! y! V3 ^8 ?+ b# n+ S, t' o: L; L* O3 F
delete emp_bak1;
: z% ^) a0 b/ m* h8 K, u" u D
0 n5 F( w; c* b7 R0 Einsert into emp_bak1(empno, ename, salary)
$ S- Z: {6 z+ O; v% t @values(1020, 'amy', 4000);
! H/ q% H, T" |; d' d( H B4 Winsert into emp_bak1(empno, ename, salary)5 _* \% m5 y- X6 @! Z( `* _) t
values(1021, 'roy', 5000);0 ?1 J2 P A+ ~/ F |
insert into emp_bak1(empno, ename, salary)
, e% m* o+ ?' z5 R5 v$ s, _values(1022, 'river', 6000);; D3 T7 v3 _- m1 ~8 L7 I) r
3 ~- q) S6 B) F
--rowid是Oracle数据库的伪列。
I. T v! L+ Y* b( y$ _--rowid是Oracle数据库独有的。
% a7 v+ ?8 E" i" `9 h1 t9 i. ~ delete from emp_bak1
* \3 f; z% V* W7 B1 J where rowid not in (' R0 C6 A/ F9 b4 \- n
select max(rowid) from emp_bak1& w2 Y7 Y) D7 x3 f: W0 A+ D6 C
group by empno, ename, salary);, z S$ X# k" R. v' {1 H- y* K
; @: P Y& _; P9 F" a
二、事务:Transaction( m2 c. F% I+ Z
TCL:Transaction Control Language) T3 T; m6 s6 ?4 e; u4 y+ l# k
commit / rollback / savepoint
- M4 l d0 Y2 w+ a$ q$ h" l事务:一组DML操作的逻辑操作集合3 P4 c8 K4 ?/ Z' f
***
0 |/ {8 U+ k$ Q: z9 E+ i- m1、事务的开始和终止7 z) F8 ]1 v5 m+ S n
1)事务开始于上一个事务的终止或者第一条DML语句) p$ h# F. U9 S$ V1 _* H1 a
2)事务终止于commit/rollback显式操作。
& | A5 K: Y# ^' s; i9 k 连接关闭:隐式终止5 _* B, `% w* V) _, o
DDL操作,比如create:隐式提交。
# O# p# i/ |: {( ]6 O; S) }& Y( e/ L3 q
insert into ...values...
/ T& j6 F) U7 r4 j2 oupdate ...% `* I2 e3 h; r3 e
delete ...
1 W D8 B9 R. }! Rinsert into ....0 _; g8 B* ]. p# f" a0 k' l
--rollback;--回退到事务之初,数据的状态和事务- v8 C ]) N" Y; y0 P& x% V% D
开始之前完全一致。
5 @+ A* Y1 N4 H2 N8 g8 Bcommit; --所有的数据改动提交。9 |; n6 W8 R3 W) D* _
/ N2 q( h: j' @2 X0 [( V2、事务中的数据状态" H/ Q# A, N- X- v4 w) I9 u* i
create table mytemp_ning(
$ N8 {8 Z2 B& x5 fid number(4));
3 w( S5 l+ Y/ C4 Tinsert into mytemp_ning values(1);5 N/ p1 e9 u+ o; ]4 B3 S
insert into mytemp_ning values(2);+ z7 E* t* [0 N7 V0 O8 r) T& E
& |( r- ]& s2 _8 B; F8 M' }--事务内部的数据改变只有自己的会话能够看到
+ _0 i* r7 a0 ^" z4 q4 h--对事务改动的数据加锁,事务之外不允许操作。0 Z! R3 ^- G9 b$ ?% `+ D
4 J+ G8 l* G4 v: V4 e' a; B
如果提交:commit
$ K4 N8 r0 }- J数据的改变被确认。所有的会话都能看到这种改动。
+ s% o! f$ t! Q/ N) `数据上的锁被释放。
3 i( m, o- O% f保存数据的临时空间被释放。
* ]. a5 c: q, i8 p2 w/ [3 e U% i% O1 s ?& d; Q8 f5 h
如果回滚:rollback$ C5 ]( L" C- l
数据的改变被取消。
5 ~4 x4 ?: @5 J7 b# S+ X数据上的锁被释放。
3 }) @; Y3 q0 n) ~: L1 W临时空间被释放
; {2 \1 H& x$ \ Q+ W$ f7 Q2 X* {create table mytemp_ning(id number(4));7 \! V1 X8 [' l
--事务起点+ _, o4 z; a8 c3 H- a2 a2 d
insert into mytemp_ning values(3); z3 h# O* W- u/ [: l! r* R
savepoint A;
; v: Q2 I$ t5 Q. B" Rinsert into mytemp_ning values(4);
( {. }: i2 O* a: E; d: s; }. `savepoint B;7 M, o) ?5 p# Y6 K8 B/ S) q
insert into mytemp_ning values(5);
/ P5 U1 v6 z0 [8 x5 Xrollback to A; --回滚到保存点A,A之后的保存点全部被取消
. L; a5 ^1 a+ G4 Uselect * from mytemp_ning; --3保存,4、5回退, U7 w$ a: ]( A W1 F
' _1 _; R# r: e4 J4 g三、DDL9 b G _2 l: d: v% L# T
create / drop / alter / truncate% S; \$ `) k! [
* `( E( D2 i5 {' N& ~2 x( K数据库的脚本(script)文件main.sql:! _2 A$ p. t% K' a2 F
------------begin--------------------
$ L0 m I" r+ n--删除表emp
: ^1 r! H, y2 v8 R, `% o: ddrop table emp;
- C" X! Q4 A1 r+ G8 ?--创建表emp% z+ }. G5 r: e9 r1 q6 z! l- \4 D- r
create table emp(id number(4),
" c! x2 M. y, j ~2 |8 tname char(20));
& C0 l4 K1 I4 b6 {8 ?: Dinsert into emp values(1, 'amy');
! e! g) N: u2 a4 {commit;
! ]5 N- H) k. Z- L8 v
' V4 g! Q" ?9 U/ M# G
# D, T6 K* |2 R/ j+ l- W |
|