通过分析SQL语句的执行计划优化SQL(总结)

时间:2019-05-12 03:30:31下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《通过分析SQL语句的执行计划优化SQL(总结)》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《通过分析SQL语句的执行计划优化SQL(总结)》。

第一篇:通过分析SQL语句的执行计划优化SQL(总结)

通过分析SQL语句的执行计划优化SQL(总结)

做DBA快7年了,中间感悟很多。在DBA的日常工作中,调整个别性能较差的SQL语句时一项富有挑战性的工

作。其中的关键在于如何得到SQL语句的执行计划和如何从SQL语句的执行计划中发现问题。总是想将日常

经验的点点滴滴总结一下,但是直到最近才下定决心,总共花了3个周末时间,才将其整理成册,便于自

己日常工作。不好意思独享,所以将其贴出来。

修改日志:

2006.02.20:

根据网友反馈已做部分修改,但pdf文件没有做修改,修改部分在“如何产生执行计划”关于set

autotraceonly的介绍部分

第一章、第2章 并不是很重要,是自己的一些想法,关于如何做一个稳定、高效的应用系统的一些想法。

第三章以后都是比较重要的。

附录的内容也是比较重要的。我常用该部分的内容。

前言

本文档主要介绍与SQL调整有关的内容,内容涉及多个方面:SQL语句执行的过程、ORACLE优化器,表之间 的关联,如何得到SQL执行计划,如何分析执行计划等内容,从而由浅到深的方式了解SQL优化的过程,使

大家逐步步入SQL调整之门,然后你将发现„„。

该文档的不当之处,敬请指出,以便进一步改正。请将其发往我的信箱:xu_yu_jin2000@sina.com。

如果引用本文的内容,请著名出处

目录

第1章 性能调整综述 第2章 有效的应用设计

第3章 SQL语句处理的过程 第4章 ORACLE的优化器 第5章 ORACLE的执行计划 访问路径(方法)--access path 表之间的连接

如何产生执行计划 如何分析执行计划

如何干预执行计划-合并连接(Sort Merge Join(SMJ))嵌套循环(Nested Loops(NL))哈希连接(Hash Join)

排序-合并连接(Sort Merge Join, SMJ):

a)对于非等值连接,这种连接方式的效率是比较高的。b)如果在关联的列上都有索引,效果更好。c)对于将2个较大的row source做连接,该连接方法比NL连接要好一些。d)但是如果sort merge返回的row source过大,则又会导致使用过多的rowid在表中查询数据时,数据库

性能下降,因为过多的I/O。

嵌套循环(Nested Loops, NL):

a)如果driving row source(外部表)比较小,并且在inner row source(内部表)上 有唯一索引,或有高选择性非唯一索引时,使用这种方法可以得到较好的效率。b)NESTED LOOPS有其它连接方法没有的的一个优点是:可以先返回已经 连接的行,而不必等待所有的连接操作处理完才返回数据,这可以实现快速的响应时间。哈希连接(Hash Join, HJ):

a)这种方法是在oracle7后来引入的,使用了比较先进的连接理论,一般来说,其效率应该好于其它2种连接,但是这种连接只能用在 CBO优化器中,而且需要设置合适的hash_area_size参数,才能取得较好的性能。

b)在2个较大的row source之间连接时会取得相对较好的效率,在一个 row source较小时则能取得更好的效率。c)只能用于等值连接中

笛卡儿乘积(Cartesian Product)当两个row source做连接,但是它们之间没有关联条件时,就会在两个row source中做笛卡儿乘积,这通

常由编写代码疏漏造成(即程序员忘了写关联条件)。笛卡尔乘积是一个表的每一行依次与另一个表中的所

有行匹配。在特殊情况下我们可以使用笛卡儿乘积,如在星形连接中,除此之外,我们要尽量使用笛卡儿

乘积,否则,自己想结果是什么吧!

注意在下面的语句中,在2个表之间没有连接。SQL> explain plan for select emp.deptno,dept,deptno from emp,dept

Query Plan------------------------------SLECT STATEMENT [CHOOSE] Cost=5 MERGE JOIN CARTESIAN TABLE ACCESS FULL DEPT SORT JOIN TABLE ACCESS FULL EMP

CARTESIAN关键字指出了在2个表之间做笛卡尔乘积。假如表emp有n行,dept表有m行,笛卡尔乘积的结果

就是得到n * m行结果。

7楼

06-01-12 17:48 [ 大 中 小 ]

SunnyXu 一般会员

注册日期: 2004 Nov 来自:

技术贴数:38 精华贴数:1 论坛积分:267 论坛排名:9743 论坛徽章:0

[center]如何产生执行计划[/center]

要为一个语句生成执行计划,可以有3种方法: 1).最简单的办法

Sql> set autotrace on Sql> select * from dual;执行完语句后,会显示explain plan 与 统计信息。这个语句的优点就是它的缺点,这样在用该方法查看执行时间较长的sql语句时,需要等待该语句执行成

功后,才返回执行计划,使优化的周期大大增长。

如果想得到执行计划,而不想看到语句产生的数据,可以采用: Sql> set autotrace traceonly 这样还是会执行语句。它比set autotrace on的优点是:不会显示出查询的数据,但是还是会将数据输出

到客户端,这样当语句查询的数据比较多时,语句执行将会花费大量的时间,因为很大部分时间用在将数

据从数据库传到客户端上了。我一般不用这种方法。

Sql> set autotrace traceonly explain 如同用explain plan命令。对于select 语句,不会执行select语句,而只是产生执行计划。但是对于dml

语句,还是会执行语句,不同版本的数据库可能会有小的差别。这样在优化执行时间较长的select语句时,大大减少了优化时间,解决了“set autotrace on”与“set autotrace traceonly”命令优化时执行

时间长的问题,但同时带来的问题是:不会产生Statistics数据,而通过tatistics数据的物理I/O的次数,我们可以简单的判断语句执行效率的优劣。

如果执行该语句时遇到错误,解决方法为:(1)在要分析的用户下:

Sqlplus > @ ?rdbmsadminutlxplan.sql(2)用sys用户登陆

Sqlplus > @ ?sqlplusadminplustrce.sql Sqlplus > grant plustrace to user_name;-> A)--> C。如果数据库是基于代价的优化器,它会利用计

算出的代价来决定合适的驱动表与合适的连接顺序。一般来说,CBO都会选择正确的连接顺序,如果CBO选

择了比较差的连接顺序,我们还可以使用ORACLE提供的hints来让CBO采用正确的连接顺序。如下所示:

select /*+ ordered */ A.col4 from B,A,C where B.col3 = 10 and A.col1 = B.col1 and A.col2 = C.col2 and C.col3 = 5

既然选择正确的驱动表这么重要,那么让我们来看一下执行计划,到底各个表之间是如何关联的,从而得

到执行计划中哪个表应该为驱动表:

在执行计划中,需要知道哪个操作是先执行的,哪个操作是后执行的,这对于判断哪个表为驱动表有用处

。判断之前,如果对表的访问是通过rowid,且该rowid的值是从索引扫描中得来得,则将该索引扫描先从

执行计划中暂时去掉。然后在执行计划剩下的部分中,判断执行顺序的指导原则就是:最右、最上的操作

先执行。具体解释如下:

得到去除妨碍判断的索引扫描后的执行计划: Execution Plan---------------------------0 SELECT STATEMENT Optimizer=CHOOSE 1 0 MERGE JOIN 2 1 SORT(JOIN)3 2 NESTED LOOPS 4 3 TABLE ACCESS(FULL)OF 'B' 5 3 TABLE ACCESS(BY INDEX ROWID)OF 'A' 7 1 SORT(JOIN)8 7 TABLE ACCESS(FULL)OF 'C' 看执行计划的第3列,即字母部分,每列值的左面有空格作为缩进字符。在该列值左边的空格越多,说明

