時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(1)
??? 跟我學(xué)SQL分為三部分,其中涵蓋了有關(guān)SQL標(biāo)準(zhǔn)的基本知識(shí)。在上一篇文章里我們討論了一些數(shù)據(jù)庫(kù)術(shù)語(yǔ)和4種最基本的數(shù)據(jù)查詢類型。此外,我們還解釋了WHERE子句和條件語(yǔ)句的用法,同時(shí)我們提供了各類查詢的具體示例。
?? 在這篇文章里,我們將就其他一些SQL函數(shù)和子句進(jìn)行闡述,供你用于基本的SELECT數(shù)據(jù)查詢中。
?? SELECT選項(xiàng)精制結(jié)果
?? 正如我們從上一篇文章中所讀到的那樣,SELECT語(yǔ)句具有種類繁多的各類選項(xiàng),這些選項(xiàng)可以用來(lái)控制數(shù)據(jù)返回的方式。這些選項(xiàng)以子句、關(guān)鍵詞和函數(shù)的形式存在。
?? 子句是一種修改結(jié)果的語(yǔ)句。子句不是必要的語(yǔ)句但它對(duì)數(shù)據(jù)的內(nèi)容及其顯示進(jìn)行了提煉。WHERE子句就是這樣的子句。
?? 關(guān)鍵詞觸發(fā)數(shù)據(jù)庫(kù)的內(nèi)在功能。這些關(guān)鍵詞在有時(shí)甚至是查詢所必需的。例如"INSERT INTO table_name (column1) VALUES (‘data1’);"語(yǔ)句中的INTO和VALUE就是如此。我們將了解DISTINCT關(guān)鍵詞,它能觸發(fā)一些非常有用的可選功能。
?? 下面總結(jié)了一些最常用的子句、關(guān)鍵詞和函數(shù)。然后我會(huì)對(duì)每一部分舉例說(shuō)明。
?? ORDER BY – 按照指定列排序返回結(jié)果的子句
?? DISTINCT – 只返回結(jié)果集合內(nèi)唯一行的關(guān)鍵詞
?? COUNT -- 返回匹配查詢的數(shù)據(jù)行總數(shù)數(shù)值的函數(shù)
?? AVG – 該函數(shù)返回指定列的平均值
?? SUM –該函數(shù)把指定的列中的數(shù)字加起來(lái)
?? MIN – 該函數(shù)返回列中最小的非NULL值
?? MAX –該函數(shù)返回列中的最大值
?? GROUP BY – 按列匯集查詢函數(shù)結(jié)果的子句
?? 用ORDER BY對(duì)查詢結(jié)果排序
?? ORDER BY子句讓數(shù)據(jù)庫(kù)對(duì)查詢結(jié)果排序,這樣你就無(wú)須自己編寫應(yīng)用程序進(jìn)行"手工"排序了。ORDER BY子句必須放在查詢語(yǔ)句的結(jié)尾。其基本用法如下:
?? SELECT * FROM Contacts ORDER BY first_name;
?? 你可以隨意在任何選擇語(yǔ)句中使用ORDER BY 子句返回多列結(jié)果。你還可以用它連接其他子句:
?? SELECT first_name, last_name FROM Contacts WHERE first_name BETWEEN ‘a(chǎn)’ AND ‘k’ ORDER BY last_name;
?? 你可以對(duì)多列數(shù)據(jù)排序。優(yōu)先順序按從左到右依次降低,所以查詢語(yǔ)句中各列的排列順序很重要。
?? SELECT * FROM Contacts ORDER BY company, last_name, first_name;
? 查詢結(jié)果默認(rèn)按數(shù)字或者字母的升序排序。你可以在ORDER BY 子句后面加上DESC關(guān)鍵詞改成降序排列。在下面的例子中,最高的net_amount排在最先(降序)。假如兩行或者兩行以上數(shù)據(jù)都包含了同樣的net_amount值,那么同行中l(wèi)ast_name值在字母表中最先出現(xiàn)的排先,因?yàn)閘ast_name一列還是按照升序排序的。
?? SELECT * FROM Sales ORDER BY net_amount DESC, last_name, first_name;
?? 在按照定義的列名排序以后,大多數(shù)數(shù)據(jù)庫(kù)隨后將按照數(shù)據(jù)表內(nèi)的第一列排序然后順序向右再排序。具體的實(shí)現(xiàn)各有變化,因此,如果排序在應(yīng)用中比較重要那么你應(yīng)該明確地定義所要排序的列。
?? 另外一值得注意的問(wèn)題是,采用ORDER BY子句(以及WHERE子句),你正在用來(lái)排序結(jié)果的數(shù)據(jù)列并不一定得是返回結(jié)果集合的一部分。只要所有引用的列都在數(shù)據(jù)表內(nèi)存在則下例完全有效:
?? SELECT company, first_name, net_amount FROM Sales ORDER BY start_date, last_name;
?? DISTINCT返回不重復(fù)結(jié)果
?? DISTINCT關(guān)鍵詞只返回結(jié)果集合內(nèi)不重復(fù)的數(shù)據(jù)行。例如,有時(shí)你可能需要找出Sales表內(nèi)的公司,但是你又不想看見每個(gè)條目。于是你可以用DISTINCT對(duì)應(yīng)每一公司名返回一行數(shù)據(jù):
?? SELECT DISTINCT company FROM Sales;
?? 在使用DISTINCT時(shí),它適用于所有的請(qǐng)求列。如果你打算列出表內(nèi)的所有銷售人員和他們所代表的公司而非每一銷售記錄,那么你可以使用下列語(yǔ)句。注意,這樣操作還可能返回同一公司的若干條目等等。
?? SELECT DISTINCT company, last_name, first_name FROM Sales;
?? 你還可以在對(duì)結(jié)果縮小范圍和進(jìn)行排序時(shí)結(jié)合SELECT語(yǔ)句使用DISTINCT。為了確定顯示的內(nèi)容,數(shù)據(jù)庫(kù)首先會(huì)證實(shí)精練的請(qǐng)求是否匹配數(shù)據(jù)行,然后應(yīng)用DISTINCT功能。在全部結(jié)果集合都得以確定之后即處理ORDER BY子句。如下例所示,只有net_amount大于100的數(shù)據(jù)行才被返回。由于DISTINCT保留遇見的第1個(gè)匹配查詢條件的數(shù)據(jù)行而丟棄其他匹配行,所以O(shè)RDER BY語(yǔ)句所引用的net_amount看起來(lái)就好象產(chǎn)生了隨機(jī)的結(jié)果。
?? SELECT DISTINCT company, last_name, first_name FROM Sales WHERE net_amount > 100 ORDER BY company, net_amount;
?? 函數(shù)應(yīng)用邏輯
?? 返回單一值的函數(shù)稱做聚集函數(shù)(aggregate function)。通過(guò)應(yīng)用程序訪問(wèn)下列聚集函數(shù)的結(jié)果時(shí),包含結(jié)果的"字段名"就是你所使用的實(shí)際函數(shù)。例如,在分析你的數(shù)據(jù)庫(kù)結(jié)果時(shí),結(jié)果數(shù)組的鍵值可能如下所示:
?? $keyname = "COUNT(*)";
?? $resultkey = "AVG(net_amount)";
?? COUNT
?? COUNT函數(shù)計(jì)算出結(jié)果集合中的數(shù)據(jù)行數(shù)。和其他函數(shù)一樣它接受一個(gè)參數(shù)。以下的基本示例能告訴你數(shù)據(jù)表內(nèi)的行數(shù):SELECT COUNT(*) FROM Sales;
?? 你也可以用它來(lái)計(jì)算任何結(jié)果集合中的行數(shù)。
?? SELECT COUNT(*) FROM Sales WHERE net_amount > 100;
?? 如果你想看看某特定列有多少行包含非空值,那你不妨對(duì)該列使用COUNT函數(shù)。注意,除非數(shù)據(jù)庫(kù)設(shè)置為字段為空時(shí)缺省填充NULL否則將返回表內(nèi)數(shù)據(jù)行的總數(shù)。另外,列出的列在超出一個(gè)的情況下會(huì)引起錯(cuò)誤。
?? SELECT COUNT(company) FROM Sales;
?
?? COUNT還可以用來(lái)計(jì)算DISTINCT結(jié)果集合中的行數(shù)。
?? SELECT COUNT(DISTINCT company, last_name) FROM Sales;
?? COUNT語(yǔ)句通常用在程序中確定FOR循環(huán)的循環(huán)次數(shù)。
?? AVG
?? AVG返回某列所有字段的平均值,該列必須是數(shù)字?jǐn)?shù)據(jù)類型。該函數(shù)用列的名字作為其參數(shù),如果列字段數(shù)據(jù)類型是非數(shù)字類型的則函數(shù)返回"0"。SELECT AVG(net_amount) FROM Sales;
?? 你可以結(jié)合子句限制該函數(shù)的應(yīng)用范圍。
?? SELECT AVG(net_amount) FROM Sales WHERE company LIKE ‘%ABCD Co%’;
?? 就象所有聚集函數(shù)一樣,ORDER BY語(yǔ)句將被忽略。
?? SUM
?? SUM的工作方式和AVG差不多,只不過(guò)該函數(shù)返回結(jié)果集合中所有字段值的和。
?? SELECT SUM(net_amount) FROM Sales WHERE net_amount > 100;
?? AVG、SUM、MIN和MAX函數(shù)在沒(méi)有指定列的情況下都會(huì)返回錯(cuò)誤,所以你不能使用"*"通配符。
?? MIN
?? MIN返回指定列中最小的非空值。如果指定列是數(shù)字?jǐn)?shù)據(jù)類型則結(jié)果將是最小的數(shù)字。如果它是一種字符串?dāng)?shù)據(jù)類型則函數(shù)將返回按字母表順序出現(xiàn)的第1個(gè)值。SELECT MIN(net_amount) FROM Sales WHERE last_name = "Smith";
?? SELECT MIN(last_name) FROM Sales;
?
?? MAX
?? MAX的工作方式和MIN函數(shù)一樣,只不過(guò)該函數(shù)返回最大的非空值。該函數(shù)也可以用于字符串或者數(shù)字列
?? SELECT MAX(net_amount) FROM Sales;
?? SELECT MAX(company) FROM Sales WHERE net_amount > 100;
?? MAX函數(shù)有時(shí)還用在包含自動(dòng)遞增鍵字段的列上確定下一條目的鍵ID。除非你正在運(yùn)行一個(gè)非公開的數(shù)據(jù)庫(kù),否則在使用這一信息插入下一條目時(shí)務(wù)必謹(jǐn)慎,以防其他用戶先你執(zhí)行數(shù)據(jù)操作。
?? GROUP BY 令函數(shù)更有用
?? 雖然以上提到的所有這些函數(shù)都能提供相當(dāng)有用的信息,但是,如果有GROUP BY子句幫忙的話更能讓你在列的字段子集中應(yīng)用這些函數(shù)。不要對(duì)你的Sales表中每一家公司一次又一次地執(zhí)行MAX函數(shù)查詢——你完全可以帶GROUP BY子句獲得同樣的結(jié)果:
?? SELECT company, MAX(net_amount) FROM Sales GROUP BY company;
?? 這樣做可以獲得每家公司net_amount的的最大值。在選擇多列名的時(shí)候也可以采用該語(yǔ)句,你還可以用多列來(lái)對(duì)函數(shù)結(jié)果分組。
?? 下面的例子演示了以上各種方式。首先,包括GROUP BY子句可以令你指定要顯示的其他列。然而,你得知道這個(gè)例子將返回在組中遇到的第1個(gè)last_name值;Sum( net_amount )將顯示全部公司的結(jié)果而不僅僅針對(duì)匹配姓氏的數(shù)據(jù)行。這是因?yàn)?,我們只使用了Company字段來(lái)定義我們的組。
?? SELECT company, last_name, SUM(net_amount) FROM Sales GROUP BY company;
?? 在上面的例子中,last_name列實(shí)際上并沒(méi)有提供什么有用的信息,但這樣做是為了在下一個(gè)例子中要用到的功能做準(zhǔn)備。你可以創(chuàng)建多列定義的組。這樣就可以在結(jié)果集合中產(chǎn)生針對(duì)特定行的函數(shù)結(jié)果,而結(jié)果集合則是由所有指定
關(guān)鍵詞標(biāo)簽:選項(xiàng),語(yǔ)句,結(jié)果,函數(shù),
相關(guān)閱讀 PHP的配置詳細(xì)選項(xiàng) 初學(xué)PHP指導(dǎo):php.ini 配置詳細(xì)選項(xiàng) 如何設(shè)置Windows7屏保程序的隱藏選項(xiàng) 限制使用桌面相關(guān)選項(xiàng) 元?dú)怛T士機(jī)械狂潮鎖敵技巧推薦-具體介紹 linux 2.6內(nèi)核配置選項(xiàng)注解
熱門文章 淺談JSP JDBC來(lái)連接SQL Server 2005的方法 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 sql server系統(tǒng)表?yè)p壞的解決方法 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶、角色、架構(gòu)的關(guān)系
時(shí)間:2023-02-23 18:10:12
時(shí)間:2021-05-13 19:41:22
時(shí)間:2019-12-31 17:49:29
時(shí)間:2019-06-25 08:41:20
時(shí)間:2018-09-06 08:48:54
時(shí)間:2018-08-16 13:18:40
人氣排行 配置和注冊(cè)O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫(kù) SQL2000數(shù)據(jù)庫(kù)遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫(kù)服務(wù)端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級(jí)到2000的正確操作步驟 sql server系統(tǒng)表?yè)p壞的解決方法 淺談JSP JDBC來(lái)連接SQL Server 2005的方法