數據庫基礎第三章:數據表管理


一、數據類型

 

 

Character 字符串:

數據類型 描述 存儲
char(n) 固定長度的字符串。最多 8,000 個字符。 n
varchar(n) 可變長度的字符串。最多 8,000 個字符。  
varchar(max) 可變長度的字符串。最多 1,073,741,824 個字符。  
text 可變長度的字符串。最多 2GB 字符數據。  

Unicode 字符串:

數據類型 描述 存儲
nchar(n) 固定長度的 Unicode 數據。最多 4,000 個字符。  
nvarchar(n) 可變長度的 Unicode 數據。最多 4,000 個字符。  
nvarchar(max) 可變長度的 Unicode 數據。最多 536,870,912 個字符。  
ntext 可變長度的 Unicode 數據。最多 2GB 字符數據。  

Binary 類型:

數據類型 描述 存儲
bit 允許 0、1 或 NULL  
binary(n) 固定長度的二進制數據。最多 8,000 字節。  
varbinary(n) 可變長度的二進制數據。最多 8,000 字節。  
varbinary(max) 可變長度的二進制數據。最多 2GB 字節。  
image 可變長度的二進制數據。最多 2GB。  

Number 類型:

數據類型 描述 存儲
tinyint 允許從 0 到 255 的所有數字。 1 字節
smallint 允許從 -32,768 到 32,767 的所有數字。 2 字節
int 允許從 -2,147,483,648 到 2,147,483,647 的所有數字。 4 字節
bigint 允許介於 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之間的所有數字。 8 字節
decimal(p,s)

固定精度和比例的數字。允許從 -10^38 +1 到 10^38 -1 之間的數字。

p 參數指示可以存儲的最大位數(小數點左側和右側)。p 必須是 1 到 38 之間的值。默認是 18。

s 參數指示小數點右側存儲的最大位數。s 必須是 0 到 p 之間的值。默認是 0。

5-17 字節
numeric(p,s)

固定精度和比例的數字。允許從 -10^38 +1 到 10^38 -1 之間的數字。

p 參數指示可以存儲的最大位數(小數點左側和右側)。p 必須是 1 到 38 之間的值。默認是 18。

s 參數指示小數點右側存儲的最大位數。s 必須是 0 到 p 之間的值。默認是 0。

5-17 字節
smallmoney 介於 -214,748.3648 和 214,748.3647 之間的貨幣數據。 4 字節
money 介於 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之間的貨幣數據。 8 字節
float(n) 從 -1.79E + 308 到 1.79E + 308 的浮動精度數字數據。 參數 n 指示該字段保存 4 字節還是 8 字節。float(24) 保存 4 字節,而 float(53) 保存 8 字節。n 的默認值是 53。 4 或 8 字節
real 從 -3.40E + 38 到 3.40E + 38 的浮動精度數字數據。 4 字節

Date 類型:

數據類型 描述 存儲
datetime 從 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度為 3.33 毫秒。 8 bytes
datetime2 從 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度為 100 納秒。 6-8 bytes
smalldatetime 從 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度為 1 分鍾。 4 bytes
date 僅存儲日期。從 0001 年 1 月 1 日 到 9999 年 12 月 31 日。 3 bytes
time 僅存儲時間。精度為 100 納秒。 3-5 bytes
datetimeoffset 與 datetime2 相同,外加時區偏移。 8-10 bytes
timestamp 存儲唯一的數字,每當創建或修改某行時,該數字會更新。timestamp 基於內部時鍾,不對應真實時間。每個表只能有一個 timestamp 變量。  

其他數據類型:

數據類型 描述
sql_variant 存儲最多 8,000 字節不同數據類型的數據,除了 text、ntext 以及 timestamp。
uniqueidentifier 存儲全局標識符 (GUID)。
xml 存儲 XML 格式化數據。最多 2GB。
cursor 存儲對用於數據庫操作的指針的引用。
table 存儲結果集,供稍后處理。

二、數據表管理

