數據結構和數據庫的區別
數據庫是應用軟件級別研究數據的存儲和操作(主要針對磁盤上的數據)
數據結構是在系統軟件級別研究數據的存儲和操作(主要是針對內存中的數據)
對硬盤數操作是數據庫的強項,是數據庫研究的核心問題。
什么是連接
客戶端和數據庫其實是分離的,客戶端只是我們管理數據發送命令顯示數據的工具,實際上的數據庫和這個客戶端沒有什么關系。
客戶端通過連接訪問數據庫,如果沒有開啟數據庫服務就無法進行訪問。
命令通過客戶端發送給數據庫執行。有些命令可以一起執行,有些命令無法一起執行。
數據庫創建和刪除
.mdf
數據文件.ldf
日志文件
系統數據庫不要進行修改
數據庫附加和分離
右擊數據庫->任務->分離(解除SSMS和數據庫之間連接)
然后將數據庫文件移動,再在其他機器附加.mdf
文件
右鍵數據庫->附加
需要注意的是有可能附加失敗,彈出:附加操作系統錯誤5什么的,需要修改文件的權限:
如圖,添加完全控制。
SQL Server創建登錄用戶
注意只有管理員才能創建其他用戶,注意創建賬號的時候去掉強制密碼過期
關系型數據庫基本概念
- 字段:列、屬性,用來模擬許多事物的某一個靜態特征
- 記錄:行、元組,用來模擬一個事物的許多靜態特征,表示事物本身
- 表:記錄的組合,用來模擬同類事物的集合
- 主鍵:唯一標識事務
- 外鍵:表示該元素和另一個表中元素的關系(一般是多對一的多中含有外鍵,就是說如果一個表A的某個屬性是另一個表B中的屬性,且表A中許多記錄的屬性都是相同的,則應該在表A中添加主鍵。因為如果我們在表B中添加主鍵,那么每個表B中的記錄都對應多個表A的記錄,無法在一個格子中添加,即B->A不是函數)
創建表
創建表之前需要創建庫
nvarchar
表示國家化編碼可以變化的字符串(支持漢字)
允許NULL值表示是否允許這個屬性不填
dbo
表示當前用戶是管理員身份
含有外鍵的表叫做外鍵表
添加外鍵
使用圖形界面
對某一列選擇關系
使用命令
新建查詢,選擇對應的數據庫
注釋使用
--
,需要注意的是每條語句后面都應該加上逗號,最后一條語句后面可以加上逗號也可以不加上(Oracel不能在最后一條語句后面加上逗號)
create table dept
(dept_id int primary key,dept_name nvarchar(100) not null,dept_address nvarchar(100)
)create table emp
(emp_id int constraint pk_emp_id primary key,emp_name nvarchar(20) not null, --nvar表示國際化支持漢字可以變化的字符串emp_sex nchar(1),dept_id int constraint fk_dept_id foreign key references dept(dept_id)
)
點擊感嘆號后執行,然后刷新數據庫中的表,就可以看到新建的表。
約束
對一個表中屬性操作的限制叫做約束
分類:
- 主鍵約束:不允許重復數據,避免數據冗余(實體完整性)
- 外鍵約束:通過外鍵約束從語法上保證本事物所關聯的其他事物一定是存在的(引用完整性),事物和事物之間的關系是通過外鍵來體現的
- check約束:保證事物屬性的取值在合法的范圍內
create table student
(std_id int primary key,std_sal int check(std_sal>=1000 and std_sal<=8000)
)insert into student values (1, 1000)
insert into student values (2, 10000)
- default約束:保證事物的屬性一定會有一個值
create table student
(std_id int primary key,std_sal int check(std_sal>=1000 and std_sal<=8000),std_sex nchar(1) default ('男') --()可以省略,在數據庫中字符串必須用''括起來--數據庫中的單引號用來表示字符串--數據庫中的雙引號用來表示事物的名稱
)insert into student(std_id, std_sal) values (1, 1000)
insert into student values (2, 10000, '女')
如果在前面省略了插入字段的集合,則在后面必須給所有屬性賦值
允許為空和default之間:可以認為允許為空為default
為Null
insert如果沒有給所有的字段賦值,則必須在表后面加上所賦值字段的集合,無論沒有賦值的字段是為空還是有default值
- 唯一約束:保證事物屬性的取值不允許重復,但允許為空
create table student1
(std_id int primary key,std_sal int check(std_sal>=1000 and std_sal<=8000),std_sex nchar(1) default ('男'),std_name nvarchar(200) unique
)insert into student1 values (1, 6000, '男', '張三')
insert into student1 values (2, 2000, '女', null) --唯一鍵可以為空,但是主鍵不允許為空
unique
和not null
可以組合使用,這樣也不能為空了
create table student1
(std_id int primary key,std_sal int check(std_sal>=1000 and std_sal<=8000),std_sex nchar(1) default ('男'),std_name nvarchar(200) unique not null
)
雖然允許其中一個為空,但是不能有多個空但是Orecal里面允許多個字段為空
- not null約束:要求用戶必須為該屬性賦一個值,否則語法出錯。默認允許為空,如果不寫not null 則不允許為空
唯一約束和主鍵約束之間的關系
create table student
(std_id int primary key identity, --添加一個沒有實際意義的字段當作主鍵,即代理主鍵-- identity 表示插入元素的時候不需要錄入,自動增長--只有主鍵能夠作為外鍵std_name nvarchar(50) unique not null, --不要使用業務邏輯當作主鍵-- 原因1:當使用具有實際意義的字段當作主鍵的時候,這個字段的元素有可能會改變-- 原因2:查找元素的時候一般按照主鍵進行查詢,使用整型數字更好,效率更高-- 原因3:擁有實際意義的字段一般比較長,浪費儲存空間std_email nvarchar(50) not null,-- 默認允許為空,如果不寫not null 則不允許為空std_address nvarchar(50)
)
表和約束之間的區別:
通過表來解決事物的存儲
通過約束來解決事物取值的有效性和合法性的問題
建表的過程就是指定事物屬性以及事物屬性各種約束的過程
關系
一對一
一對多
多對多
通過設置不同的外鍵來表示表和表的不同關系
一對一
- 關聯的實體共享一個主鍵
- 其中一個實體通過外鍵關聯到另外一個實體的主鍵,需要在外鍵列添加唯一約束
- 通過外鍵表表示實體之間的關系
一對多(A表和B表)
B表添加外鍵關聯到A的主鍵,不需要在外鍵列添加唯一約束。即在多的一方添加外鍵。本質上要滿足函數關系
多對多(A表和B表)
多對多必須通過單獨的一張表來表示
create table cls
-- 表示class,表名不要寫復數,寫單數
(cls_id int primary key,cls_num int not null,cls_name nvarchar(10)
)create table teacher
(teacher_id int primary key,teacher_name nvarchar(10) not null
)create table cls_teacher_mapping
-- 用來模擬班級和教師的多對多關系
(rela_cls int constraint fk_cls foreign key references cls(cls_id),rela_teacher int constraint fk_teacher foreign key references teacher(teacher_id),rela_course nvarchar(10),constraint pk_cls_teacher primary key (rela_cls,rela_teacher),--主鍵只允許有一個,外鍵可以有多個
)insert into cls values (1, 20, 'one')
insert into cls values (2, 30, 'two')
insert into cls values (3, 40, 'three')insert into teacher values (1001, 'a')
insert into teacher values (1002, 'b')
insert into teacher values (1003, 'c')
insert into teacher values (1004, 'd')insert into cls_teacher_mapping values (1, 1001, 'C')
insert into cls_teacher_mapping values (2, 1002, 'C++')
insert into cls_teacher_mapping values (3, 1001, 'C')
insert into cls_teacher_mapping values (2, 1003, 'Python')
主鍵
主鍵:能夠唯一標識事物的一個字段或者多個字段的組合
主鍵的特征:
- 主鍵通常都是整數(不建議使用字符串當作主鍵,除非是用于集群式服務的時候)。
集群式服務:用戶的一個請求可能需要使用不同主機的數據庫才能夠完成一個服務 - 主鍵的值通常不允許修改,除非本記錄被刪除(如果該主鍵作為其他表的外鍵的時候如果修改可能導致數據丟失)
- 主鍵一般定義為表名_id,或者表名Id
- 要用代理主鍵,不要使用業余主鍵。即不要使用有業務含義的字段當作主鍵
外鍵
外鍵:如果一個表中的若干個字段是來自若干個表的主鍵或者唯一鍵,則這若干個字段就是外鍵
注意:外鍵通常是來自另外表的主鍵而不是唯一鍵,因為唯一鍵可能為Null或者被修改
外鍵不一定來自其他表,也可能來自本表的主鍵。例如,員工表里面上司字段就是員工表的主鍵
含有外鍵的表叫做外鍵表,外鍵字段來自的那張表叫做主鍵表
主鍵表和外鍵表的刪除問題
應該先刪除外鍵表。先刪除主鍵表,則使得外鍵表的數據引用失敗。如果堅持刪除,應該先刪除關系。