重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
T-SQL查询语句
峄城ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!
美国国家标准协会(ANSI)和国际标准组织(ISO)为SQL定义了标准,微软通过用Transact-SQL和ANSI—SQL兼容,Transact-SQL还包含了几种能够增强性能的扩展。
T-SQL的组成:
数据定义语言(Date Definition Language)语句简称DDL语句
DDL语句用来建立数据库,数据库对象(create,alter,drop)
createobject_name
alterobject_name
dropobject_name
举例说明DDL语句的使用:
use schoolDB
create tableteacher
(cust_idint ,company varchar(40),contact varchar(30),phone char(12))
go
alter tableteacheradd ageint default30
数据控制语言(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.TStudentset Sname='张春海',sex='男'where studentid='0000000569'//更新表中studentID为0000000569的姓名修改为'张春海'
delete dbo.TStudentwhere 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+5from dbo.TScorewhere 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,Emailfrom dbo.TStudentwhere Sname='田育朋'
使用比较操作符 = ><>= <= <>
select * from dbo.TScorewhere mark<=60
使用字符比较符 like
% 0个或多个字符串
_ 任何单个的字符
[]在指定区域或集合内的任何单个字符
[^]不在指定区域或集合内的任何单个字符
select*from dbo.TStudentwhere snamelike'高%'
select*from dbo.TStudentwhere snamelike'_[明,育]_'
select*from dbo.TStudentwhere snamelike'_[^明,育]_'
OR AND NOT使用方法
select*from dbo.TStudentwhere Snamelike'高%'and sex='男'or StudentID='0000000112'
查找不姓高的学生
select*from dbo.TStudentwhere Snamenot like'高%'
select*from dbo.TScorewhere markbetween 70and 80
等价于
select*from dbo.TScorewhere mark>=70and mark<=80
不包括70 和80
尽量使用between而不使用and和比较操作符表示的表达式
如果想返回不在指定区域的行时,使用not between 。这样会降低数据查询的速度。
select*from dbo.TScorewhere marknot between 70and 80
指定时间范围
select * from dbo.TStudentwhere Birthdaybetween'1983-01-01'and'1984-01-01'
insert dbo.TStudent(StudentID,Sname,sex)values('0000001901','陈英宏','男')
查找班级不为空的学生
select * from dbo.TStudentwhere Classis not null
查找班级为空的学生
select * from dbo.TStudentwhere Class is null
使用is not null来查询指定列中非空的行
select StudentID,subJectID,markfrom dbo.TScoreorder by 2,3desc
select StudentID,subJectID,markfrom dbo.TScoreorder by subJectID,markdesc
asc升序
desc降序
distinct
select distinct Classfrom dbo.TStudent
select StudentIDas'学号',Snameas'姓名',sexas'性别',cardIDas'×××号',Birthdayas'生日',Emailas'邮件', Classas'专业',enterTimeas'录入时间'from dbo.Tstudent
等价于
select StudentID'学号',Sname'姓名',sex'性别',cardID '×××号',
Birthday '生日',Email'邮件', Class '专业',enterTime '录入时间'from dbo.TStudent
符号可能是字母,数字或标识,在结果集中,他们被用作特定的值,以增加结果集的可读性。
select StudentID'学号',Sname'姓名',sex'性别','性别'from dbo.Tstudent
年龄是计算列
select StudentIDas'学号',Snameas'姓名',sexas'性别',cardIDas'×××号',Birthdayas'生日',Emailas'邮件', Classas'专业',enterTimeas'录入时间',Datediff(yy,Birthday,getdate())as'年龄'from dbo.TStudent
前面查询都是基于单个数据库表的查询,如果一个查询需要对多个表进行操作,就成为连接查询,连接查询的结果集或结果称为表之间的连接。
表连接的类型:
内连接、外连接、交叉连接
创建多表查询的练习环境
--创建学生表student
Createtable student
(
studentidint,
snamenvarchar(10),
sexnchar(1)
)
--插入学生
insert studentvalues(1,'华荣','女')
insert studentvalues(2,'王景正','男')
insert studentvalues(3,'郭淑丽','女')
insert studentvalues(4,'韩旭','女')
insert studentvalues(5,'孟小飞','男')
--创建成绩表
createtable score
(
studentidint,
subjectnamenvarchar(20),
scoredecimal
)
--插入成绩
insert scorevalues(1,'英语',89)
insert scorevalues(1,'数学',59)
insert scorevalues(2,'英语',79)
insert scorevalues(2,'数学',86)
insert scorevalues(3,'英语',57)
insert scorevalues(3,'数学',67)
insert scorevalues(6,'英语',88)
insert scorevalues(6,'数学',83)
1. 查询所有学生的成绩
select a.*,b.* from student ajoin score bon a.studentid=b.studentid
select sname,subjectname,scorefrom student ajoin score bon a.studentid=b.studentid
select a.studentid,sname,subjectname,scorefrom student ajoin score bon a.studentid=b.studentid
2. 从多个表中合并数据
使用内连接
select a.*,b.*from student ajoin score bon a.studentid=b.studentid
等价于
select a.*,b.*from student ainner join score bon a.studentid=b.studentid
使用外连接
左外连接
select a.studentid,sname,subjectname,scorefrom dbo.student aleftjoin dbo.score bon a.studentid=b.studentid
右外连接
select a.*,b.*from dbo.student arightjoin dbo.score bon a.studentid=b.studentid
练习:
1.查找不及格同学姓名和学科分数
select sname,subjectname,scorefrom dbo.student ajoin dbo.score bon a.studentid=b.studentidwhere score<60
自连接
查找到重名的学生
insert studentvalues(6,'韩旭','男')
select a.*,b.* from dbo.student ajoin dbo.student bon a.sname=b.snamewhere 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 maxAvg
统计表中有多少行
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.TStudentgroupby 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.TStudentvalues('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,Emailinto TDefrom dbo.TStudentwhere Class='开发班'
4.4. 删除数据
删除学号是0000000020的学生
delete dbo.TStudentwhere 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-1000wherecustomerName='张三'
updatebanksetcurrentMoney=currentMoney-1000wherecustomerName='李四'
select*frombank
执行以上命令后李四账户增加了1000,但是张三账户余额仍然是1000,这样的转账结果肯定是不可取,我们可以通过以下方法来解决。
首先转账过程就是一个事物,它需要两条UPDATE语句来完成,这两条语句是一个整体。如果其中任何一条出现错误,则整个转账业务也应该取消,两个账户的余额应该恢复到原来的状态。
通过以下语句来解决上述转账的问题
print'查看转帐事务前的余额'select*frombank
go
begintransaction
declare@errorSumint
set@errorSum=0
updatebanksetcurrentMoney=currentMoney-1000wherecustomerName='张三'
set@errorSum=@errorSum+@@ERROR
updatebanksetcurrentMoney=currentMoney+1000wherecustomerName='李四'
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