邏輯運算符
NOT運算符
not運算符可以表示否定的意思,而且它不能單獨使用,一般是搭配其他查詢條件來一起使用,如下圖:
其中的“not product_price>=200”等價於“product_price<200”,這是因爲not代表否定的意思,所以導致語句的意思發生改變。
AND運算符和OR運算符
到目前爲止我們講的SQL語句都是隻有一個查詢條件,但是實際運用中我們往往是同時指定多個查詢條件對數據進行查詢的,所以就有了AND運算符和OR運算符來滿足查詢的需求。
在where子句中使用AND運算符或OR運算符,可以對多個查詢條件進行組合。
- AND運算符在其兩側的查詢條件都成立時,整個查詢條件才成立,相當於“並且”;
- OR運算符在其兩側的查詢條件有一個成立時,整個查詢條件都成立,相當於“或者”。
例:
AND運算符的使用:
OR運算符的使用:
注意:AND運算符的優先級高於OR運算符。
通過括號改變優先級順序
上面我們提到AND運算符的優先級高於OR運算符,但是,我們可以使用括號()來改變優先級的順序,如下:
含有NULL時的真值
在SQL中邏輯表達式的可能值包括真(TRUE)、假(FALSE)和不確定(UNKNOWN),這是SQL中特有的情況,所以SQL中的邏輯運算也被稱作三值運算。
所以,之前當我們在使用“product_price>100”語句檢索時,會檢索不到價格爲NULL的商品,因爲他們對於該語句既不是真,也不是假,而是處於不確定的狀態,所以NULL只能使用IS NULL運算符或IS NOT NULL運算符來檢索。
聚合函數
通過SQL對數據進行某種操作或計算時需要使用函數。
常用函數:
名稱 | 作用 |
---|---|
COUNT | 計算表中的記錄數(全部數據的行數) |
SUM | 計算表中數值列中數據的合計值 |
AVG | 計算表中數據列中數據的平均值 |
MAX | 求出表中任意列中數據的最大值 |
MIN | 求出表中任意列中數據的最小值 |
如上所示,用於彙總的函數我們稱爲聚合函數或者聚集函數,所謂聚合,就是將多行彙總爲一行。
COUNT函數
使用count函數計算全部數據的行數
例:
“count”後面的括號內輸入的“”是參數,輸出值“15”稱爲返回值。我們前面講到過“”代表全部列的意思。
計算NULL之外的數據的行數
例:
這次得出來得值和我們上面的明顯不一樣,少了價格爲NULL的那兩行,也就是說如果想要得到某一列中非空行數的話,將對象列設定爲參數即可實現。
由此,我們需要注意,對於COUNT函數來說,參數列不同計算的結果也會發生變化。
COUNT(*)會得到包含NULL的數據行數,而COUNT(<列名>)會得到NULL之外的數據行數,也就是說,在COUNT函數中我們使用“ * ”作爲參數和使用某一列作爲參數的結果可能是不一樣的,如:有一表全空且只有一列,使用“ * ”時,還是該表有多少行就顯示多少行,而使用該列的名稱作爲參數時,只會顯示0行,因爲該列全空。
注意:除了COUNT函數外,其他函數都不能將星號(*)作爲參數。
聚合函數會將NULL排除在外,但COUNT(*)例外,並不會排除NULL。
SUM函數
計算合計值
例:
上面我們計算出了所有價格不爲NULL的價格的和。
計算date型數據的和(調皮)
得出的數值很怪,爲“303007779”,它的計算挺特別的,大致如下:
先給大家看看數據,
1.日的和
因爲超過兩位數,所以往前進二。
2.月份的和
因爲月份和沒有超過兩位數,所以不用向前進一。
3.先計算出年份的和
這樣,就得出了303007779這個拼湊起來的數字,其實該數字變爲“30300-77-79”這個形式更容易理解(雖然這個日期的格式並不對…)
我們可以看到,其實計算這個date型數據的和是沒有太大的意義的…
AVG函數
例:計算平均值
我們由上結果可以看到AVG函數也是先排除NULL來計算平均值的。
例:計算date類型平均值
計算方法參考上面“計算date型數據的和”。
MAX函數和MIN函數
例:
我們使用這兩個函數取得了價格的最大值和最小值。
例:日期的最大值和最小值
使用聚合函數刪除重複值(關鍵字DISTINCT)
例:計算商品種類
在使用COUNT函數之前,我們先使用了DISTINCT關鍵字將“product_type”中的重複數據給刪除了,所以COUNT函數得以計算出商品的種類。當然,DISTINCT關鍵字也適用於其他聚合函數,如下圖:
使用GROUP BY子句對錶進行分組
GROUP BY子句
GROUP BY子句可以將表中的列進行分組,在GROUP BY子句中指定的列稱爲聚合鍵或者分組列。
GROUP BY子句的語法結構如下:
select <列名1>,<列名2>,<列名3>...
from <表名>
group by <列名1>,<列名2>,<列名3>...;
注意:select中的列要和下面group by子句中的列對應上,否則會出現錯誤。
例:
從上圖來看,GROUP BY子句的作用好像跟DISTINCT關鍵字類似,
但是GROUP BY子句的用法卻是跟DISTINCT關鍵字不同,如下:
我們可以看到GROUP BY子句指定列後可以跟COUNT函數結合使用。
而圖二的對價格的檢索中我們可以看到,當聚合鍵中包含NULL時,也會將NULL作爲一組特定的數據。
注:GROUP BY子句的書寫順序必須寫在FROM語句之後(如果有WHERE子句的話需要寫在WHERE子句之後)。
使用WHERE子句時GROUP BY的執行結果
在使用了GROUP BY子句的SELECT語句中,也可以正常使用WHERE子句,此時會先根據WHERE子句指定的條件進行過濾,然後再進行彙總處理。
例:
上例子中,WHERE子句先進行了過濾,將類型爲“生活用品”的商品挑選出來,然後GROUP BY子句再針對挑選出來的商品進行分組。
執行順序如下:
FROM→WHERE→GROUP BY→SELECT
與聚合函數和GROUP BY子句有關的相關錯誤
1.在SELECT子句中書寫了多餘的列
在使用聚合函數時,SELECT子句中的元素有嚴格的限制,此時SELECT子句中只能存在以下三種元素:
- 常數
- 聚合函數
- GROUP BY子句中指定的列名(也就是聚合鍵)
這裏常出現的錯誤就是把聚合鍵之外的列名書寫在SELECT子句之中,這點我們在前面也提到過,使用GROUP BY子句時,SELECT子句中不能出現聚合鍵之外的列名。
如下圖:
SELECT語句中多“product_price”這一不在聚合鍵內的列,導致出現了錯誤。
2.GROUP BY子句的結果是排序的嗎
答案是:
不是,GROUP BY子句結果的顯示是無序的,如果想要按照某種特定順序進行排序的話,需要在SELECT語句中進行指定。
3.在WHERE子句中使用聚合函數
where子句中不能使用聚合函數,否則會報錯,如下圖:
事實上,只有SELECT子句、HAVING子句和ORDER BY子句中能夠使用COUNT等聚合函數。