SQL sever學習筆記
阿新 • • 發佈:2017-09-28
另一個 沒有 rtm update 引號 ddl 同時 填充 刪除表 SQL Server管理
(1) SQL Server的兩種驗證方式:用戶名驗證和Windows驗證,開發時用Windows驗證就行了。
(2) 常用字段類型:bit(可選值0,1),datetime,int,varchar,nvarchar(可能含有中文用nvarchar)。
(3) varchar(),nvarchar().char(n)的區別:char(n)不足長度n的部分用空格填充。Var: variable:可變的。
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 int null
)
刪除表:drop table T_Person
(5) 執行簡單的Insert語句: insert into T_Person(ID,Name,Age) values (1,’Jim’,39)
(6) *(熟悉):SQL主要分DDL(數據定義語言)和DML(數據操作語言)兩類,
create table,drop table,alter table等屬於DDL,
select,insert,Update,delete等屬於DML。
數據插入
(1) insert語句可以省略表名後的列名,但是不推薦。Insert into Person2 values(‘lucy’,’38’)
(2) 如果插入的行中有些字段的值不確定,那麽insert的時候不指定那些列即可。
數據更新
(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,<,>,>=,<=,!=(或< >)等。
數據檢索
(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()。
數據匯總
(1) SQL聚合函數:max(最大值),min(最小值),avg(平均值),sum(和),count(數量)。
數據排序
(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
通配符過濾(模糊匹配)
(1) 通配符過濾使用Like。
(2) 單字符匹配的通配符為半角下劃線”_”,它匹配單個出現的字符,以任意字符開頭,剩余部分為”erry”:
select * from T_Employee where FName like ‘_erry’
(3) 多字符匹配的通配符為半角百分號”%”,它匹配任意次數(零或者多個)出現的任意字符,”K%”匹配以K開頭,任意長度的字符串。檢索姓名中包含”n”的員工的信息:
select * from T_Employee where FName like ‘%n%’
空值處理
(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
多值匹配 :where
(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
數組分組 : Group by
(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。
Having子句 :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是對組進行過濾。
限制結果集行數 :top
(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函數簡化實現
去掉數據重復 :distinct
(1) select FDepartment from T_Employee——>select distinct FDepartment from T_Employee
(2) distinct是對整個結果集進行數據重復處理的,而不是針對某一個列,因此下面的語句並不會只保留Fdepartment進行重復值處理。
select distinct FDepartment,FSubcompany from T_Employee
SQL語句執行順序:
1. FROM子句組裝來自不同數據源的數據
2. WHERE子句基於指定的條件對記錄進行篩選
3. GROUP BY子句將數據劃分為多個分組
4. 使用聚集函數進行計算
5. 使用HAVING子句篩選分組
6. 計算所有的表達式
7. 使用ORDER BY對結果集進行排序
關系代數:
五種基本運算:並、差、笛卡爾積、選擇、投影
數據庫範式:
1NF(First Normal Form):當且僅當所有域只包含原子值,即每個分量都是不可再分的數據項,則稱實體E滿足第一範式
2NF(Second Normal Form):當且僅當實體E滿足第一範式,且每一個非鍵屬性完全依賴主鍵時,滿足第二範式
3NF(Third Normal Form):當且僅當實體E是第二範式(2NF),且E中沒有非主屬性傳遞依賴時,滿足第三範式
控制冗余(Controlled Redundancy)與非控制冗余(Uncontrolled Redundancy)的區別:
未受控制的數據存儲冗余會導致如下的問題:
1. 更新數據時的重復工作
2. 浪費空間
3. 數據可能會不一致
因此,理想情況下,我們應該設計一個沒有冗余的數據庫,但是有時候我們需要提高查詢的效率,因此我們引入了控制冗余(Controlled Redundancy)
例如: 我們將學生名和課程號冗余存儲於GRADE_REPORT表中,因為查詢成績的時候我們需要同時查詢學生姓名以及課程號。
數據的約束條件:完整性約束
1. 域約束:對屬性取值範圍的約束
2. 鍵約束:每個關系必須要有主鍵,且每個主鍵必須不相同
3. 非空約束:屬性值不能為NULL
4. 實體完整性約束:主鍵值不能為空
5. 參照完整性約束:外鍵可以取NULL值,但若外鍵為另一關系主鍵,則不能為NULL。
6. 用戶定義的完整性
各種數據操作可能違反的完整性約束
插入操作:域約束、鍵約束、非空約束、實體完整性約束、參照完整性約束
刪除操作:參照完整性約束
更新操作:域約束、鍵約束、非空約束、實體完整性約束、參照完整性約束
附:數據庫基本結構知識介紹:
名詞積累:
數據庫(Database):存放和提供數據的“庫房”
數據(Data):數據庫中存儲的基本對象。
數據庫管理系統(DBMS):位於用戶與操作系統之間的一層數據管理軟件。
數據庫系統(Database System):包括數據庫、DBMS、應用系統、數據庫管理員(DBA)
主鍵(Primary Key):用於唯一的標識表中的某一條記錄的屬性或屬性的集合。
外鍵(Foreign Key):用於與另一張表關聯,外鍵為另一張表的主鍵
超鍵(Super Key):超鍵是能唯一區分元組的屬性或屬性的集合
鍵(候選鍵):去掉了超鍵中多余的屬性,仍然能夠保證區分不同的元組。
模式(Schema):一個數據庫的描述,包括對數據庫結構,數據類型,還有約束。
實例(Instance / State):數據庫中在某一時刻存儲的真實的數據。(Instance是Schema在某一時刻的具體化、實例化)
數據操縱語言(DML:Data Manipulation Language):增刪改查
數據定義語言(DDL:Data Definition Language):定義、刪除、修改數據庫中的對象
數據控制語言(DCL:Data Control Language):用於控制用戶對數據庫操縱的權限
數據模型(Data Model):現實世界數據特征的抽象,用來定義數據如何組織,數據之間的關系怎樣
並相容性(Union Compatibility):兩個關系具有並相容性需要保證具有相同的屬性個數,以及對於每個屬性都有相同的域
視圖(VIEW):視圖是虛擬的表,並不是物理存儲的數據。而是由基本表或其他視圖派生的數據。對視圖的更新,實際上轉換為對實際基表的更新。
數據模型(Data Model): 基本概念:現實世界數據特征的抽象,用來定義數據如何組織,數據之間的關系怎樣。
層次:
1.概念模型(Conceptual):按用戶的觀點來對數據和信息建模
2.邏輯/實現模型(Logical / Implementation):層次模型,網狀模型,關系模型
3.物理模型(Physical):數據在具體DBMS產品中的物理儲存方式
數據庫系統的三級模式結構:
1.內模式(Internal Schema): (也稱存儲模式。)數據物理結構和儲存方式的描述,是數據在數據庫內部的表示方式
2.概念模式(Conceptual Schema):(也稱全局模式。)有時簡稱“模式”。是對數據庫中全體數據的邏輯結構和特征的描述
3.外模式(External Schemas): (也稱子模式或者用戶模式。)數據庫用戶能夠看見和使用的局部數據的邏輯結構和特征的描述
.試述事務的概念及事務的四個特性。
答:
事務是用戶定義的一個數據庫操作序列,這些操作要麽全做要麽全不做,是一個不可分割的工作單位。
事務具有四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持續性(Durability)。這個四個特性也簡稱為ACID特性。
原子性:事務是數據庫的邏輯工作單位,事務中包括的諸操作要麽都做,要麽都不做。
一致性:事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。
隔離性:一個事務的執行不能被其他事務幹擾。即一個事務內部的操作及使用的數據對其他並發事務是隔離的,並發執行的各個事務之間不能互相幹擾。
持續性:持續性也稱永久性(Permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其執行結果有任何影響。
SQL sever學習筆記