MYSQL单表查询

Posted 排骨南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL单表查询相关的知识,希望对你有一定的参考价值。

聚合函数

  聚合:  将分散的聚集到一起.
  聚合函数: 对列进行操作,返回的结果是一个单一的值,除了 COUNT 以外,都会忽略空值

  COUNT:统计指定列不为NULL的记录行数;
  SUM:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
  MAX:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
  MIN:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
  AVG:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

select 聚合函数 from 表名;

例如:
select avg(age),min(age),max(age),sum(age),count(age)from person #统计人员的平均年龄,最小年龄,最大年龄,总年龄,不为空的行数

分组

分组的含义: 将一些具有相同特征的数据 进行归类.比如:性别,部门,岗位等等

 怎么区分什么时候需要分组呢?  

 

  特征: 遇到 "每" 字,一般需要进行分组操作.

 

  例如: 1. 公司每个部门有多少人.

 

      2. 公司中有 多少男员工 和 多少女员工.

 

#分组查询格式:
select 被分组的字段 from 表名 group by 分组字段 [having 条件字段]
ps: 分组查询可以与 聚合函数 组合使用.

#查询班级的平均年龄
select avg(age),name from tb  GROUP BY class;

#查询每个部门的平均薪资 并且看看这个部门的员工都有谁?
select avg(salary),dept,GROUP_CONCAT(name) from tb1 GROUP BY dept;
#GROUP_CONCAT(expr):按照分组,将expr字符串按逗号分隔,组合起来

#查询平均薪资大于10000的部门, 并且看看这个部门的员工都有谁?  
select avg(salary),dept,GROUP_CONCAT(name) from person GROUP BY dept; having avg(salary)>10000;     #这里的having后面跟条件与where相似,但也有不同

 where 与 having区别:
#执行优先级从高到低:where > group by > having
#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数

 

 

分页查询 

 

关键字 limit   
limit (起始条数),(查询多少条数),如果limit后只有一个数字,则代表 0,(查询多少条数)

#查询前5条数据 select * from person limit 3; #查询第3条到第3条数据 select * from person limit 3,6;

 

SQL 语句关键字的执行顺序

1、查询中常用到的关键词有:

SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY

其中,SELECT与FROM是必需的,其他关键词则是可选的。

标准的 SQL 的解析顺序为:   FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY
  (1).FROM 字段语句, 组装来自不同数据源的数据
  (2).WHERE 表名, 基于指定的条件对记录进行筛选
  (3).GROUP BY 分组字段列表, 将数据划分为多个分组
  (4).使用聚合函数进行计算
  (5).使用 HAVING 子句筛选分组
  (6).计算所有的表达式
  (7).使用 ORDER BY 对结果集进行排序 ASC(升序,默认)、DESC(降序)

例如:

在学生成绩表中,把班级为1班的学生成绩按照学生姓名分组,并且筛选分组结果,汇总计算各个学生的总成绩,选出总成绩大于600分的学生列表,并按照总分从高到低排列。

Python代码

select sum(score)as s,name 
from tb1
where class_id=1 group by name having s
>600
order by 2 asc

在上面的示例中SQL语句的执行顺序如下:

①首先执行FROM子句,从tb1表检索记录;

②执行WHERE子句,筛选出tb1表中class_id=1的所有记录;

③执行GROUP BY子句,把tb1表按name列进行分组;

④计算SUM()聚集函数,求出每个name的score之和;

⑤执行HAVING子句,筛选出sum(score)大于600的分组;

⑥提取name,sum(score)两个字段,产生新的结果集;

⑦执行ORDER BY子句,把⑥的结果集按sum(score)字段升序排列。

 












































以上是关于MYSQL单表查询的主要内容,如果未能解决你的问题,请参考以下文章

关于MySQL的关联查询

单表查询

MySQL之单表查询

MySQL之单表查询

mysql加强~单表查询mysql查询常用的函数

MySQL之单表查询