表是存儲各種數據的載體,具有以下特點:

 在特定的數據庫中表名是唯一的,在特定的表中,列名是唯一的,但不同的表可以有相同的
列名。兩者的唯一性都是由 SQL Server 強制實現的。

 表是由行和列組成的,行又稱為 記錄,列被稱為 字段。行和列的次序是任意的。
 每個表最多有 1024 列。

數據行在表中是唯一的, 行的唯一性可以通過定義主鍵來實現。

一般來說,在一個表中,不允許有兩個完全相同的行存在。

2.1. 創建數據表

在創建數據表之前,需要定義表中的列(字段)的名稱,同時還需要定義每列的數據類型和寬
度。數據類型指定了在每列中存儲的數據的類型,例如文本、數字、日期等。寬度指定了可以向列中
輸入多少個字符或數字,也可以使用用戶自定義類型數據。除此之外,還需要設定表中列是否允許為
空,是否有默認值,是否設置為標識列等。下面以創建“客房類型”表為例來介紹幾個與創建表結構
相關的概念。圖 3-1 是在 SQL Server Management Studio 中使用圖形化方式創建數據表,圖書信息表
中的字段有:編號、圖書名稱、作者、出版社、價格、ISBN。其結構和數據如圖 3-2 所示。

( 1) 列的屬性

表的列名在同一個表中具有唯一性,同一列的數據屬於同一種數據類型。除了用列名和數據類型
來指定列的屬性外,還可以定義其它屬性:如 NULL(空值)屬性、NOT NULL(不為空)屬性和
IDENTITY(標識列) 屬性、默認約束、空值約束。

2.1.1、NULL 或 NOT NULL

如果表的某一列被指定具有 NULL 屬性,那么就允許在插入數據時省略該列的值。反之,如果表的
某一列被指定具有 NOT NULL 屬性,那么就不允許在沒有指定列缺省值的情況下插入省略該列值的數
據行。如圖 3-3 中,定義圖書信息表的表結構,分別定義列名、該列的數據類型和該列是否允許為空。

當勾選“允許 Null 值”時,表示允許為空,即該列數據可以不添加數據,反之,該列必須添加數據。

2.1.2、IDENTITY

IDENTITY 屬性可以使表的列包含系統自動生成的數字。這種數字在表中可以唯一標識表的每一
行,即表中的每一行數據在指定為 IDENTITY 屬性的列上的數字均不相同。指定了 IDENTITY 屬性的列
稱為 IDENTITY 列。當用 IDENTITY 屬性定義一個列時,可以指定一個初始值和一個增量。插入數據到
含有 IDENTITY 列的表中時,初始值在插入第一行數據時使用,以后就由 SQL Server 根據上一次使用
的 IDENTITY 值加上增量得到新的 IDENTITY 值。如果不指定初始值和增量值,則其缺省值均為 1。
對於 IDENTITY,必須注意以下幾點:

a) IDENTITY 屬性只適用於整型類型的列;

b) 一個表最多只能設置一個 IDENTITY 屬性;

c) IDENTITY 屬性的列中每個單元格中值無需人為添加或修改;

d) IDENTITY 屬性列中的編號,一旦刪除,將是永久性的;

e) 一個列不能同時具有 NULL 屬性和 IDENTITY 屬性,只能二者選其一。

在圖 3-4 中,編號設置為 IDENTITY 屬性,則該列數據不需要用戶添加,且由系統根據標識規范自
動添加。標識種子為 1,表示該列初始值為 1。標識增量為 1,表示增量為 1,即每添加一條記錄,該
列的數據會加 1。

2.1.3、 默認約束(Default Constraint)

默認約束指用戶在進行插入操作時,沒有顯式地為列提供數據,那么系統將把默認值賦給該列。
默認值約束所提供的默認值可以為常量、函數、系統函數、空值等,表中的每一列只能定義一個默認
約束,對於具有 IDENTITY 屬性和 timestamp 數據類型的字段,不能使用默認約束,同時,定義的默認
值長度不允許大於對應字段所允許的最大長度。char var   varchar

 datetime類型的默認值為getdate()則獲得當前日期與時間

