【SQL】18 SQL NULL 函式、SQL 通用資料型別、SQL 用於各種資料庫的資料型別

HelloZEX發表於2018-07-27

SQL NULL 函式

SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函式

請看下面的 "Products" 表:

P_Id ProductName UnitPrice UnitsInStock UnitsOnOrder
1 Jarlsberg 10.45 16 15
2 Mascarpone 32.56 23  
3 Gorgonzola 15.67 9 20

假如 "UnitsOnOrder" 是可選的,而且可以包含 NULL 值。

我們使用下面的 SELECT 語句:

SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)
FROM Products

在上面的例項中,如果有 "UnitsOnOrder" 值是 NULL,那麼結果是 NULL。

微軟的 ISNULL() 函式用於規定如何處理 NULL 值。

NVL()、IFNULL() 和 COALESCE() 函式也可以達到相同的結果。

在這裡,我們希望 NULL 值為 0。

下面,如果 "UnitsOnOrder" 是 NULL,則不會影響計算,因為如果值是 NULL 則 ISNULL() 返回 0:

SQL Server / MS Access

SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products

Oracle

Oracle 沒有 ISNULL() 函式。不過,我們可以使用 NVL() 函式達到相同的結果:

SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products

MySQL

MySQL 也擁有類似 ISNULL() 的函式。不過它的工作方式與微軟的 ISNULL() 函式有點不同。

在 MySQL 中,我們可以使用 IFNULL() 函式,如下所示:

SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products

或者我們可以使用 COALESCE() 函式,如下所示:

SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
FROM Products



SQL 通用資料型別

資料型別定義列中存放的值的種類。

SQL 通用資料型別

資料庫表中的每個列都要求有名稱和資料型別。Each column in a database table is required to have a name and a data type.

SQL 開發人員必須在建立 SQL 表時決定表中的每個列將要儲存的資料的型別。資料型別是一個標籤,是便於 SQL 瞭解每個列期望儲存什麼型別的資料的指南,它也標識了 SQL 如何與儲存的資料進行互動。

下面的表格列出了 SQL 中通用的資料型別:

資料型別 描述
CHARACTER(n) 字元/字串。固定長度 n。
VARCHAR(n) 或
CHARACTER VARYING(n)
字元/字串。可變長度。最大長度 n。
BINARY(n) 二進位制串。固定長度 n。
BOOLEAN 儲存 TRUE 或 FALSE 值
VARBINARY(n) 或
BINARY VARYING(n)
二進位制串。可變長度。最大長度 n。
INTEGER(p) 整數值(沒有小數點)。精度 p。
SMALLINT 整數值(沒有小數點)。精度 5。
INTEGER 整數值(沒有小數點)。精度 10。
BIGINT 整數值(沒有小數點)。精度 19。
DECIMAL(p,s) 精確數值,精度 p,小數點後位數 s。例如:decimal(5,2) 是一個小數點前有 3 位數小數點後有 2 位數的數字。
NUMERIC(p,s) 精確數值,精度 p,小數點後位數 s。(與 DECIMAL 相同)
FLOAT(p) 近似數值,尾數精度 p。一個採用以 10 為基數的指數計數法的浮點數。該型別的 size 引數由一個指定最小精度的單一數字組成。
REAL 近似數值,尾數精度 7。
FLOAT 近似數值,尾數精度 16。
DOUBLE PRECISION 近似數值,尾數精度 16。
DATE 儲存年、月、日的值。
TIME 儲存小時、分、秒的值。
TIMESTAMP 儲存年、月、日、小時、分、秒的值。
INTERVAL 由一些整數字段組成,代表一段時間,取決於區間的型別。
ARRAY 元素的固定長度的有序集合
MULTISET 元素的可變長度的無序集合
XML 儲存 XML 資料

 


SQL 資料型別快速參考手冊

然而,不同的資料庫對資料型別定義提供不同的選擇。

下面的表格顯示了各種不同的資料庫平臺上一些資料型別的通用名稱:

資料型別 Access SQLServer Oracle MySQL PostgreSQL
boolean Yes/No Bit Byte N/A Boolean
integer Number (integer) Int Number Int
Integer
Int
Integer
float Number (single) Float
Real
Number Float Numeric
currency Currency Money N/A N/A Money
string (fixed) N/A Char Char Char Char
string (variable) Text (<256)
Memo (65k+)
Varchar Varchar
Varchar2
Varchar Varchar
binary object OLE Object Memo Binary (fixed up to 8K)
Varbinary (<8K)
Image (<2GB)
Long
Raw
Blob
Text
Binary
Varbinary
lamp

註釋:在不同的資料庫中,同一種資料型別可能有不同的名稱。即使名稱相同,尺寸和其他細節也可能不同! 請總是檢查文件!



SQL 用於各種資料庫的資料型別

Microsoft Access、MySQL 和 SQL Server 所使用的資料型別和範圍。

Microsoft Access 資料型別

