数据库语句范文

2024-07-25

数据库语句范文(精选6篇)

数据库语句 第1篇

一、基础

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:

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

二、提升

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

三、技巧 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

数据库语句 第2篇

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 电脑

A 光盘

B 光盘

A 手机

B 手机

C

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用于提交所有的事务处理结果,即确认事务的处理。

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

数据库系统中SQL语句优化 第3篇

由于应用程序可能生成非常复杂的SQL语句,查询优化程序必须精心构建、功能强大,以保障良好的执行性能。例如,查询优化程序可转换SQL语句,使复杂的语句转换成为等价的但执行性能更好的SQL语句。查询优化程序的典型特征是基于开销。在基于开销的优化策略中,对于给定查询生成多个执行计划,然后对每个计划估算开销,选用估算开销最低的执行计划。掌握优化查询过程中查询优化器的角色,将为你创建有用的索引、编写有效的查询和为调整较差查询性能的查询打下良好的基础。

1 查询优化策略

1.1 正确合理地使用索引

索引是数据库中一个常用而重要的数据库对象,而优化查询重要的方法是建立索引,在关系数据库系统的表上建立合适的索引,可以避免表扫描并减少因查询而造成的I/O开销,提高数据库数据查询的速度,改善数据库性能。但是创建索引会增加系统的时间和空间的开销。因此创建索引时必须要与实现应用系统的查询需求密切结合,才能达到优化查询的目的。使用索引要遵循下列原则:

1)认真考察SELECT语句中的WHERE子句。WHERE子句中包含的每列都是创建索引的候选项。若对每一列都建立索引,同一个表中拥有大量的索引,不仅占用的空间会增大,而且对系统维护的开销也会增加。所以在建立索引时,应考虑到实际应用中要频繁搜索的条件,即对WHERE子句中经常使用的列才建立索引。如在学生成绩查询系统中,经常以学生的学号(sno)去查询相关信息,如:SELECTscore FROMstu2dent-grade WHEREsno=<输入项>,这时则可以选sno这一列为索引项。

2)对于要进行多列排序的,可以在这些列上建立复合索引。

3)对频繁进行GROUPBY(分组)或ORDERBY(排序)操作的列上建立索引。

4)对于不同值较少的列上不要建立索引,如某些表上的“性别”列,只有“男”和“女”两种值,这时就没有必要在该列上建立索引。

5)在对于大批量数据记录的插入及删除,首先删除索引,再进行数据操作,等操作完成之后再重建必要的索引,避免因此而引起的消耗系统时间。如在学生信息管理系统中,新生入学时,需要向数据库中插入较多的数据。这时,在插入数据之前,先删除原来在该表中已有的索引,等所有数据入库后重新建立索引。

1.2 把对视图的访问转换为对基本表的访问

视图是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制,利用视图可以大大简化用户的工作,但是如果从查询优化的角度来看,视图则不利于查询效率的提高。如何才能既满足用户需求又不影响系统效率,一直是人们所关注的焦点。SQL语言是一个描述性的非过程化语言,用户在写SQL语句时,不用知道需要操作的数据具体是如何存放的以及必须按照什么步骤才能进行处理,查询处理器会自动完成这些工作。但是,查询语句操作的数据库对象除了可能是基本表以外,还可能是视图。如果查询处理器直接对视图进行操作,查询优化器所能生成的执行计划的唯一选择就是先执行视图定义,再将视图的查询结果作为一个临时表参与查询的其余处理。这种处理方式在绝大多数情况下效率极低,这时可以认为用户提供的查询蕴含了过程性,查询重写的目标之一就是将过程性查询转换为描述性的。因此,优化器要对视图进行重写,也就是将对视图的引用转换为对视图所涉及的基本表的引用,从而得到一个语义上完全等价的查询,但是重写后的查询效率却比原来提高了很多倍。

1.3 谓词的等价变换

由于执行引擎对各种谓词的处理方法不同,因此把逻辑表达式重写成等价的且效率较高的表达式是提高效率的有效方法,同时也是切实可行的。通过查阅大量的文献资料以及大量的实验,分析了RDBMS执行引擎对各种谓词执行效率的不同,总结出以下几种谓词转换规则:

1)将多个OR连接的谓词转化为ANY表达式。当条件表达式中同层次上出现由连接词OR连接的谓词,并且OR所连接的谓词的左表达式相同且谓词符号也相同时,那么可以将这些谓词合并为一个右表达式用ANY来描述的谓词。

