MS SQL Server学习笔记(二)

1、类型转换函数
	--cast(表达式 as 数据类型)
	--convert(数据类型,表达式)
	SELECT 100.0+CAST('1000' AS INT)
	SELECT 100.0+CONVERT(INT,'1000')
	SELECT '您的班级编号:'+CONVERT(VARCHAR(1),1)
	SELECT * FROM dbo.TblStudent ORDER BY CAST(tsClass AS INT) DESC--字符串进行类型转换然后排序
	PRINT CONVERT(VARCHAR(10),GETDATE(),120)--Convert对日期的转换
2、联合结果集union(集合运算符)--把多个结果集中的行联合起来,连接join(多个结果集中的列联合起来)
	SELECT tsName FROM dbo.TblStudent
	UNION ALL--不自动去除重复并不进行数据的自动排列
	SELECT ttname FROM dbo.TblTeacher

	SELECT tsName FROM dbo.TblStudent
	UNION --自动去除重复并对联合数据自动进行排列
	SELECT ttname FROM dbo.TblTeacher
	--大多数情况下联合的时候不需要去除重复,同时要保持数据的顺序,所以一般建议使用union all
	SELECT 
		商品名称,
		销售价格=SUM(销售价格*销售数量)
	FROM Myorders
	GROUP BY 商品名称
	UNION ALL
	SELECT '总销售价格',SUM(销售价格*销售数量) FROM Myorders
	ORDER BY 销售总价 ASC
	--要查询出成绩表中的:最高分,最低分和平均分
	SELECT 
		MAX(tmath) AS 最高分,
		MIN(tmath) AS 最低分,
		AVG(tmath) AS 平均分
	FROM dbo.TblScore

	SELECT 
		最高分=(SELECT MAX(tmath)FROM dbo.TblScore),
		最高分=(SELECT MIN(tmath)FROM dbo.TblScore),
		平均分=(SELECT AVG(tmath)FROM dbo.TblScore)
		
	SELECT 名称='最高分',分数=MAX(tmath) FROM dbo.TblScore
	UNION ALL
	SELECT 名称='最低分',分数=min(tmath) FROM dbo.TblScore
	UNION ALL
	SELECT 名称='平均分',分数=AVG(tmath) FROM dbo.TblScore
	--使用union向表中插入多条数据
	INSERT INTO dbo.TblStudent
			( tsName ,
			  tsGender ,
			  tsAddress ,
			  tsAge ,
			  tsBirthday ,
			  tsCardID ,
			  tsClass
			)
	SELECT '丁许aa','男','sadsadsa',40,'1992-09-11',12321,2
	UNION ALL
	SELECT '丁许bb','男','sadsadsa',40,'1992-09-11',12321,2
	UNION ALL
	SELECT '丁许cc','男','sadsadsa',40,'1992-09-11',12321,2
	UNION ALL
	SELECT '丁许dd','男','sadsadsa',40,'1992-09-11',12321,2
	--在使用union进行插入数据的时候,也要注意union会去除重复
	INSERT INTO dbo.TblStudent
			( tsName ,
			  tsGender ,
			  tsAddress ,
			  tsAge ,
			  tsBirthday ,
			  tsCardID ,
			  tsClass
			)
	SELECT '丁许aa','男','sadsadsa',40,'1992-09-11',12321,2
	UNION
	SELECT '丁许aa','男','sadsadsa',40,'1992-09-11',12321,2
	UNION
	SELECT '丁许aa','男','sadsadsa',40,'1992-09-11',12321,2
	UNION
	SELECT '丁许aa','男','sadsadsa',40,'1992-09-11',12321,2
3、一次性向表中插入多行数据
	--将tblstudent表的结构和表中数据备份到tblstudent2017Backup表中。
	--tblstudent2017Backup表是在执行select into语句时创建的。
	--select into语句不能重复执行,因为每次执行都会创建一个tblstudent2017Backup表
	--tblstudent表结构包括自动编号列都会在tblstudent2017Backup中创建,但是tblstudent表中的约束并不会出现在tblstudent2017Backup表中
	SELECT * INTO tblstudent2017Backup FROM dbo.TblStudent
	--只复制表结构,不复制数据
	SELECT TOP 0 * INTO tblstudent2017Backup FROM dbo.TblStudent


	--使用insert into 表 select ...from 表
	INSERT INTO tblstudent2017backup
	SELECT tsName,tsGender,tsAddress,tsage,tsBirthday,tsCardID,tsClass FROM dbo.TblStudent WHERE tsGender='女'
3、字符串函数
	--常用的字符串函数
	--1.len()计算字符的个数
	PRINT LEN('s丁许')--3
	--datalength()返回占用的字节个数,这个不是字符串函数
	PRINT datalength('s丁许')--5
	PRINT datalength(N's丁许')--6
	--2.
	PRINT UPPER('aaaA')--转换大写
	PRINT LOWER('aaaA')--转换小写
	--3.去掉两段空格
	PRINT '==============='+'      hello        '+'============'
	PRINT '==============='+LTRIM('      hello        ')+'============'
	PRINT '==============='+rTRIM('      hello        ')+'============'
	PRINT '==============='+LTRIM(rTRIM('      hello        '))+'============'
	--4.字符串截取函数
	---从左边开始截取,截取5个字符
	PRINT LEFT('中华人民共和国今天。。。',5)
	--4.2 right()
	-----从右边开始截取,截取5个字符
	PRINT right('中华人民共和国今天。。。',5)
	--4.3 substring()截取字符串
	PRINT SUBSTRING('中华人民共和国今天。。。',1,5)
	PRINT SUBSTRING('中华人民共和国今天。。。',5,2)
	PRINT SUBSTRING('中华人民共和国今天。。。',0,5)
	PRINT SUBSTRING('中华人民共和国今天。。。',-1,5)
4、日期函数
	PRINT GETDATE()
	PRINT SYSDATETIME()
	--dataAdd(),增加时间
	SELECT DATEADD(DAY,200,GETDATE())
	SELECT DATEADD(month,200,GETDATE())
	--datediff()计算两个日期的差
	--查询入职一年以上的员工
	SELECT 
		* 
	FROM dbo.TblStudent 
	WHERE DATEADD(YEAR,1,tsBirthday)<=GETDATE() 
	SELECT DATEDIFF(YEAR,'1991-05-31',GETDATE())
	--统计处入职n年的人的个数
	SELECT
		入职年数=DATEDIFF(year,tsBirthday,GETDATE()),
		人数=COUNT(*)
	FROM dbo.TblStudent
	GROUP BY DATEDIFF(year,tsBirthday,GETDATE())
	--获取日期的某部分值
	PRINT DATEPART(YEAR,GETDATE())
	PRINT MONTH(GETDATE())
	--返回日期的某部分,字符串表示形式,DATEPART式数字表示形式
	PRINT DATENAME(YEAR,GETANSINULL())

	--查询出不同年份入职的员工人数
	SELECT
		入职年份=DATEPART(YEAR,tsbirthday),
		员工人数=COUNT(*)
	FROM dbo.TblStudent
	GROUP BY DATEPART(YEAR,tsbirthday) 
5、综合练习
	--输出所有数据中通话时间最长的5条记录
	SELECT
		TOP 5*,
		通话时长=DATEDIFF(second,StartTime,EndTime)
	FROM callrecords
	ORDER BY DATEDIFF(second,StartTime,EndTime) DESC
	--输出所有数据中拨打长途号码(对方号码以0开头)的总时长
	SELECT
		SUM(DATEDIFF(second,StartTime,EndTime)) AS 通话总时长
	FROM callrecords
	WHERE telnumber LIKE '0%'

	--输出本月通话总时长最多的前三个呼叫员的编号
	SELECT
		TOP 3 callernumber AS 呼叫员编号,
		SUM(DATEDIFF(minute,StartTime,EndTime)) AS 通话时长
	FROM callrecords
	WHERE DATEDIFF(MONTH,starttime,'2010-01-04')=0
	GROUP BY callernumber
	ORDER BY SUM(DATEDIFF(minute,StartTime,EndTime)) DESC

	--输出本月拨打电话次数最多的前三个呼叫元的编号
	SELECT 
		TOP 3 callernumber AS 呼叫员编号,
		COUNT(*) AS 次数
	FROM callrecords
	WHERE DATEDIFF(MONTH,starttime,'2010-01-04')=0
	GROUP BY callernumber
	ORDER BY COUNT(*) DESC

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值