程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 跟我學MS SQL Server -2

跟我學MS SQL Server -2

編輯:關於SqlServer


  (二) SELECT語句選項

  跟我學SQL分為三部分,其中涵蓋了有關SQL標准的基本知識。在上一篇文章裡我們討論了一些數據庫術語和4種最基本的數據查詢類型。此外,我們還解釋了WHERE子句和條件語句的用法,同時我們提供了各類查詢的具體示例。

  在這篇文章裡,我們將就其他一些SQL函數和子句進行闡述,供你用於基本的SELECT數據查詢中。
 
  SELECT選項精制結果

  正如我們從上一篇文章中所讀到的那樣,SELECT語句具有種類繁多的各類選項,這些選項可以用來控制數據返回的方式。這些選項以子句、關鍵詞和函數的形式存在。

  子句是一種修改結果的語句。子句不是必要的語句但它對數據的內容及其顯示進行了提煉。WHERE子句就是這樣的子句。

  關鍵詞觸發數據庫的內在功能。這些關鍵詞在有時甚至是查詢所必需的。例如“INSERT INTO table_name (column1) VALUES (‘data1’);”語句中的INTO和VALUE就是如此。我們將了解DISTINCT關鍵詞,它能觸發一些非常有用的可選功能。

  下面總結了一些最常用的子句、關鍵詞和函數。然後我會對每一部分舉例說明。

ORDER BY – 按照指定列排序返回結果的子句

DISTINCT – 只返回結果集合內唯一行的關鍵詞
COUNT -- 返回匹配查詢的數據行總數數值的函數
AVG – 該函數返回指定列的平均值
SUM –該函數把指定的列中的數字加起來
MIN – 該函數返回列中最小的非NULL值
MAX –該函數返回列中的最大值
GROUP BY – 按列匯集查詢函數結果的子句

  用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大於100的數據行才被返回。由於DISTINCT保留遇見的第1個匹配查詢條件的數據行而丟棄其他匹配行,所以ORDER BY語句所引用的net_amount看起來就好象產生了隨機的結果。

SELECT DISTINCT company, last_name, first_name FROM Sales WHERE net_amount > 100 ORDER BY company, net_amount;

  函數應用邏輯

  返回單一值的函數稱做聚集函數(aggregate function)。通過應用程序訪問下列聚集函數的結果時,包含結果的“字段名”就是你所使用的實際函數。例如,在分析你的數據庫結果時,結果數組的鍵值可能如下所示:

= “COUNT(*)”;
= “AVG(net_amount)”;

  COUNT

  COUNT函數計算出結果集合中的數據行數。和其他函數一樣它接受一個參數。以下的基本示例能告訴你數據表內的行數:SELECT COUNT(*) FROM Sales;

  你也可以用它來計算任何結果集合中的行數。

SELECT COUNT(*) FROM Sales WHERE net_amount > 100;

  如果你想看看某特定列有多少行包含非空值,那你不妨對該列使用COUNT函數。注意,除非數據庫設置為字段為空時缺省填充NULL否則將返回表內數據行的總數。另外,列出的列在超出一個的情況下會引起錯誤。

SELECT COUNT(company) FROM Sales;

  COUNT還可以用來計算DISTINCT結果集合中的行數。

SELECT COUNT(DISTINCT company, last_name) FROM Sales;

  COUNT語句通常用在程序中確定FOR循環的循環次數。



  AVG

  AVG返回某列所有字段的平均值,該列必須是數字數據類型。該函數用列的名字作為其參數,如果列字段數據類型是非數字類型的則函數返回“0”。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 > 100;

  AVG、SUM、MIN和MAX函數在沒有指定列的情況下都會返回錯誤,所以你不能使用“*”通配符。

  MIN

  MIN返回指定列中最小的非空值。如果指定列是數字數據類型則結果將是最小的數字。如果它是一種字符串數據類型則函數將返回按字母表順序出現的第1個值。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 > 100;

  MAX函數有時還用在包含自動遞增鍵字段的列上確定下一條目的鍵ID。除非你正在運行一個非公開的數據庫,否則在使用這一信息插入下一條目時務必謹慎,以防其他用戶先你執行數據操作。

  GROUP BY 令函數更有用

  雖然以上提到的所有這些函數都能提供相當有用的信息,但是,如果有GROUP BY子句幫忙的話更能讓你在列的字段子集中應用這些函數。不要對你的Sales表中每一家公司一次又一次地執行MAX函數查詢——你完全可以帶GROUP BY子句獲得同樣的結果:

SELECT company, MAX(net_amount) FROM Sales GROUP BY company;

  這樣做可以獲得每家公司net_amount的的最大值。在選擇多列名的時候也可以采用該語句,你還可以用多列來對函數結果分組。

  下面的例子演示了以上各種方式。首先,包括GROUP BY子句可以令你指定要顯示的其他列。然而,你得知道這個例子將返回在組中遇到的第1個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 > 100 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) > 500;

  上面的語句計算每家公司net_amount的平均值,而且只計算那些姓氏滿足限制條件的銷售人員的銷售量,同時只顯示大於500的結果。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved