SiteMap

2013年3月13日水曜日

table

/***********************************
 *                          TABLE                            *
 ************************************/



/* SQL Server 2012 table 特徵 */
 -- 理論上 可以有20億個 table
 -- 每個 table 定義 1024 個 column
 -- 每筆 record 最多 8k bytes
-------------------------------------------------------------

/******************
 * CREATE TABLE *
 ******************/
 --(1) SQL -- DDL
 --(2) GUI Utiltiy -- SQL Server Management Studio
--------------------------------------------------------------

/* (1) CREATE TABLE  USE SQL (DDL) */

  -- Syntax of CREATE TABLE
  /*
     CREATE TABLE
     [database_name.[schema]. | schema. ] table_name
     ( {
          | column_name AS computed_column_expression
          | }
        [, ...n])
      [ON { filegroup | "default"}]
      [TEXTIMAGE_ON { filegroup | "default"}]
      [FILESTREAM_ON { filegroup | "default"}]
   */

   /* ::= { column_name data_type }
       [COLLATE collation_naem ]
       [DEFAULT constraint_expression]
         | IDENTITY [ (seed, increment) [ NOT FOR REPLICATION]]]
       [ROWGUIDCOL]
       [ ] [...n]
   */

    /* ::= [CONSTRAINT constraint_name]
        { [ NULL | NOT NULL]
           | [ {PRIMARY KEY | UNIQUE}
             [CLUSTERED | NOCLUSTERED]
             [WITH FILLFACTOR =fillfactor]
             [ON {filegroup | DEFAULT}]]
           | [FOREIGN KEY]
             REFERENCES ref_table [ (ref_column)]
             [ON DELETE {CASCADE | NO ACTION}]
             [ON UPDATE {CASCADE | NO ACTION}]
             [NOT FOR REPLICATION]
           | CHECK [ NOT FOR REPLICATION]
             (logical_expression)}
       */
---------------------------------------------------------------------------------
/* table name */
   -- \\domain_name\server_name\instance_name\databse_name.schema_name.table_name
---------------------------------------------------------------------------------  

-----------------------------------------------------------------------------------  
/* simple example:   */
create database mis
go
USE mis
GO

  -- 員工基本資料檔 (employee)
CREATE TABLE employee
(
  emp_id    char(8),
  emp_name      char(12),
  sex        char(2),
  address    char(24),
  salary        numeric(10,1)
)
GO

 -- 驗證
sp_help employee
select * from employee

 -- 練習:
CREATE TABLE tmp1
(p_id char(10),
f_name varchar(20),
l_name varchar(10),
birth datetime  )
go
---------------------------------------------------------------

/* 範例資料庫 MIS */
   -- employee 員工資本資料表
   -- order_master 訂單主檔   
   -- order_detail 訂單明細檔 
   -- products  料品資本資料檔 
   -- customer 客戶基本資料檔
   -- gallery 圖庫資料檔
  
------------------------------------------------------------------------------------------
/* FIELD ATTRIBUTE 欄位屬性 */
   -- column_name
   -- data_type
   -- NULL/NOT NULL
   -- COLLATE collation_name (定序)(char,varchar,text,nchar,nvarchar,ntext)  
   -- DEFAULT constant_expression
   -- IDENTITY(seed,increment)  (欄位值是 "資料表" 唯一的)
   -- ROWGUIDCOL (欄位值是 "全世界" 唯一的)
      -- 一個資料表中最多只能有一個 IDENTITY 及 ROWGUIDCOL 欄位
   -- FILESTREAM

/* FIELD CONSTRAINT 欄位限制 */
 -- NULL / NOT NULL (about NULL)
 -- PRIMARY KEY
 -- UNIQUE
 -- DEFAULT
 -- CHECK

/* TABLE CONSTRAINT */ 
 -- FOREIGN KEY
 -- 指定檔案群組
 -- COMPUTED COLUMN 
------------------------------------------------------------------------------

/***************************
 *    ALTER TABLE      *
 ***************************/
------------------------------------------------------------------------------

/***************************
 *    DROP TABLE       *
 ***************************/
-------------------------------------------------------------------------------

/* TEMPORARY TABLE */
==============================================

