1、SQL的ABC 特色
(1) Application 應用:理念是提供軟件、硬件、服務在內的完整解決方案
(2) Box盒子: 傳統部署方式、部署在企業內部、
(3)Cloud: 私有雲 、公有雲;私有雲性能是有限的、公有雲Azure Sql ,軟硬件、運維、HADR 、更新都由微軟負責
2、Azure Sql
(1)Azure SQL (概念性服務器)有多個數據庫、但一次只能連接一個數據庫,客戶不能在數據庫之間切換,也不能編寫多數據庫查詢
(2)Azure SQL 引擎 是一種專用引擎,但使用了相同的代碼基、實現T-SQL 功能與本地化實現一致
(3)有一些內部部署的SQL server t-sql 尚未在 Azure Sql 中沒有
3、Sql Server 實例
(1) Sql Server 實例是一個已安裝的SQLServer數據庫引擎或服務
(2)可以在同一台計算機上安裝多個Sql Server 實例、在安全、數據、資源上實例之間相互獨立在邏輯級別上,駐留在同一台計算機上的兩個實例、和駐留在兩個計算機上的實例沒有不同之處
(3)一台計算機上只有一個Default 實例(默認實例)、其他都是默認實例、在安裝是確定是默認還是命名、后面不能改
(4)連接默認實例、客戶端只需指定ip 、連接命名實例,則需要指定 ip\實例名稱
4、數據庫
(1)數據庫是一個對象容器、包含表、視圖、存儲過程、其他對象
(2)一個數據庫實例中可以包含多個數據庫 、包括系統數據庫和用戶數據庫
(3)系統數據庫有master 、resource 、model 、tempdb 、msdb ,但是在Azure Sql 中客戶端只能連接master
(4) 在一個實例中可以定義多個用戶數據庫
(5)排序規則Collation 通常在數據庫級別定義、確定語言支持、區分大小寫、排序規則
5、數據文件和事務日志文件
(1)數據庫有數據文件Data.mdf 和 事務日志文件TransactionLog.ldf 組成
(2)Sql server 可以並行的寫入數據文件、但是只能串行的寫入事務日志文件,因此,與數據文件不同,事務日志多並不能提高寫入性能
(3)在創建數據庫的時候可以為每個文件(數據文件、日志文件)定義屬性、包括名稱、初始大小、最大大小、自動增量
(4)多個數據文件被組織成“文件組” ,對象(表、視圖。。。)被分散在文件組中的文件中
(5)一個數據庫中至少有一個名為primary 的文件組,可以指定哪個文件組作為默認文件組
(6)如果創建對象的時候沒有顯示的指定目標文件組,那么默認放在默認文件組中
(6)創建對象可以通過選擇文件組、進行物理布局
(7)Auzre Sql 不需要用戶關注數據文件和日志文件的布局
(8)文件后綴: .mdf 代表主數據文件(不要與主數據庫文件混淆)、.ldf代表日志數據文件 、.ndf 表示不是主數據庫文件
5、登錄安全
(1)連接數據庫實例,必須先創建一個“Login”
(2)Login 綁定windows 登錄憑證、這種稱為“windows 身份驗證登錄”、登錄時不需Login name、password
(3)Sql server 身份驗證登錄、需要提供用戶名密碼、需要將Login映射到每一個數據庫用戶、數據庫用戶被授予訪問數據庫中對象權限
6、架構與對象
(1)數據庫是對象容器其實是簡化說法、數據庫包含架構、架構包含對象
(2)架構才是對象(表、視圖。。。)的容器
(3)可以在架構級別控制權限、如授予用戶對架構的select權限、因此對架構的划分,安全是一個考量因素
(4)架構是一個命名空間、通常被用作對象名稱的前綴 dbo.XXX ,dbo 是架構 架構名稱、這種寫法叫做架構限定式對象名稱
(5)引用對象時,如果省略的架構、Sql server 會在默認架構中找對象、如果沒有再去dbo 架構中找
(6)由於省略架構限定尋找的過程需要耗費一定性能、所以sql server 建議始終使用架構限定式對象名稱
7、表定義
use TSQL2012; if object_id('dbo.Employees','U') is not null drop table dbo.Employees; create table dbo.Employees ( empid int not null, firstname varchar(30) not null, lastname varchar(30) not null, hiredate date not null, mgrid int null, ssn varchar(20) not null, salary money not null );
(1)定義表要確定數據庫、架構
(2)使用( ) 而不是{ }
(3)use 數據庫名稱 語法在Azure Sql中 不支持、但是當選中庫后執行不會報錯、可用於確保創建對象時連接到了正確的數據庫
(4)if 函數調用了 object_id(object_name ,type) 函數、入參為(對象名稱、對象類型),U 表示用戶數據庫 ,該函數存在返回object_id ,否則返回null
(5) 如果沒有顯示的指定是否允許為NULL標記、Sql Server 不得不依賴默認值。默認值為(NULL) ,強烈建議顯示定義、不依賴默認值
8、數據完整性
8.1 完整性說明
(1)關系模型最大好處之一就是數據完整性
(2)數據完整性作為模型的一部分實施、即作為表定義的一部分,這被稱為“聲明式數據完整性”
(3)數據完整性已代碼方式實施、如存儲過程、觸發器、這被稱為“過程式數據完整性”
8.2 主鍵約束
(1)主鍵約束強制唯一性、主鍵不允許是用null 標記 、每張表只能有一個主鍵
(2)為保證主鍵的強制唯一性、sql server 會在后台建立唯一索引、唯一索引,是SQL server保證強制唯一性的物理機制
(3)sql
alter table Employees add constraint PK_Employees primary key(empid);
8.3 唯一約束
(1)與主鍵不同,表中可以有多個唯一鍵
(2)與主鍵不同 ,唯一鍵可以為null
(3) sql
alter table Employees add constraint UNQ_Employees_ssn unique(ssn);
8.4外鍵約束
(1)外鍵約束強制引用完整性
(2)sql
if object_id('dbo.Orders','U') is not null drop table dbo.Orders; create table dbo.Orders ( orderid int not null, empid int not null, custid varchar(10) not null, orderts datetime2 not null, qty int not null, constraint PK_Orders primary key(orderid) ); alter table dbo.Orders add constraint FK_Orders_Employees foreign key(empid) references dbo.Employees(empid); alter table dbo.Orders add constraint FK_Orders_Employees foreign key(mgrid) references dbo.Employees(empid);
(3)外鍵引用操作
No action : 當刪除父表記錄被引用,無法刪除
cascade : 級聯刪除
set default 、set null : 級聯操作設置外鍵值為default 、null
(4)外鍵列允許為null ,當為null的時候產生孤立行
8.5 check 約束
(1)為列定義一個謂語,insert 、update ,必須滿足該謂語要求
(2)sql
alter table dbo.Employees add constraint CHK_Employees_salary check(salary>0);
(3)當謂語計算為False 拒絕插入更新、當計算結果為True 或 unknown 時,修改會被接受, 如上面當salary 為 null 時 會接受
8.6 默認約束
(1)是默認值表達式
(2)sql
alter table dbo.Orders add constraint DFT_Orders_orderts default(sysdatetime()) for orderts;