數據庫複習—表和數據完整性

表和數據完整性

  1. 表是SQL Server數據庫中最重要的數據對象,也是構建高性能數據庫的基礎。在程序開發與應用過程中,表是存儲數據的基本單元。
  2. 數據表的設計的優劣將影響磁盤空間使用效率、數據處理時內存的利用率以及數據的查詢效率。
  3. 數據完整性則是保證表中數據正確與完整的關鍵。
3.1 SQL Server 2005 的數據類型
  1. 數據庫中的所有數據都存放在按行與列格式組織的表中,數據類型是數據的一種屬性,決定數據存儲的空間和格式。
  2. 數據類型可以爲對象定義4個屬性:
  • 對象包含的數據種類
  • 所存儲值佔有的空間(字節數)和數值範圍
  • 數值的精度(僅適用於數值類型)
  • 數值的小數位數(僅適用於數值類型)
  1. SQL Server 2005提供的數據類型可以歸納爲:數值類型、字符類型、日期時間類型、貨幣類型和其他數據類型。
3.1.1 數值類型
  1. 精確數值類型
    用來存儲沒有小數位的整數或定點小數。
    任何算術運算符都可以操作數值。
    在這裏插入圖片描述
  2. 近似數值類型
    存儲十進制值,用於表示浮點數據。
    對小數點右邊的數進行四捨五入。只有在精確數據類型不夠大,不能存儲數值時,才考慮使用float。
    在這裏插入圖片描述
3.1.2 字符類型
  1. 字符類型是用於存儲字符型數據的。
  2. Unicode標準使用2個字節來表示每個字符。
  3. 在SQL Server 2005中,Unicode數據以nchar、nvarchar和ntext數據類型存儲。定義一個字符數據類型時,指定該列允許存儲的最大字節數。
    在這裏插入圖片描述
3.1.3 日期時間類型
  1. 日期時間類型數據,可具體分爲datatime與smalldatetime兩種類型。datatime和smalldatetime數據類型在計算機內部是作爲整數存儲的。
  2. datetime類型存儲爲一對4字節整數,它們一起表示自1753年1月1日午夜12點鐘經過的毫秒數。
  3. smalltime類型存儲爲一對2字節整數,它們一起表示自1900年1月1日午夜12點鐘經過的分鐘數。
    在這裏插入圖片描述
3.1.4 貨幣類型
  1. 貨幣數據類型旨在存儲精確到4個小數位的貨幣值。
    在這裏插入圖片描述
3.1.5 其他數據類型
  1. 二進制數據類型
    在這裏插入圖片描述
  2. 特殊數據類型
    SQL Server 2005還提供了7種特殊數據類型,包括cursor、sql_variant、timestamp、table、uniqueidentifier與xml。
  • timestamp 用於表示SQL server 活動的先後順序,以二進投影的格式表示。timestamp 數據與插入數據或者日期和時間沒有關係。
  • bit 由 1 或者 0 組成,當表示真或者假、on 或者 off 時,使用 bit 數據類型。
  • uniqueidentifier 由 16 字節的十六進制數字組成,表示一個全局唯一的。
  • 當表的記錄行要求唯一時,GUID是非常有用。
  1. 自定義數據類型
  • SQL Server 2005允許用戶根據自己的需要自定義數據類型(UDT),並可以用此數據類型來聲明變量或列。
  • 自定義類型提供了一種可以將更能清楚地說明對象中值的類型的名稱應用於數據類型的機制,這使程序員或數據庫管理員能夠更容易地理解用該數據類型定義的對象的用途。
