(1) 用自定義文件格式保存數據的劣勢。算法
(2) DBMS(DataBase Management System,數據庫管理系統)和數據庫,平時談到」數據庫」可能有兩種含義:MSSQL Server,Oracle等某種DBMS;存放一堆數據庫的 一個分類(CateLog)。數據庫
(3) 不一樣品牌的DBMS有本身不一樣的特色:MYSQL,MSSQLServer,DB2,Oracle,Access,Sybase等。對於開發人員來說,大同小異。數組
(4) 除了Access,SQLServerCE等文件型數據庫以外,大部分數據庫都須要數據庫服務器才能運行。學習,開發時是鏈接本機的數據庫,上線運行時是數據庫運行在單獨的服 務器。安全
2數據庫中的概念服務器
(1) CataLog(類)(又叫數據庫DataBase,表空間TableSpace),不一樣類的數據因該放到不一樣的數據庫中。併發
1) 便於對各個CataLog進行個性化管理ide
2) 避免命名衝突函數
3) 安全性更高學習
(2) Table(表);不一樣類型的資料放到不一樣的」格子」中,將這種區域叫作」表」,不一樣的表根據放的數據不一樣進行空間的優化,找起來也方便。優化
(3) 列(Column),字段(Field)。
(4)主鍵(Primarykey)
(1) 主鍵就是數據行的惟一標示,不會重複的列才能當主鍵,一個表能夠沒有主鍵,可是會很是難以處理,所以沒有特殊理由表都會設定主鍵。
(2) 主鍵有兩種選用策略;業務主鍵和邏輯主鍵。業務主鍵是使用有業務意義的字段作主鍵,好比身份證號,銀行帳號等。邏輯主鍵是使用沒有任何業務意義的字段作主 鍵,由於很難保證業務主鍵不會重複(身份證號重複),不會變化(帳號升位),所以推薦用邏輯主鍵。
(3) 邏輯主鍵:徹底給程序看的,業務員不會看的數據。
(1) SQL Server的兩種驗證方式:用戶名驗證和Windows驗證,開發時用Windows驗證就好了。
(2) 經常使用字段類型:bit(可選值0,1),datetime,int,varchar,nvarchar(可能含有中文用nvarchar)。
(3) varchar(),nvarchar().char(n)的區別:char(n)不足長度n的部分用空格填充。Var: variable:可變的。
(1) SQL語句是和DBMS」交談」專用的語句,不一樣DBMS都認SQL語法。
(2) SQL語句中字符串用單引號。
(3) SQL語句是大小寫不敏感的,不敏感指的是SQL關鍵字,字符串值仍是大小寫敏感。
(4) 建立表,刪除表不只能夠手工完成,還能夠執行SQL語句來完成,在自動化部署,數據導入中用的不少。
建立表: create table T_Person
(
ID int not null,
Name nvarchar(50),
Age int null
)
刪除表:drop table T_Person
(5) 執行簡單的Insert語句: insert into T_Person(ID,Name,Age) values(1,’Jim’,39)
*(熟悉):SQL主要分DDL(數據定義語言)和DML(數據操做語言)兩類,create table,drop table,alter table等屬於DDL,select,insert,Update,delete等屬 於DML。
(1) SQL Server中兩種經常使用的主鍵數據類型:int(或bigint)+標識列(又稱自動增加字段);uniqueidentifier(又稱Guid)。
(2) 用標識列實現字段自增能夠避免併發等問題,不用開發人員控制自動增加,用標識列的字段在insert的時候不用指定主鍵的值,將字段的」是標識列」設置爲」是」,一個表只 能有一個標識列。
(3) Guid算法是一種能夠產生惟一標示的高效算法,它使用網卡MAC地址,納秒級時間,芯片ID碼算出來的,這樣保證每次生成的GUID永遠不會重複,不管 是同一個計算機 上仍是不一樣的計算機,SQL Server中生成GUID的函數newid(),.NET中生成GUID的方法:Guid.NewGuid(),返回值是GUID類型。
例如:SQL Server:select newID()
C#代碼中 :Guid id=Guid.NewGuid();
(4) (*)int自增字段的優勢:佔用空間少,無需開發人員干預,易讀。缺點:效率低,數據導入導出的時候很痛苦。
(5) (*)Guid的優勢:效率高,數據導入導出方便,缺點:佔用空間大,不易讀。
1. 數據插入
(1) insert語句能夠省略表名後的列名,可是不推薦。Insert into Person2 values(‘lucy’,’38’)
(2) 若是插入的行中有些字段的值不肯定,那麼insert的時候不指定那些列便可。
(3) 給字段能夠設置默認值,若是Guid類型主鍵的默認值設定爲newid()就會自動生成,不多這樣幹: insert into person3(ID,Name,Age) values(newid(),’tom’,30)
2. 數據更新
(1) 更新一個列:update T_Person set Age=30
(2) 更新多個列:update T_Person set Age=30,Name=’Tom’
(3) 更新一部分數據:update T_Person set Age=30 where Name=’Tom’,用where語句表示只更新Name是’Tom’的行,注意SQL中等於判斷用單個=,而不 是==。
(4) where中還可使用複雜的邏輯判斷:
update T_Person set Age=30 where Name=’Tom’ or Age<25. or至關於C#中的||(或者)。
(5) where中可使用的其餘邏輯運算符是:or,and,not,<,>,>=,<=,!=(或< >)等。
3. 數據刪除
(1) 刪除表中的所有數據:delete from T_Person。
(2) delete只是刪除數據,表還在,和drop table不一樣。
(3) delete也能夠帶where子句來刪除一部分數據:delete from T_Person where FAge>30。
4. 數據檢索
(1) 簡單的數據檢索:select * from T_Employee。
(2) 只檢索須要的列:select FName from T_Employee。
(3) 列別名:select FNumber as 編號,FName as 姓名 from T_Employee。
(4) 還能夠檢索不與任何表關聯的數據:select 1+1,select newId(),select getDate()。
5. 數據彙總
(1) SQL聚合函數:max(最大值),min(最小值),avg(平均值),sum(和),count(數量)。
6. 數據排序
(1) order by子句位於select語句的末尾,它容許指定按照一個列或者多個列進行排序,還能夠指定排序方式是升序(從小到大排序,ASC)仍是降序(從大到小排 序,DESC)。
(2) 按照年齡從大到小排序,若是年齡相同則按照工資從大到小排序
select * from T_Employee order by FAge Desc,FSalary Desc
(3) order by子句要放到where子句以後:
select * from T_Employee where FAge>23 order by FAge Desc,FSalary Desc
7. 通配符過濾(模糊匹配)
(1) 通配符過濾使用Like。
(2) 單字符匹配的通配符爲半角下劃線」_」,它匹配單個出現的字符,以任意字符開頭,剩餘部分爲」erry」:
select * from T_Employee where FName like ‘_erry’
(3) 多字符匹配的通配符爲半角百分號」%」,它匹配任意次數(零或者多個)出現的任意字符,」K%」匹配以K開頭,任意長度的字符串。檢索姓名中包含」n」的員工的信息:
select * from T_Employee where FName like ‘%n%’
8. 空值處理
(1) 數據庫中,一個列若是沒有指定值,那麼值就爲null,這個null和C#中的null不同,數據庫中的null表示」不知道」,而不是表示沒有,所以select null+1結果是null, 由於」不知道」加1的結果仍是」不知道」。
(2) select * from T_Employee where FName=null and select * from T_Employee where FName!=null。都沒有任何返回結果,由於數據庫」不知道」。
(3) SQL中使用is null,is not null來進行空值判斷。
select * from T_Employee where FName is null
select * from T_Employee where FName is not null
9. 多值匹配
(1) select FAge,FNumber,FName from T_Employee where FAge in(34,23,35)
(2) 範圍值:
1) select * from T_Emploee where FAge>=23 and FAge<=27
2) select * from T_Employee where Fage Between 23 and 27
10. 數組分組
(1) 按照年齡進行分組統計各個年齡段的人數:
select FAge,Count(*) from T_Employee Group by Fage
(2) Group by子句必須放在where語句的後面
(3) 沒有出如今Group by子句中的列是不能放到select語句後的列名列表中的(聚合函數除外)。
1) 錯誤:select FAge,FSalary from T_Employee group by Fage。
2) 正確:select Fage,Avg(FSalary) from T_Employee group by Fage。
11. Having子句
(1) 在where中不能使用聚合函數,必須使用Having,Having要位於Group by以後。
select Fage,Count(*) as 人數 from T_Employee Group by FAge Having Count(*)>1
(2) 注意Having中不能不能使用爲參數分組的列,Having不能代替where,做用不同,Having是對組進行過濾。
12. 限制結果集行數
(1) select top 5 * from T_Employee order by FSalary Desc
(2) (*)檢索按照工資從高到低排序檢索從第六名開始一共三我的的信息
select top 3 * from T_Employee where FNumber not in (select top 5 FNumber from T_Employee order by Fsalary desc) order by FSalary Desc。
(3) SQL Server2005後增長了Row_Number函數簡化實現
13. 去掉數據重複
(1) select FDepartment from T_Employee——>select distinct FDepartment from T_Employee
(2) distinct是對整個結果集進行數據重複處理的,而不是針對某一個列,所以下面的語句並不會只保留Fdepartment進行重複值處理。
select distinct FDepartment,FSubcompany from T_Employee