T-SQL是標準SQL在SQL Server數據庫中的實現。數據庫
範式是在表設計時的標準,一般一個表須要遵循如下三個範式;第一範式
:數據庫中的表的列,必須是原子的,不能夠在進行拆分。
例如:一個列中存儲多個值,一個學生的姓名和年齡被存儲在同一個列內。第二範式
:繼承第一範式的約束,在其基礎上增長了必須存在主鍵進行惟一標識,並且表中的其餘列須要依賴主鍵(當存在多個主鍵的時,不能只依賴主鍵的一部分,也就是隻依賴於其中一個)。第三範式
:繼承第二範式的約束,在其基礎上增長了除了主鍵的列,其餘列不能相互依賴。安全
1.數據庫由數據文件和事務日誌文件,數據文件主要存儲對象的數據,事務日誌文件存儲SQL Server須要維護事務的信息。
2.數據文件可並行寫入,可是事務日誌文件只能以連續的方式一次寫入一個。因此多個事務日誌文件並不能帶來性能上的提高。
3.數據文件被組織存儲到一個叫作「文件組」的邏輯組中,一個數據庫至少存在一個PRIMARY的文件組,這個文件組主要存儲主數據庫文件(mdf文件)和數據庫目錄.
4.系統內數據庫的用途:master
:主要存儲實例範圍的元數據,服務器配置,實例中全部數據庫信息和初始化信息tampdb
:主要存儲一些臨時數據的地方,例如臨時表。modeldb
:這個數據庫用做建立新數據庫的模版,建立的每一個新數據庫是由Model的副本初始化建立的。msdb
:主要存儲一個叫作「SQL Server代理」服務的數據。resource
:主要存儲全部系統對象的定義。
5.架構:個人理解就是命名空間,方便管理,防止衝突,而且能夠對架構進行權限控制,保證了安全性。建議在寫T-SQL的時候爲對象加上架構的前綴,這樣能夠省去系統查找對象所在架構上耗費掉的性能。服務器
1.在關係模型中全部的列必須有名稱,可是在T-SQL中容許SELECT查詢中出現沒有列名的列。
2.對列起別名的三種方式:
1)列名 AS 別名(建議)
2)別名 = 列名
3)列名 別名(不建議,:不直觀並且若是在查詢中多個列存在的時候,若是忘記寫逗號,很容易把緊挨着的列當成別名處理,查詢不會失敗,從而致使BUG)
3.SQL Server可以在查詢中對相同的表達式只計算一次。
4.在使用SELECT進行查詢的時候最好把要查詢的列都顯示的列出來,即便須要的是表中的全部的列,也不要使用使用SELECT *
進行查詢,雖然性能上卻是沒有多大的影響, SELECT *
按照建立表定義時指定的列順序保存列序號位置,這樣作的弊端是,之後修改了表結構時,程序中對應序號位置的列可能已經不在是你指望的那個列,這樣就會致使一些難以捕捉的BUG。
5.若是在SELECT查詢中對列起的別名是當前表中已經存在的列,那麼對該別名的全部操做都是對起別名的字段進行操做。架構
--例如:表A中存在列:firstName,lastName,CreateTime SELECT firstname AS lastname FROM A ORDER BY lastname --如上查詢,會按照firstname進行排序
6.若是在SELECT中指定了DISTINCT,那麼在後來使用的ORDER BY 子句中只能是 SELECT 中出現的列,不能是其餘列。不然ORDER BY沒有意義。性能
SELECT DISTINCT country FROM A ORDER BY emplId --在上面的查詢中,由於結果是去重的,因此對應於同一個國家可能有多個emplId,這樣在按照emplId進行排序是沒有意義的。
7.在基本的查詢語句中,其邏輯處理順序以下:設計
1) FROM 2) WHERE 3) GROUP BY 4) HAVING 5) SELECT 5.1) 表達式 5.2) DISTINCT 6) ORDER BY 6.1) TOP/OFFSET-FETCH
8.T-SQL中使用三值邏輯:TRUE / FALSE / UNKNOWN,對於查詢篩選而言 「接收TRUE」,也就是 FALSE 和 UNKNOWN 是不知足條件的。可是對於CHECK約束而言 「拒接FALSE」 也就是 TRUE 和 UNKNOWN 知足條件,兩個NULL進行比較爲UNKNOWN,而且兩個NULL被認爲是不相等的。在對存在NULL值的列進行排序的時候,T-SQL會優先對NULL進行排序。
9.在T-SQL中若是兩個操做數的類型不一樣,具備較低優先級的操做數會先轉化爲較高優先級的操做數類型。5/2.0 第一操做數是 5 INT 類型,第二個操做數 2.0 NUMERIC 類型,在進行計算的時候 5 先轉化爲 5.0 以後在進行計算,結果爲 2.5。
數據類型的優先級請查看:數據類型的優先級
10.T-SQL中運算符的優先級(從高到低)代理
1) () 2) * / % 3) + - 4) > < >= <= <> != !> !< 4) NOT 5) AND 6) OR BETWEEN IN LIKE 7) =(賦值)
11.在SELECT/WHERE/UPDATE的列表中表達式是在同一時間進行計算的。日誌
SELECT RealAge AS age,age+1 FROM A --這裏的age沒法使用。因爲同時操做,age在age+1時並不存在。
12.含Var元素的數據類型具備可變的存儲長度,這樣佔用的存儲空間更少,讀取操做更快。可是對於更新操做可能會致使行擴展,數據移動在當前頁面以外,因此更新效率低於固定長度。
MAX默認是8000字節,超出8000字節會被做爲大型對象存儲在行的外部。code