关于sql语句查询--top关键字
Top关键字:
1、⾸先引⽤⼀位⽹友出错的例⼦,sql="select top 30 * from data where title='"&title1&"' order by id desc"
sql语句查询结果取反分析出错原因:sql语句⾥同时存在where和top语句的时候,并且where条件列不是合适的索引,程序执⾏的是全表扫描,⾸先是查符合where条件的记录,⽽这⾥的top限制形同虚设。如果全表是百万级别以上的数据表,那么就这么⼀个简单的判断,就有可能拖垮数据库。
2、解决办法就是去掉where条件筛选语句,如果你希望使⽤selcet top语句,并且还要附带where条件,那么条件中的列就得是合适的索引,如聚集索引、复合索引⾥的主列等,同时,where条件⾥也要尽量避开使⽤函数,or,判断NULL等会引起全部扫描的语句。这⼀点要记住,不然执⾏的是全表扫描。
3、如何选出第N条到第2N条记录呢。这样的sql语句就可以了:
“select top n * from TABLE_NAME where id not in (select top n id from TABLE_NAME order by id desc)"
4、对Top基本理解下(TOP 和 SET ROWCOUNT)
SELECT 语句中的TOP⼦句限制单个查询返回的⾏数,⽽SET ROWCOUNT限制所有后续查询影响的⾏数。在很多编程任务中这些命令提供了⾼效率。
SET ROWCOUNT在SELECT,INSERT,UPDATE OR DELETE语句中设置可以被影响的最⼤⾏数。这些设置在命令执⾏时马上⽣效并且只影响当前的会话。为了移除这个限制执⾏SET ROWCOUNT 0。⼀些实际的任务⽤TOP or SET ROWCOUNT⽐⽤标准的SQL命令对编程是更有效率的。让我们在⼏个例⼦中证明:
在⼏乎所有的数据库中最流⾏的⼀个查询是请求⼀个列表中的前N项。在 pubs数据库案例中,我们可以查销售最好CD的前五项。⽐较⽤TOP,SET ROWCOUNT和使⽤ANSI SQL的三种⽅案。
(1)Select title,ytd_salesFrom titlesa Where (select count(*)From titlesb d_sales&d_sales)<5 Order by ytd_sales DESC
这个纯ANSI SQL⽅案执⾏⼀个效率可能很低的关联⼦查询,特别的在这个例⼦中,在ytd_sales上没有索引⽀持。另外,这个纯的标准SQL命令没有过滤掉在ytd_sales的空值,也没有区别多个CD间有关联的情况。
(2)SET ROWCOUNT 5 SELECT title, ytd_salesFROM titlesORDER BY ytd_sales DESCSET ROWCOUNT 0
(3)SELECT TOP 5 title, ytd_salesFROM titlesORDER BY ytd_sales DESC
第⼆个⽅案使⽤SET ROWCOUNT来停⽌SELECT查询,⽽第三个⽅案是当它到前五⾏时⽤TOP n来停⽌。在这种情况下,在获得结果之前我们也要有⼀个ORDER BY⼦句强制对整个表进⾏排序。两个查询的查询计划实际上是⼀样的。然⽽,TOP优于SET ROWCOUNT的关键点是SET必须处理ORDER BY⼦句所需的⼯作表,⽽TOP 不⽤。
总结:在⼀个⼤表上,我们可以为表上创建⼀个索引以避免排序,查询将使⽤该索引到前5⾏并停⽌。
ROWNUM伪列:
1、使⽤SELECT语句返回的结果集,希望按特定条件查询前N条记录,可以使⽤伪列ROWNUM。ROWNUM是对结果集加⼀个伪列,先查到结果集后再加上⼀个列,是符合条件结果的序列号;从1开始排起,只能⽤< > = !=这些⽐较符合。
ROWNUM对于等于某值的查询条件,⽐如查询第⼀条记录,可以使⽤ROWNUM=1作为条件;但是如果查询第⼆条记录写ROWNUM=2则查询不到数据,ROWNUM的=判断只对于1有效;
2、同理,查询⼤于某值的查询条件,ROWNUM>n(n>1的⾃然数)这种条件不成⽴;那如何查询第⼀
⾏以后的记录呢?
solution:⽤⼦查询解决,但是必须为rownum设置别名,"select * from (select rownum no ,id,name from table1) where no >1";
3、ROWNUM对于⼩于某值的查询是可以的,select * from table1 where rownum<3
4、ROWNUM和排序
Oracle中rownum是在取数据时产⽣的序号,想对指定排序的数据指定rownum⾏数据就要做处理了:
"select rownum,id,name from table1 order by name",查询结果按name排序,但是rownum不是按1、2、3...排列,⽽是按记录插⼊时的顺序给记录排号;
solution:使⽤⼦查询,select rownum ,id,name from(select * from table1 order by name)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论