三、数据的检索

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必须遵守两个原则:一是每个结果集必须有相同的列数;二是每个结果集的列必须类型相
容 。

你可能感兴趣的:(三、数据的检索)