資料型別 描述 儲存
Text 用於文字或文字與數字的組合。最多 255 個字元。  
Memo Memo 用於更大數量的文字。最多儲存 65,536 個字元。註釋:無法對 memo 欄位進行排序。不過它們是可搜尋的。  
Byte 允許 0 到 255 的數字。 1 位元組
Integer 允許介於 -32,768 與 32,767 之間的全部數字。 2 位元組
Long 允許介於 -2,147,483,648 與 2,147,483,647 之間的全部數字。 4 位元組
Single 單精度浮點。處理大多數小數。 4 位元組
Double 雙精度浮點。處理大多數小數。 8 位元組
Currency 用於貨幣。支援 15 位的元,外加 4 位小數。提示:您可以選擇使用哪個國家的貨幣。 8 位元組
AutoNumber AutoNumber 欄位自動為每條記錄分配數字,通常從 1 開始。 4 位元組
Date/Time 用於日期和時間 8 位元組
Yes/No 邏輯欄位,可以顯示為 Yes/No、True/False 或 On/Off。在程式碼中,使用常量 True 和 False (等價於 1 和 0)。註釋:Yes/No 欄位中不允許 Null 值 1 位元
Ole Object 可以儲存圖片、音訊、視訊或其他 BLOBs(Binary Large OBjects)。 最多 1GB
Hyperlink 包含指向其他檔案的連結,包括網頁。  
Lookup Wizard 允許您建立一個可從下拉選單中進行選擇的選項列表。 4 位元組

 


MySQL 資料型別

在 MySQL 中,有三種主要的型別:Text(文字)、Number(數字)和 Date/Time(日期/時間)型別。

Text 型別:

資料型別 描述
CHAR(size) 儲存固定長度的字串(可包含字母、數字以及特殊字元)。在括號中指定字串的長度。最多 255 個字元。
VARCHAR(size) 儲存可變長度的字串(可包含字母、數字以及特殊字元)。在括號中指定字串的最大長度。最多 255 個字元。註釋:如果值的長度大於 255,則被轉換為 TEXT 型別。
TINYTEXT 存放最大長度為 255 個字元的字串。
TEXT 存放最大長度為 65,535 個字元的字串。
BLOB 用於 BLOBs(Binary Large OBjects)。存放最多 65,535 位元組的資料。
MEDIUMTEXT 存放最大長度為 16,777,215 個字元的字串。
MEDIUMBLOB 用於 BLOBs(Binary Large OBjects)。存放最多 16,777,215 位元組的資料。
LONGTEXT 存放最大長度為 4,294,967,295 個字元的字串。
LONGBLOB 用於 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 位元組的資料。
ENUM(x,y,z,etc.) 允許您輸入可能值的列表。可以在 ENUM 列表中列出最大 65535 個值。如果列表中不存在插入的值,則插入空值。

註釋:這些值是按照您輸入的順序排序的。

可以按照此格式輸入可能的值: ENUM('X','Y','Z')

SET 與 ENUM 類似,不同的是,SET 最多隻能包含 64 個列表項且 SET 可儲存一個以上的選擇。

Number 型別:

資料型別 描述
TINYINT(size) 帶符號-128到127 ,無符號0到255。
SMALLINT(size) 帶符號範圍-32768到32767,無符號0到65535, size 預設為 6。
MEDIUMINT(size) 帶符號範圍-8388608到8388607,無符號的範圍是0到16777215。 size 預設為9
INT(size) 帶符號範圍-2147483648到2147483647,無符號的範圍是0到4294967295。 size 預設為 11
BIGINT(size) 帶符號的範圍是-9223372036854775808到9223372036854775807,無符號的範圍是0到18446744073709551615。size 預設為 20
FLOAT(size,d) 帶有浮動小數點的小數字。在 size 引數中規定顯示最大位數。在 d 引數中規定小數點右側的最大位數。
DOUBLE(size,d) 帶有浮動小數點的大數字。在 size 引數中規顯示定最大位數。在 d 引數中規定小數點右側的最大位數。
DECIMAL(size,d) 作為字串儲存的 DOUBLE 型別,允許固定的小數點。在 size 引數中規定顯示最大位數。在 d 引數中規定小數點右側的最大位數。

注意:以上的 size 代表的並不是儲存在資料庫中的具體的長度,如 int(4) 並不是只能儲存4個長度的數字。

實際上int(size)所佔多少儲存空間並無任何關係。int(3)、int(4)、int(8) 在磁碟上都是佔用 4 btyes 的儲存空間。就是在顯示給使用者的方式有點不同外,int(M) 跟 int 資料型別是相同的。

例如:

1、int的值為10 (指定zerofill)

int(9)顯示結果為000000010
int(3)顯示結果為010

就是顯示的長度不一樣而已 都是佔用四個位元組的空間

Date 型別:

資料型別 描述
DATE() 日期。格式:YYYY-MM-DD

註釋:支援的範圍是從 '1000-01-01' 到 '9999-12-31'