/**************************
 * CREATE TABLE           *
 **************************/
 -- method (1) SQL (DDL)
   -- example 1: ( order_master 訂單主檔 )(IDENTITY, PRIMARY KEY, UNIQUE)
      USE mis
      GO
      CREATE TABLE order_master
      (
        order_no    int IDENTITY(100,1) CONSTRAINT pk_order_no PRIMARY KEY,
                        -- IDENTITY 會自動給號 從100開始逐次增加1
                        -- CONSTRAINT pk_order_no 給主鍵名字, 不打的話系統會自己給

        cust_id     char(8),
        order_date  datetime,
        ship_date   datetime,
        sales_id    char(8),
        invoice_no  char(10) UNIQUE,
                    -- UNIQUE 唯一鍵
        total_amt   numeric(10,1)
                    -- numeric(10,1) 十進位的數字 一共有10位數, 其中一個為小數
      )
       GO
       -- identity 說明
         -- 產生序號的方法各家資料庫做法不同
             a. Oracle  --> ROWID ; SEQUENCE
             b. SQL Anywere --> NUMBER(*)
             c. MySQL --> AUTOINCREMENT 欄位屬性      
         -- E. M.
     
       -- data type datatime 說明    
          -- datetime 資料型別 90/01/01 12:00:00:000
          -- date 資料型別 (SQL server 2005 以後)
          -- e.g.

     INSERT INTO order_master(cust_id,order_date,invoice_no)
     VALUES('C007','2010/01/01','INV009')

     SELECT * FROM order_master
 
  --練習: date 資料型別
      CREATE TABLE order_master_2
      (
        order_no    int IDENTITY(100,1) PRIMARY KEY,
        cust_id     char(8),
        order_date date,
        ship_date   date,
        sales_id     char(8),
        invoice_no  char(10) UNIQUE,
        total_amt   numeric(10,1)
      )
       GO   

     INSERT INTO order_master_2(cust_id,order_date,invoice_no)
     VALUES('C007','2010/01/01','INV009')

     SELECT * FROM order_master_2

-------------------------------------------------------------------------------------------
 
  -- example 2: ( order_master 訂單主檔 )    (NULL /NOT NULL ;  UNIQUE)
     -- 先移除 old table
        DROP TABLE order_master
     -- 重新 create table
    USE mis
    GO

    CREATE TABLE order_master
      (
        order_no    char(10),
        cust_id     char(8),
        order_date char(10),
        ship_date   char(10),
        sales_id     char(8) NOT NULL,  /* 一定要有接單人 */
        invoice_no  char(10) UNIQUE,  /* 系統給定 unique constraint name */
        total_amt   numeric(10,1),

        PRIMARY KEY(order_no)
      )
      GO
                            -- about NULL: NULL 表示資料中有了
                                                    a. 漏失
                                                    b. 未知
                                                    c. 雜類
                                                    d. 不恰當的值
                                                   -- 在數學運算式中使用NULL,運算結果也會是NULL                                                 

-----------------------------------------------------------------------------------
  -- example 3: (customer 客戶基本資料檔)  (DEFAULT 說明)
   USE mis
   GO
   
   CREATE TABLE customer
   (
     cust_id        char(8) PRIMARY KEY,
     cust_name  varchar(20),
     contant        varchar(20),      /* 聯絡人 */
     tel             varchar(14),         /* 聯絡電話 */
     address       varchar(24),
     cust_level             char(1) DEFAULT 'B'  /*  預設等級為 'B' */
   )

  -- 測試 (1): E. M.
  -- 測試 (2): INSERT
  INSERT INTO customer (cust_id, cust_name)
  VALUES ('C005','三七仲介')
  -- 驗證:  
  SELECT * FROM customer