2)将ANY或ALL转化为单个值。当谓词的右表达式为ANY或ALL的形式,并且ANY(ALL)包含的各表达式均有固定值,并且可以比较大小,则可根据谓词符号(仅限于比较大小的操作符)将ANY(ALL)重写为单个值。

3)将BETWEEN转化为AND连接的谓词。可以把由BETWEENexpr1ANDexpr2的形式重写为用AND连接的两个谓词,效率往往有一定的提高。

4)将IN谓词表达式扩展为OR连接的谓词表达式。

以上提到的4类谓词重写规则均有其特定的条件,在条件满足的情况下才可以使用。对于简单谓词的重写,每条规则提高的效率可能不太明显,但如果查询语句的WHERE条件同时使用多条规则进行重写时,效率的提高将非常可观。

1.4 使用存储过程

存储过程是SQL语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理,创建后便可转换为可执行代码,作为数据库的一个对象存储在数据库中,存储过程的代码驻留在服务器端,因而执行时不需要将应用程序代码向服务器端传送,可以大大减轻网络负载。同时,由于存储过程已编译为可执行代码,不需要每次执行时进行分析和优化工作,只需要从高速缓冲存储器中调用存储过程已编译好的二进制代码来执行,从而减少了预处理所花费的时间,提高了系统的效率。另一方面,使用存储过程还易于维护,且表的结构改变时,不影响客户端的应用程序。

2 结论

在数据库的开发和维护中,查询的优化设计可以提高系统性能,特别对于经常要用于查询且数据量大的数据库系统更显得重要。SQL查询优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充分利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生。而SQL的性能优化是一个复杂的过程,以上所述的策略只是在应用层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计等。优化的方面除充分利用硬件性能外,还可采用软件方法来解决。系统管理员只有正确观察和分析系统运行中提供的各种信息,充分结合实际应用特点,才能合理制定出良好的优化策略,实现快速、高效的数据查询和应用分析,同时也使硬件资源得到最充分的发挥。

摘要:查询是数据库中最基本、最常用、最复杂的操作,查询操作的优劣直接影响数据库应用程序的性能。本文主要讨论了基于SQL查询重写技术的数据库查询优化策略,通过查询重写可以把用户所写的效率不高的SQL语句重新优化组合,使之成为效率较高的查询语句。

关键词:数据库,SQL,优化

参考文献

[1]刘光霆.ORACLE中SQL查询优化研究[J].计算机与信息技术,2008,(5).

[2]姜参,赵越.SQLSever服务器性能优化[J].福建电脑,2008,(4).

数据库语句 第4篇

关键词:SQL语句;优化;智能;自动;数据库;程序

中图分类号:TP311.131 文献标识码:A文章编号:1007-9599 (2010) 09-0000-01

SQL Statement Optimization Study for Database

------- LECCO SQL Expert Analysis and Research

Li Maozhou

(Sichuan Transportation Vocational&Technical College,Chengdu611130,China)

Abstract:Some optimization experts believe that database can get nearly 40% system performance by optimizing SQL statements to high performance of SQL statements about the problem of database SQL statement optimization,which have always been keen on by computer researchers. Through artificial intelligence to automatically optimize on the SQL is re-inputing of the SQL statement for get the optimal SQL statement with the same effect.

Keywords:SQL statement;Optimization;Intelligent;Automatic;

Database;Program

一、对数据库中SQL语句进行优化的背景

我们都知道,对于一个计算机数据库系统的生命周期进行分阶段优化研究,它可以分为设计阶段优化、开发阶段优化、成品阶段优化这三个阶段,在数据库设计阶段优化数据库性能其成本最低收益最大,而对于成品阶段优化而言,这一阶段对数据库性能优化的成本最高收益最小,许多的优化专家都认为,通过对网络、数据库参数、计算机硬件、应用程序等来优化数据库系统可以在很大程度上让计算机数据库系统性能得到提升,据统计数据库系统性能提升的40%来源于对网络、计算机操作系统、数据库参数等的优化,其余的将近60%则是来源于对数据库应用程序的优化,有的优化专家甚至认为对于数据库应用程序中SOL语句的优化占到其中的一半还多,由此可见优化数据库中SQL语句对于计算机数据库系统性能的提升有着很大的影响。

二、在计算机数据库中SQL语句优化的意义

