返回非空值的計數:Count(*) 用於數字或字符類型的列
例:select Count(*) as 及格人數 from Student where Score>=60;——》查詢返回的是:分數60分以上的所有同學的人數
SQL Server 基礎
一.基礎
1.SQL Server 使用的是SQL(Structured Query Language,結構化的查詢語言)語言,他只是數據庫能識別的指令,T-SQL(Transact-SQL )是標準的SQL加強版,由:數據庫的定義語言(DDL),數據庫的操作語言和數據庫的控制語言組成;
注:SQL中的下標從1開始;SQL中不分大小寫
2.主數據庫文件:*.mdf
次數據庫文件:*.ndf 可多個,如:可分別在三個驅動盤上建立3個次數據庫文件(1.ndf,2.ndf和3.ndf)
日誌文件 :*.ldf
3.註釋:
(1).單行註釋:--
(2).多行註釋:
4.快捷鍵:
F5 :執行語句
Ctrl F5 :檢查語法
5.登陸及權限的管理:
(1).添加登陸賬戶:
1).添加Windows賬戶:exec sp_grantlogin '賬戶名\密碼'
例:exec sp_grantlogin 'wzy\123123'
2).添加SQL賬戶:exec sp_addlogin '賬戶名',',密碼'
例:exec sp_addlogin 'wzy','12313'
刪除登陸賬戶:exec sp_droplogin '賬戶名'
例:exec sp_droplogin 'wzy'
(2).添加數據庫用戶:
exec sp_grantdbaccess '數據庫賬戶','密碼'
例:exec sp_grantdbaccess 'wzydb','123'
刪除數據庫用戶:
exec sp_revokedbaccess '數據庫賬戶'
例:exec sp_revokedbaccess 'wzydb'
(3).管理數據庫用戶的權限:
爲數據庫的用戶分配權限:
grant 權限,權限 on 表名 to 數據庫賬戶
例:grant insert,delete,check on Studnet to wzy
——賦予wzy數據庫用戶對Studnet表的添加,刪除,查找的權限
刪除數據庫的用戶的權限:
revoke 權限,權限 on 表名 from 數據庫賬戶
例:revoke insert,delete on Student from wzy
——刪除wzy數據庫用戶對Studnet表的添加和刪除的權限
二.
1.SQL中的表達式:
= 等於;>大於;< 小於;>= 大於或等於;<=小於或等於;<> 不等於;! 非
2.通配符:
‘_’ :表示一個字符 ;例:A Like ‘C_’;
% :表示任意長度的字符串;例:A Like ‘C_%’;
[ ] :括號中所指定範圍內的任意一個字符;例:A Like ‘C_WO[1-2]’;
[^ ] :不在括號中所指定範圍內的任意一個字符;例:A Like ‘C_WO[^1-2]’;
3.邏輯表達式:
AND,OR,NOT (先是Not,再是AND,最後是Ro)
例:Not(付款方式='信用卡')OR(信用卡 IN ('牡丹卡','龍卡','陽光卡'))????????????????
注:IN是用來限制範圍的;
三.函數
1.字符串函數:
1).字符串的長度:len
例:select len(name) from Student where id=1;——》返回id爲1的學生姓名的字符串長度:
2).大小寫轉換:lower,upper
例:select lower(name) from Student where id=1;——》返回id爲1的學生姓名的字符串的小寫
例:select upper(name) from Student where id=1;——》返回id爲1的學生姓名的字符串的大寫
3).尋找一個字符串在另一個字符串中的起始下標:charindex
例: select charindex('Accp','My Accp',1);——》4
4).清楚左邊的空格:ltrim
例:select ltrim(' 哈哈');——》查詢返回的是:哈哈(前面沒有空格)
5).清楚右邊的空格:rtrim
例:select ltrim('哈哈 ');——》查詢返回的是:哈哈(後面沒有空格)
6).從字符串右邊數返回指定數目的字符:right
例:select right('哈市咔噠收視費',3) ;——》查詢返回的是:收視費
7).替換字符串中的字符:replace
例:select replace('師傅師傅是爽膚水愛仕達阿達','師','爽');——》查詢返回的是:爽傅爽傅是爽膚水愛仕達阿達
8).在字符串中刪除指定長度的字符串字符,用另一個字符串代替:stuff
例:select stuff('ABCDEFGHRJ',2,6,'我的地盤我做主');——》查詢返回的是:A我的地盤我做主HRJ
注:返回字符串中從2開始的6個字符的被替換後的字符串;SQL中的下標從1開始;
2.日期函數:(yy:年;mm:月;dd:日 dw:星期(從1開始,表示週日);)
1).取得當前的系統的日期:getDate()
例:select getDate();——》查詢返回的是:今天的日期:2009-03-25 15:39:24.870
2).推遲指定日期的:DateAdd()
例:select DateAdd(mm,4,'01/03/2009');——》查詢返回的日期是:2009-05-03 00:00:00.000
3).兩個日期之間指定日期部分的差值(前-後):DateDiff()
例:select DateDiff(mm,'01/03/2009','07/12/2008');——》查詢返回的日期是:-6
4).返回日期中指定部分的字符串形式:DateName()
例:select DateName(dw,'01/01/2000');——》查詢返回的日期是:星期六
5).返回指定日期部分的整數形式:DatePart()
例:select DatePart(day,'07/12/2008');——》查詢返回的日期是:12
Select DatePart(dw,getDate());——》查詢返回的日期是:6(今天是星期5)
3.數學函數:
1).取絕對值:Abs()
例:select Abs(-23);——》查詢返回的是:23
2).大於或等於指定數值或表達式的最小整數:Ceiling()
例:select Ceiling(23.5);——》查詢返回的是:24
3).小於或等於指定數值或表達式的最大整數:Floor()
例:select Floor(23.5);——》查詢返回的是:23
4).取數值表達式的冪:Power()
例:select Power(2,4);——》查詢返回的是:16
5).將數值表達式精確到指定的位數:Round()
例:select Round(23.5329323,3);——》查詢返回的是:23.5330000
6)判斷正負(正數的返回 1;負數的返回 1;0返回0):Sign()
例:select Sign(-234);——》查詢返回的是:-1
7).取平方根:Sqrt()
例:select Sqrt(9);——》查詢返回的是:3.0
4.系統函數:
1).轉換數據類型:Convert
例:select Convert(Varchar(5),12345)——》查詢返回的是:"12345";(把12345轉換成字符串)
例:select Convert(int,'12345')——》查詢返回的是:12345;(把字符串12345轉換成整形數字)
三.插入
1.插入一條語句:
insert into 表名(列名)values(值列表)
例:Insert into Students(name,address,age)values('老李','北京',23);
注:1).(列名)和(值列表)要完全對應,實現實體(行)的完整性
2).如果允許爲空或者有默認值時,且(列名)中沒寫該字段,(值列表)中對應的項均可以不填
3).如果允許爲空或者有默認值時,且(列名)中寫該字段,(值列表)中對應的項必填,(列名)中默認值對應(值列表)中用 default,(列名)中允許爲的對應(值列表)中用null(表示表中該列對應的字段沒有應用對象)或' '(表示表中該列對應的 字段類型的默認值)代替
4).要完全符合檢查約束:(列名)中的字段有約束時,(值列表)中對應的項必須符合約束,否則添加失敗
2.一次插入多條語句:
1).插入的新表必須預先存在:
例:insert into User (name,address,Email)
select name,address,Email from Student
注:User表必須預先存在,查詢到的數據的個數,順序,數據類型等,必須與插入的項保持一致
2).插入的新表預先不存在:
例:select Student.name,Studnet.Address,Student.Emial
into User
from Student
注:User表必須預先不存在,語句運行的過程中自己創建的
向新表插入數據的時候需要創建標示例:
例:select identity(int,1(標示的種子),1(增長量)as Student.Id,Student.name,Studnet.Address,Student.Emial
into User
from Student
四.修改
update 表名 set 列名='',列名='',... where 列名=''
例:update Student set name='老王',address='南京' where Student.Id=1;
update Scores set scores=scores 5 where scores<=90;
注:1).如果不用where 限制,整個表所有的數據都被更新
2).update 可以更新一條數據,也可以更新多條數據,還可以更新整張表
五.刪除
(1).刪除表中的數據
delete from 表名 where 列名=''
例; delete from Scores where scores<=60;
注:如果不用where 限制,整個表所有的數據都被刪除
(2).刪除表中的所有數據,表存在
truncate table 表名: 刪除沒有主外建約束的表
delete 表名: 可刪除有主外建約束的表
(3).刪除表中的所有數據,表也被刪掉
drop table 表名: 完全刪除表的所有
六.查詢
1.簡單的查詢:
(1).查詢表中的所有數據:select * from 表名;
例:select * from Students
(2).帶條件的查詢:select * from 表名 where 列名='';
例:select * from Students where name='老王';
(3).指定列名的查詢:select 列名1,列名2,... from 表名 where 列名='';
例:select name,address from Students where id=1;
(4).查詢空行:select 列名1,列名2,... from 表名 where 列名 is null; (或者is Not null)
例:select name,address from Students where Email is null; ——》查詢Email爲空的實體
(5).查詢後顯示標題的爲漢字,查詢後多出一列(常量列):
例:select 姓名=name,地址=address,學校名稱='北大青鳥' from Students
或:select name as 姓名,address as 地址,'北大青鳥' as 學校名稱 from Students
(6).查詢顯示限制行數:
例:select Top 5 姓名=name,地址=address,'北大青鳥' as 學校名稱 from Students where Email is Not null;
或:select Top 20 percent 姓名=name,地址=address,'北大青鳥' as 學校名稱 from Students where Email is Not null;
注:percent :表示百分之幾;TOP :表示從上往下
Top 20 percent:所有查詢的數據的前20%條
(7).合併列名的查詢:
例:select FirstName '.' LastName as 姓名 from User
(8).排序查詢結果:
1).使用order by語句;並不是where的條件
例:select StudentId as 學員編號,(Scores*0.9 9) as 學員成績 from Student order by Scores
2).ASC爲升序;DESC爲降序;默認爲ASC升序排列;
例:select StudentId as 學員編號,(Scores*0.9 9) as 學員成績 from Student where (Scores*0.9 5)<60 order by Scores
注: order by Scores——》查出的結果按成績的升序排序
3).也可以按多個字段進行排序顯示查詢結果,注意排序是按字段的先後順序的:
例:select StudentId as 學員編號,Scores as 學員成績 from Student where Scores>60 order by Scores,StudentId
注:order by Scores,StudentId——》查出的結果先按按成績的升序排序,再按學員編號的升序排序
2.模糊查詢:
(1).使用Like:只用於字符串,僅與Char和Varchar數據的類型聯合使用
例:select * from Studnet where name Like '張%';——》查詢返回的是:姓張的所有學生
例:select * from Card where id Like '%[^8]%[A,C]%';——》查詢返回的是:第三位不是8的A卡或C卡
(2).使用Between...and...或Not Between...and...進行範圍查詢:
例:select * from Scores where Score Between 60 and 80; ——》查詢返回的是:分數是60到80的成績
例:select * from Student where birthday Between '1993-2-3' and '2009-3-4';——》查詢返回的是:出生在那時間段你的學生
(3).使用in或not in進行範圍查詢:
例:select * from Student where address in ('北京','上海','天津'); ——》查詢返回的是:住址是這三個地的所有學生
3.聚合函數查詢:
(1).數字的彙總:Sum ,不能彙總字符,日期等其他函數
例:select Sum(Score) from Student where name like '張%'; ——》查詢返回的是:姓張的所有同學的分數總和
注:查詢只能返回一個數字,不能與返回多行的數據一起查詢,如加上返回查詢address,姓張的同學可能有與不同的地址(多行)
(2).查詢數字的平均值:Avg ,不能彙總字符,日期等其他函數
例:select Avg(Score) from Student where name like '張%'; ——》查詢返回的是:姓張的所有同學的分數平均值
例:select avg(Score) from Student where Score>=60;——》查詢返回的是:分數60分以上的所有同學的平均值
注:查詢只能返回一個數字,不能與返回多行的數據一起查詢,如加上返回查詢address,姓張的同學可能有與不同的地址(多行)
(3).查詢最大值或最小值:Max,Min; 能用於數字,字符,日期等其他函數
例:select Age(Score) as 平均分,Max(Score) 最高分,Min(Score) as 最低分 from Student where Score>=60
——》查詢返回的是:分數大於60分的同學的平均分,最高分,最低分
注:查詢只能返回一個數字,不能與返回多行的數據一起查詢,如加上返回查詢address,姓張的同學可能有與不同的地址(多行)
(4).返回非空值的計數:Count(*) 用於數字或字符類型的列
例:select Count(*) as 及格人數 from Student where Score>=60;——》查詢返回的是:分數60分以上的所有同學的人數
4.分組查詢:
(1).使用Group By 進行分組查詢:先分組在進行查詢,並不是where的條件
例:select CourseId as 課程id ,Avg(Score) as 課程的平均成績 from Score Group By CourseId
——》查詢返回的是:按課程的id進行分組查詢,返回每門課程的平均成績
例:select StudnetId as 學生id,CourseId as 課程id,Avg(Score) as 課程的平均成績 from Score
Group by CourseId,Studentid
——》查詢返回的是:先按課程的id進行分組,再按學生的id進行分組,然後查詢返回每個學生每門課程的平均成績
(還是每個學生每門課程的成績,因爲select語句中只能出現爲每個分組返回一個值得表達式)
注:分組查詢中:select語句中只能出現:(1)被分組的列(2)爲每個分組返回一個值得表達式(如聚合函數)
(2).使用Having進行分組篩選:
例:select * from StudnetId as 學生id,CourseId as 課程id,Avg(Score) as 課程的平均成績 from Score
Group by CourseId,Studentid Having Count(Score)>1
——》查詢返回的是:先按課程的id進行分組,再按學生的id進行分組,並且分組後出現1次以上的列
然後查詢返回每個學生每門課程的平均成績
(還是每個學生每門課程的成績,因爲select語句中只能出現爲每個分組返回一個值得表達式)
注:查詢語句中:篩選順序是:where,Group By ,Having
where是從數據源中去掉不符合搜索條件的語句
Group By從剩下的符合條件的列中,進行分組,表達式(函數)爲各個組進行計算統計
Having對分組進行篩選,去掉不符合組搜索條件的各組中的數據行
5.多表查詢:
(1).內聯查詢:表之間存在主外鍵關係,表之間的地位平等
1).在where語句中制定查詢條件:
例:select Studnet.name as 學生姓名,Course.name as 課程名稱,Scores.Score as 課程成績 from Studnet,Scores,Course
where Student.id = Scores.StudentId,Course.Id=Scores.CourseId
==》select S.name as 學生姓名,C.name as 課程名稱,SC.Score as 課程成績
from Studnet as S
inner Join Scores as SC on (S.id = SC.StudentId)
inner Join Course as C on (C.Id=SC.CourseId)
——》查詢返回的是:查詢學生表和成績表,返回每個學生的每門課程的成績
2).通過(inner)Join...on...語句中制定查詢條件:
例:select student.name,Scores.CourseId,Scores.Score from Studnet,Scores
where Student.id = Scores.StudentId
==>select S.name as 學生姓名,C.CourseId as 課程id,C.Score as 課程成績 from Studnet as S inner join Scores as C
on S.id = C.StudentId
(2)外聯查詢:表之間存在主外鍵關係,表之間的地位有主次之分
1).左外鏈接查詢:包含左表中所有匹配的行,如果右表中有的項左表中沒有對應的項,以空填充
例:select S.name as 學生姓名,C.CourseId as 課程id,C.Score as 課程成績
from Studnet as S
left outer Join Scores as C
on S.id=C.StudentId
——》查詢返回的是:以學員信息表爲主表,成績表爲次表,查詢符合條件的列中的某些學員沒有對應的科目和成績,以空填充
2).右外鏈接查詢:包含右表中所有匹配的行,如果右表中有的項左表中沒有對應的項,以空填充
例:select S.name as 學生姓名,C.CourseId as 課程id,C.Score as 課程成績
from Studnet as S
right outer Join Scores as C
on S.id=C.StudentId
——》查詢返回的是:以成績表爲主表,學員信息表爲次表,查詢符合條件的列中的某些成績沒有對應的學員和課程,以空填充
七.變量:
(1).聲明變量:局部變量用'@',系統(全局)變量用'@@',不能賦值
DeClare @變量名 變量的類型
例:deClare @name varchar(10)
set @name='馬文才'
select * from Student where name= @name
——查找馬文才的信息
(2).爲變量賦值:
1). set 專用的賦值常量,一次只能爲一個變量賦值
例:deClare @name varchar(10)
set @name='馬文才'
2).select 給從表中查詢的結果賦值,可以給多個變量賦值,用逗號隔開
例:deClare @name varchar(10)
set @name='馬文才'
deClare @seat int
select @seat=Seat from Student where StuName=@name ——》查找馬文才的座位號並賦值給變量@seat
select * from Student where (Seat=@seat 1) or (Seat=@seat 1) ——》查找馬文才的左右同桌
(3).最常用的全局變量:@@error , @@identity
1).@@error :判斷最近一條增刪改的語句是否正確;成功:0;不成功:非0
例:print '當前的錯誤號:' Convert(varchar(5),@@error)
——》輸出錯誤號,大於0,表示上一條語句執行錯誤
2).@@identity:最新的標識列號
例:insert into Studnet (id,names)values(1,'wzy')
print '當前的錯誤號:' Convert(varchar(5),@@identity)
——》輸出最後一條添加語句的id