本文轉自:http://www.baanerp.com/post/48.html
資料類型是資料的一種屬性,表示資料所表示資訊的類型。任何一種電腦語言都定義了自己的資料類型。當然,不同的程式語言都具有不同的特點,所定義的資料類型的各類和名稱都或多或少有些不同。SQLServer 提供了 25 種資料類型:
·Binary [(n)]
·Varbinary [(n)]
·Char [(n)]
·Varchar[(n)]
·Nchar[(n)]
·Nvarchar[(n)]
·Datetime
·Smalldatetime
·Decimal[(p[,s])]
·Numeric[(p[,s])]
·Float[(n)]
·Real
·Int
·Smallint
·Tinyint
·Money
·Smallmoney
·Bit
·Cursor
·Sysname
·Timestamp
·Uniqueidentifier
·Text
·Image
·Ntext
(1)位元據類型
位元據包括 Binary、Varbinary 和 Image
Binary 資料類型既可以是固定長度的(Binary),也可以是變長度的。
Binary[(n)] 是 n 位固定的位元據。其中,n 的取值範圍是從 1 到 8000。其儲存窨的大小是 n + 4 個位元組。
Varbinary[(n)] 是 n 位變長度的位元據。其中,n 的取值範圍是從 1 到 8000。其儲存窨的大小是 n + 4個位元組,不是n 個位元組。
在 Image 資料類型中儲存的資料是以位字串儲存的,不是由 SQL Server 解釋的,必須由應用程式來解釋。例如,應用程式可以使用BMP、TIEF、GIF 和 JPEG 格式把資料存放區在 Image 資料類型中。
(2)字元資料類型
字元資料的類型包括 Char,Varchar 和 Text
字元資料是由任何字母、符號和數字任意組合而成的資料。
Varchar 是變長字元資料,其長度不超過 8KB。Char 是定長字元資料,其長度最多為 8KB。超過 8KB 的ASCII 資料可以使用Text資料類型儲存。例如,因為 Html 文檔全部都是 ASCII 字元,並且在一般情況下長度超過 8KB,所以這些文檔可以 Text 資料類型儲存在SQL Server 中。
(3)Unicode 資料類型
Unicode 資料類型包括 Nchar,Nvarchar 和Ntext
在 Microsoft SQL Server 中,傳統的非 Unicode 資料類型允許使用由特定字元集定義的字元。在 SQL Server安裝過程中,允許選擇一種字元集。使用 Unicode 資料類型,列中可以儲存任何由Unicode 標準定義的字元。在 Unicode 標準中,包括了以各種字元集定義的全部字元。使用Unicode資料類型,所戰勝的窨是使用非 Unicode 資料類型所佔用的窨大小的兩倍。
在 SQL Server 中,Unicode 資料以 Nchar、Nvarchar 和 Ntext 資料類型儲存。使用這種字元類型儲存的列可以儲存多個字元集中的字元。當列的長度變化時,應該使用Nvarchar 字元類型,這時最多可以儲存 4000 個字元。當列的長度固定不變時,應該使用 Nchar 字元類型,同樣,這時最多可以儲存4000 個字元。當使用 Ntext 資料類型時,該列可以儲存多於 4000 個字元。
(4)日期和時間資料類型
日期和時間資料類型包括 Datetime 和 Smalldatetime兩種類型
日期和時間資料類型由有效日期和時間組成。例如,有效日期和時間資料包括“4/01/98 12:15:00:00:00 PM”和“1:28:29:15:01AM 8/17/98”。前一個資料類型是日期在前,時間在後一個資料類型是霎時間在前,日期在後。在 Microsoft SQL Server中,日期和時間資料類型包括Datetime 和 Smalldatetime 兩種類型時,所儲存的日期範圍是從 1753 年 1 月 1 日開始,到9999 年12 月 31 日結束(每一個值要求 8 個儲存位元組)。使用 Smalldatetime 資料類型時,所儲存的日期範圍是 1900年 1 月 1日 開始,到 2079 年 12 月 31 日結束(每一個值要求 4 個儲存位元組)。
日期的格式可以設定。設定日期格式的命令如下:
Set DateFormat {format | @format _var|
其中,format | @format_var 是日期的順序。有效參數包括 MDY、DMY、YMD、YDM、MYD 和 DYM。在預設情況下,日期格式為MDY。
例如,當執行 Set DateFormat YMD 之後,日期的格式為年 月 日 形式;當執行 Set DateFormat DMY 之後,日期的格式為日 月有年 形式
(5)數字資料類型
數字資料只包含數字。數字資料類型包括正數和負數、小數(浮點數)和整數
整數由正整數和負整數組成,例如 39、25、0-2 和 33967。在 Micrsoft SQL Server 中,整數儲存的資料類型是 Int,Smallint和 Tinyint。Int 資料類型儲存資料的範圍大於 Smallint 資料類型儲存資料的範圍,而 Smallint 據類型儲存資料的範圍大於Tinyint 資料類型儲存資料的範圍。使用 Int 資料狗昔儲存資料的範圍是從 -2 147 483 648 到 2 147 483 647(每一個值要求4個位元組儲存空間)。使用 Smallint 資料類型時,儲存資料的範圍從 -32 768 到 32 767(每一個值要求2個位元組儲存空間)。使用Tinyint 資料類型時,儲存資料的範圍是從0 到255(每一個值要求1個位元組儲存空間)。
精確小婁資料在 SQL Server 中的資料類型是 Decimal 和 Numeric。這種資料所佔的儲存空間根據該資料的位元後的位元來確定。
在SQL Server 中,近似小數資料的資料類型是 Float 和 Real。例如,三分之一這個分數記作。3333333,當使用近似資料類型時能準確表示。因此,從系統中檢索到的資料可能與儲存在該列中資料不完全一樣。
(6)貨幣資料表示正的或者負的貨幣數量 。
在 Microsoft SQL Server 中,貨幣資料的資料類型是Money 和 Smallmoney
Money資料類型要求 8 個儲存位元組,Smallmoney 資料類型要求 4 個儲存位元組。
(7)特殊資料類型
特殊資料類型包括前面沒有提過的資料類型。特殊的資料類型有3種,即 Timestamp、Bit 和 Uniqueidentifier。
Timestamp 用於表示SQL Server 活動的先後順序,以二進投影的格式表示。Timestamp 資料與插入資料或者日期和時間沒有關係。
Bit 由 1 或者 0 組成。當表示真或者假、ON 或者 OFF 時,使用 Bit 資料類型。例如,詢問是否是每一次訪問的客戶機請求可以儲存在這種資料類型的列中。
Uniqueidentifier 由 16 位元組的十六進位數字組成,表示一個全域唯一的。當表的記錄行要求唯一時,GUID是非常有用。例如,在客戶標識號列使用這種資料類型可以區別不同的客戶。
2.使用者定義的資料類型
使用者定義的資料類型基於在 Microsoft SQL Server 中提供的資料類型。當幾個表中必須儲存同一種資料類型時,並且為保證這些列有相同的資料類型、長度和可空性時,可以使用使用者定義的資料類型。例如,可定義一種稱為 postal_code 的資料類型,它基於 Char 資料型別。
當建立使用者定義的資料類型時,必須提供三個數:資料類型的名稱、所基於的系統資料類型和資料類型的可空性。
(1)建立使用者定義的資料類型
建立使用者定義的資料類型可以使用 Transact-SQL 陳述式。系統預存程序 sp_addtype 可以來建立使用者定義的資料類型。其文法形式如下:
sp_addtype {type},[,system_data_bype][,'null_type']
其中,type 是使用者定義的資料類型的名稱。system_data_type 是系統提供的資料類型,例如 Decimal、Int、Char 等等。 null_type 表示該資料類型是如何處理空值的,必須使用單引號引起來,例如'NULL'、'NOT NULL'或者'NONULL'。
例子:
Use cust
Exec sp_addtype ssn,'Varchar(11)',"Not Null'
建立一個使用者定義的資料類型 ssn,其基於的系統資料類型是變長為11 的字元,不允許空。
例子:
Use cust
Exec sp_addtype birthday,datetime,'Null'
建立一個使用者定義的資料類型 birthday,其基於的系統資料類型是 DateTime,允許空。
例子:
Use master
Exec sp_addtype telephone,'varchar(24),'Not Null'
Eexc sp_addtype fax,'varchar(24)','Null'
建立兩個資料類型,即 telephone 和 fax
(2)刪除使用者定義的資料類型
當使用者定義的資料類型不需要時,可刪除。刪除使用者定義的資料類型的命令是 sp_droptype {'type'}。
例子:
Use master
Exec sp_droptype 'ssn'
注意:當表中的列還正在使用使用者定義的資料類型時,或者在其上面還綁定有預設或者規則時,這種使用者定義的資料類型不能刪除。
SQL SERVER的欄位類型說明
以下為SQL SERVER7.0以上版本的欄位類型說明。SQL SERVER6.5的欄位類型說明請參考SQL SERVER提供的說明。
欄位類型 |
描述 |
bit |
0或1的整型數字 |
int |
從-2^31(-2,147,483,648)到2^31(2,147,483,647)的整型數字 |
smallint |
從-2^15(-32,768)到2^15(32,767)的整型數字 |
tinyint |
從0到255的整型數字 |
|
|
decimal |
從-10^38到10^38-1的定精度與有效位元的數字 |
numeric |
decimal的同義字 |
|
|
money |
從-2^63(-922,337,203,685,477.5808)到2^63-1(922,337,203,685,477.5807)的貨幣資料,最小貨幣單位千分之十 |
smallmoney |
從-214,748.3648到214,748.3647的貨幣資料,最小貨幣單位千分之十 |
|
|
float |
從-1.79E+308到1.79E+308可變精度的數字 |
real |
從-3.04E+38到3.04E+38可變精度的數字 |
|
|
datetime |
從1753年1月1日到9999年12日31的日期和時間資料,最小時間單位為百分之三秒或3.33毫秒 |
smalldatetime |
從1900年1月1日到2079年6月6日的日期和時間資料,最小時間單位為分鐘 |
|
|
timestamp |
時間戳記,一個資料庫寬度的唯一數字 |
uniqueidentifier |
全球唯一識別碼GUID |
|
|
char |
定長非Unicode的字元型資料,最大長度為8000 |
varchar |
變長非Unicode的字元型資料,最大長度為8000 |
text |
變長非Unicode的字元型資料,最大長度為2^31-1(2G) |
|
|
nchar |
定長Unicode的字元型資料,最大長度為8000 |
nvarchar |
變長Unicode的字元型資料,最大長度為8000 |
ntext |
變長Unicode的字元型資料,最大長度為2^31-1(2G) |
|
|
binary |
定長位元據,最大長度為8000 |
varbinary |
變長位元據,最大長度為8000 |
image |
變長位元據,最大長度為2^31-1(2G) |
DB2 提供了關連式資料庫的查詢語言 SQL (Structured Query Language),是一種非常口語化、既易學又易懂的文法。此一語言幾乎是每個資料庫系統都必須提供的,用以表示關連式的*作,包含了資料的定義(DDL)以及資料的處理(DML)。SQL原來拼成SEQUEL,這語言的原型以“系統 R“的名字在 IBM 聖荷西實驗室完成,經過IBM內部及其他的許多使用性及效率測試,其結果相當令人滿意,並決定在系統R 的技術基礎發展出來 IBM 的產品。而且美國國家標準局(ANSI)及國際標準組織(ISO)在1987遵循一個幾乎是以 IBM SQL 為基礎的標準關連式資料語言定義。
一、資料定義 DDL(Data Definition Language)
資料定語言是指對資料的格式和形態下定義的語言,他是每個資料庫要建立時候時首先要面對的,舉凡資料分哪些表格關係、表格內的有什麽欄位主鍵、表格和表格之間互相參考的關係等等,都是在開始的時候所必須規劃好的。
1、建表格:
CREATE TABLE table_name(
column1 DATATYPE [NOT NULL] [NOT NULL PRIMARY KEY],
column2 DATATYPE [NOT NULL],
...)
說明:
DATATYPE --是資料的格式,詳見表。
NUT NULL --可不可以允許資料有空的(尚未有資料填入)。
PRIMARY KEY --是本表的主鍵。
2、更改表格
ALTER TABLE table_name
ADD COLUMN column_name DATATYPE
說明:增加一個欄位(沒有刪除某個欄位的文法)。
ALTER TABLE table_name
ADD PRIMARY KEY (column_name)
說明:更改表得的定義把某個欄位設為主鍵。
ALTER TABLE table_name
DROP PRIMARY KEY (column_name)
說明:把主鍵的定義刪除。
3、建立索引
CREATE INDEX index_name ON table_name (column_name)
說明:對某個表格的欄位建立索引以增加查詢時的速度。
4、刪除
DROP table_name
DROP index_name
二、的資料形態 DATATYPEs
smallint
16 位元的整數。
interger
32 位元的整數。
decimal(p,s)
p 精確值和 s 大小的十進位整數,精確值p是指全部有幾個數(digits)大小值,s是指小數
點後有幾位元。如果沒有特別指定,則系統會設為 p=5; s=0 。
float
32位元的實數。
double
64位元的實數。
char(n)
n 長度的字串,n不能超過 254。
varchar(n)
長度不固定且其最大長度為 n 的字串,n不能超過 4000。
graphic(n)
和 char(n) 一樣,不過其單位是兩個字元 double-bytes, n不能超過127。這個形態是為
了支援兩個字元長度的字型,例如中文字。
vargraphic(n)
可變長度且其最大長度為 n 的雙字元字串,n不能超過 2000。
date
包含了 年份、月份、日期。
time
包含了 小時、分鐘、秒。
timestamp
包含了 年、月、日、時、分、秒、千分之一秒。
組合查詢
組合查詢是指所查詢得資料來源並不只有單一的表格,而是聯合一個以上的
表格才能夠得到結果的。
SELECT *
FROM table1,table2
WHERE table1.colum1=table2.column1
說明:
1.查詢兩個表格中其中 column1 值相同的資料。
2.當然兩個表格相互比較的欄位,其資料形態必須相同。
3.一個複雜的查詢其動用到的表格可能會很多個。
整合性的查詢:
SELECT COUNT (*)
FROM table_name
WHERE column_name = xxx
說明:
查詢合格資料共有幾筆。
SELECT SUM(column1)
FROM table_name
說明:
1.計算出總和,所選的欄位必須是可數的數字形態。
2.除此以外還有 AVG() 是計算平均、MAX()、MIN()計算最大最小值的整合性查詢。
SELECT column1,AVG(column2)
FROM table_name
GROUP BY column1
HAVING AVG(column2) > xxx
說明:
1.GROUP BY: 以column1 為一組計算 column2 的平均值必須和 AVG、SUM等整合性查詢的關鍵字
一起使用。
2.HAVING : 必須和 GROUP BY 一起使用作為整合性的限制。
複合性的查詢
SELECT *
FROM table_name1
WHERE EXISTS (
SELECT *
FROM table_name2
WHERE conditions )
說明:
1.WHERE 的 conditions 可以是另外一個的 query。
2.EXISTS 在此是指存在與否。
SELECT *
FROM table_name1
WHERE column1 IN (
SELECT column1
FROM table_name2
WHERE conditions )
說明:
1. IN 後面接的是一個集合,表示column1 存在集合裡面。
2. SELECT 出來的資料形態必須符合 column1。
其他查詢
SELECT *
FROM table_name1
WHERE column1 LIKE ’x%’
說明:LIKE 必須和後面的’x%’ 相呼應表示以 x為開頭的字串。
SELECT *
FROM table_name1
WHERE column1 IN (’xxx’,’yyy’,..)
說明:IN 後面接的是一個集合,表示column1 存在集合裡面。
SELECT *
FROM table_name1
WHERE column1 BETWEEN xx AND yy
說明:BETWEEN 表示 column1 的值介於 xx 和 yy 之間。
3、更改資料:
UPDATE table_name
SET column1=’xxx’
WHERE conditoins
說明:
1.更改某個欄位設定其值為’xxx’。
2.conditions 是所要符合的條件、若沒有 WHERE 則整個 table 的那個欄位都會全部被更改。
4、刪除資料:
DELETE FROM table_name
WHERE conditions
說明:刪除合格資料。
說明:關於WHERE條件後面如果包含有日期的比較,不同資料庫有不同的運算式。具體如下:
(1)如果是ACCESS資料庫,則為:WHERE mydate>#2000-01-01#
(2)如果是ORACLE資料庫,則為:WHERE mydate>cast(’2000-01-01’ as date)
或:WHERE mydate>to_date(’2000-01-01’,’yyyy-mm-dd’)
在Delphi中寫成:
thedate=’2000-01-01’;
query1.SQL.add(’select * from abc where mydate>cast(’+’’’’+thedate+’’’’+’ as date)’);
如果比較日期時間型,則為:
WHERE mydatetime>to_date(’2000-01-01 10:00:01’,’yyyy-mm-dd hh24:mi:ss’)