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