在很多情况下,存储在数据库中的原始数据不是我们想要的,我们往往要将其转换成一种特定的格式。这些操作虽然可以在客户端完成,但在数据库中完成也不失为一种好方法。
我们通常使用+
运算符来拼接字段:
SELECT [LastName]+' '+[FirstName]
FROM [dbo].[Employees]
TRIM函数可以去除左右两边的空格,LTRIM则可以去除左边的空格,RTRIM同理:
SELECT RTRIM([LastName]+' ')+[FirstName]
FROM [dbo].[Employees]
在前面的示例中我们发现,查询结果并没有列名。为了方便起见,我们使用as
关键字来手动添加。
SELECT [LastName]+' '+[FirstName] AS FullName
FROM [dbo].[Employees]
在一个表中,有着商品数量和商品单价,那么,我们就可以很轻松地完成对商品总价格的计算:
SELECT [ProductID],[UnitPrice]*[Quantity]*(1-[Discount]) AS FullPrice
FROM [dbo].[Order Details]
+
-
*
/
运算符都可以使用
前面应该已经见识过了TRIM,YEAR等,所以我们不难知道Sql语言也有函数这一概念。
这个缺点已经足矣动摇你使用函数的决心了,不过现在你仍然得学习他,然后用自己的思维去判断是否应该使用函数。
大部分SQL支持下列类型的函数
前面我们介绍了TRIM函数,它可以将文笔两边的空格给干掉,解决了格式的问题,现在介绍一个叫UPPER的函数,它使小写字符转换成为了大写字符:
/*转换前*/
SELECT [CompanyName]
FROM [dbo].[Customers]
/*转换后*/
SELECT UPPER([CompanyName])
FROM [dbo].[Customers]
日期处理函数的通用性不是一般的差,每种数据库都有不同的函数,相同的函数名也有不同参数格式。实在是蛋疼不已。
建议大部分情况下都是用DATEPART函数,在SQL Server中,它的使用方法如下:
SELECT [ShipAddress],
[ShipCity]
FROM [dbo].[Orders]
WHERE DATEPART(yy, [OrderDate]) = 1997
数值处理函数是统一度最高的函数了。
有时候我们不只是需要检索数据,还需要把数据汇总进行分析,如得到查询到的条数,平均数等。
SELECT AVG([UnitPrice]) AS AVGNUM
FROM [dbo].[Order Details]
分组查询用于归纳。比如查找各个类型的数量。演示如下:
SELECT [City]
,COUNT(*)
FROM [dbo].[Customers]
GROUP BY [City]
WHERE关键字只能用于过滤列,对分组就无能为力了。所以,SQL引入了一个新的关键字HAVING
我们继续拿上一个例子做演示
SELECT [City]
,COUNT(*)
FROM [dbo].[Customers]
GROUP BY [City]
HAVING COUNT(*)>1
我们可以理解为当我们进行分组时,数据库会为我们创建一个新的对象——组,这个新的对象有着自己的属性,我们成为组属性
,它和列属性有着本质的不同。希望大家可以分清楚他们之间的区别。
分组排序和列排序的关键字相同,都是使用GROUP BY,但依然是使用组属性:
SELECT [City],COUNT(*) AS Items
FROM [dbo].[Customers]
GROUP BY [City]
HAVING COUNT(*)>1
ORDER BY Items,[City]