如何控制SQL查询返回的行数!(100分)

  • 主题发起人 主题发起人 zhangly
  • 开始时间 开始时间
Z

zhangly

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾 请教一个问题
我的TQUERY 中设置的是SELECT * FROM 表名 where sts='S'
显示在DBGRID中
但是我想提高查询速度
只需要返回20条记录(全部查询有几千条符合条件)
后台数据库是sybase
请教如何解决!
谢谢!
 
SELECT top 20 * FROM 表名 where sts='S'
 
以上的仁兄答对了!
 
top实际上仍然会取得所有的数据
把头20条返回
因此节约的时间是数据传输和显示的时间
数据库服务器的开销照旧
所以最好有一个字段来做分段查询
 
通过rownum控制,where rownum <10;
 
谢谢各位大虾指教
但是TOP 10我今天下午在办公室好象已经试过了
在SQL SERVER数据库中有用
在SYBASE中不可以
对于沉香屑说的还没试过
我想等星期一上班把两个办法都试一下
分数一定送给解决问题以及热心的兄弟们
再次表示感谢!
 
请教fff2001 rownum的具体用法!谢谢!
我直接在SQL语句中使用好象不行呀!
 
在ORACLE的sqlplus中可以用where {...} and rownum=20来只选20行,不知道对你有用没有.
 
top好象只在sql server中有用在access都不行的!
 
Access 完全支持 Top!!!!!!!!

SELECT 语句
命令 Microsoft Jet数据库引擎从数据库里返回信息,作为一组记录。

语法
SELECT [predicate] { * | table.* | [table.]field1 [AS alias1] [, [table.]field2 [AS alias2] [, ...]]}
FROM tableexpression [, ...][IN外部数据库]
[WHERE...]
]
[GROUP BY...]
]
[HAVING...]
]
[ORDER BY...]
]
[WITH OWNERACCESS OPTION]

SELECT 语句具有以下几个部分:

部分 说明
predicate 下列谓词之一:ALL, DISTINCT, DISTINCTROW, 或 TOP.您可用谓词来限制返回的记录数量。如果没有指定谓词,则默认值为 ALL。
* 从特定的表中指定全部字段。
table 表的名称,此表中包含已被选择的记录的字段。
field1, field2 字段的名称,该字段包含了您要获取的数据。如果数据包含多个字段,则按列举顺序依次获取它们。
alias1, alias2 名称,用来作列标头,以代替 table.中原有的列名。
tableexpression 表的名称,这些表包含要获取的数据。
Externaldatabase 数据库的名称,该数据库包含 tableexpression 中的表,如果这些表不在当前数据库中的话。



ALL、DISTINCT、DISTINCTROW、TOP 谓词
标明用 SQL查询选取的记录。

语法
SELECT [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]]
FROM table
FROM 表

包含这些谓词的 SELECT 语句 有以下部分:

部分 说明
ALL 如果不包含任何一个谓词,则取此值。Microsoft Jet数据库引擎选取所有满足 SQL 语句的所有记录。下列两示例是等价的,并且都返回雇员表的所有记录:
SELECT ALL *
FROM Employees
ORDER BY EmployeeID;

SELECT *
FROM Employees
ORDER BY EmployeeID;

DISTINCT 省略选择字段中包含重复数据的记录。为了让查询结果包含它们,必须使 SELECT 语句中列举的每个字段值是唯一的。例如,雇员表可能有一些同姓的雇员。如果有两个记录的姓氏字段皆包含 Smith,则下列 SQL 语句只返回包含 Smith 的记录:
SELECT DISTINCT
LastName
FROM Employees;

如果省略 DISTINCT,则查询将返回两个包含 Smith 的记录。

如果 SELECT 子句包含多个字段,则对已给记录,所有字段值的组合必须是唯一的,而且结果中将包含这一组合。

如果查询使用 DISTINCT,则不能更新其输出,而且该输出也不会反映其它用户所作的一系列更改。

DISTINCTROW 省略基于整个重复记录的数据,而不只是基于重复字段的数据。例如,可在客户ID字段上创建一个联结客户表及订单表的查询。客户表并未复制一份 CustomerID 字段,但是订单表必须如此做,因为每一客户能有许多订单。下列 SQL 语句显示如何使用 DISTINCTROW 生成公司的列表,且该列表至少包含一个订单,但不包含有关那些订单的任何详细数据:
SELECT DISTINCTROW CompanyName
FROM Customers INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
ORDER BY CompanyName;

如果省略 DISTINCTROW,则查询将对每一公司生成多重行,且该公司包含多个订单。

仅当从查询中的一部分表但不是全部表中选择字段时,DISTINCTROW 才会有效。如果查询只包含一个表,或者从所有的表中输出字段,则可省略DISTINCTROW。

TOP n [PERCENT] 返回特定数目的记录,且这些记录将落在由 ORDER BY 子句指定的前面或后面的范围中。假设您想要 1994 年班级里的前 25 个学生名字:
SELECT TOP 25
FirstName, LastName
FROM Students
WHERE GraduationYear = 1994
ORDER BY GradePointAverage DESC;

如果您没有包含 ORDER BY 子句,则查询将由学生表返回 25 个记录的任意集合,且该表满足 WHERE 子句。

TOP 谓词不在相同值间作选择。在前一示例中,如果第 25 及第 26 的最高平均分数相同,则查询将返回 26 个记录。

也可用 PERCENT 保留字返回特定记录的百分比,且这些记录将落在由 ORDER BY 子句指定的前面或后面范围中。假设用班级后面 10% 的学生代替前 25 个学生,:

SELECT TOP 10 PERCENT
FirstName, LastName
FROM Students
WHERE GraduationYear = 1994
ORDER BY GradePointAverage ASC;

ASC 谓词指定返回后面的值。遵循 TOP的值一定是无符号 Integer.

查询是否可更新,这不会受到 TOP 的影响。

table 从其中获取记录的表的名称。
 
rownum只能在oracle中使用
 
听我一个朋友说哪儿看到在sybase中只选择一定条数的SQL语句
但是他忘记了具体怎么实现的了
请大家帮我想想办法!
谢谢!
 
sybase不支持top,如想返回指定数目的记录,我常用的就是用where来控制一下。
 
在sql中可以使用[red]SET ROWCOUNT 数量 [/red]来限定sql要算是的行数,当数据行超过设置的
数量时就不再处理
 
感谢windbell提供标准答案
再次表示感谢
提取一定记录我发现换用ADO也能实现
请教大家ADO和一般的QUERY有什么不同!
 
多人接受答案了。
 
后退
顶部