该列值的缩进越多,该列值也越靠右。如上面的执行计划所示:第一列值为6的行的缩进最多,即该行最

靠右;第一列值为4、5的行的缩进一样,其靠右的程度也一样,但是第一列值为4的行比第一列值为5的行

靠上;谈论上下关系时,只对连续的、缩进一致的行有效。

从这个图中我们可以看到,对于NESTED LOOPS部分,最右、最上的操作是TABLE ACCESS(FULL)OF 'B',所以这一操作先执行,所以该操作对应的B表为第一个驱动表(外部表),自然,A表就为内部表了。从图中

还可以看出,B与A表做嵌套循环后生成了新的row source,对该row source进行来排序后,与C表对应的

排序了的row source(应用了C.col3 = 5限制条件)进行MSJ连接操作。所以从上面可以得出如下事实:B表

先与A表做嵌套循环,然后将生成的row source与C表做排序—合并连接。

通过分析上面的执行计划,我们不能说C表一定在B、A表之后才被读取,事实上,B表有可能与C表同时被

读入内存,因为将表中的数据读入内存的操作可能为并行的。事实上许多操作可能为交叉进行的,因为

第二篇:SQL语句性能优化

我也做了很长时间医疗软件,也写过不少sql优化,没有详细记录下来,个人感觉下面转载的更符合医院医疗软件实际业务,很认可大部分所写的原则,固转载过来,以作借鉴。软件的根本还是在于更细更精,在于从客户的实际使用考虑问题。

性能优化原则1:永远避免困境

利用缓存把字典数据取到中间服务器或是客户端替代直接sql查询,如,门诊医生站把字典下载到客户端,减少执行次数。

一次性取数据到客户端,然后再逐条处理,而不是分次取数据,处理好一条数据再取下一条再处理。例:门诊收费取hjcfmxk例子,原来是一张处方条明细都查询一次,查询后再处理,现改为一次把所有明细都取过来,然后一条条处理

尽量减少光标,看能不能用临时表

性能优化原则2:kiss原则

对于where 条件中的左边可以利用索引的字段Keep it simple stupid,左边尽量避免用函数(substring,isnull,upper,lower),参加计算+,-*/

例子1:select * from ZY_BRFYMXK where substring(zxrq,1,8)='20081212‘

select * from ZY_BRFYMXK where zxrq between '2008121200' and '2008121224' 例子2:

select * from zy_detail_charge where SUBSTRING(patient_id,1,10)=

substring('000005090600',1,10)这句耗时30秒以上

select * from zy_detail_charge where patient_id like substring('000005090600',1,10)+'%' 这句耗时2秒以内

性能优化原则3:尽可能利用到索引

例:select * from ZY_BRFYMXK a(nolock),VW_LSYZK b(nolock)where a.syxh=3 and a.yzxh=b.xh and a.fylb=0

select * from ZY_BRFYMXK a(nolock),VW_LSYZK b(nolock)where a.syxh=3 and a.yzxh=b.xh and a.fylb=0 and b.syxh=3

性能优化原则4:or,避而远之

对于索引字段尽力避免用or,普通字段可以用or,解决要么分解成多个sql,要么用业务规则避免,例:declare @rq1 ut_rq16,@syxh ut_syxh

select @rq1='20081201'

select @syxh=157

性能优化原则5:避免大批量数据取到前台

例: select * from ZY_BRSYK cyrq between ‘20080901’ and ‘20081201‘,对于大医院每天100多人,90天是9000条数据

性能优化原则6:事务,尽可能的短吧

所有计算、对临时表的更新都应但放在事务外,事务中最好只有更新和插入正式表操作.因为事务中产生的锁只有在commit tran是才会释放。

性能优化原则7:热表,留在最后吧

热表是频繁调用的表。如:sf_mzcfk,zy_brfymxk,bq_fyqqk.对于热表尽量放在事务最后:这样锁的时间短。大家都坚持这样,死锁的可能性就小。如果都是热表各个存储过程更新表的顺序应当一样这样可以避免死锁

性能优化原则8:创建临时表一定要避免在事务中作

如create #tempXX(…)

Select * into #tempXX from …

因为创建临时表会锁tempdb的系统表

例:生成#temp1放在事务内外,用sp_lock2 ‘’观察结果

if object_id('tempdb..#temp1','U')is not null

drop table #temp1

begin tran

select * into #temp1 from ZY_BRSYK where ryrq>'20080901‘

select * from #temp1

waitfor delay '00:00:10'

commit

性能优化原则9:大的报表查询避免与正常业务碰撞

如果没有查询服务器,那要在存储过程中限制不能操作加上如:

declare @rq1 ut_rq16,@rq2 ut_rq16,@now ut_rq16

select @rq1=convert(varchar(8),getdate(),112)+'08:00:00'

select @rq1=convert(varchar(8),getdate(),112)+'11:30:00'

select @now=convert(char(8),getdate(),112)+convert(char(8),getdate(),8)

if @now>@rq1 and @now<@rq2

begin

select '上午繁忙时间段不能作此查询'

return

end

性能优化原则10:存储过程避免大的if…else…

这个常出项在业务相同表不同的存储过程中,因为这样常到if …else …原来医技接口中很多这种存储过程,当时把门诊住院业务放在一个存储过程中。这样最大的问题是sql server会根据sql语句来compile存储,这个过程会生成优化计划,决定用那个索引。如果存储过程用到门诊表compile一下,到用到住院表是发现不对,又会compile一下,这样不停compile.compile很号时间要1-2秒,而且一个存储过成在compile是,所有调用这个存储过程的进程都要在排队等候,因为他会独占锁这个存储过程

例:usp_yjjk_getwzxxm_old.sql,后改为:

usp_yjjk_getwzxxm.sql, usp_yjjk_getwzxxm_mz.sql,usp_yjjk_getwzxxm_zy.sql

性能优化原则11:进攻是最好的防守

在普通编程语句对于数据校验总是用防守办法先判断,后再作相应处理。而在sql中先处理再判断性能会好很多。

--更新药品库存。

If exists(select 1 from YK_YKZKC WHERE idm=100 and kcsl>50)

begin

update YK_YKZKC set kcsl=kcsl-50 where idm=100

End

Else begin

rollback tran

Select ‘F库存不够’

return

end

--改为

update YK_YKZKC set kcsl=kcsl-50 where idm=100 and kcsl>50

If @@rowcount<=0

Begin

Rollbakc tran

Select ‘F库存不够’

end

--取未执行的医技项目,日表没有数据就到年表中查找

if exists(select a.* from SF_MZCFK a(nolock),SF_CFMXK b(nolock)

begin

select a.* into #temp1 from SF_MZCFK a(nolock),SF_CFMXK b(nolock)

end

else begin

select a.* into #temp1 from SF_NMZCFK a(nolock),SF_NCFMXK b(nolock)

end

--改为

Insert into #temp1 select a.*

from SF_MZCFK a(nolock),SF_CFMXK b(nolock)

If @@rowcount=0

Begin

Insert into #temp1 select a.*

from SF_NMZCFK a(nolock),SF_NCFMXK b(nolock)

end

性能优化原则12:trig最后的手段

Trig(触发器)的处理的处理机制是满足条件时就会在源语句后面加上trig中的代码进行执行。

它有两个致命的弊端:(1)不清楚有trig的人会对于执行结果感到迷惑。如常有在插入一张表如果主键是indentity的值常取用select @@identity。但如是有trig,tring中有表插入操作,这时的@@identity可能就不是想要的值。(2)trig会束缚选择。如:有一套单据主表和明细表,当明细表的金额更新时,要同步主表的金额,当程序是一条条更新明细时用trig的作法是每当更新一条明细记录时都算一处所有明细表的总金额,再去更新主表的金额。这样有多少条明细就要算多少次,好的作法是不要trig,直接在sql语句中明细更新完明后,一次性算出总金额每条单据的总金额,再更新主表的金额。

对于trig如果有其他手段就一定要避免用trig.性能优化原则13:用户说好才是真的好

1)有时sql语句性能难以优化,但用户对于系统响应速度还是不满意。这时可以从业务分析处理。

