1. 程式人生 > >資料庫零散知識點(二)

資料庫零散知識點(二)

1.union all (包括重複行) 和union(不包括重複行):

連線兩個結果集,將兩個查詢結果放在一個裡面,要求兩個查詢的欄位的數量和型別要基本一樣

2.交叉連線 cross join(和其他連線不同的是 不需要用 on):

交叉聯接返回第一個表中的所有行,第一個表中的每一行與第二個表中的所有行組合。交叉聯接也稱作笛卡爾積

3.完全連線 full join:

完整外部聯接返回第一個表和第二個表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的資料值。(將兩表的所有資料都展示出來,無對應的用null展現)

4.

alter修改(在此主要講的是修改表,部分約束)

    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

給已有的表新增default約束
  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可以記憶為:使所有資料都依賴於鍵,整個鍵,只是鍵。不可以派生的資料