關於sql語句查詢 top關鍵字

2021-07-14 09:32:11 字數 2470 閱讀 2243

top關鍵字:

1、首先引用一位網友出錯的例子,sql="select top 30 * from data where title='"&title1&"' order by id desc"

分析出錯原因: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  where b.ytd_sales>a.ytd_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 (selectrownum 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)

關鍵字查詢

題目描述 每次給你一篇文章,和一些關鍵字,需要你告訴我多少關鍵字將匹配於文章。輸入描述 第一行包含乙個整數,表示有多少篇文章。最後一行是文章,長度不超過1000000。輸出描述 輸出文章中包含多少關鍵字。輸入樣例 15 shehe sayshr heryasherhs 輸出樣例 3源 include...

SQL 常用關鍵字

create database 建立資料庫 create database my db 建立表 create table user id int 11 not null auto increment,name varchar 50 default null,password varchar 50 d...

使用 EXPLAIN 關鍵字 檢查SQL語句效率

explain詳細說明 通過explain可以知道mysql是如何處理語句,分析出查詢或是表結構的效能瓶頸。通過expalin可以得到 1.表的讀取順序 2.表的讀取操作的操作型別 3.哪些索引可以使用 4.哪些索引被實際使用 5.表之間的引用 6.每張表有多少行被優化器查詢 通過explain s...