1、数据汇总
有时需要对数据库中的数据进行一些统计,SQL标准中规定了以下几种聚合函数:
举例:
SELECT MAX(FSalary) as MAX_SALARY FROM T_Employee WHERE FAge>25
SELECT AVG(FAge) FROM T_Employee WHERE FSalary>3800
SELECT SUM(FSalary) FROM T_Employee
SELECT COUNT(*),COUNT(FNumber) FROM T_Employee
这里需要注意的是,COUNT(*)统计的是结果集的总条数,而COUNT(FName)统计的则是除了结果集中的
FName不为空(也就是不等于NULL)的记录总条数。
2、排序
ASC代表升序,升序是默认的排序方式。
SELECT * FROM T_Employee ORDER BY FAge ASC
DESC是降序
SELECT * FROM T_Employee ORDER BY FAge DESC
ORDER BY语句允许指定多个排序列,各个列之间使用逗号隔开即可。
SELECT * FROM T_Employee ORDER BY FAge DESC,FSalary DESC
ORDER BY 语句要放在where子句之后。
3、高级数据过滤
- 单字符匹配
它匹配单个出现的字符
SELECT * FROM T_Employee WHERE FName LIKE '_erry_'
- 多字符匹配
SELECT * FROM T_Employee WHERE FName LIKE 'T%'
单字符匹配和多字符匹配还能一起用
SELECT * FROM T_Employee WHERE FName LIKE '%n_'
-
空值检测
SELECT * FROM T_Employee WHERE FNAME IS NULL
SELECT * FROM T_Employee WHERE FNAME IS NOT NULL
-
多值检测
SELECT FAge,FNumber,FName FROM T_Employee WHERE FAge IN (23,25,28)
-
范围值检测
SELECT * FROM T_Employee WHERE FAGE>=23 AND FAGE <=27
SELECT * FROM T_Employee WHERE FAGE BETWEEN 23 AND 27
使用“BETTWEEN AND”我们还能够进行多个不连续范围值的检测
SELECT * FROM T_Employee WHERE (FSalary BETWEEN 2000 AND 3000) OR (FSalary BETWEEN 5000 AND 8000)
4、数据分组
GROUP BY 要放在where子句后面
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee WHERE FSubCompany = 'Beijing' GROUP BY FAge
GROUP BY子句将检索结果首先按照FSubCompany进行分组,然后在每一个分组内又按照FAge进行分组,数据库系统将数据分成了下面的分组
SELECT FSubCompany,FAge,COUNT(*) AS CountOfThisSubCompAge FROM T_Employee GROUP BY FSubCompany,FAge ORDER BY FSubCompany
SUM、AVG、MIN、MAX,COUNT也可以在分组中使用,用来对每一个分组进行统计。
对分组结果进行过滤就需要用到HAVING语句
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1
HAVING语句能够使用的语法和WHERE几乎是一样的,不过使用WHERE的时候GROUP BY子句要位于WHERE子句之后,而使用HAVING子句的时候GROUP BY子句要位于HAVING子句之前。
需要特别注意,在HAVING语句中不能包含未分组的列名,比如下面的SQL语句是错误的:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING FName IS NOT NULL
HAVING 子句中的列 'T_Employee.FName' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
需要用WHERE语句来代替HAVING,修改后的SQL语句如下:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee WHERE FName IS NOT NULL GROUP BY FAge
5、限制结果集行数
下面的SQL语句将返回按照工资降序排列的从第二行开始(行号从0开始)的最多五条记录
SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 2,5
6、抑制数据重复
DISTINCT是对整个结果集进行数据重复抑制的,而不是针对每一个列,执行下面的SQL语句
SELECT DISTINCT FDepartment,FSubCompany FROM T_Employee
7、计算字段
1、常量字段
对于单个公司而言,公司名称、注册资本这两部分信息不是能从现有的T_Employee,但是它们是确定的值,因此我们编写下面的SQL语句
SELECT 'CowNew集团',918000000,FName,FAge,FSubCompany FROM T_Employee
2、字段间的计算
人力资源部要求统计全体员工的工资指数,工资指数的计算公式为年龄与工资的乘积,这就需要计算将FAge和FSalary的乘积做为一个工资指数列体现到检索结果中,执行下面的SQL语句:
SELECT FNumber,FName,FAge * FSalary FROM T_Employee
计算字段也可以在WHERE语句等子句或者UPDATE、DELETE中使用 。
8、联合结果集
有的时候我们需要组合两个完全不同的查询结果集,而这两个查询结果之间没有必然的联系,只是我们需要将他们显示在一个结果集中而已。在SQL中可以使用UNION运算符来将两个或者多个查询结果集联合为一个结果集中。
SELECT FNumber,FName,FAge FROM T_Employee UNION SELECT FIdCardNumber,FName,FAge FROM T_TempEmployee
使用Union必须遵守两个原则:一是每个结果集必须有相同的列数;二是每个结果集的列必须类型相
容 。