2.2、列的常見約束

2.2.1、主鍵約束(Primary Key Constraint)

主鍵用來標識記錄的唯一性。數據庫表中對儲存數據對象予以唯一和完整標識的數據列或屬性的
組合。一個數據表只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null),主鍵可以是多
列的組合,值不允許重復。

通俗來說就是可以唯一區分每一條數據的列,如我們定義用戶表時把‘‘身份證號’’作為主鍵,這樣
身份證號這一列就是唯一的,根據身份證號可以精確的找到對應的用戶數據,因為每個人的身份證號
都不一樣。強烈建議每張表都定義主鍵,如果考慮數據遷移則可以把主鍵定義成 UUID。下面是一些
關於主鍵的示例:

學生表:(學號,姓名,性別,出生日期,入學時間)學號是主鍵

商品表:(商品編號,商品名稱,商品價格)商品編號是主鍵

選課表:(課程編號,學生編號,分數)課程編號與學生編號是組合主鍵

有時候我們在定義一張表時沒有辦法確定哪一列作為主鍵,可以添加編號作為主鍵列。在如圖 3-
6 中,我們把編號這列設置為主鍵。設置成功后,字段名前面會出現一把金色的鑰匙。

2.2.2、唯一約束(Unique Constraint)

要求該列唯一,允許為空,但只能出現一個空值。

第一:創建唯一約束

 

 

2.2.3、檢查約束(Check Constraint)

某列取值范圍限制、格式限制等,如有關年齡的約束。

第一:定義 CHECK 約束

 

2.2.4、外鍵約束(Foreign Key Constraint)

用於兩表間建立關系,需要指定引用主表的那一列。

在關系數據庫中,每個數據表都是由關系來連系彼此的關系,父數據表(Parent Entity)的主鍵
(primary key)會放在另一個數據表,當做屬性以創建彼此的關系,而這個屬性就是外鍵。
比如,學生跟老師之間是教學的關系,學生數據表會有個屬性叫指導老師(FK),而這個值就是對
應到老師數據表的老師代號(PK),學生的指導老師就是外鍵。

 

下面是一個使用外鍵關聯兩張表的示例:

宿舍表:(宿舍編號 PK,宿舍位置,電話)宿舍編號是主鍵

學生表:(學號 PK,姓名,性別,出生日期,宿舍編號 FK)學號是主鍵,宿舍編號是外鍵,它
引用宿舍表的主鍵值。

外鍵取值規則:空值或參照的主鍵值。

(1)、插入非空值時,如果主鍵表中沒有這個值,則不能插入。

(2)、更新時,不能改為主鍵表中沒有的值。

(3)、刪除主鍵表記錄時,你可以在建外鍵時選定外鍵記錄一起級聯刪除還是拒絕刪除。

(4)、更新主鍵記錄時,同樣有級聯更新和拒絕執行的選擇。

在上例中,我們新增一張“圖書類別”表,其結構和數據如圖 3-11 所示:

 

在圖書信息表中,我們可以通過“類別”這個字段可以得知該圖書屬於哪個類別。比如,《孫子兵
法》就屬於“軍事”類別的圖書。因此,我們認為字段“類別”是圖書信息表的外鍵,而外鍵的數據
必須依賴於另一張表主鍵的數據。相對而言,外鍵所在的表,我們稱之為外鍵表,主鍵所在的表,我
們稱之為主鍵表。在此案例中,圖書信息是外鍵表,圖書類別是主鍵表。那么,我們怎么把類別這個
字段設置為外鍵呢,其步驟為:

第一:選擇外鍵列

 

 

 2.3、使用SQL創建表

--創建數據庫
--drop database ServicePlatform
--go
create database ServicePlatform
on primary
(
name='ServicePlatform',
filename='D:\ServicePlatform\ServicePlatform\Data\ServicePlatform.mdf'
)
go
use ServicePlatform;
go