------------------------------------------------------------------------------------------------
  -- example 4: (customer 客戶基本資料檔)  (part II : CHECK 說明)
     -- 先移除 old table
   DROP TABLE customer
     -- 重新 create table
   CREATE TABLE customer
   (
     cust_id        char(8) PRIMARY KEY,
     cust_name  varchar(20),
     contant        varchar(20),      /* 聯絡人 */
     tel             varchar(14),         /* 聯絡電話 */
     address       varchar(24),
     cust_level             char(1) DEFAULT 'B',  /*  預設等級為 'B' */

     CONSTRAINT ck_contant_1
     CHECK (tel is not null or address is not null)  /* 一定要有電話或住址 */ 
   )
   
  -- 測試 : INSERT
  INSERT INTO customer (cust_id, cust_name)
  VALUES ('C005','三七仲介')     -- X

  INSERT INTO customer (cust_id, cust_name, tel)
  VALUES ('C005','三七仲介','0204-858585')     -- OK

  SELECT * FROM customer

  -- 練習: (check)
table employee2
p_id char(10)
f_name varchar(20)
l_name varchar(20)
sex char(2) {'男','女',NULL}
salary numeric(10,2) {15680~100000}

  -- 解答:
  create table employee2
  (p_id char(10),
   f_name varchar(20),
   l_name varchar(20),
   sex char(2),
   salary numeric(10,2),
  
   check (sex in ('男', '女')),
   check (salary between 15680 and 100000))
   go

  -- 測試:
   insert into employee2
   values('E005','jack','huang','中',30000)
   go 

   insert into employee2
   values('E005','jack','huang','男',300000)
   go

   insert into employee2
   values('E005','jack','huang','男',30000)
   go 

   -- 猜猜看? 可不可以?為甚麼?
   insert into employee2(p_id,f_name,l_name)
   values('E005','jack','huang')
   go
------------------------------------------------------------------------------------
/* TABLE CONSTRAINT */ 
 -- FOREIGN KEY
 -- REFRENCE CONSTRAINT
    -- (Type I ) : Update / Delete Restrict
    -- (Type II) : Update Cascade
    -- (Type III): Delete Cascade
    -- (Other )  :  Set null / Set Default 

  /* example 5: ( order_detail   訂單明細檔 )
                         ( foreign key and referential integrity constraint 說明) */

   USE mis
   GO
   CREATE TABLE order_detail
   (
     order_no     char(10),   -- foreign key
     item_no    int,             -- 項次
     product_id  char(15),    -- 料品代碼
     qty        smallint,   
     unit_price    decimal(10,1),
     note        varchar(28),    -- 備註

     PRIMARY KEY (order_no, item_no),
     FOREIGN KEY (order_no) REFERENCES order_master(order_no)
   )
    GO

   -- 測試
     -- INSERT (order_master)
   INSERT INTO order_master (order_no, sales_id, invoice_no)
   VALUES ('P0111001','E0011023','RTS87875')
  
   SELECT * FROM order_master
               --INSERT (order_detail)
   INSERT INTO order_detail (order_no, item_no, product_id, qty)
   VALUES ('P0111001',1,'rg58009',78)

   INSERT INTO order_detail (order_no, item_no, product_id, qty)
   VALUES ('P0111001',2,'ju68007',88)
   
    SELECT * FROM order_detail
          --INSERT (違反參考整合性限制的操作)
   INSERT INTO order_detail (order_no, item_no, product_id, qty)
   VALUES ('P0111008',1,'nikonfm2',1)        --X
     
          --DELETE (違反參考整合性限制的操作)
   DELETE FROM order_master
   WHERE order_no = 'P0111001'        -- X 
----------------------------------------------------------------------------------------------

 -- FOREIGN KEY (part II) (以 database diagram 說明)

  /* example 5: (products 料品基本資料檔 )
                         ( foreign key and referential integrity constraint 說明) */
 
  CREATE TABLE products
  (
    product_id         char(15) primary key,
    product_name    varchar(24),
    spec            varchar(24),
    unit            varchar(10)
  )
  
   -- Management Studio
   -- order_detail(product_id) references to products(product_id)

   DELETE FROM order_detail
---------------------------------------------------------------------------------