DATETIME() *日期和時間的組合。格式:YYYY-MM-DD HH:MM:SS

註釋:支援的範圍是從 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'

TIMESTAMP() *時間戳。TIMESTAMP 值使用 Unix 紀元('1970-01-01 00:00:00' UTC) 至今的秒數來儲存。格式:YYYY-MM-DD HH:MM:SS

註釋:支援的範圍是從 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC

TIME() 時間。格式:HH:MM:SS

註釋:支援的範圍是從 '-838:59:59' 到 '838:59:59'

YEAR() 2 位或 4 位格式的年。

註釋:4 位格式所允許的值:1901 到 2155。2 位格式所允許的值:70 到 69,表示從 1970 到 2069。

*即便 DATETIME 和 TIMESTAMP 返回相同的格式,它們的工作方式很不同。在 INSERT 或 UPDATE 查詢中,TIMESTAMP 自動把自身設定為當前的日期和時間。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。


SQL Server 資料型別

String 型別:

資料型別 描述 儲存
char(n) 固定長度的字串。最多 8,000 個字元。 Defined width
varchar(n) 可變長度的字串。最多 8,000 個字元。 2 bytes + number of chars
varchar(max) 可變長度的字串。最多 1,073,741,824 個字元。 2 bytes + number of chars
text 可變長度的字串。最多 2GB 文字資料。 4 bytes + number of chars
nchar 固定長度的 Unicode 字串。最多 4,000 個字元。 Defined width x 2
nvarchar 可變長度的 Unicode 字串。最多 4,000 個字元。  
nvarchar(max) 可變長度的 Unicode 字串。最多 536,870,912 個字元。  
ntext 可變長度的 Unicode 字串。最多 2GB 文字資料。  
bit 允許 0、1 或 NULL  
binary(n) 固定長度的二進位制字串。最多 8,000 位元組。  
varbinary 可變長度的二進位制字串。最多 8,000 位元組。  
varbinary(max) 可變長度的二進位制字串。最多 2GB。  
image 可變長度的二進位制字串。最多 2GB。  

Number 型別:

資料型別 描述 儲存
tinyint 允許從 0 到 255 的所有數字。 1 位元組
smallint 允許介於 -32,768 與 32,767 的所有數字。 2 位元組
int 允許介於 -2,147,483,648 與 2,147,483,647 的所有數字。 4 位元組
bigint 允許介於 -9,223,372,036,854,775,808 與 9,223,372,036,854,775,807 之間的所有數字。 8 位元組
decimal(p,s) 固定精度和比例的數字。

允許從 -10^38 +1 到 10^38 -1 之間的數字。

p 引數指示可以儲存的最大位數(小數點左側和右側)。p 必須是 1 到 38 之間的值。預設是 18。

s 引數指示小數點右側儲存的最大位數。s 必須是 0 到 p 之間的值。預設是 0。

5-17 位元組
numeric(p,s) 固定精度和比例的數字。

允許從 -10^38 +1 到 10^38 -1 之間的數字。

p 引數指示可以儲存的最大位數(小數點左側和右側)。p 必須是 1 到 38 之間的值。預設是 18。

s 引數指示小數點右側儲存的最大位數。s 必須是 0 到 p 之間的值。預設是 0。

5-17 位元組
smallmoney 介於 -214,748.3648 與 214,748.3647 之間的貨幣資料。 4 位元組
money 介於 -922,337,203,685,477.5808 與 922,337,203,685,477.5807 之間的貨幣資料。 8 位元組
float(n) 從 -1.79E + 308 到 1.79E + 308 的浮動精度數字資料。

n 引數指示該欄位儲存 4 位元組還是 8 位元組。float(24) 儲存 4 位元組,而 float(53) 儲存 8 位元組。n 的預設值是 53。

4 或 8 位元組
real 從 -3.40E + 38 到 3.40E + 38 的浮動精度數字資料。 4 位元組

Date 型別:

資料型別 描述 儲存
datetime 從 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度為 3.33 毫秒。 8 位元組
datetime2 從 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度為 100 納秒。 6-8 位元組
smalldatetime 從 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度為 1 分鐘。 4 位元組
date 僅儲存日期。從 0001 年 1 月 1 日 到 9999 年 12 月 31 日。 3 bytes
time 僅儲存時間。精度為 100 納秒。 3-5 位元組
datetimeoffset 與 datetime2 相同,外加時區偏移。 8-10 位元組
timestamp 儲存唯一的數字,每當建立或修改某行時,該數字會更新。timestamp 值基於內部時鐘,不對應真實時間。每個表只能有一個 timestamp 變數。  

其他資料型別:

資料型別 描述
sql_variant 儲存最多 8,000 位元組不同資料型別的資料,除了 text、ntext 以及 timestamp。
uniqueidentifier 儲存全域性唯一識別符號 (GUID)。
xml 儲存 XML 格式化資料。最多 2GB。
cursor 儲存對用於資料庫操作的指標的引用。
table 儲存結果集,供稍後處理。

相關文章