zoukankan      html  css  js  c++  java
  • DML数据操作语言之查询(二)

    当我们查询出了N条记录之后 ,我们知道一共是几条记录,或者这些记录某一字段(列值)的最大值,最小值,平均值等,就可以使用聚合函数。

    1.聚合函数                         

    聚合函数会将null 排除在外。但是count(*)例外,并不会排除null。

    常用的聚合函数有 5个 :               聚合函数 用在select子句中

    count(列名)     :   计算表中的数据行数  

    使用 count(*)  会查出 包含null在内的全部数据行数 。

    使用count(某列名) 会查出  该列不包含null在内的 数据行数。

    如:某表记录一共有8行,其中有两条记录的age字段 为null。

    select count(*)  from  tb_person;    ----将得到 8  
    select  count(age)  from  tb_person;   --- 将得到 6

    sum(列名):    计算表中 指定列的值的总和值  只能指定列类型为数值的列   不能指定列名为 *

    如:某表记录一共有8行,其中有两条记录的age字段 为null。

    select  sum(age)  from  tb_person;  ---  先排除 age字段为null的记录 ,然后计算剩余6条记录的age字段的总和值

    avg(列名) :   计算表中 指定列的值的平均值   只能指定列类型为数值的列   不能指定列名为 *

    如:某表记录一共有8行,其中有两条记录的age字段 为null。

    select  avg(age)   from  tb_person ;    --- 先排除 age字段为null的记录 ,然后计算剩余6条记录的age字段的平均值。

    max(列名)  :  比较得到表中 指定列的值的最大值   可以指定任何列类型的数据列   不能指定列名为 *

    如:某表记录一共有8行,其中有两条记录的age字段 为null,还有两条记录的birthday字段为null

    select  max(age)   from  tb_person ;    --- 先排除 age字段为null的记录 ,然后比较剩余6条记录的age字段的得到age字段的最大值。
    select  max(birthday)   from  tb_person ;    --- 先排除 birthday字段为null的记录 ,然后比较剩余6条记录的birthday字段的得到birthday字段的最大值。

    min(列名) :   比较得到表中 指定列的值的最小值   可以指定任何列类型的数据列   不能指定列名为 *

    用法类同与max().

    在使用聚合函数的同时,结合使用 distinct来删除重复记录

    2.对表进行分组

    对表中的记录 ,按照指定的列的值是否相等(可以是多列),从而进行分组。使用group by子句。

    group by子句按照指定的列,将查询出来的记录进行分组,指定的列称为分组列。

    group by子句一定要写在 from子句之后(如果有where子句的话需要写在where子句之后)。所以现在接触的子句书写顺序是:

    select  .....   from  .....   where ......   group by .......

    当指定的分组列 中包含 null时,在最终的分组会以"不确定"行(空行)的形式表现出来。

    在使用了where子句的SQL语句中,执行顺序是  首先 根据where子句的条件表达式对记录进行筛选。

    其次,将筛选得到的记录 安装 group by 子句指定的分组列,进行分组。

    然后,根据select子句中指定的显示列,进行显示。

    所以指定顺序是  from  →  where →   group by →  select

    常见错误 :

    1.在使用 group by子句进行分组时,在select子句中出现了多余的列。

    通过group by子句进行分组之后,得到的结果表中的一条记录 代表的是一个分组,而不再是一条数据。

    使用group by子句进行分组时,select子句中不能出现group by子句中没有出现的列名。

    2.在group by子句中写了列的别名

    我们可以在select 子句中指定列的别名 ,但是不能在group by 子句中使用select子句中指定的列的别名。

    因为 group by子句是在select子句之前执行的。

    3.group by子句进行分组之后的记录 是有序的吗?

    答案是:“随机的”。

    4.在where子句中出现了 聚合函数 

    只有select子句  和 having子句  (以及order by子句)中才能使用聚合函数。

    3.为聚合结果指定条件

    为聚合结果指定筛选条件 使用的 having 子句。

    where子句 和 having子句 都是用来指定筛选条件的,但是二者的使用有所不同:

    我们查询数据有两种情况,

    第一种,我们不使用 聚合函数 和 group by子句 这种对查询后的数据进行聚合的操作 ,这是我们查询出来的结果表中的一行记录,就是一条

    原始的记录,这条记录在原始的数据表中是存在的。

    第二种,我们使用了 聚合函数 和 group by子句这种对查询后的数据进行聚合的操作 ,操作的到的结果表的一行记录,是在原始数据表中 不存在的。

    结果表中的一行数据 可能代表一个分组(使用了 group by 子句),也可能代表了对查询数据的操作(使用了聚合函数)。

    使用 where子句 指定的筛选条件,是对第一种情况,即原始数据表中的一条记录 来进行筛选的

    使用 havin子句  指定的筛选条件,是对第二种情况,即不是原始数据表的一条记录,是采用 聚合函数 和 group by子句得到的一条聚合记录进行筛选的。

    having子句必须写在group by子句之后(如果group by子句存在的话):

    select  .....  from ....   where  ....   group by ...  having....

    执行顺序是: 先执行where子句,对原始的数据记录进行筛选,得到的是原始数据记录,在原数据表中中存在,然后执行group by子句对得到的原始数据记录,按照指定

    的分组列,进行分组,得到的数据记录,是在原始数据表中 不存在的的聚合数据记录,即分组,再然后 指定select子句,对group by子句分组之后的数据记录,来指定显示

    哪些列,使用聚合函数进行操作。最后 ,执行having 子句,再对聚合函数操作得到的列进行筛选。

    按理来说,对于group by子句指定的分组列,进行筛选的条件,应该放在having子句中,则也是合理的。但是 对于group by子句指定的分组列,进行筛选的条件应该放在where

    子句中 ,这是出于执行效率的考虑。因为我们可以先筛序出符合条件的分组列的记录,然后再进行分组,这样执行效率高。而不是先进行分组,然后筛选出符合分组列条件的分组,

    这样执行效率低。

    4.对查询结果进行排序

    使用order by子句对查询结果进行排序。

     一般情况,order by 子句写在select语句 (不是子句)的末尾。

    书写顺序:

    select .....  from  ....  where .....  group  by ....  having ....  order by.....

    order by 子句中指定的列 称为排序列。

    升序使用的关键字是 asc   降序使用的关键字是 desc。 如果不写 ,默认使用升序进行排序,即asc.

    指定多个排序列:

    我们可以在order by子句中,指定多个排序列,意思是先按照指定的第一列进行排序,排好之后,对于第一列的值相等的记录,再按照指定的第二列的值进行排序,以此类推,如果还指定

    了第三列。

    如果某些记录,在指定的排序列的值是 null,那这些记录就不进行排序。而是在其他记录排好序之后,在结果表的开头或者末尾集中显示(不同数据库不同)。

    可以在order by子句中使用 select子句中指定的列的别名,这是因为排序总是在最后一步,是在select子句执行之后。 

    排序列既可以任何列:

    可以是上一个小节中的查询数据的第一种情况中的列。select子句中原始数据的指定的列。

    可以是select之中中未使用的列,即不用来显示的列。

    可以是上一个小节中的查询数据的第二种情况中的列。即进行数据的聚合之后的列,聚合函数。

  • 相关阅读:
    Tarjan-割点&桥&双连通
    树状数组
    loli的搜索测试-5
    思维题
    生成树
    贪心
    loli的搜索测试-4
    树链剖分
    基于AHK的上课自动签到
    用列表实现栈
  • 原文地址:https://www.cnblogs.com/wangliyue/p/4172849.html
Copyright © 2011-2022 走看看