/* Delete Cascade 串聯刪除 */
/* example 6: (訂單主檔/訂單明細檔 串聯刪除) */

  -- 先 Drop table order_detail
   DROP TABLE order_detail
  -- 重新 CREATE TABLE order_detail

   CREATE TABLE order_detail
   (
     order_no     char(10),   -- foreign key
     item_no    int,             -- 項次
     product_id  char(15),    -- 料品代碼
     qty        smallint,   
     unit_price    decimal(10,1),
     note        varchar(28),    -- 備註

     PRIMARY KEY (order_no, item_no),
     FOREIGN KEY (order_no) REFERENCES order_master(order_no)
     ON DELETE CASCADE
   )

  -- 驗證 :

   INSERT INTO order_detail (order_no, item_no, product_id, qty)
   VALUES ('P0111001',1,'rg58009',78)

   INSERT INTO order_detail (order_no, item_no, product_id, qty)
   VALUES ('P0111001',2,'ju68007',88)

   SELECT * FROM order_master

   SELECT * FROM order_detail
     
    --  刪除  order_master.order_no='P0111001'

   DELETE FROM order_master
   WHERE  order_no='P0111001'

   -- 看 order_master/order_detail 結果

   SELECT * FROM order_master
   SELECT * FROM order_detail
--------------------------------------------------------------------------------
/* Update Cascade 串聯更新 */
/* example 7: (訂單主檔/訂單明細檔 串聯更新) */

  -- 先 Drop table order_detail
   DROP TABLE order_detail
  -- 重新 CREATE TABLE order_detail

   CREATE TABLE order_detail
   (
     order_no     char(10),   -- foreign key
     item_no    int,             -- 項次
     product_id  char(15),    -- 料品代碼
     qty        smallint,   
     unit_price    decimal(10,1),
     note        varchar(28),    -- 備註

     PRIMARY KEY (order_no, item_no),
     FOREIGN KEY (order_no) REFERENCES order_master(order_no)
     ON UPDATE CASCADE
   )
-------------------------------------------------------------
  -- 練習:重新 CREATE TABLE order_detail :
          1.foreign key (order_no) references to order_master (order_no)
            串聯更新及串聯刪除。
          2.foreign key (product_id) references to products(product_id)
            預設阻止策略。
======================================================================
/* 建立計算欄位 (Computed column) */
  -- example:
  USE mis
  GO

  CREATE TABLE eva
  (  eva_id     char(8),
     product_id        char(15),
     unit_price          numeric(10,2),
     qty                     int,
     total_money     as  qty*unit_price       -- computed column
   )

    -- test:
    -- input data to table eva
        INSERT INTO eva
        VALUES ('EVA0001','S0098078',10.3,2500)

        INSERT INTO eva
        VALUES ('EVA0002','S0098099',0.7,12000)

        SELECT * FROM eva  
======================================================================
/* ROWGUIDCOL (全域唯一識別碼)屬性說明 */
/* Example 8: 圖庫資料表 */

   -- create gallery table
   USE mis
   GO
  
   DROP TABLE gallery
   GO
  
   CREATE TABLE gallery
   (local_id    int     IDENTITY (10001, 1),
    global_id    uniqueidentifier DEFAULT NEWID() ROWGUIDCOL, -- 新增紀錄時自動產生全域唯一值
    g_file_name nvarchar(20) NOT NULL,
    create_date date DEFAULT CONVERT(date, GETDATE())
   )
   
   -- INSERT 圖檔檔案 測試
   INSERT INTO gallery(g_file_name)
   VALUES ('d:\5592.jpg')
  
   INSERT INTO gallery(g_file_name)
   VALUES ('d:\92.jpg')
  
   -- SELECT 測試
   SELECT * FROM gallery
  
   /* 一個資料表中最多只能有一個 IDENTITY 欄位及一個ROWGUIDCOL欄位,
    而且在查詢時還可以用 $IDENTITY 及 $ROWGUID 來代表這二個欄位 */
  
   -- SELECT 測試
   SELECT $ROWGUID
   FROM gallery
   WHERE $IDENTITY = 10001    
==============================================================
/* FILESTREAM 說明 */
/* 1.針對VARBINARY(MAX)資料型別,微軟從SQL Server 2008開始所提供的一種
     資料儲存方式。該方式就是透過資料庫引擎直接將VARBINARY(MAX)的資料
     儲存在作業系統,此稱之為檔案資料流(FileStream)
    
   2.指定此欄位的值要以『檔案』形式個別儲存,
     但前題是必須先啟用所屬 SQL Server 伺服器及資料庫的 FILESTREAM 功能。
     
   3.只能用於 varbinary(max) 型別的欄位, 通常用來儲存文字檔、
     圖檔、影片、或 Word、Excel 等文件檔的內容。     
    
   4.使用 FILESTREAM 時有一個限制, 那就是在資料表中還必須有一個ROWGUIDCOL欄位,
     而且已設定 NOT NULL 及『 UNIQUE 或 PRIMARY KEY』條件約束。*/
  
