函式語法
SQL 擁有很多可用於計數和計算的內建函式。
內建 SQL 函式的語法是:
SELECT function(列) FROM 表
COUNT(column_name) 函式返回指定列的值的數目(NULL 不計入):
SELECT COUNT(column_name) FROM table_name
SQL語法
COUNT(*) 函式返回表中的記錄數:
SELECT COUNT(*) FROM table_name
SQL COUNT(DISTINCT column_name) 語法
COUNT(DISTINCT column_name) 函式返回指定列的不同值的數目:
SELECT COUNT(DISTINCT column_name) FROM table_name注釋:COUNT(DISTINCT) 適用於 ORACLE 和 Microsoft SQL Server,但是無法用於
Microsoft Access。
實例一
下列 "Orders" 表:
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
|
我們希望計算客戶 "Carter" 的訂單數。 我們使用如下 SQL 語句:
SELECT COUNT(Customer) AS CustomerNilsen FROM OrdersWHERE Customer='Carter'以上 SQL 語句的結果是 2,因為客戶 Carter 共有 2 個訂單:
SQL COUNT(*) 實例 如果我們省略 WHERE 子句,比如這樣:
SELECT COUNT(*) AS NumberOfOrders FROM Orders結果集類似這樣:
這是表中的總行數。
實例二
我們希望計算 "Orders" 表中不同客戶的數目。
我們使用如下 SQL 語句:
SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders結果集類似這樣:
這是 "Orders" 表中不同客戶(Bush, Carter 和
Adams)的數目。
FIRST() 函式FIRST() 函式返回指定的欄位中第一個記錄的值。
提示:可使用 ORDER BY 語句對記錄進行排序。
SELECT FIRST(column_name) FROM table_name
實例1 "Orders" 表:
希望查找 "OrderPrice" 列的第一個值。
我們使用如下 SQL 語句:
SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders結果集類似這樣:
GROUP BY
GROUP BY 語句用於結合合計函式,根據一個或多個列對
結果集進行分組。
SELECT column_name, aggregate_function(column_name)FROM table_nameWHERE column_name operator valueGROUP BY column_name
我們擁有 "Orders" 表(實例1):
我們希望查找每個客戶的總金額(總訂單)。
我們想要使用 GROUP BY 語句對客戶進行組合。
我們使用下列 SQL 語句:
SELECT Customer,SUM(OrderPrice) FROM OrdersGROUP BY Customer結果集類似這樣:
Customer
| SUM(OrderPrice)
|
Bush
| 2000
|
Carter
| 1700
|
Adams
| 2000
|
很棒吧,對不對?
讓我們看一下如果省略 GROUP BY 會出現什麼情況:
SELECT Customer,SUM(OrderPrice) FROM Orders結果集類似這樣:(這段select語句不會執行的。因為如果使用了
聚合函式,則Customer就必須包含在group by 中,否則錯誤,所以不會出現下面的情況。。)
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 語句,就像這樣:
SELECT Customer,OrderDate,SUM(OrderPrice) FROM OrdersGROUP BY Customer,OrderDate
HAVING
在 SQL 中增加 HAVING 子句原因是,WHERE 關鍵字無法與合計函式一起使用。
SELECT column_name, aggregate_function(column_name)FROM table_nameWHERE column_name operator valueGROUP BY column_nameHAVING aggregate_function(column_name) operator value
實例1 "Orders" 表:
希望查找訂單總金額少於 2000 的客戶。
我們使用如下 SQL 語句:
SELECT Customer,SUM(OrderPrice) FROM OrdersGROUP BY CustomerHAVING SUM(OrderPrice)<2000
結果集類似:
Customer
| SUM(OrderPrice)
|
Carter
| 1700
|
我們希望查找客戶 "Bush" 或 "Adams" 擁有超過 1500 的訂單總金額。
我們在 SQL 語句中增加了一個普通的 WHERE 子句:
SELECT Customer,SUM(OrderPrice) FROM OrdersWHERE Customer='Bush' OR Customer='Adams'GROUP BY CustomerHAVING SUM(OrderPrice)>1500
結果集:
Customer
| SUM(OrderPrice)
|
Bush
| 2000
|
Adams
| 2000
|
函式介紹
access()
函式
| 描述
|
UCASE(c)
| 將某個域轉換為大寫
|
LCASE(c)
| 將某個域轉換為小寫
|
MID(c,start[,end])
| 從某個文本域提取字元
|
LEN(c)
| 返回某個文本域的長度
|
INSTR(c,char)
| 返回在某個文本域中指定字元的數值位置
|
LEFT(c,number_of_char)
| 返回某個被請求的文本域的左側部分
|
RIGHT(c,number_of_char)
| 返回某個被請求的文本域的右側部分
|
ROUND(c,decimals)
| 對某個數值域進行指定小數位數的四捨五入
|
MOD(x,y)
| 返回除法操作的餘數
|
NOW()
| 返回當前的系統日期
|
FORMAT(c,format)
| 改變某個域的顯示方式
|
DATEDIFF(d,date1,date2)
| 用於執行日期計算
|
Aggregate()
Aggregate函式的操作面向一系列的值,並返回一個單一的值。
注釋:如果在 SELECT 語句的項目列表中的眾多其它表達式中使用 SELECT 語句,則這個 SELECT 必須使用 GROUP BY 語句!
函式
| 描述
|
AVG(column)
| 返回某列的平均值
|
COUNT(column)
| 返回某列的行數(不包括 NULL 值)
|
COUNT(*)
| 返回被選行數
|
FIRST(column)
| 返回在指定的域中第一個記錄的值
|
LAST(column)
| 返回在指定的域中最後一個記錄的值
|
MAX(column)
| 返回某列的最高值
|
MIN(column)
| 返回某列的最低值
|
STDEV(column)
| 返回某列的標準偏差
|
STDEVP(column)
| 返回某列總體的標準偏差
|
SUM(column)
| 返回某列的總和
|
VAR(column)
| 返回某列非NULL值的方差
|
VARP(column)
| 返回某列所有非NULL值的總體方差
|
【示例】
Name
| Age
|
Adams, John
| 38
|
Bush, George
| 33
|
Carter, Thomas
| 28
|
AVG ()
AVG 函式返回數值列的平均值。NULL 值不包括在計算中。
SELECT AVG(column_name) FROM table_name
我們擁有 "Orders" 表(示例1):
我們希望計算 "OrderPrice" 欄位的平均值。
我們使用如下 SQL 語句:
SELECT AVG(OrderPrice) AS OrderAverage FROM Orders
結果集類似這樣:
示例2
我們希望找到 OrderPrice 值高於 OrderPrice 平均值的客戶。
我們使用如下 SQL 語句:
SELECT Customer FROM OrdersWHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)
結果集類似這樣:
COUNT() 函式COUNT() 函式返回匹配指定條件的行數。
FORMAT()
FORMAT 函式用於對欄位的顯示進行格式化。
SELECT FORMAT(column_name,format) FROM table_name
參數
| 描述
|
column_name
| 必需。要格式化的欄位。
|
format
| 必需。規定格式。
|
我們擁有下面這個 "Products" 表:
Prod_Id
| ProductName
| Unit
| UnitPrice
|
1
| gold
| 1000 g
| 32.35
|
2
| silver
| 1000 g
| 11.56
|
3
| copper
| 1000 g
| 6.85
|
我們希望顯示每天日期所對應的名稱和價格(日期的顯示格式是 "YYYY-MM-DD")。
我們使用如下 SQL 語句:
SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDateFROM Products結果集類似這樣:
ProductName
| UnitPrice
| PerDate
|
gold
| 32.35
| 12/29/2008
|
silver
| 11.56
| 12/29/2008
|
copper
| 6.85
| 12/29/2008
|
LAST()
LAST() 函式返回指定的欄位中最後一個記錄的值。
提示:可使用 ORDER BY 語句對記錄進行排序。
SELECT LAST(column_name) FROM table_name
實例1 "Orders" 表:
我們希望查找 "OrderPrice" 列的最後一個值。
我們使用如下 SQL 語句:
SELECT LAST(OrderPrice) AS LastOrderPrice FROM Orders結果集類似這樣:
LCASE()
LCASE 函式把欄位的值轉換為小寫。
SELECT LCASE(column_name) FROM table_name
我們擁有下面這個 "Persons" 表:
Id
| LastName
| FirstName
| Address
| City
|
1
| Adams
| John
| Oxford Street
| London
|
2
| Bush
| George
| Fifth Avenue
| New York
|
3
| Carter
| Thomas
| Changan Street
| Beijing
|
我們希望選取 "LastName" 和 "FirstName" 列的內容,然後把 "LastName" 列轉換為小寫。
我們使用如下 SQL 語句:
SELECT LCASE(LastName) as LastName,FirstName FROM Persons結果集類似這樣:
LastName
| FirstName
|
adams
| John
|
bush
| George
|
carter
| Thomas
|
LEN()
LEN 函式返回文本欄位中值的長度。
SELECT LEN(column_name) FROM table_name
同上有 "Persons" 表:
我們希望取得 "City" 列中值的長度。
我們使用如下 SQL 語句:
SELECT LEN(City) as LengthOfCity FROM Persons結果集類似這樣:
MAX()
MAX 函式返回一列中的最大值。NULL 值不包括在計算中。
SELECT MAX(column_name) FROM table_name注釋:MIN 和 MAX 也可用於文本列,以獲得按字母順序排列的最高或最低值。
實例1"Orders" 表:
我們希望查找 "OrderPrice" 列的最大值。
我們使用如下 SQL 語句:
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders結果集類似這樣:
MID()
MID 函式用於從文本欄位中提取字元。
SELECT MID(column_name,start[,length]) FROM table_name
參數
| 描述
|
column_name
| 必需。要提取字元的欄位。
|
start
| 必需。規定開始位置(起始值是 1)。
|
length
| 可選。要返回的字元數。如果省略,則 MID() 函式返回剩餘文本。
|
同上有 "Persons" 表:
我們希望從 "City" 列中提取前 3 個字元。
我們使用如下 SQL 語句:
SELECT MID(City,1,3) as SmallCity FROM Persons結果集類似這樣:
MIN()
MIN 函式返回一列中的最小值。NULL 值不包括在計算中。
SELECT MIN(column_name) FROM table_name注釋:MIN 和 MAX 也可用於文本列,以獲得按字母順序排列的最高或最低值。
實例1 "Orders" 表:
我們希望查找 "OrderPrice" 列的最小值。
我們使用如下 SQL 語句:
SELECT MIN(OrderPrice) AS SmallestOrderPrice FROM Orders結果集類似這樣:
NOW()
NOW 函式返回當前的日期和時間間
SELECT NOW() FROM table_name
貌似沒有這函式。
我們擁有下面這個 "Products" 表:
Prod_Id
| ProductName
| Unit
| UnitPrice
|
1
| gold
| 1000 g
| 32.35
|
2
| silver
| 1000 g
| 11.56
|
3
| copper
| 1000 g
| 6.85
|
我們希望顯示當天的日期所對應的名稱和價格。
我們使用如下 SQL 語句:
SELECT ProductName, UnitPrice, Now() as PerDate FROM Products結果集類似這樣:
ProductName
| UnitPrice
| PerDate
|
gold
| 32.35
| 12/29/2008 11:36:05 AM
|
silver
| 11.56
| 12/29/2008 11:36:05 AM
|
copper
| 6.85
| 12/29/2008 11:36:05 AM
|
ROUND()
ROUND 函式用於把數值欄位捨入為指定的小數位數。
SELECT ROUND(column_name,decimals) FROM table_name
參數
| 描述
|
column_name
| 必需。要捨入的欄位。
|
decimals
| 必需。規定要返回的小數位數。
|
"Products" 表:
我們希望把名稱和價格捨入為最接近的整數。
我們使用如下 SQL 語句:
SELECT ProductName, ROUND(UnitPrice,0) as UnitPrice FROM Products
結果集類似這樣:
ProductName
| UnitPrice
|
gold
| 32
|
silver
| 12
|
copper
| 7
|
Scalar ()
Scalar 函式的操作面向某個單一的值,並返回基於輸入值的一個單一的值。
SQL ()
函式
| 描述
|
AVG(column)
| 返回某列的平均值
|
BINARY_CHECKSUM
| |
CHECKSUM
| |
CHECKSUM_AGG
| |
COUNT(column)
| 返回某列的行數(不包括NULL值)
|
COUNT(*)
| 返回被選行數
|
COUNT(DISTINCT column)
| 返回相異結果的數目
|
FIRST(column)
| 返回在指定的域中第一個記錄的值(SQLServer2000 不支持)
|
LAST(column)
| 返回在指定的域中最後一個記錄的值(SQLServer2000 不支持)
|
MAX(column)
| 返回某列的最高值
|
MIN(column)
| 返回某列的最低值
|
STDEV(column)
| |
STDEVP(column)
| |
SUM(column)
| 返回某列的總和
|
VAR(column)
| |
VARP(column)
| |
SUM()
SUM 函式返回數值列的總數(總額)。
SELECT SUM(column_name) FROM table_name
實例1 "Orders" 表:
我們希望查找 "OrderPrice" 欄位的總數。
我們使用如下 SQL 語句:
SELECT SUM(OrderPrice) AS OrderTotal FROM Orders結果集類似這樣:
GROUP BY 語句合計函式 (比如SUM) 常常需要添加 GROUP BY 語句。
UCASE()
UCASE 函式把欄位的值轉換為大寫。
SELECT UCASE(column_name) FROM table_name
"Persons" 表:
我們希望選取 "LastName" 和 "FirstName" 列的內容,然後把 "LastName" 列轉換為大寫。
我們使用如下 SQL 語句:
SELECT UCASE(LastName) :
LastName
| FirstName
|
ADAMS
| John
|
BUSH
| George
|
CARTER
| Thomas
|