--表1 組織機構表
if OBJECT_ID('Organization') is not null
drop table Organization;
go
create table Organization
(
Id int identity(1,1) primary key,  --醫院編號
Name nvarchar(100) not null, --醫院名稱
State int default(1), --狀態 [0凍結,1正常]
InsertTime datetime default(getdate()) --添加記錄的時間
)
go

--表2 科室表
if OBJECT_ID('Department') is not null
drop table Department;
go
create table Department
(
Id int identity(1,1) primary key,  --科室編號
OrganizationId int references Organization(Id), --所屬機構
Name nvarchar(100) not null --科室名稱
)
go

 

三、作業與單詞

1、單詞

(1)、char 字符

(2)、var 可變的

2、創建表

關於三個表: 學生信息表, 成績表,課程表進行組合查詢的操作 ,話不多說,先上表信息。
學生表

 

 

 

課程信息表

 

 

 

 學生成績表

 

 

3、創建一個商品數據庫(spdb),創建兩個表:

(1)、商品類型(splx)

bh 編號 int pk not null

mc 名稱 nvarchar(100) not null

1 數碼

2 服飾

3 水果

 

(2)、商品(sp)

spbh 商品編號 int pk not null

spmc 商品名稱 nvarchar(200) not null

splx 商品類型 fk(外鍵) int

spjg 商品價格 numeric(10,2)

 

101 華為榮耀8X 1 1998.5

102 外套   2   88.8

103 芒果   3   8.95

 

4、SQL_server中創建訂單數據庫

任務描述:

  • 關系模型

1、代理商(代理商編號、姓名、地址、郵政編碼、提成金額、提成比例)

其中代理商編號為primary key(主碼)

 

2、客戶(客戶編號、姓名、地址、郵政編碼、收支差額、貸款限額、代理商編號)

其中客戶編號為primary key(主碼)

  

3.產品(產品編號、描述信息、庫存量、類別、倉庫的編號、價格)

其中產品的編號為primary key(主碼)

  

4.訂單(訂單編號、訂貨日期、客戶編號)

  

5.訂貨項目(訂單編號、產品編號、訂購數量、訂購單價)

  

 

  • 原始數據

1.對於代理商(代理商編號、姓名、地址、郵政編碼、提成金額、提成比例)

01、聯邦、東環路1號、541001、30000.00、40

02、惠普、東環路2號、541002、4000.00、10

03、三洋、東環路3號、541003、10000.00、30

04、聯想、東環路4號、541004、100000.00、60

05、海爾、東環路5號、541005、200000.00、60

 

2.客戶(客戶編號、姓名、地址、郵政編碼、收支差額、貸款限額、代理商編號)

100、張三、西環路1號、100001、10.00、100.00、02

200、李四、西環路2號、100001、-10.00、10.00、04

300、王五、西環路3號、100001、100.00、1000.00、02

400、趙六、西環路4號、100001、600.00、2000.00、01

500、洪七、西環路5號、100001、300.00、900.00、05

600、李明、西環路6號、100001、20.00、300.00、03

700、張進、西環路7號、100001、400.00、1000.00、03

 

3.產品(產品的編號、描述信息、庫存量、類別、倉庫的編號、價格)

0011、葯物,單位(瓶)、1000、12、1001、40.00

0022、機器,單位(件)、300、3、1002、50000.00

0033、中葯,單位(包)、800、12、1001、300.00

0044、軟件,單位(套)、1500、10、1003、2000.00

0055、家具,單位(件)、6000、3、1002、1000.00

0066、小型機,單位(台)、10000、3、1002、200000.00

 

4.訂單(訂單編號、訂貨日期、客戶編號)

111、2000-10-01、200

222、2000-09-01、200

333、2001-01-01、500

444、2002-02-02、300

555、2003-03-03、100

 

5.訂貨項目(訂單編號、產品編號、訂購數量、訂購單價)

111、0033、200、280.00

222、0066、6000、150000.00

333、0033、100、280.00

444、0011、300、39.00

555、0055、5500、950.00

444、0044、1000、1900.00

 

5、創建如下兩個表

表1 部門表 bm