3.2 表的創建與維護
3.2.1 表的類型
  1. 按照表的用途分類
    (1)系統表
    (2)用戶表
    (3)已分區表
  2. 按照表的存儲時間分類
    (1)永久性
    (2)臨時表
  • 所有臨時表都是在tempdb數據庫中創建的
  • 通過使用create table命令並在表名前添加一個字符(#),可以創建局部臨時表
3.2.2 表的創建
  1. 利用Transaxt-SQL語句創建數據表
    create table 的語法格式如下:
    create table [database_name.[schema_name].|schema_name.]table_name
    ({<column_dfinition>| computed_column_definition>}
    [<table_constraint>][,…n])
    [ON{partition_scheme_name(partition_column_name)
    | filegroup | “default”}]
    [{TEXTIMAGE_ON{filegroup|“default”}}[;]

例3.1
利用CREATE TABLE命令建立課程信息表course,表結構如表所示。
在這裏插入圖片描述
create table teaching.dbo.course(
courseno nchar(6) not null,
cname nchar(20) null,
type nchar(8) null,
credit numeric(4,1) null,
constraint pk_course primary key
clustered(courseno asc))
on [primary]

其中,pk_course 表示創建主鍵時的索引名稱,可以是任意標識符。
clustered 項表示聚集索引類型
asc表示按courseno值升序方式排列數據,若是desc則表示降序
例3.2
利用CREATE TABLE命令建立學生分數表score,表結構如表所示。該表中主鍵由兩個列構成。 在這裏插入圖片描述
create table score teaching.dbo.score(
studentno nchar(10) not null,
coureno nchar(6) not null,
usually numeric(6,2) null,
final numeric(6,2) null,
constraint pk_score primary key
clustered (studentno asc,courseno asc))

將studentno, courseno列都設爲主鍵
例3.3
利用CREATE TABLE命令建立教師信息表teacher,表結構如表所示。
在這裏插入圖片描述
create table teaching.dbo.teacher(
teacherno nchar(6) not null,
tname nchar(8) null,
major nchar(10) null
prof nchar(10) not null,
department nchar(12) null,
constraint pk_teacheer primary key
clustered (teacherno asc))

圖形界面方式,生成sql代碼
在這裏插入圖片描述
USE [teaching]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[class](
[classno] nchar NOT NULL,
[classname] nchar NULL,
[department] nchar NULL,
[monitor] nchar NULL,
CONSTRAINT [PK_class] PRIMARY KEY CLUSTERED
(
[classno] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

例3.5
在這裏插入圖片描述
create table teaching.dbo.teach_class(
teacherno nchar(6) not null,
classno nchar(6) not null,
courseno nchar(6) not null,
constraint pk_teaching_class primary key
clustered(teacherno asc,classno asc,courseno asc))

  1. 爲數據表輸入數據
    圖形操作界面:“打開”表,開始輸入數據。
3.2.3 數據瀏覽
  1. 在查詢窗口中瀏覽表數據
    “打開”表,即可查看
  2. 利用Transact-SQL語句在查詢窗口中瀏覽表數據
    select *from course
3.2.4 表結構的修改
  1. 在SQL Server Management Studio中修改表結構
  2. 利用Transact-SQL語句修改表結構
    alter table的語法格式如下:
    alter table [database_name.[schema_name].|schema_name.]table_name
    {alter column column_name
    {[type_schema_name.]type_name[(precision[,scale]|max|xml_schema_collection})]
    [collate collation_name][null|not null]
    |{add|drop}{rowguidcol|persisted}
    |[with{check|nocheck}]add
    {<column_definition>|<computed_column_definition>
    |<table_constraint>}[,…n]
    |drop
    {[constraint] constraint_name
    [with(<drop_clustered_constraint_option>[,…n])]
    |column column_name}[,…n]}[;]

例3.6
在test01數據庫中創建一個新表student1,然後修改其列屬性。
create table student1
(column_grade int) --創建新表
go
exec sp_help student1 --查看錶的信息
go
alter table student1
add
column_class varchar(20) null --添加列
go
exec sp_help student1
go
alter table student1
drop column
column_grade --刪除列
go
exec sp_help student1
go

例3.7
修改test01中表student1的列column_class數據類型和名稱。
use test01
go
alter table student1
alter column
column_class char(20) not null
go
exec sp_rename ‘student01.column_class’,‘st_class’
go

3.2.5 表數據的修改
  1. 利用insert語句輸入數據
    insert 語句的語法格式如下:
    insert [top(expression)[percent]]
    [into] {|rowset_function_limited
    [with(<table_hint_limited>[…n])]}
    {[(column_list)] []
    {values({default|null|expression}[,…n])
    |derived_table|execute_statement}}
    |default values [;]

例3.8
向teaching數據庫中的score表中添加數據。
insert into score
(usually,courseno,final,studentno)
values(79,‘c05109’,91,‘0937221508’)
insert into score
value(‘0824113307’,‘c05127’,93,78)

  1. 利用update語句更新表數據
    update 語句的基本語法格式如下:
    update [top(expression)[percent]]
    {|rowset_function_limited
    [with(<table_hint_limited>[…n])]}
    set
    {column_name=expression|default|null}
    }[,…n][<output_clause>][from{<table_source>}
    [,…n]][where{<search_condition>}][;]

例3.9
更改teaching數據庫中的score表中的學號爲0824113307、課程號爲c05127的期末成績修改爲87。
update score
set final=87
where studentno=‘0824113307’ and
courseno=‘c05127’

例3.10
爲數據庫test01中表student1輸入3行數據,然後將列st_class的值全部改爲jsj1012。
insert into student1
values(‘jixie0809’)
insert int student1
values(‘huag0902’)
insert into student1
values(‘txun0912’)
go
update student1
set st_class = ‘jsj1012’
go

  1. 利用delete 語句刪除表中數據
    delete 語句的基本語法格式如下:
    delete [top(expression)[percent]]
    [from] {|rowset_function_limited
    [with(<table_hint_limited>[…n])]}
    [] [from<table_sourde>
    [,…n]]
    [where {search_condition>}] [;]

例3.11
刪除數據庫test01中表student1的列st_class的值爲jsj1012的行。
delete from student1
where st_class=‘jsj1012’

  1. 利用Truncate Table語句刪除表中數據
  • Truncate Table語句從一個表中刪除所有行的速度要快於delete。語句格式如下:
    Truncate table table_name
  • 若要刪除表中的所有行,則Truncate Table語句是一種快速、無日誌記錄的方法
3.2.6 刪除表
  1. 在SQL Server Management Studio中刪除數據表
  2. 利用Transact-SQL語句刪除數據表
    利用Transact-SQL語句drop table 就可刪除數據表定義及表的所有數據、索引、觸發器、約束和指定的權限。其語法格式如下:
    drop table[database_name.[schema_name].|schema_name.]table_name[,…n][;]
3.3 數據的完整性

數據的完整性是指數據的精確性和可靠性,是爲防止數據庫中存在不符合語義規定的數據,防止因錯誤信息的輸入、輸出而造成無效的操作或錯誤信息而提出的,數完整性在數據庫管理系統中是十分重要的。

3.3.1 數據完整性的類型
  • 域(domain)完整性
  • 實體(entity)完整性
  • 引用完整性
  • 用戶定義完整性
3.3.2 約束
  1. SQL Server 2005支持的約束類型
    (1)not null 約束
    (2)primary key約束:標識具有唯一標識表中行的值的列或列集。
    (3)foreign key約束:外鍵用於建立和加強兩個表數據之間的連接的一列或多列。
    (4)unique約束:強制實施列集中值的唯一性
    (5)check約束:通過限制可放入列中的值來強制實施域完整性。
  2. 在SQL Server Management Studio中創建約束
    (3)創建foreign key約束
    打開外鍵表,點擊關係→添加→表和列規範→選擇主鍵表和外鍵表及所有共有的列→確定。
    (4)創建unique約束
    打開表→管理索引和鍵→添加→是唯一的(是)→關閉
    (5)創建check約束
    打開表→管理check約束→添加→表達式(sex=‘男’ or sex=‘女’)→確定
  3. 利用Transact-SQL語句創建或修改約束的語法格式如下:
    <table_constraint>::=[constraint constraint_name]
    [with{check|nocheck}]
    add {table_constraint>}[,…n]
    |drop {[constraint]constraint_name
    |column column_name}[,…n]
    |check|nocheck}constraint
    {all|constraint_name[,…n]}

例3.14
爲數據庫teaching中的班級表class的列classno創建FOREIGN KEY 約束,並將其中的classname、department、monitor的“允許空”修改爲NOT NULL。
alter table class
add constraint pk_class primary key
clustered(classno asc)
go
alter table class
alter column classname nchar(12) not null
go
alter table class
alter column department nchar(12) not null
go
alter table class
alter column monitor nchar(8) not null
go

例3.15
爲數據庫teaching中的成績表score的兩個列usually和final添加CHECK約束,限定其值在0~100範圍內。
alter table score
add constraint ck_usually
check(usually>=0 and usually<=100),
constraint ck_final
check(final>=0 and final<=100)
go

例3.16
爲數據庫teaching中的學生信息表student的列Email創建一個UNIQUE約束。
alter table class
add constraint u_Email unique
nonclustered(Email)
go

例3.17
爲數據庫teaching中表score的列studentno創建一個FOREIGN KEY約束。
alter table score
with check
add constraint fk_sc_stud foreign key
(studentno)
references student(studentnno)
go

  1. 刪除約束
    通過Transact-SQL語句也可以刪除約束,刪除約束的語法格式如下:
    alter table table_name
    drop constraint constraint_name
    { all|constraint_name[,…n]}

例3.18
利用命令刪除爲數據庫teaching中表score的一個約束FK_score_student1。
alter table score
drop constraint fk_score_student1

  1. 禁止使用約束
    禁止約束就是禁止使用在現有數據上的約束檢查。
    (1)禁用在現有數據上的約束檢查;
    (2)在加載新數據時禁用約束檢查。
3.3.3 規則
  1. 使用create rule命令創建規則
    語法格式如下:
    create rule
    [schema_name.] rule_name
    as condition_expression [;]

例3.19
爲數據庫teaching創建一條規則score_rule,該規則規定凡是分數類的列值必須在0~100之間。
use teaching
go
create rule score_rule
as @score between 0 and 100
go

  1. 綁定規則
    規則是一種獨特的對象。要使之生效,必須用sp_bindrule將其與表中的列綁定。
    綁定規則的語句格式:
    sp_bindrule [@rulename=]‘rule’,
    [@objname=]‘object_name’
    [,[@futureonly=]‘futureonly_flag’]

例子
use teaching
exec sp_bindrule ‘score_rule’,‘score.usually’

3. 解除列上綁定的規則
解除規則的綁定sp_unbindrule存儲過程,sp_unbindrule存儲過程的語法格式如下:
sp_unbindrule[@objname=]‘object_name’
[,[@futureonly=]‘futureonly_flag’]

例如
例如,要解除綁頂定到score表的usually列上的規則,可以使用以下Transact-SQL語句:
use teaching
go
exec sp_unbindrule ‘scroe.usually’

  1. 解除規則
    解除規則綁定後,就可以用drop rule 語句刪除規則score_rule了。
    drop rule score_rule
3.3.4默認值

默認值是一種數據庫對象,屬於逐步取消的數據完整性手段。

  1. 使用create default 命令創建默認值
    語句格式如下:
    create default
    [schema_name.]default_name
    as constraint_expression[;]

例如
例如,在teaching數據庫中創建一個type_default默認值對象的程序代碼如下:
create default type_default as ‘必修’
2. 利用存儲過程綁定默認值
在創建默認值後,必須將它與特定表的列綁定後才能使之發揮作用。用sp_bindefault存儲過程綁定默認值到列。sp_bindefault存儲過程的語法格式如下:
sp_bindefault[@defname=]‘default’,
[@objname=]‘object name’
[[@futureonly=]‘futureonly flag’]

例如
例如,將上面的type_default默認值對象綁定course表的type列上,可以用以下Transact-SQL語句。
exec sp_bindefault ‘type_default’,‘course.type’

  1. 解除默認值對象的綁定
    刪除默認值對象時,首先要執行sp_unbindefault存儲過程,取消默認值對象的綁定,然後執行drop default語句刪除默認值對象。
    解除默認值對象綁定的sp_unbindefault存儲過程語法格式如下:
    sp_unbindefault[@objname=]‘object_name’
    [,[@futureonly=]‘futureonly_flag’]

例如
exec sp_unbindefault ‘course.type’

  1. 刪除默認值對象
    刪除默認值語法格式:
    drop default {default_name}[,…n]
3.3.5 強制數據的完整性

通過以下兩種方法可以強制數據庫完整性:
(1)由聲明保證的數據完整性。聲明數據完整性是指定義數據標準,規定數據必須作爲對象定義的一部分,SQL Server 2005將自動確保數據符合標準。實現基本數據完整性的首選方法是使用由聲明保證的完整性。
(2)過程定義數據完整性。使用過程保證的數據完整性,即可以通過編寫腳本來定義數據必須滿足的標準,並執行這個標準。在SQL Server 2005中可以通過使用觸發器和存儲過程來實現過程定義數據完整性。

3.4 數據庫關係圖

數據庫關係圖(database diagram)是數據庫中對象的圖形表示形式。
數據庫對象圖包括表對象、表所包含的列以及它們之間的相互關聯的情況。
可以通過創建關係圖或打開現有的關係圖來打開數據庫關係圖設計器

  1. 創建數據庫關係圖
    新建數據庫關係圖→選擇所需的表,添加→繼續添加或刪除表→
  2. 在數據庫關係圖中修改數據庫對象
    展開數據庫關係圖,選擇→表視圖|標準、列名或鍵命令→輸入新的列名→
  3. 數據庫關係圖中的要素
    (1) 表功能
    A. 標題欄:顯示錶的名稱;
    B. 行選擇器:選擇表中的數據庫列;
    C. 屬性列:僅在表的某些視圖中可見。
    (2) 在數據庫關係圖中,每個關係都可以帶有3種不同的功能:終結點、線型和相關表。
    A. 終結點如果某個關係在一個終結點處有鍵,在另一個終結點處有無窮符號,則該關係是一對多關係。如果某個關係在每個終結點處都有鍵,則該關係是一對一關係。
    B. 線型線本身表示當向外鍵表添加新數據時,DBMS是否強制關係的引用完整性。如果爲實線,則在外鍵表中添加或修改行時,DBMS將強制關係的引用完整性。如果爲點線,則在外鍵表中添加或修改行時,DBMS不強制關係的引用完整性。
    C. 相關表關係線表示兩個表之間存在外鍵關係。對於一對多關係,外鍵表是靠近線的無窮符號的那個表。如果線的兩個終結點連接到同一個表,則該關係是自反關係。可以打開數據庫關係圖以查看或編輯關係圖的結構。
  4. 查看數據庫關係圖
    查看數據庫關係圖的步驟如下:
    (1)在對象資源管理器中,右擊相應數據庫的“數據庫關係圖”節點下的已經建成的數據庫關係圖。
    (2)在彈出菜單中,單擊“修改”命令。即可查看和修改選擇的關係圖。
    (3)或者在對象資源管理器中,展開“數據庫關係圖”文件夾。雙擊要打開的數據庫關係圖的名稱。
    由此可見,數據庫關係圖還是一種可視化工具,可用於對所連接的數據庫進行設計和可視化處理。
3.5 數據的導入和導出
3.5.1 數據轉換概述
  1. SQL Server 2005 Integration Services (SSIS)是一種企業數據轉換和數據集成解決方案,用戶可以以此從不同的數據源提取、轉換、複製及合併數據,並將其移至單個或多個目標。SSIS的典型用途如下。
  • 合併來自異類數據存儲區的數據,包括文本格式、Excel和Access等數據。
  • 自動填充數據倉庫,進行數據庫的海量導入、導出操作。
  • 對數據的格式在使用前進行數據標準化轉換。
  • 將商業智能置入數據轉換過程。
  • 使數據庫的管理功能和數據處理自動化。
  1. Integration Services 的數據轉換類型
    數據轉換將輸入列中的數據轉換爲其他數據類型,然後將其複製到新的輸出列。例如,可從多種數據源中提取數據,然後用此轉換將列轉換爲目標數據存儲所需的數據類型。如果需要配置數據轉換,可以採用下列方法:
  • 指定包含要轉換的數據的列和要執行的數據轉換的類型。
  • 指定轉換輸出列是使用 Microsoft SQL Server 2005 Integration Services (SSIS) 提供的不區分區域設置的較快分析例程,還是使用標準的區分區域設置的分析例程
    Integration Services 數據引擎支持具有多個源、多個轉換和多個目標的數據流。利用數據轉換,開發人員可以方便地生成具有複雜數據流的包,而無需編寫任何代碼。
  1. SQL Server數據的導入導出嚮導
    SQL Server 導入和導出嚮導提供了最低限度的數據轉換功能。
    (1)嚮導的主要功能是複製數據。是快速創建在兩個數據存儲區間複製數據的Integration Services 包的最簡單方法。
    (2)在SQL Server2005中的新增功能。通過使用 SQL Server 導入和導出嚮導創建的已保存的包可以在Business Intelligence Development Studio 中打開,並可以使用 SSIS 設計器進行擴展。
    (3)訪問的數據源。SQL Server 導入和導出嚮導可以訪問下列類型的數據源:SQL Server、平面文件、Access、Excel以及其他 OLE DB訪問接口。此外,還可以將ADO.NET用作源。
  2. 啓動 SQL Server 導入導出嚮導的常用方法
    在 Business Intelligence Development Studio 中,右鍵單擊“SSIS包”文件夾,再單擊“SSIS導入和導出嚮導”。
    在 Business Intelligence Development Studio 中的“項目”菜單上,單擊“SSIS 導入和導出嚮導”。
    在 SQL Server Management Studio 中,連接到數據庫引擎服務器類型,展開數據庫,右鍵單擊一個數據庫,指向“任務”,再單擊“導入數據”或“導出數據”。
3.6 小結

重點掌握如下幾方面的基本操作。

  • 各種數據類型的特點和用途。
  • 數據庫表結構的創建、修改和刪除等基本操作和命令。
  • 表數據的插入、更新和刪除。
  • 如何在創建表時進行數據完整性的設置。
  • 各種數據格式之間的轉換。

附件:
使用到的數據庫:
https://pan.baidu.com/s/1Lmbw_qSmC04wnPUUgwSKRA
提取碼:djsz

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章