如:我们退费模块录入发票号原来是用fph like ‘XXX%’。用户报怨慢,后来改为先用fph=‘XXX’来查,如查不到再fph like ‘XXX%’。这样在绝大部情况下速度都非常快,同时也满足小部分情况下模糊查询的需求。

如:我们的程序要查日表和年表。如果通过日表union表视图去查会非常慢,性能也难以优化。程序改为普通情况下不查年表,用户勾上年表标志时才查年表。

(2)查询统计很多数据时间比较长,就以查询完一部分数据后可以显示这部分数据或是用提示,这样用户清楚系统在作事情也知道大概进度。这样情绪上会好很多。

(3)查询模块常有一进入时也默认一个查询,如果性能好,查询又合用户心意,这种设计非常好,如果性能不好,那就不是好的设计。用户对于进入都困难的模块是没有好感的。

(4)有户的耐心与查询出的记录成正比。用户痛恨等待很久却没有查询出记录。

对于非常慢的查询,如果有些子查询非常快可以先作这样查询以避免查询很久却没有数据出来的情况。如:按病历号查在院病人所有费有明细,可以先查一下这个病历是不是有对应病人。

实战技巧1:用exists、in代替distinct

Distinct实际上是先收集再删除这样两步都耗资源。

Exists,in会隐式过滤掉重复的记录

例查自2009年以来有金额大于100的药品的病人

select distinct a.blh,a.hzxm from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock)where a.patid=b.patid and b.syxh=c.syxh and c.zxrq>'2009' and c.zje>100--改为

select a.blh,a.hzxm from ZY_BRXXK a where exists(select 1 from ZY_BRSYK

b(nolock),ZY_BRFYMXK c(nolock)where a.patid=b.patid and b.syxh=c.syxh and

c.zxrq>'2009'and c.zje>100)

实战技巧2:缩短union

select …from A,B,C,D,E1

where(E1的条件)

and(其他表联接条件)

union

select …from A,B,C,D,E2

where(E2的条件)

and(其他表接接条件)

改为

select …from A,B,C,D,(select...from E1where(E1条件)

union

select …from E2where(E2条件))E where(其他条件)

当涉及ABCD表部分耗资源而E1,E2不耗资源时是这样,如果反过来则改后的性能不一定好。查2009年4月后入院的在院病人在2905病区发生的所有费用明细

select a.hzxm,b.cyrq,d.ypmc,d.ypgg,c.ypsl/c.dwxs ypsl, c.ypdw

select a.hzxm,b.cyrq,d.ypmc,d.ypgg,c.ypsl/c.dwxs ypsl, c.ypdw

from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock),YK_YPCDMLK d where a.patid=b.patid and b.ryrq>'200904' and b.brzt not in(3,8,9)and b.syxh=c.syxh and c.bqdm='2905' and c.idm=d.idm

union all

select a.hzxm,b.cyrq,d.name,d.xmgg,c.ypsl/c.dwxs ypsl, c.ypdw

from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock),YY_SFXXMK d where a.patid=b.patid and b.ryrq>'200904' and b.brzt not in(3,8,9)and b.syxh=c.syxh and c.bqdm='2905' and c.ypdm=d.id and c.idm=0

--改为

select a.hzxm,b.cyrq,d.ypmc,d.ypgg,c.ypsl/c.dwxs ypsl, c.ypdw

from ZY_BRXXK a(nolock),ZY_BRSYK b(nolock),ZY_BRFYMXK c(nolock),(select ypmc,ypgg,ypdm,idm idm from YK_YPCDMLK union select name,xmgg,id,0 from YY_SFXXMK)d

where a.patid=b.patid and b.ryrq>'200904' and b.brzt not in(3,8,9)and b.syxh=c.syxh and c.bqdm='2905' and c.idm=d.idm and c.ypdm=d.ypdm

实战技巧3:合并sql

把表和where条件类似的两个或是多个sql合并为一个sql.--查2009年以后的普通、急诊、专家挂号人数

declare @ptghs int,@jzghs int,@zjghs int

select @ptghs=0,@jzghs=0,@zjghs=0

select @ptghs=count(*)from GH_GHZDK where ghrq>'2009' and ghlb=0

select @jzghs=count(*)from GH_GHZDK where ghrq>'2009' and ghlb=1

select @zjghs=count(*)from GH_GHZDK where ghrq>'2009' and ghlb=2

select @ptghs,@jzghs,@zjghs

--改为

select @ptghs=0,@jzghs=0,@zjghs=0

select @ptghs=sum(case when ghlb=0 then 1 else 0 end),@jzghs=sum(case when ghlb=1 then 1 else 0 end), @zjghs=sum(case when ghlb=2 then 1 else 0 end)

from GH_GHZDK where ghrq>'2009'

select @ptghs,@jzghs,@zjghs

实战技巧4:去掉游标

把游标当作编程语言的for,do---while的方式,很多情况下都可以去掉,如果光标中间sql语句只有一条一般都是可以去掉光标改为一句sql。

--查当天出院出院日期在2009年4月1到9日间病人的zfdj,zfje置为0

declare @syxh ut_syxh

declare cur1 cursor for select syxh from ZY_BRSYK where cyrq>='20090401' and cyrq<'20090410'

open cur1

fetch cur1 into @syxh

while @@fetch_status=0

begin

fetch cur1 into @syxh

end

close cur1

deallocate cur1

--改为

update ZY_BRFYMXK set zfdj=0,zfje=0

from ZY_BRFYMXK a,ZY_BRSYK b

where a.syxh=b.syxh and b.cyrq>='20090401' and b.cyrq<'20090410'

实战技巧5:取代count

利用内部函数代替

declare @count int

select * into #tmep1 from ZY_BRFYMXK WHERE zxrq>'200901'

select @count=@@rowcount—可以得到count值

select @count

select @count=count(*)from #tmep1—可以被取代

select @count

利用exists而不count判断有没有记录

declare @count int

Select @count=count(1)from ZY_BRFYMXK WHERE zxrq>'2009‘

If @count>0 … else ….--改为

If exists(Select 1 from ZY_BRFYMXK WHERE zxrq>'2009’)… else ….

第三篇:SQL语句经典总结

SQL语句经典总结

一、入门

1、说明:创建数据库

CREATE DATABASE database-name2、说明:删除数据库 drop database dbname

3、说明:备份sql server---创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'---开始 备份

BACKUP DATABASE pubs TO testBack

4、说明:创建新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)根据已有的表创建新表:

A:create table tab_new like tab_old(使用旧表创建新表)

B:create table tab_new as select col1,col2„ from tab_old definition only

5、说明:删除新表 drop table tabname

6、说明:增加一个列

Alter table tabname add column col type

注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

7、说明:添加主键: Alter table tabname add primary key(col)说明:删除主键: Alter table tabname drop primary key(col)

8、说明:创建索引:create [unique] index idxname on tabname(col„.)删除索引:drop index idxname

注:索引是不可更改的,想更改必须删除重新建。

9、说明:创建视图:create view viewname as select statement 删除视图:drop view viewname

10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围

插入:insert into table1(field1,field2)values(value1,value2)删除:delete from table1 where 范围

更新:update table1 set field1=value1 where 范围

查找:select * from table1 where field1 like ’%value1%’---like的语法很精妙,查资料!排序:select * from table1 order by field1,field2 [desc] 总数:select count as totalcount from table1 求和:select sum(field1)as sumvalue from table1平均:select avg(field1)as avgvalue from table1 最大:select max(field1)as maxvalue from table1 最小:select min(field1)as minvalue from table1