部門編號 bmbh int pk主鍵 從1開始每次增長1

部門名稱 bmmc nvarchar(50) 不為空 唯一鍵(不重復)

 

表2 員工表 yg

工號 gh int pk 從100001開始每次增長1

姓名 xm nvarchar(30) 不為空

性別 xb nvarchar(1) 不為空,默認為“男”

入職日期 rzrq datetime 默認為當前日期 getdate()

工資 gz numeric(10,2) 約束必須是0-999999之間

部門號 bmh int 可空 外鍵

 

sql腳本:

--創建數據庫
drop database Empdb;
go
create database EmpDB
on
(
name='EmpDB',  --數據庫名稱
filename='e:\data\empdb.mdf'
)
go
use EmpDB
go
--表1 部門表 bm
--部門編號 bmbh int pk主鍵 從1開始每次增長1
--部門名稱 bmmc nvarchar(50) 不為空 唯一鍵(不重復)

if  OBJECT_ID('bm') is not null  --根據名稱查找對象的編號,如果不為空則對象存在
drop table bm
go
create table bm  --創建名稱為bm的表
(
bmbh int identity(1,1) primary key,  --部門編號 數字類型 從1開始每次增長1 主鍵
bmmc nvarchar(50) unique not null  --部門名稱 字符類型 長度50 唯一鍵 不為空
)
go

--表2 員工表 yg
--工號 gh int pk 從100001開始每次增長1
--姓名 xm nvarchar(30) 不為空
--性別 xb nvarchar(1) 不為空,默認為“男”
--入職日期 rzrq datetime 默認為當前日期 getdate()
--工資 gz numeric(10,2) 約束必須是0-999999之間
--部門號 bmh int 可空 外鍵


if  OBJECT_ID('yg') is not null  --根據名稱查找對象的編號,如果不為空則對象存在
drop table yg
go
create table yg  --創建名稱為bm的表
(
gh int identity(100001,1) primary key,  --工號 數字類型 從100001開始每次增長1 主鍵
xm nvarchar(30) not null,  --姓名 字符類型 長度30 不為空
xb nvarchar(1) default(''),  --性別 字符類型 長度1 默認值為男
rzrq datetime default(getdate()),  --入職日期 日期時間類型 默認值為當前系統時間
gc numeric(10,2),
bmh int references bm(bmbh)  --外鍵引用主鍵表的字段
)
go
--加check約束
ALTER TABLE yg ADD CONSTRAINT ck_yg_gc
    CHECK (gc >= 0 AND gc <= 999999)
 

--添加數據
insert into bm(bmmc) values('人事部');
insert into bm(bmmc) values('財務部');
insert into bm(bmmc) values('技術部');

insert into yg(xm,xb, gc,bmh) values('張學友','',18952.88,1);
insert into yg(xm,xb, gc,bmh) values('劉德華','',16952.53,2);
insert into yg(xm,xb, gc,bmh) values('李煥英','',13678.79,3);

--查詢數據
select bmbh,bmmc from bm;  --查詢bm表中的bmbh,bmmc列

select * from yg where xb=''  --查詢yg表中xb='男'的所有列

--更新數據
update yg set gc=gc+10000 where xb='';  --更新yg表,將xb=女的gc增加10000

--刪除
delete from bm;  --刪除bm表中的所有數據

delete from yg where gc>20000  --刪除yg表中工資超過20000的員工

 

 

6、創建如下兩個表

1、創建數據庫CarDB,存放到d:\data目錄下

2、創建類型表,CarType,字段如上

bh 編號 int 自動增加(1001-9999)主鍵  

mc 名稱 nvarchar(50) 不允許為空 唯一鍵

3、創建汽車表 Car

qcbh 汽車編號 int 自動增長 主鍵

qcmc 汽車名稱 nvarchar(50) 不允許為空

qcnb 汽車類別 int 外鍵,鏈接到CarType表

zdss  最大時速  int 檢查約束只能取值在20-1000之間

scrq 生產日期 datetime 默認為當前日期 getdate()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM