- 注册时间
- 2008-9-13
- 最后登录
- 1970-1-1
- 在线时间
- 0 小时
- 阅读权限
- 200
- 积分
- 0
- 帖子
- 24482
- 精华
- 4
- UID
- 9
  
|
SQL分类:
0 u8 v( K8 b; v2 \DDL―数据定义语言(Create,Alter,Drop,DECLARE)
/ x8 `( a# e/ R" p* b/ _) T2 QDML―数据操纵语言(Select,Delete,Update,Insert)0 Q `3 q9 D/ X/ b/ V
DCL―数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)
( U+ O! w) i0 k# F6 s2 }$ @! l0 U. w2 L9 x
首先,简要介绍基础语句:
) z4 p' }- r U' t: `1、说明:创建数据库 J" Y$ S. ?" o
Create DATABASE database-name. u7 L4 }$ {8 d
2、说明:删除数据库. B0 o) \$ e1 T' k
drop database dbname
# P5 C2 o* v: d0 I2 e3、说明:备份sql server, i: ^. e( n; p4 y1 @ u6 z
--- 创建 备份数据的 device
" n1 o1 w$ f3 I5 ^3 m% r& P* {USE master
! O2 _; C$ `: D" yEXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'# p! F" C7 E8 k5 L ?1 W/ u
--- 开始 备份
& j& R# h/ C. ^- t' Z( F2 ?BACKUP DATABASE pubs TO testBack
! l6 d. b: g4 I, \4 {4、说明:创建新表
5 s6 S& H# A0 x/ {create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..), t+ C3 w( t9 R X3 [6 o% v
根据已有的表创建新表:+ U8 W( T& I! O4 `# J0 P& y$ @
A:create table tab_new like tab_old (使用旧表创建新表), H) m! J1 B3 O/ S! D6 t; p
B:create table tab_new as select col1,col2… from tab_old definition only& A& \! i* C3 ~) N1 f
5、说明:删除新表) T& ~0 y$ t; u" @* w0 `: ?
drop table tabname
+ z G) j- P, A4 Y# n6、说明:增加一个列
, S8 U; ^/ j/ s2 c! jAlter table tabname add column col type
) Z4 J+ g3 n4 a8 y9 `; B6 `注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。' S8 |, e3 f3 {2 S8 V- d1 P: n
7、说明:添加主键: Alter table tabname add primary key(col)" }2 z9 V( T0 {1 v% l( L$ _, Q
说明:删除主键: Alter table tabname drop primary key(col)
+ v0 j2 N, u2 G. ]: E: \ c$ n2 G8、说明:创建索引:create [unique] index idxname on tabname(col….)2 _& w J+ \0 Q5 \4 B( v; H
删除索引:drop index idxname K0 q: x- j% N: t3 E3 i& v
注:索引是不可更改的,想更改必须删除重新建。
0 k% |# V; a/ Q2 J. i9、说明:创建视图:create view viewname as select statement0 P/ o8 ?0 A* ^
删除视图:drop view viewname
/ A1 [" o6 o# L0 ]3 {( f10、说明:几个简单的基本的sql语句
) a! Y8 S6 h% v$ F+ J选择:select * from table1 where 范围
; M+ m$ t& }2 r% T4 J" I插入:insert into table1(field1,field2) values(value1,value2)% j- G7 p2 l% T6 L* o: ^* h) Z. \7 m; _
删除:delete from table1 where 范围
# H& p+ Q' S" a6 x更新:update table1 set field1=value1 where 范围1 }5 _0 r) q' _) B- }; M3 O& U( K
查找:select * from table1 where field1 like ’%value1__’ & e$ ^, G& B' R" ]4 f2 E
排序:select * from table1 order by field1,field2 [desc]
) P5 x, k" J! O9 q- y) a总数:select count * as totalcount from table1; [$ |; ?5 T4 ~: k- I4 I2 v- Z, o1 M
求和:select sum(field1) as sumvalue from table13 \8 _# u5 L8 r% {) [
平均:select avg(field1) as avgvalue from table19 g( t* E) ~# c& g9 i# ~4 M
最大:select max(field1) as maxvalue from table1
+ G$ W1 a @% a i1 |7 e& R最小:select min(field1) as minvalue from table1' X6 c2 k5 t6 m. X" J O% x
11、说明:几个高级查询运算词% [/ z; G* } O
A: UNION 运算符 C- T' n- z! W9 e- q8 U
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 Z3 D( O2 ~1 X+ d# o% m3 r- @
B: EXCEPT 运算符
3 C+ O+ N; X! T# `EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。; J" W4 L& T. J0 e! N
C: INTERSECT 运算符) h& ?; N, j7 q2 j+ |8 p0 t
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
b+ f' v) a9 p注:使用运算词的几个查询结果行必须是一致的。% R" p- O! z1 x
% ^4 y4 E9 u/ p0 |5 i" h& D! ?- y- C. j12、说明:使用外连接
* o) D3 N2 i1 @9 j# {A、left outer join:
( j4 A. S& ~1 I0 z |% b7 ?' K% N左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。9 n3 A \5 i8 |# s: |6 L( r: @
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c+ x: N; ^3 m8 i( b
B:right outer join:
( x9 k* Q+ Z/ q3 P/ O6 ~4 a右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
; y# I( A& d* B4 F, Y1 e' O; w2 JC:full outer join:
* C! N, P' m7 {# [. j全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。, n7 u8 H% g3 M. e: W
+ b* z3 J: I# V4 w7 F% K其次,大家来看一些不错的sql语句
. E/ V/ C* k' K# m3 \; o- C1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)- r6 A7 S! \) M9 g2 h
法一:select * into b from a where 1<>1# {! J! A2 j: r6 y
法二:select top 0 * into b from a6 d+ q0 A* H0 g$ V: F M" G
+ Y9 i1 ?! u7 t- P5 S! \8 W7 d
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
% O9 R1 ?& u7 d" zinsert into b(a, b, c) select d,e,f from b;
9 Q' c) O1 |) Q! \3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)7 q( ]# H5 f/ h
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件7 D- y. U" T& `5 g# K% o! F
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..5 y. |" }5 I0 j$ U" z( \
& v6 E) A: h) ]8 R9 V) g$ _
4、说明:子查询(表名1:a 表名2:b)# x v* b- p) l* h* K$ O# E
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
. k4 y4 \; q& j0 r9 n a s1 w& R+ B1 k, [
5、说明:显示文章、提交人和最后回复时间
, A, q$ ]# k9 E6 Aselect a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b5 G/ ~4 r! l: e. \5 d( @0 A
" p! K" f3 o, h U( D! y6、说明:外连接查询(表名1:a 表名2:b): T' G% P: B+ i. {
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
5 k; B8 ^8 F7 U' T; y* {
- Y# X v5 D6 I$ x7 V7、说明:在线视图查询(表名1:a ) F7 Z' C, P* A5 E# i
select * from (Select a,b,c FROM a) T where t.a > 1;0 e7 [' i! o& ~$ J
# l, V& I# F& G6 F2 Q$ @0 l
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括+ m% i6 {5 k& @0 `! j5 g) _. K
select * from table1 where time between time1 and time2+ o# K2 K( h7 w
select a,b,c, from table1 where a not between 数值1 and 数值2% n* `' K8 v7 O
7 H5 @7 M$ q9 Z7 F; u9 M
9、说明:in 的使用方法
+ }0 C# I' H. y6 Oselect * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
3 K6 [" c: ^4 I" _( E U
9 ^$ d/ m6 x, K, U5 l; `" ^10、说明:两张关联表,删除主表中已经在副表中没有的信息
, Z' y2 i$ I# e+ Q; G( b# mdelete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )8 T+ e' A5 O: i# g& O) }
0 N B; A2 v) P4 c" q/ u1 U7 e( b1 A11、说明:四表联查问题:% W* p# L1 }5 ^& r9 _
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
$ \, e+ H8 i& c- @& S; ~( @$ c- t+ U w6 s' S J% m
12、说明:日程安排提前五分钟提醒
9 g" l+ F; s# {/ e# C4 {+ H- S4 eSQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
/ Y3 y& N! Y" S0 W( Z3 g* K& H: O$ j
# |. w' u0 R- A$ L; N13、说明:一条sql 语句搞定数据库分页
, K y% ~0 i9 r5 n" N+ g+ R+ Xselect top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段2 _1 Q6 E. M; r3 T; a# h
0 [3 j* E: y8 S2 Y- ~5 u4 a# C
14、说明:前10条记录
9 F5 Y$ a4 T% V9 p$ vselect top 10 * from table1 where 范围* u; d/ i1 Z9 S; W' |2 D7 F" l
/ Z( d2 O; O0 T4 J) ]0 U
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)# }& |! c- B) K
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
6 n- X, O: w. o1 X
+ }+ L# U4 L8 ^+ N6 M" p16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
, u8 G. X2 _0 @- q! J(select a from tableA ) except (select a from tableB) except (select a from tableC)- S# @# M& ~4 y8 W3 n
8 A2 Y+ u5 j' l) l4 R" K+ k3 K
17、说明:随机取出10条数据
1 `; w" B4 l5 c& D9 sselect top 10 * from tablename order by newid()
* G1 K4 Q9 H( Z4 D3 e
4 b) s1 p3 w! p( d) z18、说明:随机选择记录5 a9 ~: x7 x Y0 z1 T
select newid()
" O( q/ _) V& V$ \) }: e
( Z" b: {/ W9 B1 X( Z1 V19、说明:删除重复记录
2 g! h) H5 m$ [; ?8 }/ |Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
: ]5 I: J5 |# Q# E/ x; \5 {8 n
20、说明:列出数据库里所有的表名
9 d( ~% D; U" O- b# t v3 I4 E' pselect name from sysobjects where type='U'
0 z. ?! q5 N i9 M( z
/ [& o' B/ e2 x+ u21、说明:列出表里的所有的
" k4 ^! s# L; D7 r! Dselect name from syscolumns where id=object_id('TableName'): p( d, I9 @. q" k
5 C2 Y5 Q* t3 E8 y9 i( @1 }
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。% k! V6 X. E, u8 f8 D; j* N2 n) W
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
! L0 I0 u0 q3 C: ~显示结果:
: N$ j8 W$ E$ F8 ] o; o% Xtype vender pcs" {$ O* [* V+ ], X8 r
电脑 A 13 O4 y. C& @: T0 h8 d! n
电脑 A 16 a" A! B9 N6 E& `* Y ?! }2 }
光盘 B 2
( s- j9 S1 z3 U3 S* I$ O X光盘 A 2
. i7 s% i3 j& T0 T手机 B 3
$ C" s, A" k4 H! i! b+ t手机 C 3
5 e6 N4 h" ]0 L4 y4 A8 L
. }! _ G7 @9 y z, ~23、说明:初始化表table1
0 c$ D1 u6 p9 {9 a) Q; {, w: FTRUNCATE TABLE table1
, |3 {- u+ @" V9 K. X: h! q, [) x
24、说明:选择从10到15的记录+ b6 r. b& g1 D! U; |- B
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc |
|