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