11、说明:几个高级查询运算词 A: UNION 运算符

UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。B: EXCEPT 运算符

EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时(EXCEPT ALL),不消除重复行。

C: INTERSECT 运算符

INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时(INTERSECT ALL),不消除重复行。注:使用运算词的几个查询结果行必须是一致的。

12、说明:使用外连接

A、left(outer)join:

左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。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 B:right(outer)join:

右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。C:full/cross(outer)join:

全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

12、分组:Group by: 一张表,一旦分组 完成后,查询后只能得到组相关的信息。

组相关的信息:(统计信息)count,sum,max,min,avg 分组的标准)

在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据 在selecte统计函数中的字段,不能和普通的字段放在一起;

13、对数据库进行操作:

分离数据库: sp_detach_db;附加数据库:sp_attach_db 后接表明,附加需要完整的路径名 14.如何修改数据库的名称:

sp_renamedb 'old_name', 'new_name'

二、提升

1、说明:复制表(只复制结构,源表名:a 新表名:b)(Access可用)法一:select * into b from a where 1<>1(仅用于SQlServer)法二:select top 0 * into b from a

2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b)(Access可用)insert into b(a, b, c)select d,e,f from b;

3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)(Access可用)insert into b(a, b, c)select d,e,f from b in ‘具体数据库’ where 条件 例子:..from b in '“&Server.MapPath(”.“)&”data.mdb“ &”' where..2

4、说明:子查询(表名1:a 表名2:b)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)

5、说明:显示文章、提交人和最后回复时间

select a.title,a.username,b.adddate from table a,(select max(adddate)adddate from table where table.title=a.title)b

6、说明:外连接查询(表名1:a 表名2:b)select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、说明:在线视图查询(表名1:a)select * from(SELECT a,b,c FROM a)T where t.a > 1;

8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 select * from table1 where time between time1 and time2 select a,b,c, from table1 where a not between 数值1 and 数值2

9、说明:in 的使用方法

select * from table1 where a [not] in(‘值1’,’值2’,’值4’,’值6’)

10、说明:两张关联表,删除主表中已经在副表中没有的信息

delete from table1 where not exists(select * from table2 where table1.field1=table2.field1)

11、说明:四表联查问题:

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.....12、说明:日程安排提前五分钟提醒

SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

13、说明:一条sql 语句搞定数据库分页

select top 10 b.* from(select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc)a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 具体实现:

关于数据库分页:

declare @start int,@end int @sql nvarchar(600)set @sql=’select top’+str(@end-@start+1)+’+from top’+str(@str-1)+’Rid from T where Rid>-1)’ exec sp_executesql @sql

注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引)

T where rid not in(select

14、说明:前10条记录

select top 10 * form table1 where 范围

15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)select a,b,c from tablename ta where a=(select max(a)from tablename tb where tb.b=ta.b)

16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表

(select a from tableA)except(select a from tableB)except(select a from tableC)

17、说明:随机取出10条数据

select top 10 * from tablename order by newid()

18、说明:随机选择记录 select newid()

19、说明:删除重复记录

1),delete from tablename where id not in(select max(id)from tablename group by col1,col2,...)2),select distinct * into temp from tablename delete from tablename

insert into tablename select * from temp 评价: 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作

3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段 alter table tablename--添加一个自增列

add column_b int identity(1,1)delete from tablename where column_b not in(select max(column_b)from tablename group by column1,column2,...)alter table tablename drop column column_b

20、说明:列出数据库里所有的表名

select name from sysobjects where type='U' // U代表用户

21、说明:列出表里的所有的列名

select name from syscolumns where id=object_id('TableName')

22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。

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 显示结果:

type vender pcs 电脑 A 1

电脑 A 1 光盘 B 2 光盘 A 2 手机 B 3 手机 C 3

23、说明:初始化表table1 TRUNCATE TABLE table1

24、说明:选择从10到15的记录

select top 5 * from(select top 15 * from table order by id asc)table_别名 order by id desc

三、技巧 1、1=1,1=2的使用,在SQL语句组合时用的较多

“where 1=1” 是表示选择全部 “where 1=2”全部不选,如:

if @strWhere!='' begin set @strSQL = 'select count(*)as Total from [' + @tblName + '] where ' + @strWhere end else begin set @strSQL = 'select count(*)as Total from [' + @tblName + ']' end 我们可以直接写成 错误!未找到目录项。

set @strSQL = 'select count(*)as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere

2、收缩数据库--重建索引 DBCC REINDEX DBCC INDEXDEFRAG--收缩数据和日志 DBCC SHRINKDB DBCC SHRINKFILE

3、压缩数据库

dbcc shrinkdatabase(dbname)

4、转移数据库给新用户以已存在用户权限

exec sp_change_users_login 'update_one','newname','oldname' go

5、检查备份集

RESTORE VERIFYONLY from disk='E:dvbbs.bak'

6、修复数据库

ALTER DATABASE [dvbbs] SET SINGLE_USER GO DBCC CHECKDB('dvbbs',repair_allow_data_loss)WITH TABLOCK GO ALTER DATABASE [dvbbs] SET MULTI_USER GO

7、日志清除 SET NOCOUNT ON DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT

USE tablename--要操作的数据库名

SELECT @LogicalFileName = 'tablename_log',--日志文件名 @MaxMinutes = 10,--Limit on time allowed to wrap log.@NewSize = 1--你想设定的日志文件的大小(M)Setup / initialize DECLARE @OriginalSize int SELECT @OriginalSize = size FROM sysfiles WHERE name = @LogicalFileName SELECT 'Original Size of ' + db_name()+ ' LOG is ' + CONVERT(VARCHAR(30),@OriginalSize)+ ' 8K pages or ' + CONVERT(VARCHAR(30),(@OriginalSize*8/1024))+ 'MB' FROM sysfiles WHERE name = @LogicalFileName CREATE TABLE DummyTrans(DummyColumn char(8000)not null)

DECLARE @Counter INT, @StartTime DATETIME, @TruncLog VARCHAR(255)SELECT @StartTime = GETDATE(), @TruncLog = 'BACKUP LOG ' + db_name()+ ' WITH TRUNCATE_ONLY' DBCC SHRINKFILE(@LogicalFileName, @NewSize)EXEC(@TruncLog)--Wrap the log if necessary.WHILE @MaxMinutes > DATEDIFF(mi, @StartTime, GETDATE())--time has not expired

AND @OriginalSize =(SELECT size FROM sysfiles WHERE name = @LogicalFileName)AND(@OriginalSize * 8 /1024)> @NewSize BEGIN--Outer loop.SELECT @Counter = 0 WHILE((@Counter < @OriginalSize / 16)AND(@Counter < 50000))BEGIN--update INSERT DummyTrans VALUES('Fill Log')DELETE DummyTrans SELECT @Counter = @Counter + 1 END EXEC(@TruncLog)END SELECT 'Final Size of ' + db_name()+ ' LOG is ' + CONVERT(VARCHAR(30),size)+ ' 8K pages or ' + CONVERT(VARCHAR(30),(size*8/1024))+ 'MB' FROM sysfiles WHERE name = @LogicalFileName DROP TABLE DummyTrans SET NOCOUNT OFF

8、说明:更改某个表

exec sp_changeobjectowner 'tablename','dbo'

9、存储更改全部表

CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch @OldOwner as NVARCHAR(128), @NewOwner as NVARCHAR(128)AS DECLARE @Name as NVARCHAR(128)DECLARE @Owner as NVARCHAR(128)DECLARE @OwnerName as NVARCHAR(128)DECLARE curObject CURSOR FOR select 'Name' = name, 'Owner' = user_name(uid)from sysobjects where user_name(uid)=@OldOwner order by name OPEN curObject FETCH NEXT FROM curObject INTO @Name, @Owner WHILE(@@FETCH_STATUS=0)BEGIN if @Owner=@OldOwner begin set @OwnerName = @OldOwner + '.' + rtrim(@Name)