/* Example 9: FILESTREAM */
  
   -- CREATE DATEBASE exfs (CONTAINS FILESTREAM)
   USE master
   GO
  
   DROP DATABASE exfs
   GO
  
   CREATE DATABASE exfs
   ON
   PRIMARY
      (NAME = exfs, FILENAME = 'd:\mssql\exfs.mdf'),
   FILEGROUP fs_group1
    CONTAINS FILESTREAM
      (NAME = fs1, FILENAME = 'd:\mssql\fs1') -- FILESTREAM 資料夾
   LOG ON
      (NAME = exfs_log, FILENAME = 'd:\mssql\exfs.ldf')
     
   -- create table doc1 on database exfs
   CREATE TABLE exfs..doc1
   (doc_no uniqueidentIfier DEFAULT NEWID() ROWGUIDCOL NOT NULL UNIQUE,
    d_file_name nvarchar(20) NOT NULL,
    content varbinary(max) FILESTREAM
   )
  
   -- insert one record into file doc1
   INSERT exfs.dbo.doc1 (d_file_name,content)
   VALUES ('d:\BOM.doc',CONVERT(varbinary(max),'檔案文字儲存測試檔案文字儲存測試...'))            
  
   -- 查詢 FILESTREAM 欄的內容
   SELECT *
   FROM exfs.dbo.doc1  -- content 格式不對
  
   SELECT d_file_name, CONVERT(varchar(max),content)
   FROM exfs.dbo.doc1
-------------------------------------------------------
/* Example 9-1: FILESTREAM 說明 (create table myphoto)*/
   -- 啟動SQL Server FILESTREAM 功能
   SQL Server 組態管理員-->右鍵/內容-->FILESTREAM 頁面
  
   --建立FILESTREAM資料表myphoto
   USE AdventureWorks
   GO
  
   DROP TABLE myphoto
   GO
  
   -- 設定database 中FILESTREAM group 和 FILESTREAM datafile
     
      filestream.doc (說明圖檔)
  
   -- create table myphoto with filestream field
           
   CREATE TABLE myphoto
   (row_guid uniqueidentifier ROWGUIDCOL UNIQUE DEFAULT (NEWID()) NOT NULL,
      -- 非NULL 的唯一 ROWGUID 資料行
    myid int identity not null,
      -- 圖片代號
    photoname nvarchar(100),
      -- 圖片名稱
    photo VARBINARY(max) FILESTREAM null
      -- 儲存圖片的大數值類型資料行
    )
   
    ----------------------------------------------------   
    -- filestream.hdr 紀錄每一個檔案資料流資料表使用路徑
       filestream.doc (說明圖檔)   
      
    -- 使用filestream table
    SELECT * FROM myphoto
   
    -- 使用filestream table 利用 OPENROWSET 新增大型 BLOB 資料
    INSERT INTO myphoto(photoname,photo)
    SELECT N'天后宮.jpg',a.*
    FROM OPENROWSET (BULK 'd:\temp\天后宮.jpg',SINGLE_BLOB) a
    GO 
   
    INSERT INTO myphoto(photoname,photo)
    SELECT N'高雄港.jpg',a.*
    FROM OPENROWSET (BULK 'd:\temp\高雄港.jpg',SINGLE_BLOB) a
    GO
   
    -- 測試: 檢視FILESTREAM所在位置 .PathName()
    USE AdventureWorks
    GO
    SELECT photoname, photo.PathName() AS BLOB_PATH
    FROM dbo.myphoto
    GO
====================================================================

  /***************************
   *    ALTER TABLE          *
   ***************************/
 
  -- syntax of ALTER TABLE
     ALTER TABLE
     ADD [COLUMN]
     | ALTER [COLUNM]
     | DROP [COLUMN]
     | ADD

     | DROP CONSTRAINT
  -----------------------------------------------------------------------------------

  -- example: table employee
  -- schema of table employee
     USE mis
     GO
    
     sp_help employee