作为对计算机数据库进行操作的唯一途径,SQL语句对于计算机数据库系统的性能直接有着决定性的影响。在数据库资源的消耗中,SQL语句占了总消耗量的70%-90%;基于独立于程序设计逻辑的特点,我们对SQL语句进行优化对于计算机数据库来说,不对造成程序逻辑的混乱。

三、对SQL优化技术的发展历程进行分析

在计算机数据库方面的研究中,对于SQL优化技术而言,它的发展一共经历的三个阶段,在第一阶段是专门针对输入方面的SQL语句执行计划分析的技术,这种从数据库中提取执行计划,而且执行解释关键字含义的技术被称为第一代的SQL优化技术。第二阶段的SQL优化技术是通过对输入的SQL语句的执行计划进行分析,由此来产生是否增加索引的建议,这类技术被称为二代的SQL语句优化工具,它只能提供增加索引的一些建议,最后一阶段的SQL优化技术在分析输入SQL语句执行计划的基础上,同时对输入的SQL语句本身进行语法分析,由此来产生对SQL语句写法上的改进。

四、对于人工智能自动SQL优化技术-----LECCO SQL Expert的分析性研究

(一)对于LECCO SQL Expert优化模块的特点进行研究

LECCO SQL Expert通过独家的人工智能知识库反馈式搜索引擎进行对SQL语句进行优化,通过重写性能优异的SQL语句来达到对数据库系统性能的提升,在保证产生相同结果的接触上,它通过先进的SQL语法分析器来对较为复杂的SQL语句进行分析,通过对优化重写而得出的SQL语句进行测试运行,从而自动的找出性能最好的SQL语句,为应用程序跟数据库提供最为便捷的服务。

其次,LECCO SQL Expert作为非常先进的SQL优化工具,它提供的边做边学式训练模式,可以迅速有效的提升开发人员的SQL编程技能,而且与此同时提供SQL运行状态帮助跟更为便捷的上下文敏感的执行计划帮助系统,提供出独一无二的SQL重写解决方案。

(二)LECCO SQL Expert可以让普通的程序员写出专家级别的SQL语句

对SQL语句的优化变的方便快捷简单是其最大最优特点,笔者认为只要能写出好的SQL语句,它就能为用户提供出最好性能的优化写法,同以往的数据库优化手段进行分析比较,LECCO SQL Expert的出现把数据库优化技术提升了一个很高的层次,在最短的时间内找出所有可能的优化方案,再通过实际的测试,提供出最有效的优化方案,让普通的程序员即可写出专家级别的SQL语句,这一最大的特征让原本传统上由人的来完成的完全依赖于人的经验、受人思维限制的数据库优化手段变得更为简单有效,更为自动准确起来。

五、结束语

總的来说,对于数据库的优化时一个严格复杂的系统工程,在数据库德整体实施过程中影响到数据库系统性能的因素是非常多的,不同项目应用要求也各不相同,我们必须对数据库运行的实际情况加以分析,然后才能得出更好的优化解决方案。通过对计算机数据库中SQL语句的优化研究,一定程度上可以为数据库德更好的维护跟开发提供一些有益的解决办法。

参考文献:

[1]茹蓓.SQL查询语句的优化,《新乡教育学院学报》,2006年第4期

[2]马建霞.巧用执行计划优化SQL Server数据库查询,《电脑与电信》,2010年第6期

数据库连接概念语句总结全 第5篇

连接是根据给定的条件,从两个已知关系R和S的笛卡尔积中,选取满足连接条件(属性之间)的若干元组组成新的关系。记作:,其中F是选择条件

1.条件连接:从两个关系的笛卡尔积中选取属性间满足一定条件的元组。

2.相等连接:从关系R与S的笛卡尔积中选取满足等值条件的元组。

3.自然连接:也是等值连接,从两个关系的笛卡尔积中,选取公共属性满足等值条件(属性相同)的元组,但新关系不包含重复的属性。

4.外连接

是在连接条件的某一边添加一个符号“*”,其连接结果是为符号所在边添加一个全部由“空值”组成的行。

4.1 外连接:

如果把舍弃的元组保存在结果关系中,而在其他属性上填空值(NULL),这种连接就叫做外连接(outer join)。1.R和S作自然连接:把满足R.B=S.B条件的元组保留在新关系中。

2.把不满足R.b=S.B条件的元组也保留在新关系中,相应的值填空。

左外连接:

