天天看點

SQL語言入坑—1.資料的檢索、排序、過濾、分組

文章目錄

    • 一、MYSQL與SQL是什麼?
    • 二、SQL語言
      • 1.USE選擇資料庫
      • 2. SHOW檢視MySQL資料庫、表和内部資訊
      • 3.SELECT語句從表中檢索一個或多個資料列
        • 3.1 檢索單個列
        • 3.2 檢索多個列
        • 3.3 檢索所有列
        • 3.4 檢索不同的行—DISTINCT
        • 3.5 限制結果—LIMIT
      • 4. 使用SELECT語句的ORDER BY子句,根據需要排序檢索出的資料
        • 4.1 排序資料
        • 4.2 按多個列排序
        • 4.3 指定排序方向—DESC與ASC
        • 4.4 使用ORDER BY和LIMIT的組合,能夠找出一個列中最高或最低的值
      • 5. 使用SELECT語句的WHERE子句過濾資料
        • 5.1 WHERE子句操作符
        • 5.2 檢查單個值
        • 5.3 不比對檢查
        • 5.4 範圍檢查—BETWEEN
      • 6.組合WHERE子句進行資料過濾以及如何使用NOT和IN操作符
        • 6.1 組合WHERE子句
        • 6.2 IN操作符
        • 6.3 NOT操作符
      • 7.使用LIKE操作符進行通配搜尋
        • 7.1 百分号(%)通配符
        • 7.2 下劃線(_)通配符
      • 8.WHERE子句内使用正規表達式來更好地控制資料過濾
        • 8.1 基本字元比對—REGEXP
        • 8.2 進行OR比對—|
        • 8.3 比對幾個字元之一 — []
        • 8.4 比對範圍— -
        • 8.5 比對特殊字元
        • 8.6 比對字元類
        • 8.7 比對多個執行個體
        • 8.8 定位符
      • 9. 利用SQL的聚集函數彙總表的資料
        • 9.1 聚集函數
        • 9.2 聚集不同的值—DISTINCT 的使用
        • 9.3 組合聚集函數
      • 10.分組資料
        • 10.1 建立分組—GROUP BY子句
        • 10.2 過濾分組—HAVING子句
        • 10.3 分組與排序—GROUP BY和ORDER BY
        • 10.4 SELECT子句順序

一、MYSQL與SQL是什麼?

  MySQL是一種資料庫管理系統。它有如下優點:

為什麼有那麼多的公司和開發人員使用MySQL?
  1. 成本—MySQL是開放源代碼的,一般可以免費使用(甚至可以免費修改)
  2. 性能—MySQL執行很快(非常快)。.
  3. 可信賴—某些非常重要和聲望很高的公司、站點使用MySQL,這些公司和站點都用MySQL來處理自己的重要資料。
  4. 簡單—MySQL很容易安裝和使用。

  SQL是結構化查詢語言( Structured QueryLanguage)的縮寫。SQL是一種專門用來與資料庫通信的語言。設計SQL的目的是很好地完成一項任務,即提供一種從資料庫中讀寫資料的簡單有效的方法。

SQL有如下的優點。
  1. SQL不是某個特定資料庫供應商專有的語言。幾乎所有重要的DBMS都支援SOL,是以,學習此語言使你幾乎能與所有資料庫打交道。
  2. SQL簡單易學。它的語句全都是由描述性很強的英語單詞組成,而且這些單詞的數目不多。
  3. SQL盡管看上去很簡單,但它實際上是一種強有力的語言,靈活使用其語言元素,可以進行非常複雜和進階的資料庫操作。

下面介紹MYSQL資料庫管理系統下支援的SQL語言。

二、SQL語言

1.USE選擇資料庫

  使用USE打開資料庫,才能讀取其中的資料

2. SHOW檢視MySQL資料庫、表和内部資訊

傳回可用資料庫的一個清單。

傳回目前選擇的資料庫内可用表的清單。

傳回目前選擇的表的表名,它對每個字段傳回一行,行中包含字段名、數