----------------------------------------------------------------
   /* alter table add column */
    -- 新增電話 (tel ) 欄位

  ALTER TABLE employee
  ADD tel char(10)

  ALTER TABLE employee
  ADD fax char(10)
     --verify:
  sp_help employee
----------------------------------------------------------

  /* alter table alter column */
   -- 修改電話欄位長度
       -- (注意: instance ; 前端開發工具)
 
  ALTER TABLE employee
  ALTER COLUMN tel char(18)
      --verify:
  sp_help employee  
-----------------------------------------------------------

  /* alter table drop column */

  ALTER TABLE employee
  DROP COLUMN fax
     --verify:
  sp_help employee 
------------------------------------------------------------

  /* alter table add primary key constraint */

  ALTER TABLE employee
  ADD CONSTRAINT pk_const_1       -- constraint name      
  PRIMARY KEY (emp_id)    -- X

  -- 先修改
  ALTER TABLE employee
  ALTER COLUMN emp_id char(8) NOT NULL         

  -- 再加 PRIMARY KEY CONSTRAINT
  ALTER TABLE employee
  ADD CONSTRAINT pk_const_1       -- constraint name      
  PRIMARY KEY (emp_id)    -- OK.
----------------------------------------------------------------------

  /* alter table add unique constraint */
  -- 公司不允許同名同姓

  ALTER TABLE employee
  ADD CONSTRAINT uniq_const_1
  UNIQUE (emp_name)

  /* alter table delete constraint */
  -- delete unique constraint
  ALTER TABLE employee
  DROP CONSTRAINT uniq_const_1
-----------------------------------------------------------------------

  /* DEFAULT  part I */
  ALTER TABLE employee
  ADD is_foreign_worker char(1) DEFAULT 'F' 

  /*DEFAULT part II */
  ALTER TABLE employee
  ADD  hired_date char(10) DEFAULT
         substring(cast(getdate() as varchar),1,10)
        
  --練習:
  USE mis
  GO
 
  CREATE TABLE product_2
  (product_id nchar(12),
   product_name nvarchar(40),
   spec nvarchar(40),
   listprice numeric(10,2))
  
  修改 TABLE product_2:
  1. product_id 為 primary key
  2. spec 為 unique
  3. listprice 值在 0.00~1000000.00 間 (預設為 0.00)
         
===================================================
   /***************************
    *    DROP TABLE           *
    ***************************/
   -- syntax of DROP TABLE
      DROP TABLE


===================================================
  /*****************************
   *          DATA TYPES       *
   *****************************/
/* 使用於 */
   -- 資料表欄位
   -- 變數
   -- 參數
  

/* 種類 */  
   -- 系統內建資料型別
   -- 使用者自訂資料型別
-------------------------------------------------
/* 資料型別 (data types) 四個屬性 */
   -- 資料種類
   -- 儲存值長度或大小
   -- 精確度
   -- 小數位數

--------------------------------------------------
/* 系統內建資料型別 */
  