exec sp_changeobjectowner @OwnerName, @NewOwner end--select @name,@NewOwner,@OldOwner FETCH NEXT FROM curObject INTO @Name, @Owner END close curObject deallocate curObject GO

10、SQL SERVER中直接循环写入数据 declare @i int set @i=1 while @i<30 begin insert into test(userid)values(@i)set @i=@i+1 end 案例:

有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:

Name score Zhangshan 80

Lishi 59 Wangwu 50

Songquan 69

while((select min(score)from tb_table)<60)begin update tb_table set score =score*1.01 where score<60

if(select min(score)from tb_table)>60 break else continue end

数据开发-经典

1.按姓氏笔画排序:

Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多2.数据库加密: select encrypt('原始密码')

select pwdencrypt('原始密码')select pwdcompare('原始密码','加密后密码')= 1--相同;否则不相同 encrypt('原始密码')select pwdencrypt('原始密码')select pwdcompare('原始密码','加密后密码')= 1--相同;否则不相同 3.取回表中字段: declare @list varchar(1000), @sql nvarchar(1000)select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A' set @sql='select '+right(@list,len(@list)-1)+' from 表A' exec(@sql)4.查看硬盘分区: EXEC master..xp_fixeddrives 5.比较A,B表是否相等: if(select checksum_agg(binary_checksum(*))from A)=(select checksum_agg(binary_checksum(*))from B)print '相等' else print '不相等' 6.杀掉所有的事件探察器进程: DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid)FROM master.dbo.sysprocesses WHERE program_name IN('SQL profiler',N'SQL 事件探查器')EXEC sp_msforeach_worker '?' 7.记录搜索: 开头到N条记录

Select Top N * From 表

N到M条记录(要有主索引ID)Select Top M-N * From 表 Where ID in(Select Top M ID From 表)Order by ID Desc---N到结尾记录

Select Top N * From 表 Order by ID Desc 案例

例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段,写一个SQL语句,找出表的第31到第40个记录。

select top 10 recid from A where recid not in(select top 30 recid from A)分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。

select top 10 recid from A where„„是从索引中查找,而后面的select top 30 recid from A则在数据表中查找,这样由于索引中的顺序有可能和数据表中的不一致,这样就导致查询到的不是本来的欲得到的数据。解决方案

1,用order by select top 30 recid from A order by ricid 如果该字段不是自增长,就会出现问题 2,在那个子查询中也加条件:select top 30 recid from A where recid>-1

例2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。

set @s = 'select top 1 * from T

where pid not in(select top ' + str(@count-1)+ ' pid from T)' print @s

exec sp_executesql

@s 9:获取当前数据库中的所有用户表

select Name from sysobjects where xtype='u' and status>=0 10:获取某一个表的所有字段

select name from syscolumns where id=object_id('表名')select name from syscolumns where id in(select id from sysobjects where type = 'u' and name = '表名')两种方式的效果相同

11:查看与某一个表相关的视图、存储过程、函数

select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%' 12:查看当前数据库中所有存储过程

select name as 存储过程名称 from sysobjects where xtype='P' 13:查询用户创建的所有数据库

select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')或者

select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01 14:查询某一个表的字段和数据类型

select column_name,data_type from information_schema.columns where table_name = '表名' 15:不同服务器数据库之间的数据操作--创建链接服务器

exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 '--查询示例

select * from ITSV.数据库名.dbo.表名--导入示例

select * into 表 from ITSV.数据库名.dbo.表名--以后不再使用时删除链接服务器

exec sp_dropserver 'ITSV ', 'droplogins '

--连接远程/局域网数据(openrowset/openquery/opendatasource)--

1、openrowset--查询示例

select * from openrowset('SQLOLEDB ', 'sql服务器名 ';'用户名 ';'密码 ',数据库名.dbo.表名)

--生成本地表

select * into 表 from openrowset('SQLOLEDB ', 'sql服务器名 ';'用户名 ';'密码 ',数据库名.dbo.表名)

--把本地表导入远程表

insert openrowset('SQLOLEDB ', 'sql服务器名 ';'用户名 ';'密码 ',数据库名.dbo.表名)select *from 本地表--更新本地表 update b set b.列A=a.列A from openrowset('SQLOLEDB ', 'sql服务器名 ';'用户名 ';'密码 ',数据库名.dbo.表名)as a inner join 本地表 b on a.column1=b.column1--openquery用法需要创建一个连接--首先创建一个连接创建链接服务器

exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '--查询

select * FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')--把本地表导入远程表

insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')select * from 本地表--更新本地表 update b set b.列B=a.列B FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')as a inner join 本地表 b on a.列A=b.列A

--

3、opendatasource/openrowset SELECT * FROM opendatasource('SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').test.dbo.roy_ta--把本地表导入远程表

insert opendatasource('SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名 select * from 本地表

SQL Server基本函数

SQL Server基本函数 1.字符串函数 长度与分析用

1,datalength(Char_expr)返回字符串包含字符数,但不包含后面的空格

2,substring(expression,start,length)取子串,字符串的下标是从“1”,start为起始位置,length为字符串长度,实际应用中以len(expression)取得其长度

3,right(char_expr,int_expr)返回字符串右边第int_expr个字符,还用left于之相反

4,isnull(check_expression , replacement_value)如果check_expression為空,則返回replacement_value的值,不為空,就返回check_expression字符操作类

5,Sp_addtype 自定義數據類型

例如:EXEC sp_addtype birthday, datetime, 'NULL' 6,set nocount {on|off} 使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。

SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。SET NOCOUNT 为 OFF 时,返回计数

常识

在SQL查询中:from后最多可以跟多少张表或视图:256 在SQL语句中出现 Order by,查询时,先排序,后取

在SQL中,一个字段的最大容量是8000,而对于nvarchar(4000),由于nvarchar是Unicode码。

SQLServer2000同步复制技术实现步骤

一、预备工作

1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户--管理工具--计算机管理--用户和组--右键用户

--新建用户

--建立一个隶属于administrator组的登陆windows的用户(SynUser)2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作: 我的电脑--D: 新建一个目录,名为: PUB--右键这个新建的目录--属性--共享

--选择“共享该文件夹”--通过“权限”按纽来设置具体的用户权限,保证第一步中创建的用户(SynUser)具有对该文件夹的所有权限

--确定

3.设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)开始--程序--管理工具--服务--右键SQLSERVERAGENT--属性--登陆--选择“此账户”--输入或者选择第一步中创建的windows登录用户名(SynUser)--“密码”中输入该用户的密码

4.设置SQL Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)企业管理器

--右键SQL实例--属性

--安全性--身份验证

--选择“SQL Server 和 Windows”

--确定

5.在发布服务器和订阅服务器上互相注册 企业管理器

--右键SQL Server组

--新建SQL Server注册...--下一步--可用的服务器中,输入你要注册的远程服务器名--添加--下一步--连接使用,选择第二个“SQL Server身份验证”--下一步--输入用户名和密码(SynUser)

--下一步--选择SQL Server组,也可以创建一个新组--下一步--完成

6.对于只能用IP,不能用计算机名的,为其注册服务器别名(此步在实施中没用到)

(在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)开始--程序--Microsoft SQL Server--客户端网络实用工具--别名--添加

--网络库选择“tcp/ip”--服务器别名输入SQL服务器名

--连接参数--服务器名称中输入SQL服务器ip地址

--如果你修改了SQL的端口,取消选择“动态决定端口”,并输入对应的端口号

二、正式配置