據類型、是否允許NULL、鍵資訊、預設值以及其他資訊(如字段cust_id的auto increment)。

SHOW COLUMNS 
FROM customers;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

DESCRIBE customers;

SHOW COLUMNS FROM customers;

的一種快捷方式。

用于顯示廣泛的伺服器狀态資訊;

分别用來顯示建立特定資料庫或表的MySQL語句;

用來顯示授予使用者(所有使用者或特定使用者)的安全權限;

用來顯示伺服器錯誤或警告消息。

3.SELECT語句從表中檢索一個或多個資料列

  為了使用SELECT檢索表資料,必須至少給出兩條資訊——想選擇什麼,以及從什麼地方選擇。

3.1 檢索單個列

SELECT prod_name 
FROM products;
           

利用SELECT語句從products表中檢索一個名為prod_name的列。所需的列名在SELECT關鍵字之後給出,FROM關鍵字指出從其中檢索資料的表名。

3.2 檢索多個列

SELECT prod_id, prod_name,prod_price 
FROM products;
           

要想從一個表中檢索多個列,使用相同的SELECT語句。唯一的不同是必須在SELECT關鍵字後給出多個列名,列名之間必須以逗号分隔。

3.3 檢索所有列

SELECT * 
FROM products;
           

如果給定一個通配符(*),則傳回表中所有列。

