資料庫零散知識點(二)
1.union all (包括重複行) 和union(不包括重複行):
連線兩個結果集,將兩個查詢結果放在一個裡面,要求兩個查詢的欄位的數量和型別要基本一樣
2.交叉連線 cross join(和其他連線不同的是 不需要用 on):
交叉聯接返回第一個表中的所有行,第一個表中的每一行與第二個表中的所有行組合。交叉聯接也稱作笛卡爾積
3.完全連線 full join:
完整外部聯接返回第一個表和第二個表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的資料值。(將兩表的所有資料都展示出來,無對應的用null展現)
4.
4.1 給這個表加欄位
alter table Orders
add orderid int identity
4.2 給已有的表上建立主鍵
alter table Employees
add constraint PK_Employees
primary key(EmployeeID)
4.3 給已有的表上建立外來鍵
alter table Orders
add constraint FK_EmployeeCreatesOrder
Foreign key(EmployeeID) references Employees(EmployeeID)
4.4
alter table Customers
add constraint CN_CustomerDefaultCreateTime
default getdate() for CreateTime
4.5 在對錶裡的欄位(例如:外來鍵)進行約束更改時加上on delete cascade
外來鍵關聯使用 級聯刪除on delete cascade (如果進行刪除資料,會把相關聯的資料全部刪掉)
alter table Orders
add constraint FK_EmployeeCreatesOrder
Foreign key(EmployeeID) references Employees(EmployeeID)
ON UPDATE CASCADE
5.isnull()函式 isnull(a,b) 如果a=null,值為b, 如果a!=null,值為a
coalesce(a,b,c,...)函式返回其引數中的第一個非空表示式,當你要在n個欄位中選取某一個非空值,可以使用
case()函式強制轉換和隱形轉換型別
into #aa 建立臨時表
cast和convert資料型別轉換 eg:cast(memberid as varchar)
convert還提供一些日期格式轉換,cast沒有(其實也是可以的)
區分為了ANSI/ISO相容,cast是ansi相容的,而convert不相容
6.派生表:由一個查詢結果集的列和行構成,常會使用共用表表達式(Common Table Expression, CTE)
6.1.WITH設定一個SQL片段,在同時執行後面的sql查詢中可以多次呼叫這個片段
7.exists
通常exists的效能比派生表的效能更好些
8.ROW_NUMBER() :ROW_NUMBER() over ()根據什麼進行排序 (eg:1 2 3 4 5 6) 在裡面使用PARTITION BY告訴該函式在列改變值時重置計數,進行分組 (eg:1 2 3 4 5 1 2 1)
RANK: rank() over() 跳躍排序。如果多個行具有相同的順序值,則允許這些行具有相同的值(eg:1 2 2 4 5 6)
DENSE_RANK: dense_rank() over()連續排序。仍然是具有相同順序值就具有相同的值,但排名始終是遞增的(eg:1 2 2 3 4)
NTILE(x):將總結果劃分為x個類別,從1~x開始對這些類別排名
注:在每個排序PARTITION BY都可以使用
9.OFFSET...FETCH用於分頁 :offset(表示第幾行開始) fetch(表示顯示的行數的資料)
使用OFFSET...FETCH子句時必須同時使用ORDER BY
可以單獨使用OFFSET,但不能單獨使用FETCH
不可以同時使用select top 和 offset...fetch
可以使用算術式或變數來確定偏移多少行或獲取多少行,但不可以使用標量子查詢 eg: select * from MemberInfo
order by CreateTime desc
offset 10 rows
fetch next 10 rows only
10. merge命令同步資料
通過merge命令,可以將多個DML操作語句組合成一個整體(資料操縱語言(Data Manipulation Language, DML)),兩個表進行關聯,如果有匹配的則修改,沒有匹配的則新增
eg:
merge可以通過OUTPUT子句,可以將剛剛做過變動的資料進行輸出
eg:
結果:
matcher By target:這暗示了行已經存在於目標表上,因此很可能對目標表的行執行更新的操作
not matcher By target:通常對應根據源表中的資料將行插入到表中
not matcher By Source:這通常用於處理源表中缺少的行,這種情況下,通常將之刪除目標表中的行
By target預設,一般不顯示
11. 建立表三正規化
1NF:無重複列,保證原子性
2NF:每列必須依賴於整個鍵,實體的屬性完全依賴於主關鍵字
3NF可以記憶為:使所有資料都依賴於鍵,整個鍵,只是鍵。不可以派生的資料