數(shù)據(jù)庫(kù)中常用的概念
Sql本身是一個(gè)服務(wù)器,沒(méi)有界面,Management Studio 只是一個(gè)sql server管理工具而已,不是服務(wù)器。
Sql server 在管理工具下面的服務(wù)SQL Server (MSSQLSERVER)
主鍵:就是唯一定位的一條數(shù)據(jù)的列。不會(huì)有重復(fù)的列才能當(dāng)主鍵, 一個(gè)表可以沒(méi)有主鍵,但是會(huì)非常難以處理,因此建議都要設(shè)主鍵。
兩種主鍵:
業(yè)務(wù)主鍵:使用有業(yè)務(wù)意義的字段做主鍵,如身份證號(hào)、職工編號(hào)。
邏輯主鍵:使用任何沒(méi)有意義的字段做主鍵,完全給程序看的。推薦用邏輯主鍵
常識(shí):
1、sql語(yǔ)句中字符串是用單引號(hào)
2、 sql語(yǔ)句大小寫(xiě)不敏感的。
分類(lèi) | 備注和說(shuō)明 | 類(lèi)型 | 說(shuō)明 |
二進(jìn)制數(shù)據(jù)類(lèi)型 | 存儲(chǔ)非子符和文本的數(shù)據(jù) | Image | 可用來(lái)存儲(chǔ)圖像 |
文本數(shù)據(jù)類(lèi)型 | 字符數(shù)據(jù)包括任意字母、符號(hào)或數(shù)字字符的組合 | Char | 固定長(zhǎng)度的非 Unicode 字符數(shù)據(jù) |
Varchar | 可變長(zhǎng)度非 Unicode 數(shù)據(jù) | ||
Nchar | 固定長(zhǎng)度的 Unicode 數(shù)據(jù) | ||
Nvarchar | 可變長(zhǎng)度 Unicode 數(shù)據(jù) | ||
Text | 存儲(chǔ)長(zhǎng)文本信息(指針,2G) 保存的是字節(jié)數(shù)據(jù) | ||
Ntext | 存儲(chǔ)可變長(zhǎng)度的長(zhǎng)文本 | ||
日期和時(shí)間 | 日期和時(shí)間在單引號(hào)內(nèi)輸入 | Datetime | 日期和時(shí)間 |
數(shù)字?jǐn)?shù)據(jù) | 該數(shù)據(jù)僅包含數(shù)字,包括正數(shù)、負(fù)數(shù)以及分?jǐn)?shù) | int smallint | 整數(shù) |
float real | 數(shù)字 | ||
貨幣數(shù)據(jù)類(lèi)型 | 用于十進(jìn)制貨幣值 | Money | |
Bit數(shù)據(jù)類(lèi)型 | 表示是/否的數(shù)據(jù) | Bit | 存儲(chǔ)布爾數(shù)據(jù)類(lèi)型 |
Guid 算法是一種可以產(chǎn)生唯一標(biāo)識(shí)的高效算法,它使用網(wǎng)卡MAC、地址、納秒級(jí)時(shí)間、芯片ID碼等算出來(lái)的,這樣保證每次生成的GUID永遠(yuǎn)不會(huì)重復(fù),無(wú)論是同一個(gè)計(jì)算機(jī)上還是不同的計(jì)算機(jī)。/
數(shù)據(jù)庫(kù)的類(lèi)型uniqueidentifier
SQLServer中生成GUID的函數(shù)newid(),.Net中生成Guid的方法:Guid.NewGuid()
use 數(shù)據(jù)庫(kù)名,打開(kāi)該數(shù)據(jù)庫(kù),有時(shí)候在新建查詢(xún)時(shí)沒(méi)選擇對(duì)應(yīng)的數(shù)據(jù)庫(kù),所以用這條語(yǔ)句;蛘呤謩(dòng)選擇該數(shù)據(jù)庫(kù)
Insert語(yǔ)句可以省略表名后的列名,但是不推薦
如果插入的行中有些字段的值不確定,那么Insert的時(shí)候不指定那些列即可。
當(dāng)不提供字段名時(shí),插入值需要加入默認(rèn)值defaulf 也就默認(rèn)值用defaulf表示
插入數(shù)據(jù) insert into 表名 (字段名) values (值)
例:insert into student ([name],age,sex,birthday) values ('張三',21,1,1995-02-26)
字段與值一一對(duì)應(yīng)
1. 新建一個(gè)表
語(yǔ)法:create table 表名 (字段1 類(lèi)型1,字段2 類(lèi)型2,……)
添加主鍵 primart key (字段)
例:
CREATE TABLE T_Employee --創(chuàng)建一個(gè)表表名是T_Employee
(FNumber VARCHAR(20), --字段 類(lèi)型
FName VARCHAR(20),
FAge INT,
FSalary NUMERIC(10,2),
PRIMARY KEY (FNumber)); -- 設(shè)置主鍵
2. 刪除整個(gè)表:Drop Table 表名
更新
語(yǔ)法:update Table set col=value,col2=value2 where ...
update 表名 set 字段 = 值,字段2 = 值2 where 條件
更新一個(gè)列:UPDATE T_Person Set Age=30
更新多個(gè)列:UPDATE T_Person Set Age=30,Name=‘tom’
更新一部分?jǐn)?shù)據(jù): UPDATE T_Person Set Age=30 where Name=‘tom’,用where語(yǔ)句表示只更新Name是’tom’的行,注意SQL中等于判斷用單個(gè)=,而不是==
Where中還可以使用復(fù)雜的邏輯判斷UPDATE T_Person Set Age=30 where Name=‘tom’ or Age<25,or相當(dāng)于C#中的||(或者)
update Person1 set NickName=N'二十歲' 在字符前面加上N代表使用Unicode編號(hào)
where (Age>20 and Age<30) or(Age=80)
Where中可以使用的其他邏輯運(yùn)算符:or(或)、and(與)、not(非)、<、>、>=、<=、!=(或<>)等
3. 修改表
添加字段
語(yǔ)法:alter table 表名 add 字段 類(lèi)型
例:ALTER TABLE T_Employee ADD FSubCompany VARCHAR(20);
4. 刪除
語(yǔ)法:delete [from] Table where col=data
delete [from] 表名 價(jià)目where 條件
刪除表中全部數(shù)據(jù):delete from 表名
Delete只是刪除數(shù)據(jù),表還在,和Drop Table不同。
Delete 也可以帶where子句來(lái)刪除一部分?jǐn)?shù)據(jù):DELETE FROM T_Person WHERE FAge > 20
刪除表中全部的數(shù)據(jù)
1、 Delete 表名 刪除之后的id繼續(xù)上一次的值后。
2、runcate Table 表名 同時(shí)還原標(biāo)識(shí) 也就是說(shuō)設(shè)置默認(rèn)的id從1開(kāi)始
5. 檢索
語(yǔ)法: select col,col2[,*] from Table where ...
Select 字段 from 表名 where 條件
簡(jiǎn)單的數(shù)據(jù)檢索 :SELECT * FROM表名
只檢索需要的列 :SELECT 字段 表名
列別名:SELECT FNumber AS 編號(hào),FName AS 姓名,FAge AS Age111 FROM T_Employee
使用where檢索符合條件的數(shù)據(jù):SELECT 字段 FROM 表名 WHERE 條件。故事:新員工的數(shù)據(jù)檢索噩夢(mèng)。
還可以檢索不與任何表關(guān)聯(lián)的數(shù)據(jù):select 1+1;select newid();select getdate();
6. 函數(shù)
1、 聚合函數(shù)
最大值 MAX(字段)
最小值 MIN(字段)
平均值 AVG (字段)
求和 SUM (字段)
數(shù)量 COUNT(*)
2、 數(shù)字函數(shù)
執(zhí)行備注中的代碼
ABS() :求絕對(duì)值。
CEILING():舍入到最大整數(shù) 。3.33將被舍入為4、2.89將被舍入為3、-3.61將被舍入為-3。 Ceiling→天花板
FLOOR():舍入到最小整數(shù)。3.33將被舍入為3、2.89將被舍入為2、-3.61將被舍入為-4。 Floor→地板。
ROUND():四舍五入。舍入到“離我半徑最近的數(shù)” 。Round→“半徑”。例:Round(3.1425,2)。
解釋?zhuān)?.1425是在四舍五入的值,2是精確的位數(shù)
3、 字符串函數(shù)
LEN() :計(jì)算字符串長(zhǎng)度 求字符
DATALENGTH(): 計(jì)算字節(jié)長(zhǎng)度 求字節(jié) 一個(gè)漢字兩個(gè)字節(jié)
例:
select len('123是數(shù)字') --字符
select datalength('123是數(shù)字') --字節(jié)
注意:text類(lèi)型保存的是字節(jié)數(shù)據(jù),所以不能用len()
LOWER(): 轉(zhuǎn)小寫(xiě)
UPPER () :轉(zhuǎn)大寫(xiě)
LTRIM(): 字符串左側(cè)的空格去掉
RTRIM () :字符串右側(cè)的空格去掉
例:LTRIM(RTRIM(' bb '))
SUBSTRING(string,start_position,length)
參數(shù):string為主字符串,
start_position為子字符串在主字符串中的起始位置,從1開(kāi)始
length為子字符串的最大長(zhǎng)度。
例:SELECT SUBSTRING('abcdef111',2,3)
4、 日期函數(shù)
GETDATE() :取得當(dāng)前日期時(shí)間
DATEADD (datepart , number, date ),計(jì)算當(dāng)前的時(shí)間前或后
參數(shù):datepart 計(jì)量單位 值:year、month、day
number 增量 正數(shù)是后,負(fù)數(shù)是前
date 日期
例:--獲得當(dāng)前日期前年的時(shí)間
select dateadd(month,1,getdate())
DATEDIFF ( datepart , startdate , enddate ) :計(jì)算兩個(gè)日期之間的差額。 參數(shù):datepart 計(jì)量單位
startdate 起始日期
enddate 結(jié)束日期
例:統(tǒng)計(jì)不同工齡的員工的個(gè)數(shù):
select DateDiff(year,FInDate,getdate()),count(*) from T_Employee group by DateDiff(year,FInDate,getdate())
DATEPART (datepart,date):返回一個(gè)日期的特定部分
參數(shù):datepart 計(jì)量單位
date 日期
統(tǒng)計(jì)員工的入職年份個(gè)數(shù):
select DatePart(year,FInDate),count(*) from T_Employee
group by DatePart(year,FInDate)
5、 類(lèi)型轉(zhuǎn)換函數(shù)
CAST ( expression AS data_type)
參數(shù):expression 要轉(zhuǎn)換的值
data_type 要轉(zhuǎn)換的類(lèi)型
例:select cast(right('abc2011-02-24',10) as datetime)
CONVERT ( data_type, expression)
參數(shù):expression 要轉(zhuǎn)換的值
data_type 要轉(zhuǎn)換的類(lèi)型
例:select convert(datetime,right('2012-11-24',10))
6、空值處理函數(shù)
ISNULL(expression,value) :
參數(shù):如果expression值為null,剛返回value的值
7、 CASE函數(shù)
單值判斷,相當(dāng)于switch case
例:select fsalary, case
when fsalary < 4500 then '初級(jí)'
when fsalary < 8000 then '中級(jí)'
when fsalary > 8000 then '高級(jí)'
end as '等級(jí)'
from t_employee
注:then 后面除了給常量之外,還可以給列
7. 數(shù)據(jù)排序
ORDER BY子句位于SELECT語(yǔ)句的末尾,它允許指定按照一個(gè)列或者多個(gè)列進(jìn)行排序,
升序 ASC(從小到大排列)默認(rèn)
降序 DESC(從大到小排列)。
按照年齡從大到小排序,如果年齡相同則按照工資從大到小排序 :SELECT * FROM T_Employee ORDER BY FAge DESC,FSalary DESC(多個(gè)排序條件)
ORDER BY子句要放到WHERE子句之后
例: SELECT * FROM T_Employee WHERE FAge>23 ORDER BY FAge DESC,FSalary DESC
8. 通配符過(guò)濾
通配符過(guò)濾關(guān)鍵字使用LIKE 。
單字符匹配的通配符為半角下劃線(xiàn)“_”,它匹配單個(gè)出現(xiàn)的字符。
例:以任意字符開(kāi)頭,剩余部分為“erry”
SELECT * FROM T_Employee WHERE FName LIKE '_erry'
多字符匹配的通配符為半角百分號(hào)“%”,它匹配任意次數(shù)(零或多個(gè))出現(xiàn)的任意字符。 “k%”匹配以“k”開(kāi)頭、任意長(zhǎng)度的字符串
例:檢索姓名中包含字母“n”的員工信息
SELECT * FROM T_Employee WHERE FName LIKE '%n%'
通配符 | 解釋 | 示例 |
‘_’ | 一個(gè)字符 | A Like 'C_' |
% | 任意長(zhǎng)度的字符串 | B Like 'CO_%' |
[ ] | 括號(hào)中所指定范圍內(nèi)的一個(gè)字符 | C Like '9W0[1-2]' |
[^] | 不在括號(hào)中所指定范圍內(nèi)的一個(gè)字符 | D Like ‘%[A-D][^1-2]' |
-任意一個(gè)字符
% 任意多個(gè)字符
'[^a]%a%' 非a開(kāi)頭,中間含有a的任意多個(gè)字符
'[a-d]' 匹配a到d之間任意一個(gè)字符
9. 空值處理
數(shù)據(jù)庫(kù)中,一個(gè)列如果沒(méi)有指定值,那么值就為null,這個(gè)null和C#中的null不一樣,數(shù)據(jù)庫(kù)中的null表示“不知道”,而不是表示沒(méi)有
因此select null+1結(jié)果是null,因?yàn)椤安恢馈奔?的結(jié)果還是“不知道”。
SQL中使用is null、is not null來(lái)進(jìn)行空值判斷:
例:
SELECT * FROM T_Employee WHERE FNAME is null ;FNAME為空的值
SELECT * FROM T_Employee WHERE FNAME is not null ;fname不是空值
10. 多值匹配 使用關(guān)鍵字
要?jiǎng)h除多條記錄怎么辦?
例:Delete T_Employee where FId in (21,22)
例:SELECT * FROM T_Employee WHERE FAGE BETWEEN 23 AND 27
等價(jià)于:SELECT * FROM T_Employee WHERE FAGE>=23 AND FAGE <=27
11. 數(shù)據(jù)分組
按照年齡進(jìn)行分組統(tǒng)計(jì)各個(gè)年齡段的人數(shù):
SELECT FAge,Count(*) FROM T_Employee GROUP BY Fage
GROUP BY子句必須放到WHERE語(yǔ)句的之后
沒(méi)有出現(xiàn)在GROUP BY子句中的列是不能放到SELECT語(yǔ)句后的列名列表中的 (聚合函數(shù)中除外)
多條件查詢(xún):多條件分組時(shí),將條件相加,看是否相等,如果相等,就為一組
例:select fage,ftest,count(*) from t_employee group by fage,ftest
Having語(yǔ)句(分組后查詢(xún)條件)
分組統(tǒng)計(jì)之后查詢(xún)條件不能用where 而要用having語(yǔ)句,Having要位于Group By之后
例:--進(jìn)年齡分組統(tǒng)計(jì),同時(shí)ftese數(shù)量等于的
select fage,count(fage) from t_employee group by fage having count(ftest) = 2
12. 限制結(jié)果集行數(shù) top
--查詢(xún)前行記錄
select top 3 * from T_Employee order by fsalary desc
--分頁(yè)查詢(xún)
select top 3 * from t_Employee where fnumber not in (
select top 3 fnumber from T_Employee order by fsalary desc
)order by fsalary desc
13. 去掉數(shù)據(jù)重復(fù) distinct
例:select distinct fdepartment from t_employee
--多個(gè)列時(shí)和group by 一樣,按照多個(gè)列組合值判斷是否重復(fù)
select distinct fdepartment,fsubcompany from t_employee
14. 聯(lián)合結(jié)果集 UNION
基本的原則:每個(gè)結(jié)果集必須有相同的列數(shù);每個(gè)結(jié)果集的列必須類(lèi)型相容。
1. UNION合并兩個(gè)查詢(xún)結(jié)果集,并且將其中完全重復(fù)的數(shù)據(jù)行合并為一條
2. Union因?yàn)橐M(jìn)行重復(fù)值掃描,所以效率低,因此如果不是確定要合并重復(fù)行
那么就用UNION ALL
Union 和Union All 的區(qū)別
Union 合并重復(fù)項(xiàng),并且去掉重復(fù)項(xiàng)
Union All 合并重復(fù)項(xiàng),不去掉重復(fù)項(xiàng)
問(wèn)題:
在sql server 2008 中出現(xiàn)了“阻止保存要求重新創(chuàng)建表的更改”
解決辦法:工具->選項(xiàng)->-Designers>取消“阻止保存要求重新創(chuàng)建表的更改”
行號(hào)和自動(dòng)換行
工具—>選項(xiàng)—>文本編輯器—>純文本 右邊就有行號(hào)和文本編輯器
那些都是浮云,只有本領(lǐng)才是王道