SQL 基礎知識-表格、欄、列、索引、關聯、正規化
表格、欄、列

表格

  • 持有資料的資料庫結構
  • 包含特定實體類型的資料
  • 是一個具有列與欄特性的二維方陣
  • 每個列 - 欄文會的位置都有一個稱為數值的資料項目
  • 欄位數目至少為 1 , 列的數目沒有限制
  • 在資料庫中有獨特的名稱 (或者嚴格的說是一種綱要schema)

  • 每一欄都代表了表格實體類型的特定屬性(或特性)
  • 個欄的數值都有值域 , 它限定該欄中所能允許的數值集合 , (值域..資料型態、長度、格式、範圍、獨特性、特定數值、數值是否可為空值)
  • 欄位中的項目都是單一數值
  • 欄位的順序並不重要
  • 表格中的每欄都有可供辨識的獨特名稱 (其他表格可以使用相同的欄位名稱 辨識的方式就是 table.欄位名稱 )

 

  • 每一列都描逑了一個實體的真相 , 例如特殊的學生或設備
  • 在每個表格欄位,中每一列都含有一個數值或是空值
  • 列的順序 (由下至上)並不重要
  • 表格中不能有完全相同的列
  • 表格中的每一列都是由主索引鍵來識別
  • DBMS使用兩種類型的表格
    • 1.使用者表格(User table):儲存了使用者定義的資料
    • 2.系統表格(System table):包含了資料格式(metadata)
  • 實際上,表格中的列的數目是不斷在改變,但欄的數目卻少有改變。資料庫的複雜程度會讓新增或刪除欄位的困難的增加 ; 欄的變更可能會影響到索引鍵、參考完整性與權限等項目。然而新增增或刪除列並不影響。
  • 資料庫設計時可能根據使用者需求將數值劃分為許多欄。舉電話號碼來說可能存為單一欄位tel_no , 或是劃分為country_code 、 area_code 、 與subscriber_number來組成一個電話號碼。
  • 試算表與表格間並沒有什麼相似之處。和試算表不同的是 , 表格中的列與欄的順序對它而言並無影響、不進行計算,也不允許不規則的資料 項目,並強烈要求每個數值的合法性,而且可以輕易的與其他表格建立關聯。
  • SQL標淮對關聯式資料庫的結構定義了階層。一個目錄(catalog)中含有一個以上的綱要(schema)(由特定使用者擁有的物件及資料的集合)。一個 綱要中含有一個以上的物件 (objdct)(基本表格、檢視表(view)與列行工作[函式/程序]
主索引鍵
  • 資料庫中每個數值都必須可以被存取 , 資料被儲存在表格中列與欄交集的位置 , 因此 , 一個數值的位置必須與特定的表格、 欄列相關。利用它的獨特名稱便可以辨別表格或欄。然而列並沒有被命名 , 它需要一個稱為主索引鍵的不同辨識機制
  • 必須的:每個表格都具有一個主索引鍵。如果沒有主索引鍵,有些資料便無法存取。
  • 獨特的:因為主索引鍵是用來辨別表格中的特定列,因此表格中的任二列不得擁有相同的主索引鍵值
  • 簡單或複合:
    • 簡單索引鍵:在一個表格使用一個欄位做索引鍵
    • 複合索引鍵:在一個表格中使用多個欄位做索引鍵
  • 不能為空值:主索引鍵必須要有值。複合索引鍵中所有欄都必須要有值
  • 不常變動的:一旦被建立後 , 主索引鍵值就很少被修改
  • 最小化的:主索引鍵值只含有用來識別所需的最少欄位
外部索引鍵
  • 與不同實體相關的資訊被儲存在不同的表格中 , 因此必須要有 個能夠在表格間查詢的方法。關聯式模型提供了一個稱為外部索引鍵的機制將表格聯繫在一起
  • 它是表格中的一個 (或一組)欄 , 而它的數值與其他表格中的數值有關
  • 它確保表格中的某一列能夠在另一個表格中找到相對應的列
  • 具有外部索引鍵的表格是一個參照(referencing)或子表格。而其他表格敗為被參照(referenced)或父表格。
  • 外部索引鍵與父表格的主索引鍵(或其他候選索引鍵)建立了直接的關聯 , 因此外部索引鍵的值被限制在現有的父索引鍵的值。 這個這個限制稱為參考性完整
  • 外部索引鍵具有與父索引鍵相同的值域
  • 和主索引鍵不同的是 , 外部索引鍵的值可以是空值
  • 外部索引鍵的欄位名可以與父索引鍵的欄位名稱不同
  • 外部索引鍵的數值在它們的表格上通常不是唯一的
  • 外部索引鍵可以參考它所屬的表格的主索引鍵。這類的表格稱為自我參照
關聯性
  • 一對一
    • 在一對一中 , A表格中的每一列最多只能對應到B表格中的一個列;而B表格中的每一列最多只能對應到 A表格中的一個列。
    • 這樣的做法的理由可能基於安全性考量而將機密資料分離、將表格分離以加速查詢、避免在表格中插入空值。
    • 一個表格的主索引鍵參考到其他表格的主索引鍵就是一對一了...
  • 一對多
    • 在一對多中 , A表格中的每一列在B表格中可以有多個對應列 , 在B表格中的每一列在A表中只有一個對應列
    • 當一個表格的主索引鍵是多個表格的外部索引鍵時 , 便建立一對多關聯性
  • 多對多
    • 在多對多關聯性下 , A表每一列可以對應B表格的多個 , 而B表格每一列亦可以對應A表格中的多個列
    • 多對多只有當稱為聯合表格(junction table)的第三個表格被創造時才會被建立
    • 聯合表格的複合主索引鍵是由兩個表格的主索引鍵所組成 ; 複合索引鍵中的每一欄位 , 在單獨使用時便是外部索引鍵。 此種技術對聯合表格中的每一列產生唯一的數值 , 並將多對多關聯性分離成兩個獨立的一對多關聯聯性
正規化
  • 第一正規化
    • 每欄只含有一個數值
    • 沒有重複群組
  • 違反第一正規化的問題
    • 在列欄交集的位置含有多個數值,這表示表格名稱、欄位名稱、興索引鍵值的組合還不足以找出資料庫中的任意數值。
    • 要取得、插入、修改或刪除單一數值(在多個數值中)是很困難的,因為必須欄據這些數值的順序來操作
    • 查詢動作很複雜
    • 原本由下一級正規化所能解決的問題會變得無法解決
  • 第二正規化
    • 它的主索引鍵是單一欄位(它並不是複合索引鍵)
    • 表格中所有欄位都是主索引鍵的一部分
    • 滿足2NF的表格是完全功能相依
      完全功能相依:當任何複合索引鍵值改變時,非索引鍵欄位的數值也需要修改。
      部分功能相依:當某些複合索引鍵的值決定了非索引鍵欄位的數值。
    • 一個滿足2NF的表格是完全功能相依關係(fully functional dependent) , 這表示當任何複合索引鍵值改變時 , 非索引 鍵欄位的數值也需要修改
  • 第三正規化
    • 不具遞移相依性(transitive dependency),在3NF的表格中,非索引鍵的欄位互不相關,只和主索引鍵相關
      遞移相依性:非索引鍵的數值決定了另一個非索引鍵欄位的數值時
反正規化
  • 正規化越多,表格數目越多-->耗費大量計算能力的合併動作以及磁碟機讀寫動作
  • 一個反正規化的資料庫通常比正規化的資料庫還難理解
  • 在查詢時的速度較快,但是修改時的速度較慢
  • 插入不一致資料的風險增加
SQL 基 礎

SQL 語法

			--Retrieve authors from New York
			SELECT au_fname, au_lname
			   FROM authors
			   WHERE state = 'NY'
			   ORDER BY au_lname;
            
  • 註解 (comment): -- 開始 直到該行結束
  • 陳述式 (statement):由許多關鍵字開頭的標記(token),(token)包含關鍵字、識別項、運算子、文字符號、常數、標點符號
  • 子句 (clause):一個SQL statement 含有一個以上的子句。以上列來說使用了以
    SELECT au_fname, au_lname
    FROM authors
    WHERE state = 'NY'
    ORDER BY au_lname這四個子句
  • 關鍵字 (keyword):
  • 識別項 (Identifier):
  • 結束分號 (Terminating semicolon);一個statement是以 ; 做為結束的

識別項

  • 在資料庫伺服器中的資料庫名稱必須是唯一的
  • 在特定綱要(或資料庫)中的表格與檢視表的名稱必須是唯一的
  • 在特定表格或檢視表中的料欄位、索引鍵、索引與限制的名稱必須是唯一的
  • SQL Server索引名稱只需在該表格中是唯一 , 但Oracle與DB2中的索引名稱卻必須在整個資料庫中是唯一

暫存表
'************************ 建立暫存表格只需使用#指令 , 在ACCESS不支援暫存表格

sql = "CREATE TABLE #HotelTemp(SID numeric,ename ntext,ewkind ntext,ehkind ntext,etinfo ntext,star ntext,imgh ntext,ehinfo ntext,imgMapEA ntext,imgMapEB ntext,imgMapEC ntext)"

conn_Kwell.Execute(sql)

For i = 1 to 300
Nttext = Nttext+"I"
Next

Sqlinsert = "Insert into #HotelTemp(SID,ename,ewkind,ehkind,etinfo,star,imgh,ehinfo,imgMapEA,imgMapEB,imgMapEC) Values('1','"&Nttext&"','33','44','55','66','77','88','99','100','111')"
conn_Kwell.execute(Sqlinsert)

'************************ TEMP TEST
Set rsTemp = Server.CreateObject("ADODB.RecordSet")
SQLSelect = "Select * from #HotelTemp"
rsTemp.open SQLSelect,conn_KWELL,1,1

while not rsTemp.eof
Response.write rsTemp("ename")&"
" rsTemp.MoveNext wend Response.write Nttext Set conn_Kwell = nothing