如果只把左外关系R中要舍弃的元组保留就叫做左外连接(left join)。

右外连接:

如果只把右外关系S中要舍弃的元组保留就叫做右外连接(right join)。

【例】:

1.左外连接

左向外联接的结果集包括 left outer 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)Sql: select * from table1 left join table2 on table1.id=table2.id;

注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示

2.右外连接

右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。Sql: select * from table1 right join table2 on table1.id=table2.id;

注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示

3.完整外部联接:full join 完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。Sql: select * from table1 full join table2 on table1.id=table2.id;

2.内连接 join 或 inner join 条件连接

概念:内联接是用比较运算符比较要联接列的值的联接(写清楚on以后的条件)

select * from table1 inner join table2 on table1.id=table2.id;

3.自然连接(natural join)默认两个表里字段相等的连接。

数据库语句 第6篇

 

数据查询SELECT语句数据库教程

 

。因此,对用户来说,数据查询是数据

库最重要的功能。本章将讲述数据查询的实现方法。

在数据库中,数据查询是通过SELECT 语句来完成的。SELECT 语句可以从数据库中按用户要求检索数据,并将查询结果以表格的形式返回。我们在“Transact-SQL 语言”章节及前面的章节中已经初步接触到了SELECT 语句的一些用法,在本章中将分类讲述其具体用法。

本节讲述SELECT 语句完整的锓结构U馐且桓龇浅H叱ぁ⒖菰锏墓程。读者? 以跳过本节,从第二节开始阅读,而将本节作为理解、编写查询语句的语法参考资料。 SELECT 语句完整的语法结构如下:

SELECT statement ::=

[ ORDER BY { order_by_expression | column_position [ ASC | DESC ] } [,...n] ]

[ COMPUTE { { AVG | COUNT | MAX | MIN | SUM } (expression) } [,...n]

[ BY expression [,...n] ] ]

[ FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }

[ , XMLDATA ]

[ , ELEMENTS ]

[ , BINARY base64 ] }

[ OPTION ( [,...n]) ]

::=

{ | () }

[UNION [ALL] ) [...n] ]

::=

SELECT [ ALL | DISTINCT ]

[ {TOP integer | TOP integer PERCENT} [ WITH TIES] ]

[ INTO new_table ]

[ FROM {} [,...n] ]

[ WHERE ]

[ GROUP BY [ALL] group_by_expression [,...n]

[ WITH { CUBE | ROLLUP } ] ]

[ HAVING ]

由于SELECT 语句特别复杂,上述结构还不能完全说明其用法,因此我们将它拆分为若干部分来讲述。

10.1.1 SELECT 子句

SELECT 子句指定需要通过查询返回的表的列,其语法如下:

SELECT [ ALL | DISTINCT ]

[ TOP n [PERCENT] [ WITH TIES] ]

::=

{ *

| { table_name | view_name | table_alias }.*

| { column_name | expression | IDENTITYCOL | ROWGUIDCOL }

[ [AS] column_alias ]

| column_alias = expression

} [,...n]

各参数说明如下:

ALL

指明查询结果中可以显示值相同的列。ALL 是系统默认的。

DISTINCT

指明查询结果中如果有值相同的列,则只显示其中的一列。对DISTINCT 选项来说, Null 值被认为是相同的值。

TOP n [PERCENT]

指定返回查询结果的前n 行数据。如果PERCENT 关键字指定的话,则返回查询结果的前百分之n 行数据。

WITH TIES

此选项只能在使用了ORDER BY 子句后才能使用当指定此项时,除了返回由TOP n (PERCENT) 指定的数据行外,还要返回与TOP n (PERCENT) 返回的最后一行记录中由ORDER BY 子句指定的列的列值相同的数据行。

select_list

select_list 是所要查询的表的列的集合,多个列之间用逗号分开。

* 通配符,返回所有对象的所有列。

table_name | view_name | table_alias.*

限制通配符*的作用范围。凡是带*的项,均返回其中所有的列。

column_name

指定返回的列名

expression

表达式可以为列名、常量、函数或它们的组合。

IDENTITYCOL

返回IDENTITY 列。如果FROM 子句中有多个表含有IDENTITY 列,则在IDENTTYCOL 选项前必须加上表名,如Table1.IDENTITYCOL。

ROWGUIDCOL

返回表的ROWGUIDCOL 列。同IDENTITYCOL 选项相同,当要指定多个ROWGUIDCOL 列时,选项前必须加上表名,如Table1. ROWGUIDCOL。

