T-SQL查詢語句數據庫
美國國家標準協會(ANSI)和國際標準組織(ISO)爲 SQL定義了標準,微軟經過用Transact-SQL和ANSI—SQL兼容,Transact-SQL還包含了幾種可以加強性能的擴展。編程
T-SQL的組成:網絡
數據定義語言(Date Definition Language)語句簡稱DDL語句編程語言
DDL語句用來創建數據庫,數據庫對象(create,alter,drop)ide
create object_name函數
alter object_name性能
drop object_namespa
舉例說明DDL語句的使用:3d
use schoolDB對象
create table teacher
(cust_idint ,company varchar(40),contact varchar(30),phone char(12))
go
alter table teacher add ageint default 30
數據控制語言(Date Control Language)語句
用於改變某個用戶或角色相關的權限
grant
deny
revoke
舉例說明:
use schoolDB
grant select on products to public
go
數據操做語言(Date Manipulation Language)語句
操做數據庫中的數據。能夠更改數據庫中的數據或查詢數據庫中的信息
舉例說明:
select*from dbo.TStudent //查詢TStudent表中的數據
insert dbo.TStudent (StudentID,Sname,sex)values('0000001901','陳英宏','男')//爲TStudent表中的studentID,Sname,sex列插入相應的記錄
update dbo.TStudent set Sname='張春海',sex='男'where studentid='0000000569'//更新表中studentID爲0000000569的姓名修改成'張春海'
delete dbo.TStudent where StudentID='0000000020'//刪除studentID爲0000000020的記錄
1. 批處理
go
一個批處理命令通知SQLServer分析並運行一個批處理的全部指令
實際上不是 Transact-SQL語句,只是描述一個批處理。局部變量做用範圍侷限在一個批內,必須獨佔一行。
USE schoolDB
go
select * from dbo.TScore--從那張表查找
where mark+9<60
go
2. 表達式
1. 算數運算符
+ - * / %
比較運算符 = <> > = <
!= :不等於,等同於<>
BETWEEN :指定值得包含範圍(包含邊界)。使用AND分隔開始值和結束值
IS[NOT]NULL :根據使用的關鍵字,指定是否搜索空值或非空值。若是有任何一個操做數爲NULL,則包含運算符或算數運算符的表達式的計算結果爲NULL
LIKE:模糊查詢,與指定字符串進行模糊匹配
IN:是否在數據範圍裏面
字符串聯運算符 + 空字符不等於空值
表達式是各類符號和對單個數據進行操做
select mark+5 from dbo.TScore where mark<60
2. 邏輯運算符 and or not
NOT:和其餘操做符一塊兒使用,取反的操做
AND:組合兩個條件,並在兩個條件都爲TRUE時取值爲TRUE
OR:組合兩個條件,並在兩個條件之一爲TRUE時取值爲TRUE
3. 通配符
'_' :表示任何單個字符
sname LIKE '_cc' 查找以cc結尾的全部三個字母名字
% :任意長度的字符串
sname LIKE '%CC%'查找全部包含cc的名字
[]:括號中所指定範圍內的一個字符例如sname LIKE '[c-p]ion'將查找Ion結尾且以介於 c 與p之間的任何單個字符開始的名字
通配符常常與LIKE關鍵字一塊兒配合使用完成模糊查詢,可使用LIKE和通配符來完成對錶的一些特殊約束。
查詢全部行
select * from dbo.TStudent
使用where子句指定行
select Sname,sex,Email from dbo.TStudent where Sname='田育朋'
使用比較操做符 = ><>= <= <>
select * from dbo.TScore where mark<=60
使用字符比較符 like
% 0個或多個字符串
_ 任何單個的字符
[]在指定區域或集合內的任何單個字符
[^]不在指定區域或集合內的任何單個字符
select*from dbo.TStudent where sname like'高%'
select*from dbo.TStudent where sname like'_[明,育]_'
select*from dbo.TStudent where sname like'_[^明,育]_'
OR AND NOT使用方法
select*from dbo.TStudent where Sname like'高%'and sex='男'or StudentID='0000000112'
查找不姓高的學生
select*from dbo.TStudent where Sname not like'高%'
select*from dbo.TScore where mark between 70 and 80
等價於
select*from dbo.TScore where mark>=70 and mark<=80
不包括70 和80
儘可能使用between而不使用and和比較操做符表示的表達式
若是想返回不在指定區域的行時,使用not between 。這樣會下降數據查詢的速度。
select*from dbo.TScore where mark not between 70 and 80
指定時間範圍
select * from dbo.TStudent where Birthday between'1983-01-01'and'1984-01-01'
insert dbo.TStudent (StudentID,Sname,sex)values('0000001901','陳英宏','男')
查找班級不爲空的學生
select * from dbo.TStudent where Class is not null
查找班級爲空的學生
select * from dbo.TStudent where Class is null
使用is not null來查詢指定列中非空的行
select StudentID,subJectID,mark from dbo.TScore order by 2,3 desc
select StudentID,subJectID,mark from dbo.TScore order by subJectID,mark desc
asc升序
desc降序
distinct
select distinct Class from dbo.TStudent
select StudentID as'學號',Sname as'姓名',sex as'性別',cardID as'×××號',Birthday as'生日',Email as'郵件', Class as'專業',enterTime as'錄入時間'from dbo.Tstudent
等價於
select StudentID '學號',Sname '姓名',sex '性別',cardID '×××號',
Birthday '生日',Email '郵件', Class '專業',enterTime '錄入時間'from dbo.TStudent
符號多是字母,數字或標識,在結果集中,他們被用做特定的值,以增長結果集的可讀性。
select StudentID'學號',Sname'姓名',sex'性別','性別'from dbo.Tstudent
年齡是計算列
select StudentID as'學號',Sname as'姓名',sex as'性別',cardID as'×××號',Birthday as'生日',Email as'郵件', Class as'專業',enterTime as'錄入時間',Datediff(yy,Birthday,getdate())as'年齡'from dbo.TStudent
前面查詢都是基於單個數據庫表的查詢,若是一個查詢須要對多個表進行操做,就成爲鏈接查詢,鏈接查詢的結果集或結果稱爲表之間的鏈接。
錶鏈接的類型:
內鏈接、外鏈接、交叉鏈接
建立多表查詢的練習環境
--建立學生表 student
Createtable student
(
studentid int,
sname nvarchar(10),
sex nchar(1)
)
--插入學生
insert student values(1,'華榮','女')
insert student values(2,'王景正','男')
insert student values(3,'郭淑麗','女')
insert student values(4,'韓旭','女')
insert student values(5,'孟小飛','男')
--建立成績表
createtable score
(
studentid int,
subjectname nvarchar(20),
score decimal
)
--插入成績
insert score values(1,'英語',89)
insert score values(1,'數學',59)
insert score values(2,'英語',79)
insert score values(2,'數學',86)
insert score values(3,'英語',57)
insert score values(3,'數學',67)
insert score values(6,'英語',88)
insert score values(6,'數學',83)
1. 查詢全部學生的成績
select a.*,b.* from student a join score b on a.studentid=b.studentid
select sname,subjectname,score from student a join score b on a.studentid=b.studentid
select a.studentid,sname,subjectname,score from student a join score b on a.studentid=b.studentid
2. 從多個表中合併數據
使用內鏈接
select a.*,b.*from student a join score b on a.studentid=b.studentid
等價於
select a.*,b.*from student a inner join score b on a.studentid=b.studentid
使用外鏈接
左外鏈接
select a.studentid,sname,subjectname,score from dbo.student a leftjoin dbo.score b on a.studentid=b.studentid
右外鏈接
select a.*,b.*from dbo.student a rightjoin dbo.score b on a.studentid=b.studentid
練習:
1.查找不及格同窗姓名和學科分數
select sname,subjectname,score from dbo.student a join dbo.score b on a.studentid=b.studentid where score<60
自鏈接
查找到重名的學生
insert student values(6,'韓旭','男')
select a.*,b.* from dbo.student a join dbo.student b on a.sname=b.sname where a.studentid<>b.studentid
結合Order by找出知足條件的前幾條記錄
1. 年齡最大的前5名學生
select top 5 * from dbo.TStudent order by Birthday
2. 年齡最小的前5名學生
select top 5 * from dbo.TStudent order by Birthday desc
查找網絡班年齡最小的前5名學生
select top 5 * from dbo.Tstudent where Class='網絡班'orderby Birthday desc
能夠在Select 語句中單獨使用匯集函數,也能夠與語句group by聯合使用
除了count(*)函數,若是沒有知足where子句的記錄,則全部的彙集函數都將返回空值,Count(*)返回0
Count(*)Count(列)Sum Min max Avg
統計表中有多少行
select count(*) from dbo.TStudent
插入一條沒有班級的記錄
insert dbo.TStudent (studentID,Sname,sex)values('0000001901','王敬正','男')
select count(Class) from dbo.TStudent
求平均值
select avg(mark) from dbo.TScore
求最大值和最小值
select max(mark)from dbo.TScore
select min(mark)from dbo.TScore
求總和
select sum(mark)from dbo.TScore
若是使用匯集函數,則將對錶中的全部記錄的某個字段進行彙總,而後生成單個的值。若是想生成多個彙總值,同時使用匯集函數和group by 語句,聯合使用having和group by子句可以使結果集只包含知足條件的記錄。
聯合使用group by子句與having子句
分組彙總
1. 統計每一個班有多少個學生
select Class,count(*)from dbo.TStudent groupby Class
2. 統計男生女生數量
select sex,count(*) from dbo.TStudent group by sex
3. 統計每科平均分
selectsubJectName,avg(mark)fromdbo.TSubjectajoindbo.TScorebona.subJectID=b.subJectID
groupbysubJectName
4. 統計每一個學生的平均分
selecta.StudentID,avg(mark)fromdbo.TStudentajoindbo.TScorebona.StudentID=b.StudentID
groupbya.StudentIDorderbyavg(mark)
5. 查找平均分大於95的學生
selecta.StudentID,avg(mark)fromdbo.TStudentajoindbo.TScorebona.StudentID=b.StudentID
groupbya.StudentIDhavingavg(mark)>95
Having至關於條件
4.1. 插入數據
insert dbo.TStudent values('0000001902','李維偉','男','132302197506055634','1984-3-4','liweiwei@bdqn.com','網絡班',getdate())
4.2. 插入部分數據
插入學生學號 ;姓名性別其餘列爲空
insert dbo.TStudent (StudentID,sex,Sname)values('0000001903','男','張國強')
4.3. 將查詢記錄插建立的新表
使用SELECT INTO建立表。
將學生表中開發班的從學生查詢到一個新表
select StudentID,Sname,sex,Email into TDe from dbo.TStudent where Class='開發班'
4.4. 刪除數據
刪除學號是0000000020的學生
delete dbo.TStudent where StudentID='0000000020'
刪除1982年之前出生的學生
deletedbo.TStudentwhereBirthday<'1982-1-1'andclass='網絡班'
更新數據
更改學生學號是0000000569的學生姓名爲張海明性別改爲男
updatedbo.TStudentsetSname='張海明',sex='男'wherestudentid='0000000569'
執行事物的語法:
開始事物: BEGIN TRANSACTION
提交事物: COMMIT TRANSACTION
回滾撤銷事物:ROLLBACK TRANSACTION
事物應用案例
建立表
CREATETABLEdbo.bank (
customerNamechar(10)NOTNULL,
currentMoneymoneyNOTNULL
)
爲bank表的currentMoneymoney建立check約束,currentMoney的帳戶餘額不能少於1元
插入記錄
insertintobank(customerName,currentMoney)values ('張三',1000)
insertintobank(customerName,currentMoney)values ('李四',1)
select*frombank
updatebanksetcurrentMoney=currentMoney-1000 wherecustomerName='張三'
updatebanksetcurrentMoney=currentMoney-1000 wherecustomerName='李四'
select*frombank
執行以上命令後李四帳戶增長了1000,可是張三帳戶餘額仍然是1000,這樣的轉帳結果確定是不可取,咱們能夠經過如下方法來解決。
首先轉帳過程就是一個事物,它須要兩條UPDATE語句來完成,這兩條語句是一個總體。若是其中任何一條出現錯誤,則整個轉帳業務也應該取消,兩個帳戶的餘額應該恢復到原來的狀態。
經過如下語句來解決上述轉帳的問題
print'查看轉賬事務前的餘額'select*frombank
go
begintransaction
declare@errorSumint
set@errorSum=0
updatebanksetcurrentMoney=currentMoney-1000 wherecustomerName='張三'
set@errorSum=@errorSum+@@ERROR
updatebanksetcurrentMoney=currentMoney+1000 wherecustomerName='李四'
set@errorSum=@errorSum+@@ERROR
print'查看轉賬事務前的餘額'select*frombank
if@errorSum<>0
begin
print'交易失敗,回滾事務'
rollbacktransaction
end
else
begin
print'交易成功,提交事務,寫入硬盤,永久的保存'
committransaction
end
go
print'查看轉賬事務前的餘額'select*frombank
在事物處理過程當中使用@@ERROR全局變量來,檢查判斷當前T-SQL語句執行是否有錯誤。若是有錯誤則返回非零值,而@errorSum變量用來累計兩個UPDATE命令執行以後@@ERROR的值,只要其中一條UPDATE語句有錯誤@errorSum的值將再也不爲零。
若是將轉帳餘額修改爲500