一、數據庫的概念:
1.用自定義文件格式保存數據的劣勢
2.DBMS(DataBase Management System,數據庫管理系統)和數據庫。平時談到“數據庫”可能有兩種含義:MSSQLServer、Oracle等某種DBMS:存放一堆數據表的一個分類(Catalog)。
3、不同品牌的DBMS有自己的不同的特點:MYSQL、MSSQLServer、DB2、Qracle、Access、Sybase等。對於開發人員來講,大同小異。
4、SQL<>SQLServer<>MSSQLServer、最常見的錯誤。
5、除了Access、SQLServerCE等文件型數據庫外,大部分數據庫都需要數據庫服務器才能運行。學習、開發時是連接本機的數據庫。上線運行時是數據庫運行在單獨的服務器中。
6、Catalog(分類)(又叫數據庫DataBase、表空間TableSpace),不同類的數據應該放到不同的數據庫中,好處:
1)便於對各個Catalog進行個性化管理
2)避免命名衝突。
3)安全性高。
7、Table(表):書都放到書架上。碗都放在櫥櫃裏,不同類型的資料放到不同的格子中,將這種區域叫做表(Table)。不同的表根據放的數據不同,進行空間的優化,找起來方便。
8、列(Column),字段(Field)
9、主鍵(PrimaryKey):
主鍵是數據行的唯一標識。不會重複的列才能當主鍵,一個表可以沒有主鍵,但是會非常難以處理,因此沒有特殊理由都要設定主鍵
主鍵有兩種選用策略:業務主鍵和邏輯主鍵。業務主鍵是使用有業務意義的字段做主鍵,比如身份證號,銀行賬號等;邏輯主鍵是使用沒有任何業務意義的字段做主鍵,完全給程序看,業務人員不會看的數據。因爲很難保證業務主鍵不會重複(身份證號重複)、不會變化(賬號升位),因此推薦使用邏輯主鍵。
二、SQLServer的管理
1、需要安裝SQLServer2005或者SQLServer2008,若要使用SQLServer管理工具進行開發還要安裝SQLServer Management Studio,還可以使用VisualStudio進行管理。
2、使用免費的SQLServerExpress版本,Express版本的服務器名稱.\SQLEXPRESS,對於開發人員來講和其他版本沒有區別。
3、SQLServer的兩種驗證方式:用戶名驗證和Windows驗證,開發時用Windows驗證就行了。
4、開發人員關注點在開發上,而不是配置、備份等之上,那是DBA做的事情。
5、創建數據庫、創建表、設置主鍵
6、常用字段類型:bit(可選值0、1),datetime、int、varchar、nvarchar(可能含有中文使用nvarchar)
7、varchar、nvarchar和char(n)的區別:char(n)不足長度n的部分用空格填充。
三、SQL語句入門
1、SQL語句是和DBMS“交談”專用的語句,不同的DBMS都認SQL語法。
2、SQL語句中字符串要用單引號。
3、SQL語句是大小寫不敏感,不敏感指的是SQL關鍵字,字符串值還是大小寫敏感的。
4、創建表、刪除表不僅僅可以手工完成,還可以執行SQL語句完成,在自動化的部署、數據導入中用的多,CREATE TABLE T-Person(ID INT NOT NULL,NAME NVARCHAR(50),Age intNULL)、drop tableT-Person是刪除表的意思()。而delete是表刪除爲空。
5、簡單的insert語句:INSERT INYOT-Person(ID,NAME,AGE)values(1,'linhu',20)
6、(*)SQL主要分DDL(數據定義語言)和DML(數據操縱語言)兩類。Create Table、Drop Table 等屬於ddl;select 、insert、update、dalete等屬於dml ,dml不會影響數據表的結構。
四、主鍵設置:
1、SQLServer中兩種常用的主鍵數據類型:int(或bigint)+標識列(又稱自動增長字段);uniqueidentifier(又稱guid、uuid)。
2、用標識列實現字段自增可以避免併發等問題,不要開發人員控制自增。用標識列的字段在insert的時候不用指定主鍵的值。將字段的是“是標識符”設置爲“是”,其中一個表只能有一個標識列。
3、guid算法是一種可以產生唯一標識的高效算法,它使用的網卡MAC、地址、納秒級時間、芯片ID碼等算出來的,這樣保證每次生成的GUID永遠不會重複,無論是同一個計算機上還是不同的計算機。在公元3400年以前產生的GUID與任何其他產生的GUID都不相同。SQLServer中生成的GUID的函數newid(),在.net中生成的GUID方法:GUID.NewGuid(),返回是GUID類型。
4、(*)int 自增字段的優點:佔用的空間小、無需開發人員干預、易讀;缺點:效率低,數據導入導出的時候很痛苦。
5、(*)guid的優點:效率高,數據導入導出快;缺點:佔用的空間大,不容易讀
6、一般業界傾向於使用Guid.
五、數據插入:
1、Insert語句可以省略表名後的列名,但是不推薦。
2、如果插入的行中有些字段的值不確定,那麼Insert的時候不指定那些列即可,
3、給可以給的字段默認值,如果Guid類型主鍵的默認值設定爲newid()就會自動生成,很少這麼幹。
4、主鍵:insert into Person3(Name,Age) values('lily',38);insert intoPerson4(Id,Name,Age) values(newid(),'tom',30)
六、數據更新
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中還可以使用複雜的邏輯判斷UPDATET_Person Set Age=30 where Name='tom' or Age<25,or相當於C#的||(或者)
5、where 中還可以使用的其他邏輯運算符:or、and、not、<、>、>=、<=、!=(或<>)等
6、改變數據列的類型:ALTER TABLE Student
ALTER COLUMN SBIRTHDAY nvarchar(30) null
七、數據的刪除
1、刪除表中的全部的數據:DELETE FROM T-PERSON
2、Datele只是刪除數據,表還在,只不過這個表的內容爲空了,而Drop Table是將這個表銷燬。
3、Delete也可以帶where子句來刪除一部分數據:DELETE FROM T_PersonWHERE AGE>20
七、數據的檢索
1、執行備註中的代碼創建測試數據表。
2、簡單的數據檢索:Select * From T-Employee.
3、只檢索需要的列:Select FNumber From T-Employee;Select FName,FAge From T-Employee。
4、給列屬性取別名:Select FNumber as 編號,FName AS 姓名,FAge as 年齡 From T-Employee。
5、使用where檢索符合條件的數據:SELECTFName From T-Employee Where FSalary<5000.這個一般是新員工的檢索噩夢哦!
6、還可以檢索不與任何關係的數據:select 1+1;select newid();select getdate();
7、檢索用戶的SQLServer 的版本用 @@Version
八、數據的彙總
1、SQL聚合函數:MAX(最大值)、MIN(最小值)、AVG(平均值)、SUM(和)、COUNT(數量)
2、大於25歲的員工的最高工資:SELECTMAX(FSalary)FROM T_Employee WHERE FAge>25
3、最低工資和最高工資:Select MIN(FSalary),MAX(FSalary)From T_Employee
九、數據排序
1、ORDER BY 子句位於SELECT語句末尾,它允許指定按照一個列或則多個列進行排序,還可以指定排序的方式是升序還是降序(從小到大排列是ASC,從大到小是DESC)
2、按照年份升序排序所有員工的信息的列表:Select * From T-Employee order by FAge ASC,默認爲ASC升序排序,但是個人建議無論什麼情況你還是要指定好你的排序方式
3、按照年齡從大到小排序,如果年齡相同則按照工資從大到小排序:Select * From T-Employee Order FAge DESC ,FSalary DESC
4、ORDER By 子句要放到WHERE子句之後,SELECT *FRom T-Employee WHERE FAge>23ORDER BY FAge DESC,FSalary DESC.
十、通配符過濾
1、通配符過濾使用LIKE
2、單字符匹配的通配符爲半角(英文裏面的下劃線)下劃線"_",它匹配的單個出現的字符。以任意字符開頭,剩餘部分爲"erry":Select* From T_Employee WHERE FName LIKE '_erry'
3、多字符匹配的通配符爲半角的百分號“%”,它匹配的任意次數(零或者多個)出現的任意字符。“K%”匹配以“K”開頭,任意長度的字符串。檢索姓名中包含“n”的員工信息的話用的語句爲:SELECT * FromT_Employee Where FName Like '%n%'.
4、在表中出現NULL字樣,不是表示空值或者沒有值,它表示的是不知道什麼值
十一、空值處理
1、數據庫中,一個列如果沒有指定值,那麼值就爲null,這個null和C#中的null,數據庫中null表示的都是“不知道”的意思,而不是表示沒有,因爲“不知道”加1的結果還是不“不知道”
2、SELECT * From T_Employee Where FName=null; Select * From T_Employee Where FName !=null;都沒有任何返回結果,因爲數據庫也“不知道”
3、SQL中任何is null 、is not null 來進行空值判斷:Select * From T_EmployeeWhere FName is null;Select * From T_Employee Where FName is not null;
4、多值匹配:Select FAge,FNumber,FName FRom T_Employee Where FAge IN(23,25,28)
範圍值:Select *From T_Employee Where FAge>=23AND FAge<=27;Select * From T_Employee WhereFAge Between 23 AND 27
十二、數據分組
1、按照年齡進行分組統計各個年齡段的人數:Select FAge,count(*)From T-employee Group By Fage
2、Group By 子句必須放到Where語句的之後
3、沒有出現在Group By子句中的列是不能放到Select語句後的列名列表的(聚合函數中除外)比如:
錯誤:Select FAge,FSalary From T_Employee Group ByFAge
正確:Select FAge,AVG(FSalary)From T-employee Group By FAge
十三、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是對組進行過濾的。
3、having是對分組後的信息的過濾,能用的列和Select中能用的列是一樣的,其中Having是無法用Where替代的,Where是對原始數據進行過濾的。
十四、限制結果集行數
1、select top 5* from T_Employee order by FSalary Desc
2、(*)檢索按照工資從高到低排序檢索從第六名開始一共三個人的信息:Select top 3* From T_Employee Where FNumber Not in(Select top 5FNumber From T_Employee Order By FSalary Desc)Order By FSalary Desc
3、SQLServer 2005之後增加了Row_Number函數簡化實現。
十五、去掉數據重複
1、Select FDepartment From T-employee——>Select Distinct FDepartment From T-employee
2、Distinct是對整個結果進行數據重複處理(也就是針對整行,不是針對整個字段)的,而不是針對每一個列,因此下面的語句並不會保留Fdepartment進行重複值處理:
Select Distinct FDepartment,FSubCompany From T_Employee
十六、聯合結果集
1、簡單的結果集聯合:
Select FNumber,FName,FAge FromT_Employee UNION Select FIdCardNumber,FName,FAge From T_TemEmployee
2、基本原則:每個結果集必須有相同的的列數;每個結果集的列必須類型相容。
3、如果想去除重複行就不要加上 union all,只要union就可以了
十七、SQL裏面的一些函數:
1、ABS():求絕對值。
2、CEILING():舍入到最大整數。比如:3.33將舍入爲4;2.89將舍入爲3,而那個-3.61被舍入到-3,ceiling——》天花板
3、Floor()。舍入到最小整數,和Ceiling相反。
4、Round():四捨五入。舍入到“離我半徑最近的數”。round->"半徑".。Round(3.141525,2)
5、Len():計算字符串函數長度
6、Lower()、Upper():轉小寫、大寫
7、LTrim():字符串左邊的空格要去掉
8、Rtrim():字符串右側的空格去掉
9、Substring(String,start_position,length)其中參數string爲主字符串,start_position爲子字符串在主字符串中的起始位置,length爲子字符串的最大長度。Select Substring(‘abcdef111’,2,3)
10、日期函數:
1)GetDate():取得當前日期時間
2)Dateadd(datepart,number,date),計算增加的以後的日期。參數date爲待計算的日期;參數date爲增量;參數datepart爲計量單位,可選值見備註。DateAdd(Day,3,date)爲計算日期date的三天後的日期;而DateAdd(MOnth,-8,Date)爲計算日期date的8個月之前的日期。
3)DateDiff(Datepart,startdate,enddate):計算兩個日期之間的差額,datepart爲計量單位,可取值參考DateAdd
4)Datepart(datepart,date);返回一個日期的特定部分
十八、類型轉換函數:
1、Cast(expression asdata_type)
2、Convert(Data_Type,expression)
3、空值處理函數:isnull(expression,value):如果expression不爲空則返回expression,否則返回value.Select Isnull(FName,'佚名')as 姓名 fromT_Employee
4、case函數的用法:
1)單值判斷,相當於switch case
2)CASE expression
When values1 THEN returnvalues1
When values2 THEN returnvalues2
When values3 THEN returnvalues3
ELSE defaultreturnvalues
END
3)例子:
Select FName,
(
CASE FLevel When 1 then 'VIP客戶'
WHEN 2 THEN '高級客戶'
WHEN 3 THEN '普通用戶'
ELSE '客戶類型錯誤'
END
)as FLevlName
From T_Customer