该用户从未签到
1.内连接
8 G7 }0 M- r$ }* d
! K. c: t; b2 a4 c; C9 X t1 join t2 on 条件- U+ J+ k: B" [1 l
% c7 A% S/ {4 D 1.1.等值连接:如果on后面的条件是等于。- N7 V/ ~/ D' e3 T: _5 z6 Y
t1 join t2 on t1.deptno = t2.deptno
; M$ ? Z/ Y. u 1.1.1.等值连接的一种形式:自连接/ X; [( h# H: p5 g) Z" t
t1 join t2 on t1.mgr = t2.empno
, S8 k' y6 n& b0 Z) m* K 5 F% W% s3 v4 k/ }0 \6 z- }
1.2.非等值连接:on后面的条件不是等值操作
' z) j( `2 c2 O' p+ [ empno ename salary grade lowsal hisal
$ n; t+ Z6 h$ S+ H5 {& D ------------------ -------------------+ o$ d) J& L9 }; y/ e
1001 zhangwj 10000 1 10001 99999: l- m; X& \( Y. Q' x
1002 liucs 8000 2 8001 10000
. o" `) f1 [! v0 K; { 1003 liyi 9000 3 6001 8000
( e9 p( E+ ]2 s 1004 guofr 5000 4 4001 60005 O9 ~" w/ y+ W0 b
5 1 4000$ b+ t1 T; p% g3 O! w2 D+ H
--步骤:1.建表;2.插入数据(commit);3.查询
$ C+ [; N4 |% _8 j create table salgrade_ning(
7 G: a, q+ R3 t, u( q) h9 q& Y grade number(2),& [( V, t: T1 N y# X
lowsal number(7,2),
$ D* T$ @7 C9 @5 U0 A# _, n hisal number(7,2)
% O+ g6 J- f7 C4 E" @, } );
5 F1 f3 C$ F- V1 a! z6 s7 A: } insert into salgrade_ning values(1,10001,99999);
" ?1 F/ ~3 U) A# i9 G h" T: | insert into salgrade_ning values(2,8001,10000);* K, A- z9 r! m+ P7 s9 m
insert into salgrade_ning values(3,6001,8000);
+ X# \1 I) a6 ^" ~0 ]& t$ w; I4 | insert into salgrade_ning values(4,4001,6000);
) A5 ]! M4 p0 L t+ Y insert into salgrade_ning values(5,1,4000);& G! I, v' x# d% w1 Q# u
commit;
' G6 H; a: _/ ?- O$ X --计算员工的薪水等级:
' p$ o( M+ U3 i/ L) W' F select e.empno, e.ename, e.salary, s.grade
: w+ `1 S/ l. F: |+ ^6 j. ^ from emp_ning e join salgrade_ning s1 c3 Y. t5 ]' h; G6 h
on e.salary between s.lowsal and s.hisal;
7 G/ D/ A, l$ w9 M9 D5 n --最终查询结果的形式:, f1 o0 `( q8 q) V4 N4 F9 H7 K8 i
1001 zhangwuj 10000 2
1 {& z; g; I: T$ F: r+ {9 h( I 1002 liucs 8000 3 0 d, h2 [& v. M% ~8 z& X+ v" p7 p
. \. A5 b7 y1 F, l" T4 b 2.外连接; Q* Z, ]7 t6 y4 X/ X, Z! w5 j* \; R, M
t1 left | right | full outer join t2 on 条件
/ w# v' w$ _0 p) t : z4 p* U8 i* R6 y- C$ G3 @
SQL语句的种类:
& @# L9 R( Z& E6 R9 G DQL:select3 ?( n. \8 r. }: G3 J0 q5 O& i
DDL:create / drop / alter / truncate" N) W3 T% h/ W( f3 _. \* {, M
DML:insert / update / delete
0 B# z1 H q X/ S3 t TCL:commit / rollback / savepoint
+ e2 @$ A ?- A/ ?" J0 w8 R: { DCL:grant / revoke9 y% D9 T9 Z6 Q3 I
7 n7 S5 S0 I( w$ `+ `8 g
一、DML操作/ W( H1 T, n! F3 |2 u h
1.insert into...values...) C, O0 Y: X* |& v; ]2 ~. t6 T
--1.1.不写列名6 P2 L3 M( O7 |6 b" L9 E2 t- M
--必须提供全部的列数据,数据的顺序必须按照表结构% }5 l& a% W/ {' k
--如果有数据没提供,用null表示9 F! D% q8 f9 Z
insert into dept_ning
& \ C- u* l! p+ `/ @3 W' y) Z values(66, 'market', null);0 L+ S5 J( z8 M8 Q5 X0 B; G7 i
) T7 H; |+ x# L/ a- b9 `( E1 K! h: P insert into emp_ning2 a2 }% g9 O# ^! }! @
values(1020,'rory','Programmer',6000,null,null,) L" [; t, e* g5 l& c
sysdate,10);
6 Z; M7 r7 u1 p! G3 q. X 2 L8 u3 H" ]7 ?$ V" ?( [5 v0 H
--1.2.写列名
8 U- u) B1 O$ b( ^) V o5 z' \7 w5 X insert into emp_ning(empno, salary, ename, hiredate)
$ B9 p |( p/ V A8 Q values(1020, 6000, 'rory',
* e7 v/ v" ?* w8 q) b to_date('2011/10/10','yyyy/mm/dd'));
% d+ j2 Y: A, t9 Z+ T; F, w) u3 S
5 a: r/ d; j' \5 M6 o2 _ e9 h --to_date函数是oracle独有的。
5 K' f+ K. b9 n6 }2 l --在oracle数据库中插入日期数据,一定要用to_date
; M1 v/ g! @; x# i+ I- z% g 处理,不要采用默认格式,比如:'10-OCT-11'。
0 V* z3 M; X$ |; G
$ J* E9 U/ S2 ]% I' }4 Z$ C4 L g+ C --建议采用:写列名的方式。即使是插入全部数据,也
6 h5 v, X+ a; H9 V) W2 P% }9 o2 Q 建议把列名写全。
9 `. V/ O2 _0 x --复制全表# J: y0 n; F! K
create table 表名
$ K1 H' c2 s( F" q& W as- s5 L) K- l! ^- o9 m5 o1 K
查询语句;
( h* H" W" X9 X5 q3 k3 I6 v. K6 `
7 y. M6 o! |% R' a# I! t --只复制结构,不复制数据; Y$ L% f. B J9 }% Z+ w% q
create table salgrade_ning1
" n6 M. H* S7 z9 z as
' L, T |. Y4 C, j select * from salgrade_ning
7 b5 L- i7 C+ O4 e0 L where 1 <> 1;) m# V8 T! S: U; ]4 i: w
2 p# Z- I. r8 | --复制一部分数据:给查询语句加条件。
' P" z% _+ K' a& m5 l o6 w --如果查询语句中有表达式或者函数(包括单行函数和0 n2 @2 s$ e5 D
组函数),必须指定新表中的列名
5 w! s- V1 ^" o3 n* L --指定方式:给列设置别名;或者在新表后指定。4 l' J( n3 t1 A3 M% ?
create table emp_ning19 [3 J4 L4 q+ y/ y" I" H
as7 O8 \2 ]+ B) y6 N- M$ M3 Y0 Y8 P* y
select empno, ename, salary*12 year_sal
b& K/ F, p7 k8 v from emp_ning
0 X) ~) }% f0 @! w where deptno = 10;9 U5 V6 e3 e+ D7 }& m2 u8 \
C5 H T6 ^/ n k create table emp_count(did, emp_num)" k" Z9 o% j8 c8 y
as+ I7 ?" c/ r5 \9 G9 w# ]2 o/ F
select deptno, count(*)
, S& ~$ R, {3 I from emp_ning/ f# l; |& a V
group by deptno;
: d0 m( X0 m' N0 j! c9 j " u* }$ [1 q8 T( ^+ F. C; K
--创建一个空表
$ F m3 P: ?# L4 A5 x9 a create table emp_bak1
6 P/ ?5 b T; ?; O as- u: g5 i) o+ p, ?% `
select * from emp_ning, J$ \" X' i4 F# n3 M
where 1 = 0;3 O* W% ]4 C: y% e! B
3 x0 R" p3 J1 ^6 d$ G j --向表中插入多条记录7 O6 X+ q# ~9 d! \
insert into emp_bak1
) `! m8 S# q- K) l1 `, q (select * from emp_ning
, d4 c9 ^$ N$ n( ]& t7 |+ k- @ where deptno = 10);, u2 p) X+ k( x# P2 e
& p, b' h+ _1 c$ |" A" X --把表中的数据换为部门20和30的员工记录9 p0 o! b" L4 e& L( \
delete [from] 表名; --删除全表的数据。* V" K' }. {: ^$ U
delete from emp_bak1;) E- G# @6 Q8 Z4 [, h+ q( |) X$ G
- D. Z0 f) a! ?* A% C1 f/ u insert into emp_bak11 B1 V3 t# C2 j
(select * from emp_ning' F* v$ p4 [- q# ]7 J2 ]; I
where deptno in (20, 30));
' ?: C9 \0 C" }) ]3 c* m) e
$ s/ C: ?9 Y+ h. B7 V @& b --向新表中插入指定记录数的数据,比如前8条。9 ? I& r8 B& z+ S, B4 m. K6 A
delete from emp_bak1;, Q$ x' E9 U) I% q' T2 T
# g- I9 P/ r; m% Z insert into emp_bak1
: }3 x. d* M( y3 P7 _0 |- p3 V (select * from emp_ning
8 [4 F5 [1 ?9 I where rownum <= 8);
* K% Q1 W/ Z! A0 z v0 s 2 Z% f. s; a4 ~
小结insert:1 T9 o* W, L- Y( j# q- m6 w8 h7 u& p
1)insert into 表名(列名,...) values(列值,...);: f5 f, \( p" m* b# N
一次只能新增一行。
G( P" a! H8 @; ^" ?4 n' c 2)insert into 表名 (查询语句);
' E$ A* C0 |1 m' B 一次可以增加多行。
; U, @# u4 Y' [! Z
; e* V9 C+ ~0 ` 2.update:更新数据
9 g- u6 v8 r- C1 g" c update 表名 set 列名 = 新的列值,( c$ ]% `& r+ b1 R
列名 = 新的列值: |/ h7 C5 e( G! u% n" y- K
where 条件;1 }/ }- L: I6 N. R7 p
! v3 O( `" M( l/ `* z S5 p update emp_ning set salary = 3500,
0 k% K" l: N3 _, B) O job = 'Programmer'( e+ e; N. x& ]* R
where empno = 1012;4 d2 T- c Q7 O! ]: t
& H2 o( {( Q7 K% x w5 L8 B --部门10的员工薪水+1000
+ o5 _, ^4 ]% x" D# p update emp_ning set salary = salary + 1000& q: U7 f1 i- `$ B0 A+ C
where deptno = 10;" B( k: N- [, K3 E8 w# r% ^* `) B
@* U* [4 A% V5 ~: q1 Z/ u --更新数据表时,注意条件。1 v6 w' ?: Y2 _% ]5 w
--如果不加条件,影响的是全部表记录。1 R8 g* x7 r2 z3 P1 N3 a
* T# Y! a+ \% V9 q& w3 W0 Q
3.delete
& u- B. p# T9 b" R2 U --注意条件。; J1 ^3 G2 S2 l( L4 o
--如果不加条件的删除,将删掉表中的全部记录3 c1 U8 X# I9 E" I9 S3 s4 Z
--rollback 回退,commit确认。
: W; J* V8 w( h: N8 ^; ]& f; O0 C delete [from] 表名 where 条件;. u c& ?; B% x' t/ t
, e8 E6 a9 B( x9 ^ delete emp_bak1 where empno = 1002;
" [6 ] M" Y( |2 ~3 p * [' ]8 E9 K% I6 e. V/ b2 H
delete emp_bak1 where deptno = 10;9 a4 x! q* H( [& O" K( @8 c2 g: P0 A
6 I+ O7 q+ x) P/ C0 \
delete emp_bak1;
/ k" t. w$ x! ~" { w" M/ Q; y
6 ~4 [0 e2 `- B3 T4 L" @7 N6 j# g commit;
! ~, m( l- B9 c ~' G7 O --执行了3遍- V7 `: @* ~" e" e, k. P0 Q: C
insert into emp_bak1(empno, ename, salary)
( k# D* S0 z# O G6 \. y2 h values(1015,'amy',4000);# t: y. T8 S% [$ g
--执行了2遍
. d8 T0 n1 S! s) l9 W0 M. I insert into emp_bak1(empno, ename, salary)
. z5 ?4 r1 r6 L! A+ P values(1016,'rory',5000);
& o) h( m2 {% V7 |6 T8 d p# Z4 } --执行了1遍。% V6 I+ a7 @; N$ r4 ^) @% R1 b0 R8 P
insert into emp_bak1(empno, ename, salary)3 e) ~: Y; i# L7 ^# g
values(1017,'river',6000);6 p# `' t% O# e7 z8 X* ?6 S, S
--创建表emp_bak2,只存放不重复的记录
7 {* C4 \2 S" n4 ? create table emp_bak2' a& B* F) w- S6 w) ~
as% y) o& \& i; m! Q: {
select distinct empno, ename, salary, hiredate, job, bonus,deptno, mgr# D4 y! C1 W3 W
from emp_bak1;
4 n' c" c, m) C. r, U0 z --删除表emp_bak1% x$ M `, `- W0 T* e$ i, \
drop table emp_bak1;
; |0 B+ z( ]; S1 a! F* x --把emp_bak2改名为emp_bak1
h7 F, R* u* A* B2 B6 m6 j+ V; r rename emp_bak2 to emp_bak1;4 S E G4 y/ E6 o& v
/ w9 U- _$ _# [$ a
___________________________________________) o2 X8 Q: |- P( w
8 r1 @3 R0 l; V) ]: s- v/ ~
$ |9 Q) F# b6 ~' ^# S" B2 o; o
delete emp_bak1;
' O& h/ q* ]' A3 d' Q0 h( y+ n
( r t, O( g; g* f: r, h( U insert into emp_bak1(empno, ename, salary)
( x5 J4 x; L/ S. b2 t$ d ^ values(1020, 'amy', 4000);4 z* O K. \3 L9 D
insert into emp_bak1(empno, ename, salary)6 y0 j p9 p; j; M* e1 O
values(1021, 'roy', 5000);$ T9 E" k9 s/ C$ |% H( [8 F" R
insert into emp_bak1(empno, ename, salary)7 F1 U% N( `) W# Q- l: d
values(1022, 'river', 6000);4 |8 J: C2 H8 k+ H( ]
$ V' l8 a" g: T --rowid是Oracle数据库的伪列。
/ x4 \# F* }" o* |" a8 T/ ~ --rowid是Oracle数据库独有的。
% e/ Y2 I Z4 K4 c delete from emp_bak1
$ \2 u$ ^$ w7 ^# A* `, ?7 E3 z where rowid not in (
; [: z7 H2 e/ [! j( A select max(rowid) from emp_bak1( K- |' x& A" M; U$ p7 }$ h2 A2 ^
group by empno, ename, salary);
$ w+ f5 Z3 ]1 F; m
1 p S) G- D5 T' a4 k* M4 S 二、事务:Transaction! [! C/ o# {: |* Q: A+ b5 z
TCL:Transaction Control Language& X! ^* i% n( O1 A- _
commit / rollback / savepoint. s3 L* h* W: I
事务:一组DML操作的逻辑操作集合$ E; [5 l& K p3 z/ [
***
5 k9 ~' }& N3 O! t1 a8 h3 K, e 1、事务的开始和终止
. d4 d) [9 u, E 1)事务开始于上一个事务的终止或者第一条DML语句" s* M; ]1 q6 G7 q4 a- g* I
2)事务终止于commit/rollback显式操作。
2 H' C: t E" V; e$ i2 S$ l 连接关闭:隐式终止
* X- l, Q+ b t DDL操作,比如create:隐式提交。% f% e/ g. p/ p
8 z. X! g# K1 p" J6 n
insert into ...values...
0 j" z' W, A: k% U update ...
4 `$ r# _1 ]% T: U3 t3 Z delete ...
4 A+ q9 d% P" T; h5 ~ U insert into ....7 }9 _) ^2 l' V; {2 f9 u
--rollback;--回退到事务之初,数据的状态和事务. F; j+ e- x* n* G
开始之前完全一致。
6 r2 L8 K: x6 k0 S/ q5 y commit; --所有的数据改动提交。$ X9 X8 P% t$ J% G& D- Y& ~
8 W9 D6 U! x' M& k; I% X1 D/ j# G( ]
2、事务中的数据状态
/ Y$ e( \, E) L* h7 Q# S8 [+ ]' U' e } create table mytemp_ning(; M b0 K; V4 D6 i+ S8 O
id number(4));& n" O7 d3 D6 c6 f' Z( X
insert into mytemp_ning values(1);. t, {9 k4 M3 b0 T
insert into mytemp_ning values(2);
" h, A1 U( c5 v( ?
4 q( T4 ]0 T0 \! | --事务内部的数据改变只有自己的会话能够看到* y1 D5 s! L! {1 L, P3 m
--对事务改动的数据加锁,事务之外不允许操作。( M7 h: }* X- M$ _, A; }
* b; p6 ]$ t, @6 J' E+ {
如果提交:commit: O- s& G4 P Y
数据的改变被确认。所有的会话都能看到这种改动。- ^* V" I1 z/ W o% p
数据上的锁被释放。
" g+ u- C- \; a: T! | 保存数据的临时空间被释放。6 R6 S$ W# B" _$ P2 x9 a9 V, U4 N3 ]% P
. K" T' t' |+ S* _8 j 如果回滚:rollback
( a! D @4 D# u1 V/ X2 c) ^ 数据的改变被取消。5 P( T$ t; l! C, p2 A. [
数据上的锁被释放。
% L5 {( b( R3 h$ E 临时空间被释放
; t$ `, t) J+ K$ ~5 P$ r% R# U create table mytemp_ning(id number(4));
3 T' y9 ^7 c. A9 A --事务起点
, W; T' H7 `% [( b" X* m5 H! d ? insert into mytemp_ning values(3);, F$ _* C3 x9 K
savepoint A;" n+ T1 P" d# g9 {) |$ d7 k8 L u' K
insert into mytemp_ning values(4);* N0 y$ o. p% Q% u# j8 n
savepoint B;% m2 k+ U0 F4 c0 o/ l7 k1 S
insert into mytemp_ning values(5);
! ~6 h8 k2 m: n* ~0 @7 l rollback to A; --回滚到保存点A,A之后的保存点全部被取消% Z2 w' ?! K& d) Y2 ?6 E$ C% _: [
select * from mytemp_ning; --3保存,4、5回退5 B- r& Z1 A8 r% P5 t
' z+ c+ B* @5 X3 O 三、DDL. i" V$ I! I; V# q9 |
create / drop / alter / truncate
/ J1 a. |7 K* H" I& l0 W) ` 9 F9 Q6 {! }9 U/ w
数据库的脚本(script)文件main.sql:
7 L2 p/ f5 M* m ------------begin--------------------
% c2 J& g+ U+ }3 b- i --删除表emp
, |, G7 c: x- F3 w c8 d; s! Y, A drop table emp;1 w5 W2 _7 M' \3 |& r) \# \
--创建表emp/ v v1 C9 D, Y6 \
create table emp(id number(4),. P/ ^* B, _1 R
name char(20));3 x5 N4 [: ?. q, m# Y% c+ [' X) M
insert into emp values(1, 'amy');
4 K2 c7 q' g! s* u9 b! n commit;
5 M' H7 `" ]+ K/ O
, B3 z+ G$ x+ d( U, X( F/ z* A7 G 4 { c4 N! |' m/ r: W1 V; H8 a
我的日常 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关2、本站所有主题由该帖子作者发表,该帖子作者与我的日常 享有帖子相关版权3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和我的日常 的同意4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意7、我的日常 管理员和版主有权不事先通知发贴者而删除本文
JAVA爱好者①群:
JAVA爱好者②群:
JAVA爱好者③ :