跟我學(xué)SQL:(二)SELECT語(yǔ)句選項(xiàng)

字號(hào):

跟我學(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)的公司,但是你又不想看見(jiàn)每個(gè)條目。于是你可以用DISTINCT對(duì)應(yīng)每一公司名返回一行數(shù)據(jù):
    SELECT DISTINCT company FROM Sales;
    在使用DISTINCT時(shí),它適用于所有的請(qǐng)求列。如果你打算列出表內(nèi)的所有銷售人員和他們所代表的公司而非每一銷售記錄,那么你可以使用下列語(yǔ)句。注意,這樣操作還可能返回同一公司的若干條目等等。