column_alias

在返回的查询结果中用此别名替代列的原名。column_alias 可用于ORDER BY 子句,但不能用于WHERE GROUP BY 或HAVING 子句如果查询是游标声明命令DECLARE CURSOR 的一部分,则column_alias 还不能用于FOR UPDATE 子句(有关游标的介绍请参见“游标和视图”章节)。

10.1.2 INTO 子句

INTO 子句用于把查询结果存放到一个新建的表中。SELECT...INTO 句式不能与COMPUTE 子句一起使用。其语法如下:

INTO new_table

参数new_table 指定了新建的表的名称。新表的列由SELECT 子句中指定的列构成,新表中的数据行是由WHERE 子句指定的。但如果SELECT 子句中指定了计算列,在新表中对应的列则不是计算列,而是一个实际存储在表中的列,其中的数据由执行SELECT...INTO 语句时计算得出。如果数据库的“Select into/bulk copy” 选项设置为“True/On”,则可以用INTO 子句创建表和临时表,反之,则只能创建临时表。

10.1.3 FROM 子句

FROM 子句指定需要进行数据查询的表。只要SELECT 子句中有要查询的列,就必须使用FROM 子句。其语法如下:

FROM {} [,...n]

::=

table_name [ [AS] table_alias ] [ WITH ( [,...n]) ]

| view_name [ [AS] table_alias ]

| rowset_function [ [AS] table_alias ]

| OPENXML

| derived_table [AS] table_alias [ (column_alias [,...n] ) ]

|

::=

ON

| CROSS JOIN

|

::=

[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]

[ ]

JOIN

各参数说明如下:

table_source

指明SELECT 语句要用到的表、视图等数据源。

table_name [ [AS] table_alias ]

指明表名和表的别名。

view_name [ [AS] table_alias ]

指明视图名称和视图的别名。

rowset_function [ [AS] table_alias ]

指明行统计函数和统计列的名称。

OPENXML

提供一个XML 文档的行集合视图。

WITH ([,...n])

指定一个或多个表提示。通常SQL Server 的查询优化器会自动选取最优执行计划,除非是特别有经验的用户,否则最好不用此选项。关于表提示table_hint 的设,定请参见下一章的“删除数据”部分。

derived_table [AS] table_alias

指定一个子查询,从数据库中返回数据行。

column_alias

指明列的别名,用以替换查询结果中的列名。

joined_table

指定由连接查询生成的查询结果。有关连接与连接查询的介绍参见本章的相关章节。

join_type

指定连接查询操作的类型。

INNER

指定返回两个表中所有匹配的行。如果没有join_type 选项,此选项就为系统默认。

LEFT [OUTER]

返回连接查询左边的表中所有的相应记录,而右表中对应于左表无记录的部分,用NULL 值表示。

RIGHT [OUTER]

返回连接查询右边的表中所有的相应记录,而左表中对应于右表无记录的部分,用NULL 值表示。

FULL [OUTER]

返回连接的两个表中的所有记录。无对应记录的部分用NULL 值表示。

join_hint

指定一个连接提示或运算法则。如果指定了此选项,则INNER LEFT RIGHT 或FULL选项必须明确指定。通常SQL Server 的查询优化器会自动选取最优执行计划,除非是特别有经验的用户,否则最好不用此选项。

join_hint 的语法如下:

::= { LOOP | HASH | MERGE | REMOTE }

其中LOOP | HASH | MERGE 选项指定查询优化器中的连接是循环、散列或合并的。REMOTE 选项指定连接操作由右边的表完成。当左表的数据行少于右表,才能使用REMOTE 选项。当左表和右表都是本地表时,此选项不必使用。

JOIN

指明特定的表或视图将要被连接。

ON

指定连接的条件。

CROSS JOIN

返回两个表交叉查询的结果。10.1.4 WHERE 子句

WHERE 子句指定数据检索的条件,以限制返回的数据行。其语法如下:

WHERE |

::=

column_name { *= | =* } column_name

各参数说明如下:

search_condition

通过由谓词构成的条件来限制返回的查询结果,

old_outer_join

指定一个外连接。此选项是不标准的,但使用方便。它用“*=” 操作符表示左连接,用“=*” 操作符表示右连接。此选项与在FROM 子句中指定外连接都是可行的方法,但二者只能择其一。

注意:如果在WHERE子句中指定一个值为FALSE的条件,则可以用SELECT...INTO语句来创建一个表名不同,但结构和数据类型均和原表相同的表。

10.1.5 GROUP BY 子句

GROUP BY 子句指定查询结果的分组条件。其语法如下;

GROUP BY [ALL] group_by_expression [,...n]

[ WITH { CUBE | ROLLUP } ]

各参数说明如下:

ALL

返回所有可能的查询结果组合,即使此组合中没有任何满足WHERE 子句的数据。分组的统计列如果不满足查询条件,则将由NULL 值构成其数据。ALL 选项不能与CUBE或ROLLUP 选项同时使用。

GROUP BY ALL is not supported in queries that access remote tables.

group_by_expression

指明分组条件。group_by_expression 通常是一个列名,但不能是列的别名。数据类型为TEXT、 NTEXT、 IMAGE 或BIT 类型的列不能作为分组条件。

CUBE

除了返回由GROUP BY 子句指定的列外,还返回按组统计的行。返回的结果先按分组的第一个条件列排序显示,再按第二个条件列排序显示以此类推。统计行包括了GROUPBY 子句指定的列的各种组合的数据统计。

ROLLUP

与CUBE 不同的是,此选项对GROUP BY 子句中的列顺序敏感,它只返回第一个分组条件指定的列的统计行。改变列的顺序会使返回的结果的行数发生变化。

使用Distinct选项的统计函数,如AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、和SUM(DISTINCT column_name)等,不能在使用CUBE或ROLLUP选项时使用。

10.1.6 HAVING 子句

HAVING 子句指定分组搜索条件。HAVING 子句通常与GROUP BY 子句一起使用。TEXT、 NTEXT 和IMAGE 数据类型不能用于HAVING 子句。其语法如下:

HAVING

HAVING 子句与WHERE 子句很相似,其区别在于其作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组。

10.1.7 UNION 操作符

UNION 操作符将两个或两个以上的查询结果合并为一个结果集。它与使用连接查询合并两个表的列是不同的。使用UNION 操作符合并查询结果需要遵循两个基本规则:

列的数目和顺序在所有查询中必须是一致的;

数据类型必须兼容。

其语法如下:

| ()

UNION [ALL]

)

[UNION [ALL] ) [...n] ]

各参数说明如下:

| ()

指明查询的详细说明或查询表达式。

UNION

合并操作符。

ALL

合并所有数据行到结果中,包括值重复的数据行。如果不指定此选项,则重复的数据行只显示一行。

10.1.8 ORDER BY 子句

ORDER BY 子句指定查询结果的排序方式。其语法如下:

ORDER BY {order_by_expression [ ASC | DESC ] } [,...n]

各参数说明如下:

order_by_expression

指定排序的规则。order_by_expression 可以是表或视图的列的名称或别名。如果SELECT 语句中没有使用DISTINCT 选项或UNION 操作符。那么ORDER BY 子句中可以包含select list 中没有出现的列名。或别名ORDER BY 子句中也不能使用TEXT、 NTEXT 和 IMAGE 数据类型。

ASC

指明查询结果按升序排列。这是系统默认值。

DESC

指明查询结果按降序排列。

注意:Null值被作为最小的值。

10.1.9 COMPUTE 子句

COMPUTE 子句在查询结果的末尾生成一个汇总数据行。其语法如下:

COMPUTE

{ { AVG | COUNT | MAX | MIN | STDEV | STDEVP |VAR | VARP | SUM }

(expression) } [,...n]

[ BY expression [,...n] ]

各参数说明如下:

AVG | COUNT | MAX | MIN | STDEV | STDEVP | VAR | VARP | SUM以上参数与对应的函数有相同的含义。这些函数均会忽略NULL 值,且DISTINCT选项不能在此使用。

expression

指定需要统计的列的名称。此列必须包含于SELECT 列表中,且不能用别名。COMPUTE子句中也不能使用TEXT、 NTEXT 和IMAGE 数据类型。

BY expression

在查询结果中生成分类统计的行。如果使用此选,项则必须同时使用ORDER BY 子句。expression 是对应的ORDER BY 子句中的order_by_expression 的子集或全集。

注意:在SELECT子句中使用统计函数,会覆盖COMPUTE子句中的相应选项。在SELECTINTO语句中不能使用COMPUTE子句。

10.1.10 FOR BROWSE 子句