-- 數值型別
-- 整數 (Integer)  
     -- int  (4 bytes, -2147483648~2147483647)
     -- smallint (2 bytes, -32768~32767)
     -- tinyint    (1 byte, 0 ~ 255)
     -- bigint     (8 bytes,...)
     -- bit (0,1, null)
 
  -- 精確位數 (Exact numeric)
    -- numeric(精確度p,小數位數s)
    -- decimal(精確度p,小數位數s)
        -- default numeric(18,0)
   
  -- 近似值 (Approximate)
    -- float
    -- real

  -- 日期時間 (Data and Time)
    -- datetime (1753/1/1~9999/12/31)
    -- datetime2 (0001-01-01~9999-12-31)
    -- smalldatetime (1900/1/1~2079/6/6)
    -- date (0001:01:01~9999:12:31)
    -- time (00:00:00.000000~23:59:59.999999)
 
  -- 字串
    -- char(n)  (1~8000 character)
    -- varchar(n)  (1~8000 character)
    -- varchar(max)  (1~(2 31) -1 character) (2GB)
    -- text  (1~(2 31) -1 character) (2GB) (已不建議使用)

  -- Unicode 字串 (2 bytes per character)
    -- nchar(n) (1~4000 character)
    -- nvarchar(n) (1~4000 character)
    -- nvarchar(max) (1~(2 30) -1 character) (2GB)
    -- ntext (1~(2 30) -1 character) (2GB) (已不建議使用)

  -- binary (二元碼字串)
    -- binary (n)
    -- varbinary (n)
    -- varbinary (max) (用來儲存 Word, Excel, *.gif, *.jpeg)
    -- image (已不建議使用)
 
  -- 貨幣
    -- money
    -- smallmoney

  -- 標記
    -- timestamp (sql 7.0)
    -- uniqueidentifier    
    -- rowversion (取代 timestamp, 紀錄資料更新的時間戳記)
   
  -- XML
    -- 在 SQL Server 中儲存 XML 格式的欄位, 內容是符合 XML 格式的文件。
    -- 資料的內容也可以利用 XML Schema 和 XML Query來規範及查詢。
    -- 相較於關聯式資料庫的正規化分析
   
  -- 空間資料
    -- 兩種資料型別:
       -- geometry (儲存平面資料)
       -- geography (儲存橢圓體資料, 例如 GPS 的經緯度座標)
    -- 線上叢書--> 『設計及實作空間儲存體』 主題
    -- GOOGLE MAP     

  -- 變數資料型別 (sql_variant,cursor,table)
    -- sql_variant
        -- 可存放各種資料型別,除了text,ntext,image,timestamp,sql_variant)
        -- e.g. (OK)
        DECLARE @var1 sql_variant,@var2 sql_variant
        SET @var1=65000
        SET @var2=34
        SELECT CAST(@var1 AS int)+CAST(@var2 AS tinyint)
      
        -- e.g. (NOT OK)
        DECLARE @var1 sql_variant,@var2 sql_variant
        SET @var1=65000
        SET @var2=34
        SELECT CAST(@var1 AS int)+@var2

    -- cursor  (**1)
    -- table 資料型別   (**2)
                                        -- (**1,**2 只能用在程式設計中)
---------------------------------------------------------------------------------------------
  -- 數值資料 (numeric, decimal)
    numeric(精確度p,小數位數s) 
     p: 1~38(不含小數點), s: -84~127

     numeric:代表+(1x10-130 ~ 9.99x10125)或
                -(1x10-130 ~ 9.99x10125)或0之實數
     numeric(p)=numeric(p,0)
    

  -- example:
    USE mis
    GO
   
    CREATE TABLE test2
    (product_name VARCHAR(25),
     procudt_price NUMERIC(4,2)
    )

    INSERT INTO test2 VALUES('p1',1);
    INSERT INTO test2 VALUES('P2',2.5);
    INSERT INTO test2 VALUES('p3',50.75);
    INSERT INTO test2 VALUES('P4',99.99);
   
    INSERT INTO test2 VALUES('P5',90.999);
       -- 查詢測試
    SELECT * FROM test2;
 
    -- 錯誤示範
    INSERT INTO test2 VALUES('P6',101.5);
   
        -- 練習: 猜猜看
    INSERT INTO test2 VALUES('P7',99.999);

  DROP TABLE test2;
----------------------------------------------------------------
 
 --日期型別
      . date (ANSI SQL-92)
      . datetime(SQL Server 2005)
       . ANSI 預設日期格式: yyyy.mm.dd
      . oracle 中文繁體環境預設日期格式: dd-MON-yy(yyyy)
      . SQL Server 預設日期格式: CAST() & CONVERT()
         -- example:
         select getdate()
       
         select convert(char(10),getdate(),101)   --U.S.
         select convert(char(10),getdate(),102)   --ANSI
         select convert(char(10),getdate(),111)   --JAPAN,TAIWAN

         -- 練習(新的日期函數:SysDateTime())
         select SYSDATETIME()

  -- Julian Dates (朱利亞日期)
       . 系統初始日定為 January 1, 4712 BC (理論上)
       . 實務上 1900.1.1
    -- example:
    CREATE TABLE test3
    (product_name VARCHAR(25),
     procust_price NUMERIC(4,2),
     purchase_date DATETIME
     );

    INSERT INTO test3 VALUES('p1',1,'11/12/2006');
    INSERT INTO test3 VALUES('P2',2.5,'2006-11-12');
    INSERT INTO test3 VALUES('p3',50.75,'2006.10.10');
    INSERT INTO test3 VALUES('P4',99.99,'06/11/02');

    SELECT * FROM test3;

    DROP TABLE test3;
