SQL Server 資料型態
UniCode UniCode的出現 , 解決了各國的code page各自為政但在傳送資料時 , 需要轉換或無法正常顯示的問題

最大的問題在客戶端軟體的程式語言是否支援Unicode或是客戶端的作業作統是否支援Unicode
SQL 的系統資料型態
  1. 1.   字元資料
  2. 2.   Unicode資料
  3. 3.   數字資料 (整數    )   integer

  4.                           (小數    )   decimal

  5.                           (近似值)  approximate

  6. 4.   貨幣資料

  7. 5.   日期與時間資料

  8. 6.   二元資料

  9. 7.   特殊的系統資料型態
1. 字元資料
  • char:固定長度資料 , 最多8000個字元 , 使用char(n)來指定 , n是字元數目 , 適合用在資料長度幾乎相同的欄位
  • varchar:可變長度字元 , 最多8000個字元 , 使用varchar(n)來指字 , n 是字元最大數 , 適合用在資料長度變異大的欄位
  • text:可變長度字元 , 可以大到2的31次方 - 1
  • 2. Unicode資料

    適合用在多種語言 ( 2位元組=1個字元 )
     
  • nchar:固定長度資料 , 最多4000個字元 , 使用nchar(n)來指定
  • nvarchar:可變長度字元 , 最多4000個字元 , 使用nvarchar(n)來指字
  • ntext:可變長度字元 , 可以大到2的30次方 - 1


  • ***********
    在寫T-SQL時 , 會在字串前加一個 大寫 N 來表示存的是Unicode的資料型態資料 ,

    INSERT INTO TEST  (V1, V2, V3)
                               VALUES ( 1  , N ' 這個存入的表示UniCode '   , 23 )
    ***********
    3. 數字資料 (整數)
  • tinyint:      0 - 255 之間 , 共佔1個位元組 , 無法表示負數 .
  • smallint:(-2 的15次方) 到 (2 的15次方) -1 , 佔2個bytes  ( -32768 ~ 32767)
  • int:           (-2 的31次方) 到 (2 的31次方) -1 , 佔4個bytes  ( -2147483648  ~  2147483647)
  • bigint:        (-2 的63次方) 到 (2 的63次方) -1 , 佔8個bytes ( -9223372036854775808   ~  9223......807)
  • 數字資料 (小數)
  • numeric: 含小數的數值 , 類似於.net的Double型態 , 使用 numeric(p,s)來表示 , p=精度 , s=比例因子
  • decimal: 含小數的數值

    SQL 的 decimal  與 VB 的 Decimal 資料型態是不同的
  • 數字資料 (近似值)
  • real: -3.40E + 38 到 3.40E + 38      , 佔 4 Bytes
  • float: -1.79E + 308 到 1.79E + 308, 佔 8 Bytes
  • 貨幣資料
  • smallmoney: -214748.3648  到 214748.3647      , 佔 4 Bytes
  • money: -922337203685477.5808  到 22337203685477.5807, 佔 8 Bytes

    可使用一個貨幣符號 , 例如 $ 與一個小數點 , 但不能使用 逗點 例 $1234,5789
  • 預設的貨幣符號是美元 ($) , 輸入其他貨幣符號時

    INSERT Pr (Pro_ID , Pro_Price) Value( 'A100' , ' ¥ 100.00' )

    5. 日期與時間資料
  • smalldatetime: 1900/01/01 到 2079/06/06   , 佔 4 Bytes
  • datetime        : 1753/01/01 到 9999/12/31 , 佔 8 Bytes
  • 6. 二元資料
  • binary: 固定長度資料 , 最多8000個字元 , 使用binary(n)來指定
  • varbinary: 可變長度的二元資料 , 最多8000個字元 , 使用varbinary(n)來指定 , 適用不同的欄位長度
  • image: 可變長度資料 , 2的31次方 -1 個位元組
  • 7. 特殊的系統資料型態
  • timestamp:用來追蹤在一個資料庫中的一個列的最新加入或修改 , 它是一個序號 , 不需要填入(自動記錄的)
  • bit
  • uniqueidentifier
  • sql_variant:各來儲存資料型態不同的資料 (除了sql_variant , text , ntext , image 外)
                                    儲存的時候要用Cast 轉換資料型態 , 不轉換就儲存會發生錯誤
  • 隱含轉換 自動轉型

    Transact-SQL運算式

    數學運算式

    +
    -
    *
    /
    % 取餘數 只能用在 int smallint 和 tinyint 資料類型

    比較運算式

    = 等於
    > 大於
    < 小於
    >= 大於等於
    <= 小於等於
    <> 或 != 不等於
    !> 不大於
    !< 不小於
    ( ) 優先順序控制符號
    邏輯運算式
    AND  
    OR  
    Not  

    字串運算式

    +

    字元的相加


    Transact-SQL函數

    字串函數

    + 字串加法
    ASCII 傳回ASCII數值
    CHAR 傳回ASCII字元
    charindex (pattern,n) 取得pattern的起始位置
    difference 取餘數 只能用在 int smallint 和 tinyint 資料類型
    Ltrim 刪除字串左方空格
    Len( ) 傳回文字串長度
    Lower 轉換成小寫字母
    patindex (%pattern,n) 取得pattern的起始位置, %為SQL的萬用符號
    replicate(char,n) 依據指定的數值, 產生重覆的字串內容。
    right 傳回字串右邊指定的字元內容。
    reverse 反向運算式
    rtrim 去除字串右邊的空格。
    soundex 返回一個四位元的程式碼, 用以比較兩個字串的相似性。
    space 產生指定數量的空格
    strff (char , n1 , n2 ,char2) 在char字串中, 從n1開始 , n2的長度 , 以char2字串取代
    substring(char, n1 ,n2 ) 傳回char字串中 , 從n1開始到n2長度的字串
    str 將數值轉換為字串的函數
    upper 轉換成大寫字母

    日期與時間函數

    getDate 取得系統目前的時間及日期
    DateDiff (dapart,da1,da2 ) 以dapar指定的方式 , 返回date2與date1兩個日期之間的值
    DateAdd (dapart, n ,date ) 以dapar指定的方式 , 取得date加上N之後的日期
    DatePart(dapart , date ) 取得date中, datepart指定部分所對應的整數值
    DateName(dapart , date ) 取得date中, datepart指定部分所對應的字串名稱
    Day( ) 1-31
    Month( ) 1-12
    Year( ) 100-9999
    Weekday( ) 1-7,1代表星期日
    Hour( ) 1-23
    Date( )  
    Time( )  
    Now( )  
    datepart 值
    欄位名 縮寫 數值範圍
    Year Yy 1753 ~ 9999
    Quarter Qq 1 ~ 4
    Month Mn 1 ~ 12
    Day of Year Dy 1 ~ 366
    Day Dd 1 ~ 31
    Week Wk 0 ~ 51
    Weekday Dw 1 ~ 7
    Hour Hh 0 ~ 23
    Minute Mi 0 ~ 59
    Second Ss 0 ~ 59
    Millsecond Ms 0 ~ 999


    數學函數

    ABS 絶對值
    Asin , Acos , Atan  
    sin, con , tan  
    Ceiling 取得大於或等於的最小整數
    exp 指數
    degrees 弧度轉換
    floor 取得小於或等於的最大整數
    power 冪值
    Log 自然對數
    Sqrt 平方根
    rand 0 ~ 1 之間的亂數
    PI 圓周率
    round 四拾五入
    Sign 判斷正 (1) , 負 (-1) , 零 (0)
    Log10  
    ranians  

    轉換函數

    Convert

    (DataType [ (length) , expression [,style]])

     

    聚合函數

    取得整個 , 數個 , 或單一的資料列總計資訊 , 通常配合Select 加Group By
    不能使用於Select Where

    Avg

    平均值

    Count

    配合Distinct關鍵字使用,將自動刪重複的數值

    Count

    (*) 不能使用Distinct關鍵字

    Max

     

    Min

     

    Sum

     


    SQL 資料型態
    資料型態的種類
    • 字元字串    :Character String
    • 二元資料    :Binary large object
    • 整數與十進制數字:Exact numeric
    • 浮點數     :Approximate numeric
    • 布林數值    :Boolean
    • 日期與時間值  :Datetime
    • 日期與時間間隔 :Interval
    字元字串型態
    • CHARACTER (char)
      固定數目的字元 , length多少就只能儲存多少個字元 , 儲存的長度少於length時 , DBMS會在字串後加上空白字元以湊成length的數目
    • CHARACTER VARYING (varchar)
      代表可變量的字元 ,  與 char 不同的是 , 儲存的長度少於length時 , DBMS不會在字串後加上空白字。
    • NATIONAL CHARACTER (nchar)
      標準多字元或Unicode字元 , 其餘與 char 相同
    • NATIONAL CHARACTER VARYING (nvarchar)
      標準多字元或Unicode字元 , 其餘與  varchar 相同
    • CLOB
      字元大型物件 , 用來持有大量文字的欄位 , 不能作為索引鍵或索引
    • NCLOB
      國際字元大型物件
    • ACCESS的字串型態:text , memo
    • SQL Server的字串型態:char , varchar , nchar , nvarchar , text , ntext
    • Tips
      • 兩個連續單引號表示字串中的一個單引號字元--->don''t 表示 don't
      • 字串的長度是介於 0 到 length間的數值 , 不包含 ''(空字串或長度為0的字串)
      • DBMS對固定字串的排序比較快 , 短欄位要比長欄位快
    二元大型物件 (BLOB)
    • ACCESS的二元大型物件:ole object
    • SQL Server的二元大型物件:binary , varbinary , image
    • Tips
      • 主要是儲存大量的多媒體資料 , 如圖片 , 音樂 , 影片
      • 無法做索引鍵或索引 , 它只支援 = 或 <>
      • DBMS並不嘗試去解譯BLOB ; 它們只給應用程式使用
    精確數字型態
    • 可以是負數、0、或正數
    • 它是整數或小數
      整數:沒有小數點的數字 -42 , 0 , 76555
      小數:-22.06 , 0.0 , 0.0013
    • 具有固定的精確度及精密度
      精確度:有意義數字的數目,對小數而言,它是小數點兩旁數字的數目總和
      精密度:小數點右邊數字的數目總和
    • NUMERIC
    • DECIMAL
    • INTEGER ( int )
      整數,儲存的最大最小值視DBMS而定
    • SMALLINT
      整數,儲存的最大最小值視DBMS而定 , 會比Integer還小
    • BIGINT
      整數,儲存的最大最小值視DBMS而定 , 會比Integer還大
    • Access的數字資料型態:byte, decimal, integer, long integer
    • SQL Server的數字資料型態:bigint , int , smallint , tinyint , decimal , numeric
    • Tips
      • 不要將數字置於引號中 ,如果數字不需要做數學運算 , 便將它以字串方式儲存 , 以避免資料遺失的情況。 如電話號碼。
      • 整數計算最快
    近似數字型態
    • 可以是負數,0,或正數
    • 它是浮點數(實數)的近似值
    • 一般用來表示在技術、科學、統計與金融計算中極大或極小的數量
    • 以科學記號的方式表示
    • 具有固定的精確度但沒有明確的精密度
    • FLOAT:
      代表浮點數
    • REAL:單精確度
    • DOUBLE PRECISION:
    • Access的近似數字資料型態:single, double
    • SQL Server的近似數字資料型態:float, real
    布林型態
    • 有效值為真值(True)、假值(False)、與未知數值(Unknown)
    • 事實上,空值等於未知數值 , 通常被用來代替未知數值 ( 大多數DBMS布林型態不接受Unknown值)
    • Access的布林資料型態:yes/no
    • SQL Server的布林資料型態:bit
    日期時間型態
    • 數值是參考UTC或GMT
    • 時間數值是以24小時為基礎 13:00
    • 連字號 - 區分日期欄位 , 冒號 : 區分時間欄位。
      日期與時間中以空白字元做分隔
    • DATE
      日期 2006-03-17
    • TIME
      代表一天中的時間 22:06:57
    • TIMESTAMP
      代表以空白字元分隔的DATE TIME組合 2006-03-17 22:06:57
    • TIME WITH TIME ZONE
    • TIMESTAMP WITH TIME ZONE
    • Access日期時間型態:date/time
    • SQL Server日期時間型態:datetime, smalldatetime, rowversion
    • 只有Access是以 #將日期時間框住 , 其他DBMS都是使用引號
    差距型態
    其他資料型態
    空值
    • 關鍵字NULL代表空值
    • 代表可能是未知、稍後決定或不適用的數值
    • 空值與 0 、空白字串或空字串是不同的
    • 空值可以出現在任何型態的欄位 , 只要它們允許NULL
    • 利用IS NULL偵測空值
    • 空值彼此間不具有相等或不相等的關係
    • 雖然空值彼此間不具有相等關係 , 但是Distinct對於欄位中的所有空值都視為相同
    • 欄位有空值排序時, 視DBMS決定其是否大於或小於其他數值
    • 所有空值相關的算術或操作的結果都是空值
    • sum() , avg() , Max()都會忽略空值。count(*)是一個運算式
    • 如果Group by子句中的群組欄位含有空值 , 所有空值都會放置到同一群組中
    • 空值會影響join執行的結果 , 且在子查詢中會造成問題
    • 空值表示欠缺數值