1、配置发布服务器

打开企业管理器,在发布服务器(B、C、D)上执行以下步骤:(1)从[工具]下拉菜单的[复制]子菜单中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导(2)[下一步] 选择分发服务器 可以选择把发布服务器自己作为分发服务器或者其他sql的服务器(选择自己)

(3)[下一步] 设置快照文件夹

采用默认servernamePub(4)[下一步] 自定义配置

可以选择:是,让我设置分发数据库属性启用发布服务器或设置发布设置 否,使用下列默认设置(推荐)

(5)[下一步] 设置分发数据库名称和位置 采用默认值(6)[下一步] 启用发布服务器 选择作为发布的服务器(7)[下一步] 选择需要发布的数据库和发布类型(8)[下一步] 选择注册订阅服务器(9)[下一步] 完成配置

2、创建出版物

发布服务器B、C、D上

(1)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令(2)选择要创建出版物的数据库,然后单击[创建发布](3)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)(4)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型, SQLSERVER允许在不同的数据库如 orACLE或ACCESS之间进行数据复制。但是在这里我们选择运行“SQL SERVER 2000”的数据库服务器

(5)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表 注意: 如果前面选择了事务发布 则再这一步中只能选择带有主键的表(6)选择发布名称和描述

(7)自定义发布属性 向导提供的选择:

是 我将自定义数据筛选,启用匿名订阅和或其他自定义属性 否 根据指定方式创建发布(建议采用自定义的方式)(8)[下一步] 选择筛选发布的方式

(9)[下一步] 可以选择是否允许匿名订阅

1)如果选择署名订阅,则需要在发布服务器上添加订阅服务器

方法: [工具]->[复制]->[配置发布、订阅服务器和分发的属性]->[订阅服务器] 中添加 否则在订阅服务器上请求订阅时会出现的提示:改发布不允许匿名订阅 如果仍然需要匿名订阅则用以下解决办法

[企业管理器]->[复制]->[发布内容]->[属性]->[订阅选项] 选择允许匿名请求订阅 2)如果选择匿名订阅,则配置订阅服务器时不会出现以上提示(10)[下一步] 设置快照 代理程序调度(11)[下一步] 完成配置

当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库 有数据

srv1.库名..author有字段:id,name,phone, srv2.库名..author有字段:id,name,telphone,adress

要求:

srv1.库名..author增加记录则srv1.库名..author记录增加

srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新--*/

--大致的处理步骤

--1.在 srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步

exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2的sql实例名或ip' exec sp_addlinkedsrvlogin 'srv2','false',null,'用户名','密码' go--2.在 srv1 和 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),并且设置为自动启动

。我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动 go

--然后创建一个作业定时调用上面的同步处理存储过程就行了

企业管理器--管理

--SQL Server代理--右键作业--新建作业

--“常规”项中输入作业名称--“步骤”项

--新建

--“步骤名”中输入步骤名

--“类型”中选择“Transact-SQL 脚本(TSQL)”--“数据库”选择执行命令的数据库

--“命令”中输入要执行的语句: exec p_process--确定--“调度”项--新建调度

--“名称”中输入调度名称

--“调度类型”中选择你的作业执行安排--如果选择“反复出现”--点“更改”来设置你的时间安排

然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行

设置方法: 我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择“自动启动”--确定.--3.实现同步处理的方法2,定时同步

--在srv1中创建如下的同步处理存储过程 create proc p_process as--更新修改过的数据

update b set name=i.name,telphone=i.telphone from srv2.库名.dbo.author b,author i where b.id=i.id and(b.name <> i.name or b.telphone <> i.telphone)

--插入新增的数据

insert srv2.库名.dbo.author(id,name,telphone)select id,name,telphone from author i where not exists(select * from srv2.库名.dbo.author where id=i.id)

--删除已经删除的数据(如果需要的话)delete b from srv2.库名.dbo.author b where not exists(select * from author where id=b.id)go

第四篇:经典实用SQL语句总结

经典实用SQL语句大全总结

[编辑语言]2015-05-26 19:56

本文导航

1、首页2、11、说明:四表联查问题:

本文是经典实用SQL语句大全的介绍,下面是该介绍的详细信息。下列语句部分是Mssql语句,不可以在access中使用。SQL分类:

DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)首先,简要介绍基础语句:

1、说明:创建数据库

CREATE DATABASE database-name

2、说明:删除数据库 drop database dbname

3、说明:备份sql server---创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'---开始 备份

BACKUP DATABASE pubs TO testBack

4、说明:创建新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)根据已有的表创建新表:

A:create table tab_new like tab_old(使用旧表创建新表)B:create table tab_new as select col1,col2… from tab_old definition only

5、说明:

删除新表:drop table tabname

6、说明:

增加一个列:Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

7、说明:

添加主键:Alter table tabname add primary key(col)说明:

删除主键:Alter table tabname drop primary key(col)

8、说明:

创建索引:create [unique] index idxname on tabname(col….)删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。

9、说明: 创建视图:create view viewname as select statement 删除视图:drop view viewname

10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围

插入:insert into table1(field1,field2)values(value1,value2)删除:delete from table1 where 范围

更新:update table1 set field1=value1 where 范围

查找:select * from table1 where field1 like ’%value1%’---like的语法很精妙,查资料!排序:select * from table1 order by field1,field2 [desc] 总数:select count * as totalcount from table1 求和:select sum(field1)as sumvalue from table1平均:select avg(field1)as avgvalue from table1 最大:select max(field1)as maxvalue from table1 最小:select min(field1)as minvalue from table1

11、说明:几个高级查询运算词 A: UNION 运算符

UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

B: EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时(EXCEPT ALL),不消除重复行。

C: INTERSECT 运算符

INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时(INTERSECT ALL),不消除重复行。

注:使用运算词的几个查询结果行必须是一致的。

12、说明:使用外连接 A、left outer join:

左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。

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 B:right outer join: 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

C:full outer join:

全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。其次,大家来看一些不错的sql语句

1、说明:复制表(只复制结构,源表名:a 新表名:b)(Access可用)法一:select * into b from a where 1<>1 法二:select top 0 * into b from a

2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b)(Access可用)insert into b(a, b, c)select d,e,f from b;

3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)(Access可用)insert into b(a, b, c)select d,e,f from b in ‘具体数据库’ where 条件 例子:..from b in '“&Server.MapPath(”.“)&”data.mdb“ &”' where..4、说明:子查询(表名1:a 表名2:b)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)

5、说明:显示文章、提交人和最后回复时间

select a.title,a.username,b.adddate from table a,(select max(adddate)adddate from table where table.title=a.title)b

6、说明:外连接查询(表名1:a 表名2:b)select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、说明:在线视图查询(表名1:a)select * from(SELECT a,b,c FROM a)T where t.a > 1;

8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括

select * from table1 where time between time1 and time2 select a,b,c, from table1 where a not between 数值1 and 数值2

9、说明:in 的使用方法

select * from table1 where a [not] in(‘值1’,’值2’,’值4’,’值6’)

10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists(select * from table2 where table1.field1=table2.field1)

11、说明:四表联查问题:

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.....12、说明:日程安排提前五分钟提醒

SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

13、说明:一条sql 语句搞定数据库分页

select top 10 b.* from(select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc)a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

14、说明:前10条记录

select top 10 * form table1 where 范围

15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)select a,b,c from tablename ta where a=(select max(a)from tablename tb where tb.b=ta.b)

16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表(select a from tableA)except(select a from tableB)except(select a from tableC)

17、说明:随机取出10条数据

select top 10 * from tablename order by newid()

18、说明:随机选择记录 select newid()

19、说明:删除重复记录

Delete from tablename where id not in(select max(id)from tablename group by col1,col2,...)20、说明:列出数据库里所有的表名

select name from sysobjects where type='U'