檢索未知列是使用通配符有一個大優點。由于不明确指定列名((因為星号檢索每個列),是以能檢索出名字未知的列。

3.4 檢索不同的行—DISTINCT

SELECT DISTINCT vend_id 
FROM products;
           

使用

DISTINCT

關鍵字。此關鍵字訓示MySQL隻傳回不同的值。如果使用DISTINCT關鍵字,它必須直接放在列名的前面。

3.5 限制結果—LIMIT

SELECT prod_name 
FROM products LIMIT 5;
           

使用SELECT語句檢索單個列。

LIMIT 5

訓示MySQL傳回不多于5行。

SELECT prod_name 
FROM products LIMIT 5,5;
           

LIMIT 5,5訓示MySQL傳回從行5開始的5行。第一個數指定檢索的開始行,第二個數指定檢索的行數。

4. 使用SELECT語句的ORDER BY子句,根據需要排序檢索出的資料

  為了明确地排序用SELECT語句檢索出的資料,可使用

ORDER BY

子句。ORDER BY子句取一個或多個列的名字,據此對輸出進行排序。預設,按照升序排序(A-Z)。ORDER BY子句必須是SELECT語句中的最後一條子句。可根據需要,利用它在一個或多個列上對資料進行排序。

4.1 排序資料

SELECT prod_name 
FROM products 
ORDER BY prod_name;
           

利用SELECT語句從products表中檢索一個名為prod_name的列,并且以

ORDER BY子句

訓示MySQL對prod_name列以字母順序排序資料.

4.2 按多個列排序

SELECT prod_id,prod_price,prod_name 
FROM products 
ORDER BY prod_price,prod_name;
           

選擇三個列并按其中兩個列對結果進行排序,列名之間用逗号分開即可

SQL語言入坑—1.資料的檢索、排序、過濾、分組

先按第一個列進行排序,相同在對相同的行使用後面的列進行排序。

4.3 指定排序方向—DESC與ASC

  為了進行降序排序,必須指定DESC關鍵字。ASC(升序)是預設的關鍵字。

SELECT prod_id,prod_price,prod_name 
FROM products 
ORDER BY prod_price DESC;
           

以價格降序排序

SELECT prod_id,prod_price,prod_name 
FROM products 
ORDER BY prod_price DESC,prod_name;
           

DESC關鍵字隻應用到直接位于其前面的列名。prod_price列指定DESC,對prod_name列不指定。是以,prod_price列以降序排序,而prod_name列(在每個價格内)仍然按标準的升序排序。

4.4 使用ORDER BY和LIMIT的組合,能夠找出一個列中最高或最低的值

SELECT prod_price 
FROM products 
ORDER BY prod_price DESC LIMIT 1;
           
ORDER BY子句的位置: 在給出ORDER BY子句時,應該保證它位于FROM子句之後。如果使用LIMIT,它必須位于ORDER BY之後。使用子句的次序不對将産生錯誤消息。

5. 使用SELECT語句的WHERE子句過濾資料

  在SELECT語句中,資料根據WHERE子句中指定的搜尋條件進行過濾。WHERE子句在表名(FROM子句)之後給出

WHERE子句的位置:在同時使用ORDER BY和WHERE子句時,應該讓ORDER BY位于WHERE之後,否則将會産生錯誤

5.1 WHERE子句操作符

SQL語言入坑—1.資料的檢索、排序、過濾、分組

5.2 檢查單個值

SELECT prod_name,prod_price 
FROM products 
WHERE prod_name = 'fuses';
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組
SELECT prod_name,prod_price 
FROM products 
WHERE prod_price <10;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

5.3 不比對檢查

SELECT vend_id,prod_name 
FROM products 
WHERE vend_id <> 1003;
           

5.4 範圍檢查—BETWEEN

  為了檢查某個範圍的值,可使用BETWEEN操作符。它需要兩個值,即範圍的開始值與結束值。BETWEEN比對範圍中所有的值,包括指定的開始值和結束值。

SELECT prod_name,prod_price 
FROM products 
WHERE prod_price BETWEEN 5 AND 10;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

6.組合WHERE子句進行資料過濾以及如何使用NOT和IN操作符

6.1 組合WHERE子句

  為了進行更強的過濾控制,MySQL允許給出多個WHERE子句。這些子句可以兩種方式使用:以AND子句的方式或OR子句的方式使用。

AND操作符:

  為了通過不止一個列進行過濾,可使用AND操作符給WHERE子句附加條件,AND操作符訓示MySQL檢索比對所有條件的行;還可以添加多個過濾條件,每添加一條就要使用一個AND

SELECT prod_id,prod_price,prod_name 
FROM products 
WHERE vend_id = 1003 AND prod_price <= 10;
           

OR操作符:

  OR操作符訓示MySQL檢索比對任一條件的行

SELECT prod_name,prod_price 
FROM products 
WHERE vend_id = 1002 OR vend_id = 1003;
           

組合AND和OR帶來了一個有趣的問題:SQL(像多數語言一樣)在處理0R操作符前,優先處理AND操作符。

在WHERE子句中使用圓括号,任何時候使用具有AND和0R操作符的WHERE子句,都應該使用圓括号明确地分組操作符。不要過分依賴預設計算次序,即使它确實是你想要的東西也是如此。使用圓括号沒有什麼壞處,它能消除歧義。
SELECT prod_name,prod_price 
FROM products 
WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

6.2 IN操作符

  IN操作符用來指定條件範圍,範圍中的每個條件都可以進行比對。IN取合法值的由逗号分隔的清單,全都括在圓括号中。

# IN操作符完成與OR相同的功能
SELECT prod_name,prod_price
FROM products 
WHERE vend_id IN (1002,1003) 
ORDER BY prod_name;
           

6.3 NOT操作符

  WHERE子句中的NOT操作符有且隻有一個功能,那就是否定它之後所跟的任何條件。 MySQL支援使用NOT 對IN、 BETWEEN和EXISTS子句取反。

SELECT prod_name,prod_price 
FROM products 
WHERE vend_id NOT IN (1002,1003) 
ORDER BY prod_name;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

7.使用LIKE操作符進行通配搜尋

  前面介紹的所有操作符都是針對已知值進行過濾的。不管是比對一個還是多個值,測試大于還是小于已知值,或者檢查某個範圍的值,共同點是過濾中使用的值都是已知的。但是,這種過濾方法并不是任何時候都好用。例如,怎樣搜尋産品名中包含文本anvil的所有産品?用簡單的比較操作符肯定不行,必須使用通配符。利用通配符可以建立比較特定資料的搜尋模式。

  為在搜尋子句中使用通配符,必須使用LIKE操作符。LIKE訓示MySQL後跟的搜尋模式利用通配符比對而不是直接相等比對進行比較。

7.1 百分号(%)通配符

  在搜尋串中,%表示任何字元出現任意次數

除了一個或多個字元外,%還能比對0個字元。%代表搜尋模式中給定位置的0個、1個或多個字元。
# 找出所有以詞jet起頭的産品,使用了搜尋模式'jet%'。
SELECT prod_id,prod_name 
FROM products 
WHERE prod_name LIKE 'jet%';
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

此例子使用了搜尋模式

'jet%'

。在執行這條子句時,将檢索任意以jet起頭的詞。%告訴MySQL接受jet之後的任意字元,不管它有多少字元。

  通配符可在搜尋模式中任意位置使用,并且可以使用多個通配符。下面使用兩個通配符,它們位于模式的兩端。

SELECT prod_id,prod_name 
FROM products 
WHERE prod_name LIKE '%anvi1%';
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

搜尋模式

'%anvi1%'

表示比對任何位置包含文本anvil的值,而不論它之前或之後出現什麼字元。

7.2 下劃線(_)通配符

  下劃線的用途與%一樣,但下劃線隻比對單個字元而不是多個字元。下面進行對比:

SELECT prod_id,prod_name 
FROM products 
WHERE prod_name LIKE '_ ton anvi1';
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組
SELECT prod_id, prod_name 
FROM products 
WHERE prod_name LIKE '% ton anvi1';
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

8.WHERE子句内使用正規表達式來更好地控制資料過濾

  正規表達式的作用是比對文本,将一個模式(正規表達式)與一個文本串進行比較。MySQL用WHERE子句對正規表達式提供了初步的支援,允許你指定正規表達式,過濾SELECT檢索出的資料。

8.1 基本字元比對—REGEXP

# 檢索列prod_name包含文本1000的所有行
SELECT prod_name 
FROM products 
WHERE prod_name REGEXP '1000' 
ORDER BY prod_name;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組
SELECT prod_name 
FROM products 
WHERE prod_name REGEXP '.000' 
ORDER BY prod_name;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

這裡使用了正規表達式.000。

.

是正規表達式語言中一個特殊的字元。它表示比對任意一個字元,是以,1000和2000都比對且傳回。

比對不區分大小寫

MySQL中的正規表達式比對(自版本3.23.4後)不區分大小寫(即大寫和小寫都比對)。

為區分大小寫,可使用

BINARY關鍵字

,如WHERE prod name REGEXP BINARY ‘JetPack .000’.

8.2 進行OR比對—|

  

|

為正規表達式的OR操作符。它表示比對其中之一

SELECT prod_name 
FROM products 
WHERE prod_name REGEXP '1000|2000' 
ORDER BY prod_name;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

此SQL語句中使用了正規表達式1000 | 2000。

|

為正規表達式的OR操作符。它表示比對其中之一,是以1000和2000都比對并傳回。

8.3 比對幾個字元之一 — []

  比對任何單一字元。可通過指定一組用

[]

括起來的字元來完成

SELECT prod_name 
FROM products 
WHERE prod_name REGEXP '[123] Ton' 
ORDER BY prod_name;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

這裡,使用了正規表達式[ 123] Ton。[ 123]定義一組字元,它的意思是比對1或2或3,是以,1 ton和2 ton都比對且傳回

  這裡舉例以明确需要用[]來定義OR語句查找什麼。

SELECT prod_name 
FROM products 
WHERE prod_name REGEXP '1|2|3 Ton' 
ORDER BY prod_name;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

這個輸出不是期望中的輸出,這是因為除非把字元|括在一個集合中,否則它将應用于整個串。

字元集合也可以被否定,即它們将比對除指定字元外的任何東西。

為否定一個字元集,在集合的開始處放置一個^即可。是以,盡管[123]比對字元1、2或3,但[ ^123]卻比對除這些字元外的任何東西。

8.4 比對範圍— -

  集合可用來定義要比對的一個或多個字元。

[0-9]

比對0到9内數字,

[a-z]

比對任意字母字元等

SELECT prod_name 
FROM products 
WHERE prod_name REGEXP '[1-5] Ton' 
ORDER BY prod_name;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

8.5 比對特殊字元

  正規表達式語言由具有特定含義的特殊字元構成。如果你需要比對這些字元,

應該怎麼辦?為了比對特殊字元,必須用\為前導。

\\-

表示查找

-

\\.

表示查找

.

。這種操作就是轉義。

SELECT vend_name 
FROM vendors 
WHERE vend_name REGEXP '\\.' 
ORDER BY vend_name;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

8.6 比對字元類

  存在找出你自己經常使用的數字、所有字母字元或所有數字字母字元等的比對。為更友善工作,可以使用預定義的字元集,稱為字元類

SQL語言入坑—1.資料的檢索、排序、過濾、分組

8.7 比對多個執行個體

  正規表達式重複元字元

SQL語言入坑—1.資料的檢索、排序、過濾、分組
SELECT prod_name 
FROM products 
WHERE prod_name REGEXP '\\([O-9] sticks?\\)' 
ORDER BY prod_name;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

正規表達式

\\([0-9] sticks?\\)

解析:

\\(

比對(,

[0-9]

比對任意數字(這個例子中為1和5),

sticks?

比對stick和sticks (s後的?使s可選,因為?比對它前面的任何字元的0次或1次出現),

\\)

比對)。沒有?,比對stick和sticks會非常困難。

SELECT prod_name 
FROM products 
WHERE prod_name REGEXP '[[:digit: ]]{4}' 
ORDER BY prod_name;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

[[ :digit: ]]{4}

比對連在一起的任意4位數字

與下方等價

SELECT prod_name 
FROM products 
WHERE prod_name REGEXP ' [O-9][O-9][0-9][O-9]' 
ORDER BY prod_name;
           

8.8 定位符

  為了比對特定位置的文本,需要使用定位元字元

SQL語言入坑—1.資料的檢索、排序、過濾、分組
SELECT prod_name 
FROM products 
WHERE prod_name REGEXP '^[O-9\\.]' 
ORDER BY prod_name;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

^

比對串的開始。是以,

^[0-9\\.]

隻在.或任意數字為串中第一個字元時才比對它們。

使REGEXP起類似LIKE的作用:

LIKE 和REGEXP的不同在于,

LIKE

比對整個串而

REGEXP

比對子串。利用定位符,通過用

^

開始每個表達式,用

$

結束每個表達式,可以使REGEXP的作用與LIKE一樣。

9. 利用SQL的聚集函數彙總表的資料

9.1 聚集函數

  聚集函數(aggregate function):運作在行組上,計算和傳回單個值的函數。下面列出常用的SQL聚集函數

SQL語言入坑—1.資料的檢索、排序、過濾、分組

AVG()函數

  AVG ()通過對表中行數計數并計算特定列值之和,求得該列的平均值。AVG()可用來傳回所有列的平均值,也可以用來傳回特定列或行的平均值。

AVG()可用來傳回所有列的平均值

# 使用AVG()傳回products表中所有産品的平均價格
SELECT AVG(prod_price) AS avg_price 
FROM products;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

AVG()也可以用來确定特定列或行的平均值

SELECT AVG (prod_price) AS avg_price 
FROM products 
WHERE vend_id = 1003;
           

這條SELECT語句與前一條的不同之處在于它包含了WHERE子句。此WHERE子句僅過濾出

vend_id為1003

的産品,是以avg price中傳回的值隻是該供應商的産品的平均值。

AVG ()

函數忽略列值為NULL的行。

COUNT()函數

  COUNT()函數進行計數。可利用

COUNT ()

确定表中行的數目或符合特定條件的行的數目。

COUNT()函數有兩種使用方式:

  1. 使用

    COUNT(*)

    對表中行的數目進行計數,不管表列中包含的是空值(NULL)還是非空值。
  2. 使用

    COUNT (column)

    對特定列中具有值的行進行計數,忽略NULL值。
# 傳回customers表中客戶的總數
SELECT COUNT(*) AS num_cust 
FROM customers;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組
# 對具有電子郵件位址的客戶計數
SELECT COUNT(cust_emai1) AS num_cust 
FROM customers;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

MAX()函數

  

MAX()

傳回指定列中的最大值。MAX()要求指定列名

SELECT MAX(prod_price) AS max_price 
FROM products;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

雖然MAX()一般用來找出最大的數值或日期值,但MySQL允許将它用來傳回任意列中的最大值,包括傳回文本列中的最大值。

在用于文本資料時,如果資料按相應的列排序,則MAX()傳回最後一行。

并且MAX()函數忽略列值為NULL的行

MIN()函數

  與

MAX()函數

相反

SUM()函數

  SUM()用來傳回指定列值的和(總計)

SELECT SUM(quantity) AS items_ordered 
FROM orderitems 
WHERE order_num = 20005;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

函數

SUM( quantity)

傳回訂單中所有物品數量之和,

WHERE子句

保證隻統計某個物品訂單中的物品。

  sUM ()也可以用來合計計算值

SELECT SUM(item_price*quantity) AS tota1_price 
FROM orderitems 
WHERE order_num = 20005;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

函數

SUM(item price*quantity)

傳回訂單中所有物品價錢之和,

WHERE子句

同樣保證隻統計某個物品訂單中的物品。

SUM()函數

忽略列值為NULL的行

9.2 聚集不同的值—DISTINCT 的使用

以上5個聚集函數都可以如下使用:

  1. 對所有的行執行計算,指定ALL參數或不給參數(因為ALL是預設行為)
  2. 隻考慮不同的值,指定DISTINCT參數
# 它與上面的SELECT語句相同,但使用了DISTINCT參數,是以平均值隻考慮各個不同的價格:
SELECT AVG(DISTINCT prod_price) AS avg_price 
FROM products WHERE vend_id = 1003;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組
注意,如果指定列名,則

DISTINCT

隻能用于

COUNT()

. DISTINCT不能用于

COUNT(*)

,是以不允許使用 COUNT (DISTINCT),否則會産生錯誤。

9.3 組合聚集函數

  SELECT語句可根據需要包含多個聚集函數

SELECT COUNT(*)AS num_items,
	   MIN(prod_price) AS price_min,
	   MAX(prod_price) AS price_max,
	   AVG(prod_price) AS price_avg
FROM products;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

這裡用單條SELECT語句執行了4個聚集計算,傳回4個值(products表中物品的數目,産品價格的最高、最低以及平均值)。

10.分組資料

  這涉及兩個新SELECT語句子句,分别是

GROUP BY子句

HAVING子句

  目前為止,所有計算都是在表的所有資料或比對特定的WHERE子句的資料上進行的。

如果要傳回每個供應商提供的産品數目怎麼辦?或者傳回隻提供單項産品的供應商所提供的産品,或傳回提供10個以上産品的供應商怎麼辦?

分組允許把資料分為多個邏輯組,以便能對每個組進行聚集計算。

10.1 建立分組—GROUP BY子句

  分組是在SELECT語句的GROUP BY子句中建立的

SELECT vend_id,COUNT(*)AS num_prods 
FROM products 
GROUP BY vend_id;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

GROUP BY子句

訓示MySQL按vend_id排序并分組資料。這導緻對每個vend_id而不是整個表計算num prods一次。

GROUP BY子句

訓示MySQL分組資料,然後對每個組而不是整個結果集進行聚集。

在具體使用

GROUP BY子句

前,需要知道一些重要的規定:

  1. GROUP BY子句

    可以包含任意數目的列。這使得能對分組進行嵌套,為資料分組提供更細緻的控制。
  2. 如果在

    GROUP BY子句

    中嵌套了分組,資料将在最後規定的分組上進行彙總。換句話說,在建立分組時,指定的所有列都一起計算(是以不能從個别的列取回資料)。
  3. GROUP BY子句

    中列出的每個列都必須是檢索列或有效的表達式(但不能是聚集函數)。如果在SELECT中使用表達式,則必須在GROUP BY子句中指定相同的表達式。不能使用别名。
  4. 除聚集計算語句外,SELECT語句中的每個列都必須在

    GROUP BY子句

    中給出。
  5. 如果分組列中具有NULL值,則NULL将作為一個分組傳回。如果列中有多行NULL值,它們将分為一組。
  6. GROUP BY子句

    必須出現在

    WHERE子句之後

    ORDER BY子句之前

  使用

WITH ROLLUP關鍵字

,可以得到每個分組以及每個分組彙總級别(針對每個分組)的值,

SELECT vend id, COUNT(*) AS num-prods
FROM products
GROUP BY vend id WITH ROLLUP;
           

10.2 過濾分組—HAVING子句

  

WHERE子句

不能完成任務,因為WHERE過濾指定的是行而不是分組。HAVING非常類似于WHERE。事實上,目前為止所學過的所有類型的WHERE子句都可以用HAVING來替代。唯一的差别是WHERE過濾行,而HAVING過濾分組。

# 列出至少具有2個訂單的所有顧客
SELECT cust_id,COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

HAVING和WHERE的差别:

WHERE在資料分組前進行過濾,HAVING在資料分組後進行過濾。這是一個重要的差別,WHERE排除的行不包括在分組中。這可能會改變計算值,進而影響HAVING子句中基于這些值過濾掉的分組。

  同時使用WHERE和HAVING子句

# 傳回過去12個月内具有兩個以上訂單的顧客
SELECT vend_id,COUNT(*) AS num_prods
FROM products
WHERE prod_price >= 10
GROUP BY vend_id
HAVING COUNT(*)>= 2;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

10.3 分組與排序—GROUP BY和ORDER BY

  雖然

GROUP BY

ORDER BY

經常完成相同的工作,但它們是非常不同的。下面彙總了它們之間的差别

SQL語言入坑—1.資料的檢索、排序、過濾、分組

我們經常發現用GROUP BY分組的資料确實是以分組順序輸出的。但情況并不總是這樣,它并不是SQL規範所要求的。此外,使用者也可能會要求以不同于分組的順序排序。僅因為你以某種方式分組資料(獲得特定的分組聚集值),并不表示你需要以相同的方式排序輸出。應該提供明确的ORDER BY子句,即使其效果等同于GROUP BY子句也是如此。

SELECT order_num,SUM(quantity*item_price) AS ordertotal 
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item price) >= 50;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

為按總計訂單價格排序輸出,需要添加ORDER BY子句

# 按總計訂單價格排序輸出,需要添加ORDER BY子句
SELECT order_num,SUM(quantity*item_price) AS ordertota1
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item _price) >= 50
ORDER BY ordertotal;
           
SQL語言入坑—1.資料的檢索、排序、過濾、分組

GROUP BY子句

用來按訂單号(order_num列)分組資料,以便

SUM(quantity*item _price)

函數能夠傳回總計訂單價格。

HAVING子句

過濾資料,使得隻傳回總計訂單價格大于等于50的訂單。最後,用

ORDER BY子句

排序輸出。

10.4 SELECT子句順序

  下面展示

SELECT子句

中使用時必須遵循的次序,列出迄今為止所學過的子句。

SQL語言入坑—1.資料的檢索、排序、過濾、分組
SQL語言入坑—1.資料的檢索、排序、過濾、分組

如果對您有幫助,麻煩點贊關注,這真的對我很重要!!!如果需要互關,請評論或者私信!

SQL語言入坑—1.資料的檢索、排序、過濾、分組

繼續閱讀