-----------------------------------------------------------------------------

/* UNICODE */
-- What is unicode (Universal Character Set, UCS)
  --  一個標準, 把每個字元關聯到一個整數 (數值由 0 到 65536)
  -- Version : UCS2, UCS3, UCS4 beta
  -- 字元形別 (非 Unicode): char, varchar, text
  -- 字元形別 (Unicode)     : nchar,nvarchar,ntext
      --要把資料定義為 nchar 或是 nvarchar 時,在字串前加上大寫 N
      -- e.g.
      USE tempdb
      GO
      -------------------------- create table Customers
      CREATE TABLE Customers
      (cus_id    char(8)        PRIMARY KEY,
       cus_name   nvarchar(40)  )
     ----------------------------------- insert data into Customers
      INSERT INTO Customers
      VALUES ('C0001',N'國際標準公司')
     
      SELECT * FROM Customers
--------------------------------------------------------------------
/* 進階討論1 */
/* 二進位資料(binary)*/
  -- Varbinary(MAX) : 最大可到2G Bytes
    --example:
    use mis 
    go
              -- create table TbImage
    CREATE TABLE TbImage(       
    FileId int IDENTITY PRIMARY KEY,
    FileName nvarchar(60),
    FileType nvarchar(20),
    ImageFile varbinary(MAX))
    go 

              -- insert data into table TbImage use select clause
    INSERT INTO TbImage (FileName, FileType, ImageFile)
    SELECT 'img010.jpg' as FileName, 'JPG' as FileType,
    * FROM openrowset(bulk N'C:\IMG010.JPG', SINGLE_BLOB) as ImageFile

              -- 查詢驗證
    SELECT * FROM TbImage

              -- 使用驗證 (VS2012)
    VS2012-->檔案-->新增專案-->Windows Form 應用程式(c#) -->
    工具 --> 連接到資料庫
    工具箱 --> PictureBox --> DataBinds --> Image
                          --> SizeMode --> StrechImage

   
/* XML */

 

=================================================   

/* 隱含轉換 implicit conversion */
   -- CAST, CONVERT
=================================================

/* 習題: */
  -- create emp_sal 員工薪資檔(員工代號,本薪,職務津貼,交通津貼,膳食費)
  -- create emp_edu 員工訓練紀錄 (員工代號,受訓日期,課程名稱,概要)
  -- alter table  add reference constraint from table order_master to customer

=============================================================================== 
/* TEMPORARY TABLE (暫存資料表) */
   -- 會放在 tempdb 資料庫中
   -- 離線後會自動被刪除
   -- 種類:
      -- 區域暫存資料表: 以#開頭,只有建立者可以使用
      -- 全域暫存資料表: 以##開頭, 所有的使用者都可以使用
      
   -- example:(dbo,dbuser01)
   USE mis
   GO
  
   CREATE TABLE #order_1 (od_no char(8), qty int) --區域暫存資料表
   CREATE TABLE ##order_2 (order_no char(8), qty int) --全域暫存資料表
  
   CREATE LOGIN dbuser01
   WITH Password='123'      -- create a login account
  
   CREATE USER dbuser01 FOR LOGIN dbuser01 -- create a database account
  
      測試1: (dbo)
      SELECT * FROM #order_1
      SELECT * FROM ##order_2
     
      測試2: (變更身分 dbuser01 並從另一query/session 連接)
      新增查詢-->變更連接-->SQL Server 認證 (dbuser01/123) 登入
      執行:
     
      SELECT * FROM #order_1   --no go
      SELECT * FROM ##order_2  --ok
     
     
     
      

  /***************************
   *       特殊資料表        *
   ***************************/
   -- 寬型資料表
   -- 壓縮資料表
   -- FILESTREAM資料表
   -- 資料分割資料表

0 件のコメント: