熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

跟我學SQL:SELECT語句選項

2022-06-13   來源: SQL Server 

  用ORDER BY對查詢結果排序
  ORDER BY子句讓數據庫對查詢結果排序這樣你就無須自己編寫應用程序進行手工排序了ORDER BY子句必須放在查詢語句的結尾其基本用法如下
  
  SELECT * FROM Contacts ORDER BY first_name;
  
  你可以隨意在任何選擇語句中使用ORDER BY 子句返回多列結果你還可以用它連接其他子句
  SELECT first_name last_name FROM Contacts WHERE first_name BETWEEN a AND k ORDER BY last_name;
  
  你可以對多列數據排序優先順序按從左到右依次降低所以查詢語句中各列的排列順序很重要
  SELECT * FROM Contacts ORDER BY company last_name first_name;
  
  查詢結果默認按數字或者字母的升序排序你可以在ORDER BY 子句後面加上DESC關鍵詞改成降序排列在下面的例子中最高的net_amount排在最先(降序)假如兩行或者兩行以上數據都包含了同樣的net_amount值那麼同行中last_name值在字母表中最先出現的排先因為last_name一列還是按照升序排序的
  SELECT * FROM Sales ORDER BY net_amount DESC last_name first_name;
  
  在按照定義的列名排序以後大多數數據庫隨後將按照數據表內的第一列排序然後順序向右再排序具體的實現各有變化因此如果排序在應用中比較重要那麼你應該明確地定義所要排序的列
  
  另外一值得注意的問題是采用ORDER BY子句(以及WHERE子句)你正在用來排序結果的數據列並不一定得是返回結果集合的一部分只要所有引用的列都在數據表內存在則下例完全有效
  
  SELECT company first_name net_amount FROM Sales ORDER BY start_date last_name;
  
  DISTINCT返回不重復結果
  
  DISTINCT關鍵詞只返回結果集合內不重復的數據行例如有時你可能需要找出Sales表內的公司但是你又不想看見每個條目於是你可以用DISTINCT對應每一公司名返回一行數據
  
  SELECT DISTINCT company FROM Sales;
  
  在使用DISTINCT時它適用於所有的請求列如果你打算列出表內的所有銷售人員和他們所代表的公司而非每一銷售記錄那麼你可以使用下列語句注意這樣操作還可能返回同一公司的若干條目等等
  
  SELECT DISTINCT company last_name first_name FROM Sales;
  
  你還可以在對結果縮小范圍和進行排序時結合SELECT語句使用DISTINCT為了確定顯示的內容數據庫首先會證實精練的請求是否匹配數據行然後應用DISTINCT功能在全部結果集合都得以確定之後即處理ORDER BY子句如下例所示只有net_amount大於的數據行才被返回由於DISTINCT保留遇見的第個匹配查詢條件的數據行而丟棄其他匹配行所以ORDER BY語句所引用的net_amount看起來就好象產生了隨機的結果
  
  SELECT DISTINCT company last_name first_name FROM Sales WHERE net_amount > ORDER BY company net_amount;
  
  
  函數應用邏輯
  返回單一值的函數稱做聚集函數(aggregate function)通過應用程序訪問下列聚集函數的結果時包含結果的字段名就是你所使用的實際函數例如在分析你的數據庫結果時結果數組的鍵值可能如下所示
  
  $keyname = COUNT(*);
  $resultkey = AVG(net_amount);
  
  COUNT
  COUNT函數計算出結果集合中的數據行數和其他函數一樣它接受一個參數以下的基本示例能告訴你數據表內的行數SELECT COUNT(*) FROM Sales;
  
  你也可以用它來計算任何結果集合中的行數
  
  SELECT COUNT(*) FROM Sales WHERE net_amount > ;
  
  如果你想看看某特定列有多少行包含非空值那你不妨對該列使用COUNT函數注意除非數據庫設置為字段為空時缺省填充NULL否則將返回表內數據行的總數另外列出的列在超出一個的情況下會引起錯誤
  
  SELECT COUNT(company) FROM Sales;
  
  COUNT還可以用來計算DISTINCT結果集合中的行數
  SELECT COUNT(DISTINCT company last_name) FROM Sales;
  
  COUNT語句通常用在程序中確定FOR循環的循環次數
  
  
  AVG
  AVG返回某列所有字段的平均值該列必須是數字數據類型該函數用列的名字作為其參數如果列字段數據類型是非數字類型的則函數返回SELECT AVG(net_amount) FROM Sales;
  
  你可以結合子句限制該函數的應用范圍
  
  SELECT AVG(net_amount) FROM Sales WHERE company LIKE %ABCD Co%;
  
  就象所有聚集函數一樣ORDER BY語句將被忽略
  
  SUM
  
  SUM的工作方式和AVG差不多只不過該函數返回結果集合中所有字段值的和
  SELECT SUM(net_amount) FROM Sales WHERE net_amount > ;
  
  AVGSUMMIN和MAX函數在沒有指定列的情況下都會返回錯誤所以你不能使用*通配符
  
  MIN
  MIN返回指定列中最小的非空值如果指定列是數字數據類型則結果將是最小的數字如果它是一種字符串數據類型則函數將返回按字母表順序出現的第個值SELECT MIN(net_amount) FROM Sales WHERE last_name = Smith;
  SELECT MIN(last_name) FROM Sales;
  
  
  MAX
  
  MAX的工作方式和MIN函數一樣只不過該函數返回最大的非空值該函數也可以用於字符串或者數字列
  SELECT MAX(net_amount) FROM Sales;
  SELECT MAX(company) FROM Sales WHERE net_amount > ;
  
  MAX函數有時還用在包含自動遞增鍵字段的列上確定下一條目的鍵ID除非你正在運行一個非公開的數據庫否則在使用這一信息插入下一條目時務必謹慎以防其他用戶先你執行數據操作
  GROUP BY 令函數更有用
  雖然以上提到的所有這些函數都能提供相當有用的信息但是如果有GROUP BY子句幫忙的話更能讓你在列的字段子集中應用這些函數不要對你的Sales表中每一家公司一次又一次地執行MAX函數查詢——你完全可以帶GROUP BY子句獲得同樣的結果
  
  SELECT company MAX(net_amount) FROM Sales GROUP BY company;
  
  這樣做可以獲得每家公司net_amount的的最大值在選擇多列名的時候也可以采用該語句你還可以用多列來對函數結果分組
  
  下面的例子演示了以上各種方式首先包括GROUP BY子句可以令你指定要顯示的其他列然而你得知道這個例子將返回在組中遇到的第個last_name值Sum( net_amount )將顯示全部公司的結果而不僅僅針對匹配姓氏的數據行這是因為我們只使用了Company字段來定義我們的組
  
  SELECT company last_name SUM(net_amount) FROM Sales GROUP BY company;
  
  在上面的例子中last_name列實際上並沒有提供什麼有用的信息但這樣做是為了在下一個例子中要用到的功能做准備你可以創建多列定義的組這樣就可以在結果集合中產生針對特定行的函數結果而結果集合則是由所有指定的GROUP BY列聯合起來創建的
  
  SELECT company AVG(net_amount) last_name FROM Sales GROUP BY company last_name;
  
  
  上面的例子給每家公司中每一姓氏給出了平均的net_amount你列出GROUP BY列的順序控制著結果的排序但是實際的函數值結果是一樣的
  
  
  下面的例子表明如何組織結果而不顯示分組的列在有些場合這樣做是很有用的例如如果要顯示個人的銷售量但卻不顯示姓名就能用上下面的例子了
  
  SELECT company COUNT(sale_id) FROM Sales GROUP BY company last_name;
  
  
  限制使用GROUP BY的查詢
  如你在以上示例中所看到的那樣你可以結合WHERE字句利用以上的概念限制查詢的范圍WHERE子句會首先被計算然後執行函數在使用組的時候就是這樣的
  
  SELECT company AVG(net_amount) FROM Sales WHERE net_amount > GROUP BY company;
  
  上面的例子只對那些滿足WHERE限制條件的數據行適用AVG函數注意WHERE子句必須放在GROUP BY子句之前你還可以用HAVING語句對分組計算之後限制返回的結果集合
  
  SELECT company AVG(net_amount) FROM Sales WHERE last_name BETWEEN a AND m GROUP BY company HAVING AVG(net_amount) > ;
  
  
  上面的語句計算每家公司net_amount的平均值而且只計算那些姓氏滿足限制條件的銷售人員的銷售量同時只顯示大於的結果

From:http://tw.wingwit.com/Article/program/SQLServer/201311/21992.html
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.