select productid,productname,unitprice from products select orderid,productid,unitprice from [order details] CREATE TABLE Bank --銀行表 ( customerName NVARCHAR(20),--客戶姓名 cardId varchar(7),--卡號 currentMoney DECIMAL(18, 2)--用戶餘額 ) --//建立約束--- ALTER TABLE Bank ADD CONSTRAINT CK_Money CHECK(currentMoney>=1) --//建立添加兩條數據--- INSERT INTO Bank VALUES('張三','1001101',1000) INSERT INTO Bank VALUES('李四','1001102',1) --//取出結果--- SELECT * FROM Bank --問題:假定張三的帳戶直接轉帳1000元到李四的帳戶 --1.爲何要使用事務 update bank set currentMoney=currentMoney-1000 where cardId='1001101' update bank set currentMoney=currentMoney+1000 where cardId='1001102' --2.什麼是事務:事務(TRANSACTION)是做爲單個邏輯工做單元執行的一系列操做 --3.事務必須具有如下四個屬性,簡稱ACID 屬性: --原子性(Atomicity):事務是一個完整的操做。事務的各步操做是不可分的(原子的);要麼都執行,要麼都不執行 --一致性(Consistency):當事務完成時,數據必須處於一致狀態 --隔離性(Isolation):對數據進行修改的全部併發事務是彼此隔離的,這代表事務必須是獨立的,它不該以任何方式依賴於或影響其餘事務 --永久性(Durability):事務完成後,它對數據庫的修改被永久保持,事務日誌可以保持事務的永久性 --4.如何建立事務 declare @error int set @error=0 begin transaction--開始事務 update bank set currentMoney=currentMoney-100 where cardId='1001101' set @error=@error+@@error--@@error:保存最近一次sql錯誤代號,若是沒有錯誤則爲0 update bank set currentMoney=currentMoney+100 where cardId='1001102' set @error=@error+@@error if @error=0 --若是@error的值爲0,說明以上兩個sql語句無錯 commit transaction--提交事務,持久化(將sql語句的影響保存) else rollback transaction--撤消事務,回到開始事務時的狀態 --4.1提交事務 begin transaction update bank set currentMoney=currentMoney-100 where cardId='1001101' --若是沒有使用commit transaction,退出鏈接,會回到初始狀態 --4.2sql server默認爲每個sql語句使用自動事務 update bank set currentMoney=currentMoney-100 where cardId='1001101' --上面的sql語句與如下功能相同 begin transaction update bank set currentMoney=currentMoney-100 where cardId='1001101' if @@error=0 commit transaction else rollback transaction --因此下兩個sql位於不一樣的事務中 update bank set currentMoney=currentMoney-1000 where cardId='1001101' update bank set currentMoney=currentMoney+1000 where cardId='1001102' --5.索引:提升查詢的速度 --5.1什麼是索引:是SQL Server編排數據的內部方法。它爲SQL Server提供一種方法來編排查詢數據 。 --5.2索引類型 --惟一索引:惟一索引不容許兩行具備相同的索引值 --主鍵索引:爲表定義一個主鍵將自動建立主鍵索引,主鍵索引是惟一索引的特殊類型。主鍵索引要求主鍵中的每一個值是惟一的,而且不能爲空 --彙集索引(Clustered):表中各行的物理順序與鍵值的邏輯(索引)順序相同,每一個表只能有一個 --非彙集索引(Non-clustered):非彙集索引指定表的邏輯順序。數據存儲在一個位置,索引存儲在另外一個位置,索引中包含指向數據存儲位置的指針。能夠有多個,小於249個 --5.3建立索引格式 --CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED] -- INDEX index_name -- ON table_name (column_name…) -- [WITH FILLFACTOR=x] --UNIQUE表示惟一索引,可選 --CLUSTERED、NONCLUSTERED表示彙集索引仍是 -- 非彙集索引,可選 --FILLFACTOR表示填充因子,指定一個0到100之間的值, --該值指示索引頁填滿的空間所佔的百分比 create index ix_name on table_1(name) --5.4 --優勢 --加快訪問速度 --增強行的惟一性 --缺點 --帶索引的表在數據庫中須要更多的存儲空間 --操縱數據的命令須要更長的處理時間,由於它們須要對索引進行更新 --5.5建立索引的指導原則 --請按照下列標準選擇創建索引的列。 --該列用於頻繁搜索 --該列用於對數據進行排序 --請不要使用下面的列建立索引: --列中僅包含幾個不一樣的值。 --表中僅包含幾行。爲小型表建立索引可能不太划算,由於SQL Server在索引中搜索數據所花的時間比在表中逐行搜索所花的時間更長 --6.視圖 --6.1:什麼是視圖: --視圖是一張虛擬表,它表示一張表的部分數據或多張表的綜合數據,其結構和數據是創建在對錶的查詢基礎上 --6.2建立視圖 --CREATE VIEW view_name -- AS -- <select語句> create view oc as select o.orderid,o.orderdate,c.ContactName from orders o inner join customers c on o.CustomerID=c.CustomerID select * from oc--能夠經過視圖對原表操做 insert into oc values('1','2','3') --6.3視圖的功能 --篩選表中的行 --防止未經許可的用戶訪問敏感數據 --下降數據庫的複雜程度 --將多個物理數據庫抽象爲一個邏輯數據庫