FOR BROWSE 子句用于读取另外的用户正在进行添加、删除或更新记录的表。其语法如下:

FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }

[ , XMLDATA ]

[ , ELEMENTS ]

[ , BINARY base64 ]

}

各参数说明如下:

BROWSE

BROWSE 选项指明当查看在使用DB-Library 的客户机应用程序中的数据时,可以更新数据。

使用此子句时对所操作的表有一些限制:

表必须包含一个timestamp 类型的时间标识列;

表必须有一个惟一索引。

注意:

在SELECT语句中:FOR BROWSE子句必须是SELECT语句的最后子句;FOR BROWSE子句不能与UNION操作符同时使用;FOR BROWSE子句不能与表提示HOLDLOCK选项同时使用。

XML

XML 选项指明查询结果以XML 文档模式返回XML。 模式分为RAW、 AUTO、 EXPLICIT 三种。

RAW

将查询结果每一行转换为以一个普通标识符作为元素标识XML 文档。

AUTO

以简单嵌套的XML 树方式返回查询结果。

EXPLICIT

指定查询结果的XML 树的形式被明确定义的。

XMLDATA

返回概要信息。它是附加在文档上返回的。

ELEMENTS

指明列将以子元素的方式返回。

BINARY base 64

指定查询返回的以base64 格式编码的二进制数据。

10.1.11 OPTION 子句

OPTION 子句用于指定在整个查询过程中的查询提示(Query Hint)。通常,用户不必使用OPTION 子句,因为查询优化器会自动选择一个最佳的查询计划。OPTION 子句必须由最外层的主查询来指定。各查询提示之间应使用逗号隔开。其语法如下:

OPTION ( [,...n] )

::=

{ { HASH | ORDER } GROUP

| { CONCAT | HASH | MERGE } UNION

| { LOOP | MERGE | HASH } JOIN

| FAST number_rows

| FORCE ORDER

| MAXDOP number

| ROBUST PLAN

| KEEP PLAN

| KEEPFIXED PLAN

| EXPAND VIEWS

}

各参数说明如下:

{HASH | ORDER} GROUP

指定在GROUP BY 或COMPUTE 子句中指定的查询使用散列法或排序法。所谓散列法是指为存储和检索数据项或数据,把搜索关键字转换为一个地址的一种方法。该方法常作为数据集内的记录的一种算法,可以使记录分组均匀,减少搜索时间。

{MERGE | HASH | CONCAT} UNION

指定所有的UNION 操作符采用合并(Merge)、散列(Hash) 或连接(Concatenate)的方法执行操作。如果指定了多个UNION 提示,查询优化器会挑选一个最佳的提示方案。

{LOOP | MERGE | HASH |} JOIN

指定查询过程中的所有连接操作采取循环连接(Loop Join)、合并连接(Merge Join)或散列连接(Hash Join) 的方法。如果指定了多个JOIN 提示,查询优化器会挑选一个最佳的提示方案。

FAST number_rows

指定查询优化只用于迅速返回前number_rows 行数据,在number_rows 行以后的数据采用原查询方法。

FORCE ORDER

指定在查询语法中说明的连接顺序在查询优化的过程中保持不变。

MAXDOP number

忽略由Sp_configure 设定的针对查询的最大并行线程数目。

ROBUST PLAN

强制查询优化器尝试使用最大行容量的计划。

KEEP PLAN

强制查询优化器放松重新编译查询的阈值。指定此选项可以让一个表被多次更新而不必频繁地重新编译查询。

KEEPFIXED PLAN

强制查询优化器不重新编译查询。这样只有当表的概要改变或执行Sp_recompile 存储过程时,才会重新编译查询。

EXPAND VIEWS

扩展索引化视图(当一个视图的名称在查询文本中被视图定义替换时称这个视图被扩展了),并且查询优化器不再将索引化视图作为查询的某部分的替代品。如果视图使用了WITH (NOEXPAND) 说明,则不能被扩展。注意:SELECT语句中各子句的排列次序是很重要的,子句必须依相应的次序来使用。

当用SELECT命令读取TEXT和IMAGE类型数据时,一次所能读取的数据受限于@@TE-XTSIZE全局变量的值。

可以用SET TEXTSIZE命令来更改它。@@TEXTSIZE的初始值为4K,最大为231-1(2,147,483,647)个字节。

上一篇:车辆安全管理责任书下一篇:沙丘城下寄杜甫