--字符串函数--
SELECT CHARINDEX('Benet','My  Benet Course',1 )
--用来寻找一个指定的字符串在另一个字符串中的起始位置--
SELECT LEN('SQL Server课程')
--返回传递给它的字符串长度--
SELECT LTRIM ('  周智宇  ')
--清除字符左边的空格--
SELECT RTRIM ('  周智宇  ')
--清除字符右边的空格--
 
SELECT RIGHT('买卖提.吐尔松',3)
--从字符串右边返回指定数目的字符--
SELECT REPLACE('莫乐可切.杨可','','')
--替换一个字符串中的字符--
 
 
--查询用户13701418965在未缴费的市话--
Select '用户'+phonenumber+'市话费用'+cast(charge as varchar(10))+'' AS 市话费用
From accountbill
Where phonenumber='13701418965' AND
IsPaid = 0 AND calltype=0
 
---日期函数---
SELECT GETDATE()
--取得当前的系统日期--
SELECT DATEADD(mm,4,' 01/01/1999 ')
--将指定的数值添加到指定的日期部分后的日期--
 
SELECT  DATEDIFF(mm,' 01/01/1999 ', '05/01/1999')
--两个日期之间的指定日期部分的区别--
 
SELECT DATENAME(dw, ' 01/01/2000 ')
--日期中指定日期部分的字符串形式--
 
SELECT DATEPART(day, ' 01/15/2000 ')
--日期中指定日期部分的整数形式--
 
 
 
------####################################-------------
--显示用户1370141896520086月份的通话记录的通话时长--
Select '用户'+phonenumber+'通话时长'+cast(datediff(mi,starttime,endtime) as varchar(10))+'分钟' as 通话时长
From "history-call"
Where phonenumber='13701418965'
--------------------------------------------------------
 
 
SELECT ABS(-43)
--取数值表达式的绝对值--
 
SELECT CEILING(43.5)
--取大于或等于指定数值、表达式的最小整数--
 
SELECT FLOOR(43.5)
--取小于或等于指定表达式的最大整数--
 
SELECT POWER(5,2)
--取数值表达式的幂值--
 
SELECT ROUND(43.543,1)
--将数值表达式四舍五入为指定精度--
SELECT SIGN(-43)
--对于正数返回+1,对于负数返回-1,对于0则返回0--
 
