SQL Server 數據庫基本操作入門篇【2】

本文主要介紹運用SQL語句對模式和基本表的操作,歡迎閱讀~

一、用SQL語句新建數據庫

用SQL語句新建一個名爲STUDENT的數據庫:

CREATE DATABASE STUDENT

在SSMS中點擊【新建查詢】,輸入該語句,【執行】後然後到左側的【數據庫】右鍵刷新一下,即可看到新建的STUDENT數據庫
在這裏插入圖片描述
之前第一篇中講解了直接用對話窗口新建數據庫(可視化操作),那樣創建操作比較直觀簡單,那爲什麼要用SQL語句來寫呢?

  • 因爲SQL能夠嵌入到高級語言(例如C++,Java,Python)程序中,當程序需要自動新建數據庫時就得使用SQL語句啦

二、模式(SCHEMA)的定義與刪除

(注:SQL Server 中文版裏SCHEMA翻譯爲:架構

首先檢查數據庫中是否存在WANG這個用戶。如果沒有,需先創建該用戶
可以用SQL語句創建用戶(我會在以後的文章中介紹)
這裏我就先介紹使用DBMS直接用對話窗口新建用戶
【STUDENT】—>【安全性】—>【用戶】,右鍵【新建用戶】
在這裏插入圖片描述
在彈出的窗口中按如下順序操作,填好【用戶名】和【登錄名】之後點擊【確定】即可完成STUDENT數據庫中WANG用戶的創建:
在這裏插入圖片描述

1. 定義模式

爲用戶WANG定義一個學生-課程模式S-T

CREATE SCHEMA "S-T" AUTHORIZATION WANG;

然後打開之間新建的【STUDENT】數據庫—>【安全性】—>【架構】就能看到剛剛爲用戶WANG新建的模式【S-T】
在這裏插入圖片描述
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——

CREATE SCHEMA AUTHORIZATION WANG;

該語句沒有指定<模式名>,<模式名>隱含爲 <用戶名>
(SQL Server 中,默認用戶爲 dbo,在沒有創建模式的情況下,默認的模式名爲dbo,所以表名爲dbo.* 的格式 )

·CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。格式如下:

CREATE SCHEMA <模式名> AUTHORIZATION <用戶名>
[<表定義子句>|<視圖定義子句>|<授權定義子句>]

比如:咱們爲用戶WANG創建一個模式TEST,並且在其中定義一個表TAB1

CREATE SCHEMA TEST AUTHORIZATION WANG
CREATE TABLE TAB1   
( 
	COL1 SMALLINT, 
	COL2 INT,
	COL3 CHAR(20),
	COL4 NUMERIC(10,3),
	COL5 DECIMAL(5,2)
);

如下圖所示:
在這裏插入圖片描述
TEST模式建立成功後可以繼續在TEST模式下建立表TAB2

CREATE TABLE TEST.TAB2
( 
	COL1 SMALLINT                                                                                    
);

2. 刪除模式

DROP SCHEMA <模式名> <CASCADE|RESTRICT>

CASCADE(級聯)
刪除模式的同時把該模式中所有的數據庫對象全部刪除
RESTRICT(限制)
如果該模式中定義了下屬的數據庫對象(如表、視圖等),則拒絕該刪除語句的執行。
僅當該模式中沒有任何下屬的對象時才能執行。

這裏注意:

DROP SCHEMA WANG CASCADE;

刪除模式WANG,同時該模式中定義的表TAB1也被刪除
但是,當你輸入這句語句之後它會給你報錯:
在這裏插入圖片描述
· 因爲SQL Server使用的是T-SQL,而該語句爲標準SQL,SQL Server不支持在 DROP SCHEMA使用CASCADE,可變通後實現該功能,實現方法參考:【Transact-SQL】DROP SCHEMA TEST CASCADE :關鍵字 ‘CASCADE’ 附近有語法錯誤


三、基本表的定義、刪除與修改

1. 創建基本表

CREATE TABLE <表名>
(
	<列名> <數據類型>[ <列級完整性約束條件> ]
	[,<列名> <數據類型>[ <列級完整性約束條件>] ] 
	...
	[,<表級完整性約束條件> ] 
);

ps:[ ]的內容是可寫可不寫的,例如上面的第一行中 [ <列級完整性約束條件> ] 爲可寫可不寫,第二行及之後的都有 [ ],即可以只有一列,也可以有多列

<表名>:所要定義的基本表的名字
<列名>:組成該表的各個屬性(列)
<列級完整性約束條件>:涉及相應屬性列的完整性約束條件
<表級完整性約束條件>:涉及一個或多個屬性列的完整性約束條件

  • 如果完整性約束條件涉及到該表的多個屬性列,則必須定義在表級上,否則既可以定義在列級也可以定義在表級

—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——
來康康栗子:
· 建立一個“學生”表 Student

CREATE TABLE Student     /* 這裏模式默認爲 dbo*/    
(
	Sno	CHAR(9) PRIMARY KEY,    /* 列級完整性約束條件,Sno是主碼*/                  
	Sname CHAR(20) UNIQUE,       /* Sname取唯一值*/
	Ssex	CHAR(2),
	Sage	SMALLINT,
	Sdept	CHAR(20)
); 

創建好後如下圖所示,Sno前有一個小鑰匙圖標表示它是主碼PK
在這裏插入圖片描述
ps:需在當前數據庫的當前模式下執行(例如我這裏是在STUDENT數據庫下,需如下如所示紅色區域選擇STUDENT,模式默認爲dbo)
在這裏插入圖片描述
· 建立一個“課程”表 Course

CREATE TABLE Course
(
	Cno	CHAR(4) PRIMARY KEY,
	Cname	CHAR(40),            
	Cpno	CHAR(4),               	                      
	Ccredit	SMALLINT,
	FOREIGN KEY	(Cpno) REFERENCES  Course(Cno) 
); 

ps:Cpno是外碼,被參照表是Course,被參照列是Cno。因爲這裏的 FOREIGN KEY完整性約束條件涉及到該表的兩個屬性列Cpno和 Cno,所以必須定義在表級

· 建立一個學生選課表 SC

CREATE TABLE SC
(	
	Sno	CHAR(9), 
	Cno	CHAR(4),  
	Grade	SMALLINTPRIMARY KEY (Sno,Cno),   /* 主碼由兩個屬性構成,必須作爲表級完整性進行定義*/
	FOREIGN KEY (Sno) REFERENCES Student(Sno),  /* 表級完整性約束條件,Sno是外碼,被參照表是Student */   
	FOREIGN KEY (Cno) REFERENCES Course(Cno)    /* 表級完整性約束條件, Cno是外碼,被參照表是Course*/
); 

2. 修改基本表

ALTER TABLE <表名>
[ ADD[COLUMN] <新列名> <數據類型> [ 完整性約束 ] ]
[ ADD <表級完整性約束>]
[ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
[ DROP CONSTRAINT<完整性約束名>[ RESTRICT | CASCADE ] ]
[ALTER COLUMN <列名><數據類型> ] ;

([ ]同上面所講爲可選項)
<表名> 是要修改的基本表
ADD 子句用於增加新列、新的列級完整性約束條件和新的表級完整性約束條件
DROP COLUMN 子句用於刪除表中的列
· 如果指定了CASCADE短語,則自動刪除引用了該列的其他對象
· 如果指定了RESTRICT短語,則如果該列被其他對象引用,關係數據庫管理系統將拒絕刪除該列
DROP CONSTRAINT 子句用於刪除指定的完整性約束條件
ALTER COLUMN 子句用於修改原有的列定義,包括修改列名和數據類型
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——
來看例子:

· 向Student表增加“入學時間”列S_entrance,其數據類型爲日期型

ALTER TABLE Student ADD S_entrance DATE;

ps:不管基本表中原來是否已有數據,新增加的列一律爲空值 NULL

· 將年齡的數據類型由字符型(這裏原來的數據類型是SMALLINT)改爲整數

ALTER TABLE Student ALTER COLUMN Sage INT;

在這裏插入圖片描述
ps:這裏只需聲明要改成什麼類型即可,不用知道或寫出原來的類型

· 增加課程名稱必須取唯一值的約束條件

ALTER TABLE Course ADD UNIQUE(Cname); 

3. 刪除基本表

DROP TABLE <表名>RESTRICT| CASCADE;

RESTRICT: 刪除表是有限制
· 欲刪除的基本表不能被其他表的約束所引用
· 如果存在依賴該表的對象,則此表不能被刪除
· (即需要把與它相關的東西都刪除了才能刪它)
CASCADE: 刪除該表沒有限制(級聯)
· 在刪除基本表的同時,相關的依賴對象一起刪除
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——

又到了看例子的環節:
(大家一定要考慮清楚了再刪除吖,這沒了可就真的沒了,當然表簡單的話再新建就行,不過畢竟浪費時間,大家可以把平時寫的代碼保存起來,一來不怕誤刪了,而來下次用到直接一頓Ctrl,稍微改改就搞定~)

  • 刪除Student表
DROP TABLE  Student  CASCADE;

(基本表定義被刪除,數據被刪除;表上建立的索引、視圖、觸發器等一般也將被刪除 )

  • 若表上建有視圖(或者是有其他依賴該表的對象,即與它相關的東西),使用RESTRICT時表不能刪除;使用CASCADE可以刪除表,視圖也自動刪除。
    先創建一個基於Student的視圖 IS_Student
 CREATE VIEW IS_Student      
    AS 
	    SELECT Sno,Sname,Sage
	    FROM  Student
    	    WHERE Sdept='IS';

然後嘗試使用RESTRICT刪除:

DROP TABLE Student RESTRICT; 

DBMS提示信息:
--ERROR: cannot drop table Student because other objects depend on it

  • 如果選擇CASCADE,可刪除該表,視圖自動被刪除
DROP TABLE Student CASCADE;

DBMS提示信息:
--NOTICE: drop cascades to view IS_Student
然後,用查詢語句檢測視圖是否存在:

SELECT * FROM IS_Student;

提示信息:
--ERROR: relation " IS_Student " does not exist
刪除成功啦!
<- - -以上是標準SQL語句及其執行結果- - ->

注意! SQL Server中不支持CASCADE/RESTRICT關鍵字,所以刪除只需輸入:

DROP TABLE Student;

此時DBMS提示信息:
在這裏插入圖片描述
這是因爲SQL Server不能使用 DROP TABLE 刪除被 FOREIGN KEY 約束引用的表,所以需要先刪除FK約束,參考:SQL刪除外鍵約束

敲小黑板!!

  • 以上操作一定要切換至對應的數據庫來進行,比如我這裏就是在STUDENT數據庫下進行的
    在這裏插入圖片描述
    (這裏很重要,因爲如果是沒切換,還是默認的系統數據庫master的話,執行以上操作DBMS會報錯!)
    在這裏插入圖片描述
  • SQL Server中不支持DROP刪除模式或基本表時使用CASCADE/RESTRICT關鍵字,且SQL Server不能使用 DROP TABLE 刪除被 FOREIGN KEY 約束引用的表。 必須先刪除引用 FOREIGN KEY 約束或引用表,如何刪除引用FK約束可參考:SQL刪除外鍵約束
  • 這裏的的基本表除了Student,Course和SC也都是是有FK的,所以需要先刪除FK約束才能刪除表
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 因爲SQL Server的T-SQL與標準SQL不盡相同,所以遇到標準SQL執行報錯的時候(自己沒寫錯的情況下),可以去查閱MicrosoftSQL文檔:DROP TABLE (Transact-SQL),當然也可自行百度或Google

嘿嘿,這次的分享就這麼多啦,索引以及數據更新等知識和相關操作會寫在下一篇,感謝閱讀~😊
咱們下期 ~
在這裏插入圖片描述

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