21、说明:列出表里的所有的

select name from syscolumns where id=object_id('TableName')

22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。

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 显示结果: type vender pcs 电脑 A 1 电脑 A 1 光盘 B 2 光盘 A 2 手机 B 3 手机 C 3

23、说明:初始化表table1 TRUNCATE TABLE table1

24、说明:选择从10到15的记录

select top 5 * from(select top 15 * from table order by id asc)table_别名 order by id desc 随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:

Randomize RNumber = Int(Rnd*499)+1 While Not objRec.EOF If objRec(“ID”)= RNumber THEN...这里是执行脚本...end if objRec.MoveNext Wend 这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了? 采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的 recordset,如下所示:

Randomize RNumber = Int(Rnd*499)+ 1 SQL = “SELECT * FROM Customers WHERE ID = ” & RNumber set objRec = ObjConn.Execute(SQL)Response.WriteRNumber & “ = ” & objRec(“ID”)& “ ” & objRec(“c_email”)不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。

再谈随机数

现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:

SQL = “SELECT * FROM Customers WHERE ID = ” & RNumber & “ OR ID = ” & RNumber2 & “ OR ID = ” & RNumber3 假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码):

SQL = “SELECT * FROM Customers WHERE ID BETWEEN ” & RNumber & “ AND ” & RNumber & “+ 9” 注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。随机读取若干条记录,测试过

Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)Sql server:select top n * from 表名 order by newid()mysql select * From 表名 Order By rand()Limit n Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)语法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where...使用SQL语句 用...代替过长的字符串显示 语法: SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field)FROM tablename;Conn.Execute说明 Execute方法

该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:

1.执行SQL查询语句时,将返回查询得到的记录集。用法为: Set 对象变量名=连接对象.Execute(“SQL 查询语言”)Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。

2.执行SQL的操作性语言时,没有记录集的返回。此时用法为: 连接对象.Execute “SQL 操作性语句” [, RecordAffected][, Option] ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。

·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。

·BeginTrans、RollbackTrans、CommitTrans方法 这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。

事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。

BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。

SQL语句大全精要 2006/10/26 13:46 DELETE 语句

DELETE语句:用于创建一个删除查询,可从列在 FROM 子句之中的一个或多个表中删除记录,且该子句满足 WHERE 子句中的条件,可以使用DELETE删除多个记录。

语法:DELETE [table.*] FROM table WHERE criteria 语法:DELETE * FROM table WHERE criteria='查询的字' 说明:table参数用于指定从其中删除记录的表的名称。

criteria参数为一个表达式,用于指定哪些记录应该被删除的表达式。可以使用 Execute 方法与一个 DROP 语句从数据库中放弃整个表。不过,若用这种方法删除表,将会失去表的结构。不同的是当使用 DELETE,只有数据会被删除;表的结构以及表的所有属性仍然保留,例如字段属性及索引。

以上就是精品学习网提供的关于经典实用SQL语句大全的内容,希望对大家有所帮助。

第五篇:SQL语句总结

SQL语句总结

一、插入记录

1. 插入固定的数值

语法:

INSERT[INTO]表名[(字段列表)]VALUES(值列表)

示例1:

Insert into Students values('Mary’,24,’mary@163.com’)

若没有指定给Student表的哪些字段插入数据:<情况一>表示给该表的所有字段插入数据,根据数据的个数,可以得知Students表中一共有3个字段<情况二>表中有4个字段,其中一个字段是标识列。

示例2:

Insert into Students(Sname,Sage)values(‘Mary’,24)

指定给表中的Sname,Sage两个字段插入数据。注意事项:

1)该命令运行一次向表中插入1条记录。无法实现向已存在的某记录中插入一个数据

2)如果不指定给哪些字段插入数值,则应注意值列表的值个数

3)插入数据时,注意值的数据类型要与对应的字段数据类型匹配

4)插入数据时,如果没有给值的字段必须保证允许其为空

5)插入数据时,要注意字段中的一些约束

2. 插入的记录集为一个查询结果

语法:

INSERTINTO表名[(字段列表)]SELECT 字段列表 FROM表WHERE条件 示例1:

InsertintoTeacherselectSname,Sage,SemailfromStudent

从Student表中查询三个字段的全部记录,插入Teacher表,没有指定Teacher表的具体字段,表示给Teacher表的全部字段插入数值

示例2:

InsertintoTeacherselectSname,Sage,SemailfromStudentwhereSage>25

从Student表中查询三个字段的部分记录,插入Teacher表

示例3:

InsertintoTeacher(tid,tname)selectSname , SagefromStudent 从Student表中查询两个字段的全部记录,插入到Teacher表中的tid,tname字段 注意事项:

查询表的字段要和插入表的字段数据类型一一对应

3. 生成表查询

语法:

SELECT字段列表INTO新表名FROM原表WHERE条件

示例1:

SelectSname,Sage,SemailintonewStudentfrom Studentwhere Sage<20 从Student表中查询出年龄小于20岁的学生的记录生成新表newStudent

共6页当前第1页

示例2:

Select Sname,Sage,SemailintonewStudentfromStudentwhere 1=2

利用Student表的表结构生成新表newStudent,newStudent表中记录为空

注意事项:

执行该语句时,确保数据库中不存在into关键字后面的指定的表名

二、删除记录

1)删除满足条件的记录

语法:

DELETEFROM表名WHERE条件

示例1:

DeletefromStudentwhereSage<20

从Student表中删除年龄小于20岁的学生的记录

示例2:

DeletefromStudent

没有设置条件,删除Student表的全部记录

2)删除表的全部记录

语法:

TRUNCATETABLE表名

示例:

TruncatetableStudent

删除表Student中的全部记录,约束依然存在三、修改记录

语法:

UPDATE表名SET字段=新值WHERE条件

示例1:

UpdateStudentsetSemail=’Email’+SemailwhereSemailisnotnull

把有email的学员的email地址变为原先的地址前加上‘Email’字符串

示例2:

UpdateStudentsetSage=Sage+1

把所有记录的Sage变为原先的值加1,例如过一年学生要长一岁

四、查询记录

1. 基本查询

语法:

SELECT字段列表FROM表

示例1:

SelectsName,sAge,sEmailfromStudents

从Students表中查询3个字段的所有的记录

示例2:

Select*fromStudents

从Students表中查询所有字段的所有的记录(字段列表位置写*代表查询表中所有字段)

2. 带WHERE子句的查询

语法:

SELECT字段列表FROM表WHERE条件

示例1:

SelectSNamefromStudentswhereSage>23

查询Students表中年龄大于23的学员的姓名

3. 应用别名

语法1:

SELECT字段列表AS别名„„

示例1:

SelectSNameas学员姓名,sAgeas学员年龄fromStudents

将查询的两个字段分别用中文别名显示

语法2:

SELECT别名=字段„„

示例2:

Select学员姓名=sName, 学员年龄=sAgefromStudents

注意事项:

别名可以是英文,也可以是中文,别名可以用单引号引起,也可以不引

4. 使用常量(利用‘+’连接字段和常量)

示例:

SelectsName+’的年龄是’+convert(varchar(2),sAge)as 学员信息

from Students

从Students表中查询,将学员的姓名和年龄信息与一个常量连接起来,显示为一个字段,该字段以“学员信息”为别名

5. 限制返回的行数

语法1:

SELECTTOPN字段列表 FROM表

示例1:

Select top 3sName,sAgefromStudents

查询Students表的前三条记录

语法2:

SELECTTOPNPERCENT字段列表FROM表

示例2:

Selecttop30percentsName,sAge from Students

查询Students表的前30%条记录

6. 排序

语法:

SELECT字段列表FROM表WHERE条件ORDER BY字段ASC/DESC 示例1:

Select*fromStudentswhere sAge>20order by sAge

查询年龄大于20岁的学员信息,并且按照年龄升序排序(若不指定升降序,默认为升序)示例2:

Select*fromStudentsorder by sNamedesc

查询所有学生的所有信息,并按照学生的姓名降序排序

7. 模糊查询

1)Like:通常与通配符结合使用,适用于文本类型的字段

示例1:

Select * from StudentswheresNamelike ‘张_’

查询Students表中张姓的,两个字名的学生信息

示例2:

Select * from StudentswheresNamelike ‘张%’

查询Students表中张姓的学生的信息

示例3:

Select * from StudentswheresEmaillike ‘%@[a-z]%’

查询Students表中,Semail字段‘@’后的第一个字符为小写英文字母的学生信息 示例4:

Select * from StudentswherestuNamelike ‘%@[^a-z]%’

查询Students表中,Semail字段‘@’后的第一个字符不是小写英文字母的学生信息

2)Between „and„:用于查询条件为一个字段介于两个值之间

示例:

Select * from Students where Sage between 20and25

查询学员年龄在20到25之间的学员信息

3)In:用于查询某个字段在值列表中出现作为条件

示例:

Select*fromStudentswhereScityin(‘大连’,’沈阳’,’北京’)查询学员的城市在大连,沈阳或北京的学员信息,等价于如下功能:

Select * from Students where Scity=’大连’or Scity=’沈阳’or Scity=’北京’

4)Isnull:用于查询某个字段为空作为条件

示例:

Select * from Students where Semail is null

查询学员的email为空的学员信息

Select * from Students where semail is not null

查询学员的email不为空的学员信息

8. 聚合函数(所有函数自动忽略空值)

1)Sum():统计某字段的和,用于数值型数据

示例:

Select sum(Sage)as 学员的年龄和 from Student

统计Students表中所有学员的年龄总和,显示结果为一个字段一条记录

2)Avg():统计某字段的平均值,用于数值型数据

示例:

Select avg(Sage)as 学员的平均年龄fromStudents

统计Students表中所有学员的年龄的平均值,显示结果为一个字段一条记录

3)Max():统计某字段的最大值,用于数值,文本,日期型

4)Min():统计某字段的最小值,用于数值,文本,日期型

示例:

Select max(Sage)as 最大年龄 , min(Sage)as 最小年龄from Students

查询Students表中的学员的最大年龄和最小年龄,显示结果为两个字段一条记录

5)Count():统计某字段的记录数或者表的记录数

示例1:

Select count(Semail)as email的数量 fromStudents

查询Students表中,有email的学员的数量。Count(字段)代表统计字段的记录数 示例2:

Select count(*)as学员的数量fromStudents

查询Students表中的记录数,count(*)代表统计表的记录数

9. 分组与聚合函数

语法:

SELECT字段1,聚合函数(字段)AS别名

FROM表

WHERE条件1

GROUP BY字段1

HAVING条件2

ORDER BY字段

注意事项: 1)此语法格式用于对表中按照某个字段分类之后,对每类中的某个数据进行统计

2)分组的字段应该是包含大量重复数据的字段

3)只有出现的group by后的字段,才可以独立出现在select后

4)Where条件用于在分组之前进行对记录的过滤

5)Having条件用于对分组之后的记录集进行条件过滤

6)Orderby总是出现在最后,对最终的结果集进行排序

示例1:

SelectSsex,avg(Sage)as平均年龄fromStudent

Group by Ssex

统计Student表中男生和女生的平均年龄。按照性别分组,分为男生和女生两组,统计每组中年龄的平均值

示例2:

SelectSsex,avg(Sage)as平均年龄fromStudents

WhereSemail is not null

Group by Ssex

统计具有email的学员中,男生和女生的平均年龄。先根据Smail字段进行条件过滤,过滤掉没有email的学员,对有email的学员分为男生和女孩两组,统计每组中年龄的平均值

示例3:

SelectSdate,count(*)as人数

FromStudents

Group by Sdate

Havingcount(*)>10

统计每天报名的人数,并显示出报名人数多于10人的记录。先按照报名的日期进行分组,统计出每天的报名人数,再在分组之后的记录集上进行条件过滤,留下人数超过10人的记录。

示例4:

SelectSdate,count(*)as人数

From Students

Where xueli=’大专’

Group by Sdate

Having by count(*)>10

查询大专学历的学员中,每天报名的人数,并显示多于10人的记录。先按照学历为大专的条件进行过滤,把是大专的学员按照报名日期进行分组,统计每组的报名人数,再把分组之后的记录集进行再次过滤,显示出报名人数多于10人的信息

10. 多表查询 注意事项:

1)能够进行多表联接查询的表中必须包含有公共字段,两个表的公共字段不要求字段名相同,但数据类型必须相同,功能相同,且两个字段中要包含相同记录

2)最常用的联接为内联接

1)内联接

SELECT字段列表

FROM表1INNERJOIN表2

ON表1.公共字段=表2.公共字段

返回两个表基于公共字段有相同记录的匹配结果

SELECT字段列表

FROM表1INNERJOIN表2

ON表1.公共字段<>表2.公共字段

返回两个表的交叉联接的结果与相等条件的内联的差集

2)外联接

(1)左外联接

SELECT字段列表

FROM左表LEFTJOIN右表

ON左表.公共字段=右表.公共字段

返回内联的结果加上左表的剩余记录

(2)右外联接

SELECT字段列表

FROM左表RIGHTJOIN右表

ON左表.公共字段=表2.公共字段

返回内联的结果加上右表的剩余记录

(3)完整外联接

SELECT字段列表

FROM表1FULLJOIN表2

ON表1.公共字段=表2.公共字段

返回内联的结果加上左表的剩余和右表的剩余

3)交叉联接

SELECT字段列表

FROM表1CROSSJOIN表2

返回结果集的数目为表1的记录数*表2的记录数,表1中的每一条记录分别和表2中的每条记录进行匹配

4)自联接

SELECT字段列表

FROM表1AS别名1INNERJOIN表1AS别名2

ON别名1.公共字段=别名2.公共字段

下载通过分析SQL语句的执行计划优化SQL(总结)word格式文档
下载通过分析SQL语句的执行计划优化SQL(总结).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    sql常用语句

    //创建临时表空间create temporary tablespace test_temp tempfile 'E:oracleproduct10.2.0oradatatestservertest_temp01.dbf'size 32m autoextend on next 32m maxs......

    SQL语句大全

    SQL练习一、 设有如下的关系模式, 试用SQL语句完成以下操作: 学生(学号,姓名,性别,年龄,所在系) 课程(课程号,课程名,学分,学期,学时) 选课(学号,课程号,成绩) 1. 求选修了课程号为“C2”......

    SQL语句

    SQL语句,用友的SQL2000,通过查询管理器写的语句 1、查询 2、修改 3、删除 4、插入表名:users 包含字段:id,sname,sage 查询 select * from users查询users表中所有数据 select i......

    常用SQL语句

    一、创建数据库 create database 数据库名 on( name='数据库名_data', size='数据库文件大小', maxsize='数据库文件最大值', filegrowth=5%,//数据库文件的增长率 filename......

    sql语句

    简单基本的sql语句 几个简单的基本的sql语句 选择:select * from table1 where范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1......

    常用sql语句

    1、查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from dba_tablespaces t, dba_data_files d where t.tablespace_name = d......

    SQL语句的优化方法

    SQL语句的优化方法 1.1注释使用 在语句中多写注释,注释不影响SQL语句的执行效率。增加代码的可读性。1.2对于事务的使用 尽量使事务处理达到最短,如果事务太长最好按功能将事......

    SQL基础语句总结

    一. 四种基本的SQL语句 1. 查询 select * from table 2. 更新 update table set field=value 3. 插入 insert [into] table (field) values(value) 4. 删除 delete [from] t......