SELECT SQRT(9)
--取浮点表达式的平方根--
 
 
-----显示用户1370141896520086月份的通话记录的通话时长(通话时长精确到分钟,不到一分钟的按一分钟计算.--
Select '用户'+phonenumber+'通话时长'+cast(ceiling(datediff(ss,starttime,endtime)/60.0) as varchar(10))+'分钟' as 通话时长  From "history-call"  Where phonenumber='13701418965'
 
 
--*************系统函数*******************----
 
 
SELECT CONVERT (VARCHAR (5),12345)
---数据类型转换----
 
SELECT cast(' 2009-03-17 ' as datetime)
---数据类型转换,与convert相比语法较简单,转换功能也少--
 
SELECT CURRENT_USER
---返回当前用户的名字--
 
SELECT DATALENGTH ('中国A联盟')
---返回用于指定表达式的字节数--
 
SELECT HOST_NAME()
---返回当前用户所登录的计算机名字---
 
SELECT SYSTEM_USER
--返回当前所登录的用户名称 --
 
 
SELECT USER_NAME(1)
---从给定的用户ID返回用户名 --
 
--******************************-------
--查询用户的欠费账单记录,要求并显示用户号码和欠费信息
--查询过程是在accountbill表里查询ispaid=0表示未缴费的账单,calltype=0市话,
--calltype=1长话,charge金额,accounttime为账单时间
--显示用户13701418965欠费账单中的市话费用
Select '用户'+phonenumber+''+CAST (DATEPART(YEAR,accounttime) as Varchar(10))+''+ CAST (DATEPART(MONTH,accounttime) as Varchar(10))+'月发生市话费用'+cast(charge as varchar(10))+''
From accountbill
Where phonenumber='13701418965' AND
IsPaid = 0 AND calltype=0 Order By accounttime
 
---显示用户13701418965欠费账单中的长话费用 ---
Select '用户'+phonenumber+''+CAST (DATEPART(YEAR,accounttime) as
Varchar(10))+''+ CAST (DATEPART(MONTH,accounttime) as Varchar(10))+'
月发生长话费用'+CAST(charge as varchar(10))+''
From accountbill Where phonenumber ='13701418965' AND
IsPaid = 0 AND calltype=1 Order By accounttime
 
--滞纳金是超期的天数×欠费金额×1%来计算。用户缴费最后期限
--是用户账单时间所在月份的下个月的26日
--滞纳金是超期的天数×欠费金额×1%来计算。用户缴费最后期限
--是用户账单时间所在月份的下个月的26日。
 
 
--根据账单日期得到账单缴费最后日期
 
--计算缴费日期与账单最后日期的超期天数
--得出欠费天数和欠费的金额
--如果超期天数大于0,则滞纳金=超期天数×欠费金额
Select DateDiff(dd,Cast((cast(year(Dateadd(mm,1,accounttime))
 as varchar(10))+'-'+cast(MONTH(Dateadd(mm,1,accounttime))
as varchar(10))+'-26 00:00:00')
as datetime),Cast('2008-10-31 15:20:00'
as datetime))
as 欠费天数,charge
as 金额,accounttime
as 账单日期
From accountbill
Where phonenumber='13701418965'
 
--***************聚合********************----
--案例需求:查询用户‘ 13701418965 的合计欠费金额--
 
Select Phonenumber,Sum(CHARGE)
From accountbill
Where isPaid=0 AND phoneNumber='13701418965'
--phonenumber' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中
 
 
Select Sum(CHARGE)
From accountbill
Where isPaid=0 AND phoneNumber='13701418965'
Go
 
--历史账单中20086月份的用户平均话费--
Select  Avg(CHARGE) as 平均话费
From "history-accountbill"
Where accounttime between '2008-06-01 00:00:00' AND '2008-06-30 23:59:59'
 
---查询20086月电话话费单笔最高费用和单笔最低费用--
Select Max(CHARGE) as 单笔最高话费,Min(CHARGE) as 单笔最低话费
From "history-accountbill"
Where accounttime
 between '2008-06-01 00:00:00' and '2008-06-30 23:59:59'
 
--Tariffsmall数据库中查询欠费账单数,该如何统计账单个数:--
Select Count(*)  as 欠费账单数
From accountbill
Where ispaid=0
--如果查询欠费用户数,该如何统计不同用户号码的数量:
Select Count(Distinct phonenumber)  as 欠费用户数
From accountbill
 Where ispaid=0
 
---****分组汇总****---
--要统计不同课程的平均分数。首先把相同的CourseID都分为一组,
--然后把这些相同组对应的分数值再使用前面的聚合函数取平均值
Select CourseID, Avg(Score)  as 课程平均成绩
From Score
Group By CourseID
Select studentID as 学员编号, courseId as 内部测试,avg (score) as 内部测试平均成绩 from score  group by studentID,courseID
Select studentID as 学员编号, courseId as 内部测试,avg (score) as 内部测试平均成绩 from score  group by studentID,courseID having count(score)>1
 
使用简单 GROUP BY 子句
以下示例检索 SalesOrderDetail 表中各 SalesOrderID 的总数。
USE AdventureWorks ;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID ;
 
 
--***查询082月到7月的客户账单合计费用**--
Select CAST (DATEPART(YEAR,paytime) as varchar(10))+''+ CAST (DATEPART(MONTH,paytime) as varchar(10))+'' AS 日期,Sum(CHARGE) 合计费用
From "history-accountbill" Where isPaid<>0 AND
paytime between '2008-02-01 00:00:00' and '2008-7-31 23:59:59'
Group By CAST (DATEPART(YEAR,paytime) as varchar(10))+''+ CAST (DATEPART(MONTH,paytime) as Varchar(10))+''
 
 
---**内连接**--
USE AdventureWorks ;
GO
SELECT p.Name, sod.SalesOrderID
FROM Production.Product as p
INNER JOIN Sales.SalesOrderDetail as sod
ON (p.ProductID = sod.ProductID)
ORDER BY p.Name ;
 
 
--**左外连接**--
USE AdventureWorks ;
GO
SELECT p.Name, sod.SalesOrderID
FROM Production.Product p
LEFT OUTER JOIN Sales.SalesOrderDetail sod
ON p.ProductID = sod.ProductID
ORDER BY p.Name ;
 
--**右外连接**--
USE AdventureWorks;
GO
SELECT st.Name AS Territory, sp.SalesPersonID
FROM Sales.SalesTerritory st
RIGHT OUTER JOIN Sales.SalesPerson sp
ON st.TerritoryID = sp.TerritoryID ;