MySQL學習筆記(二)

3、約束

MySQL中約束保存在information_schema數據庫的table_constraints中,能夠經過該表查詢約束信息;數據庫

約束主要完成對數據的檢驗,保證數據庫數據的完整性;若是有相互依賴數據,保證該數據不被刪除。函數

經常使用五類約束:spa

not null:非空約束,指定某列不爲空orm

unique: 惟一約束,指定某列和幾列組合的數據不能重複io

primary key:主鍵約束,指定某列的數據不能重複、惟一table

foreign key:外鍵,指定該列記錄屬於主表中的一條記錄,參照另外一條數據function

//check:檢查,指定一個表達式,用於檢驗指定數據form

MySQL不支持check約束,但能夠使用check約束,而沒有任何效果;語法

4、大聚合函數

Orders表im

O_Id

OrderDate

OrderPrice

Customer

1

2008/12/29

1000

Bush

2

2008/11/23

1600

Carter

3

2008/10/05

700

Bush

4

2008/09/28

300

Bush

5

2008/08/06

2000

Adams

6

2008/07/21

100

Carter

 1.count 函數(返回匹配指定條件的行數)

 count(*) 對錶中行的數目進行統計,無論列中是否包含null值 仍是非空值

SELECT COUNT(*) AS NumberOfOrders FROM Orders

結果集相似這樣:

NumberOfOrders

6

 count(column)  對特定列中具備值的行進行計數,忽略null的值。

SELECT COUNT(Customer) AS CustomerNilsen FROM Orders

WHERE Customer='Carter'

以上 SQL 語句的結果是 2,由於客戶 Carter 共有 2 個訂單:

CustomerNilsen

2

如今,咱們但願計算 "Orders" 表中不一樣客戶的數目。

咱們使用以下 SQL 語句:

SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders

結果集相似這樣:

NumberOfCustomers

3

這是 "Orders" 表中不一樣客戶(Bush, Carter 和 Adams)的數目。

avg ( 函數返回數值列的平均值。NULL 值不包括在計算中)

語法

SELECT AVG(column_name) FROM table_name

例子 1

如今,咱們但願計算 "OrderPrice" 字段的平均值。

咱們使用以下 SQL 語句:

SELECT AVG(OrderPrice) AS OrderAverage FROM Orders

結果集相似這樣:

OrderAverage

950

例子 2

如今,咱們但願找到 OrderPrice 值高於 OrderPrice 平均值的客戶。

咱們使用以下 SQL 語句:

SELECT Customer FROM Orders

WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)

結果集相似這樣:

Customer

Bush

Carter

Adams

 

2.max(函數返回一列中的最大值。NULL 值不包括在計算中)

SQL MAX() 語法

SELECT MAX(column_name) FROM table_name

註釋:MIN 和 MAX 也可用於文本列,以得到按字母順序排列的最高或最低值。

如今,咱們但願查找 "OrderPrice" 列的最大值。

咱們使用以下 SQL 語句:

SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders

結果集相似這樣:

LargestOrderPrice

2000

 

min 最小值

MIN(函數返回一列中的最小值。NULL 值不包括在計算中)

SQL MIN() 語法

SELECT MIN(column_name) FROM table_name

註釋:MIN 和 MAX 也可用於文本列,以得到按字母順序排列的最高或最低值。

如今,咱們但願查找 "OrderPrice" 列的最小值。

咱們使用以下 SQL 語句:

SELECT MIN(OrderPrice) AS SmallestOrderPrice FROM Orders

結果集相似這樣:

SmallestOrderPrice

100

 

上面是5個統計函數,單獨使用,意義不大,要和分組配合起來使用

分組:group by  ,having

GROUP BY 語句

GROUP BY 語句用於結合合計函數,根據一個或多個列對結果集進行分組。

SQL GROUP BY 語法

SELECT column_name, aggregate_function(column_name)

FROM table_name

WHERE column_name operator value

GROUP BY column_name

SQL GROUP BY 實例

咱們擁有下面這個 "Orders" 表:

O_Id

OrderDate

OrderPrice

Customer

   如今,咱們但願查找每一個客戶的總金額(總訂單)。

咱們想要使用 GROUP BY 語句對客戶進行組合。

咱們使用下列 SQL 語句:

SELECT Customer,SUM(OrderPrice) FROM Orders

GROUP BY Customer

Customer

SUM(OrderPrice)

Bush

2000

Carter

1700

Adams

2000

結果集相似這樣:

很棒吧,對不對?

讓咱們看一下若是省略 GROUP BY 會出現什麼狀況:

SELECT Customer,SUM(OrderPrice) FROM Orders

結果集相似這樣:

Customer

SUM(OrderPrice)

Bush

5700

Carter

5700

Bush

5700

Bush

5700

Adams

5700

Carter

5700

上面的結果集不是咱們須要的。

那麼爲何不能使用上面這條 SELECT 語句呢?解釋以下:上面的 SELECT 語句指定了兩列(Customer 和 SUM(OrderPrice))。"SUM(OrderPrice)" 返回一個單獨的值("OrderPrice" 列的總計),而 "Customer" 返回 6 個值(每一個值對應 "Orders" 表中的每一行)。所以,咱們得不到正確的結果。不過,您已經看到了,GROUP BY 語句解決了這個問題。

GROUP BY 一個以上的列

咱們也能夠對一個以上的列應用 GROUP BY 語句,就像這樣:

SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders

GROUP BY Customer,OrderDate

HAVING 子句

在 SQL 中增長 HAVING 子句緣由是,WHERE 關鍵字沒法與合計函數一塊兒使用。

SQL HAVING 語法

SELECT column_name, aggregate_function(column_name)

FROM table_name

WHERE column_name operator value

GROUP BY column_name

HAVING aggregate_function(column_name) operator value

SQL HAVING 實例

如今,咱們但願查找訂單總金額少於 2000 的客戶。

咱們使用以下 SQL 語句:

SELECT Customer,SUM(OrderPrice) FROM Orders

GROUP BY Customer

HAVING SUM(OrderPrice)<2000

結果集相似:

Customer

SUM(OrderPrice)

Carter

1700

如今咱們但願查找客戶 "Bush" 或 "Adams" 擁有超過 1500 的訂單總金額。

咱們在 SQL 語句中增長了一個普通的 WHERE 子句:

SELECT Customer,SUM(OrderPrice) FROM Orders

WHERE Customer='Bush' OR Customer='Adams'

GROUP BY Customer

HAVING SUM(OrderPrice)>1500

結果集:

Customer

SUM(OrderPrice)

Bush

2000

Adams

2000

相關文章
相關標籤/搜索