SQL函式

在 SQL 中,基本的函式類型和種類有若干種。函式的基本類型是: Aggregate 函式 Scalar 函式

基本介紹

  • 中文名:SQL函式
  • 基本類型:Aggregate 函式 Scalar 函式
  • 所屬學科:數學
  • 類別:數學用語
函式語法,函式介紹,

函式語法

SQL 擁有很多可用於計數和計算的內建函式。
內建 SQL 函式的語法是:
SELECT function(列) FROM 表
SQL COUNT()語法
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 個訂單:
CustomerNilsen
2
SQL COUNT(*) 實例 如果我們省略 WHERE 子句,比如這樣:
SELECT COUNT(*) AS NumberOfOrders FROM Orders結果集類似這樣:
NumberOfOrders
6
這是表中的總行數。
實例二
我們希望計算 "Orders" 表中不同客戶的數目。
我們使用如下 SQL 語句:
SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders結果集類似這樣:
NumberOfCustomers
3
這是 "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結果集類似這樣:
FirstOrderPrice
1000
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結果集類似這樣:
OrderAverage
950
示例2
我們希望找到 OrderPrice 值高於 OrderPrice 平均值的客戶。
我們使用如下 SQL 語句:
SELECT Customer FROM OrdersWHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)結果集類似這樣:
Customer
Bush
Carter
Adams
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結果集類似這樣:
LastOrderPrice
100
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結果集類似這樣:
LengthOfCity
6
8
7
MAX()
MAX 函式返回一列中的最大值。NULL 值不包括在計算中。
SELECT MAX(column_name) FROM table_name注釋:MIN 和 MAX 也可用於文本列,以獲得按字母順序排列的最高或最低值。
實例1"Orders" 表:
我們希望查找 "OrderPrice" 列的最大值。
我們使用如下 SQL 語句:
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders結果集類似這樣:
LargestOrderPrice
2000
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結果集類似這樣:
SmallCity
Lon
New
Bei
MIN()
MIN 函式返回一列中的最小值。NULL 值不包括在計算中。
SELECT MIN(column_name) FROM table_name注釋:MIN 和 MAX 也可用於文本列,以獲得按字母順序排列的最高或最低值。
實例1 "Orders" 表:
我們希望查找 "OrderPrice" 列的最小值。
我們使用如下 SQL 語句:
SELECT MIN(OrderPrice) AS SmallestOrderPrice FROM Orders結果集類似這樣:
SmallestOrderPrice
100
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結果集類似這樣:
OrderTotal
5700
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

相關詞條

熱門詞條

聯絡我們