zoukankan      html  css  js  c++  java
  • WHERE、ORDER BY、GROUP BY、HAVING语句解析(二十八)

      之前啊,我们提及到,对于update和delete,若不带where条件,则对所有记录都有效。

    一、WHERE条件表达式

      (1)对记录进行过滤,如果没有指定WHERE子句,则显示所有记录。

      (2)在WHERE表达式中,可以使用MYSQL支持的函数或运算符。

      比如update语句和delete语句都可以带有where条件,如果没有指定where子句,将对所有记录有效,比如update语句,如果省略掉了where语句,将更新所有的记录。在where表达式中,还可以使用mysql支持的函数或运算符。比如刚才我们更新id号为偶数的记录时,我们使用了%,他就是典型的取模运算符,函数和运算符我们后面还会给大家做更详细的介绍。

     

     

     

     

     

     

     

     

     

    二、GROUP BY

      查询结果分组

    [GROUP BY {col_name | position} [ASC | DESC],… ]

      除了可以带where条件对记录进行过滤外,还可以对查询的结果进行分组,也就是用group by关键字,在分组的时候既可以指定列的列名,也可以指定列的位置,在语法结构中我们还可以看到两个关键字,一个是ASC,一个是DESC,ASC表示的是升序,而且是默认的,DESC表示的是降序,如果存在多个分组条件的话,那么多个分组条件之间用逗号分割,下面我们来看一下到底什么是分组?

     

     

     

    select   *   from   user;

      我们还以user数据表为例,假设我们按照性别来分组。操作命令及结果如下:

    select   sex    from   user  group   by  sex;

      除了可以写字段名字之外,还可以写位置,例如:

    select   sex   from   user   group  by  1;

      命令中的1表示的就是select语句当中第一个出现的字段。然后依次来类推,但是建议大家尽量去指定列的名称,

    而不要指定字段的位置,因为还需要我们人为的去数一数某个字段对应的位置,相对来说会更麻烦。所以建议大家指定字段的名称。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    三、HAVING

      分组条件

    [HAVING where_condition]

      在groupby分组的时候,其实还可以带有分组的条件,也就是说我既可以对所有的记录进行分组,也可以对某一部分记录进行分组,下面我们来演示一下,操作命令及结果如下:

    select  sex  from  user  group  by  1  having  age>30; 

      我们发现系统提示我们有一个错误,为什么会有这个错误呢,原因在于如果使用having进行分组条件的指定时,一定要保证分组的条件要么为聚合函数,要么条件字段出现在select语句当中,否则系统就会报错。

     

     

     

     

     

     

      下面我们再来做一下修改。操作命令及结果如下:

    select   sex,age   from   user  group  by  1  having   age>30;

    现在虽然说没有查找到结果,但是至少说我们的语法结构是书写正确的。

     

     

     

     

     

     

      下面我们来使用一个聚合函数。操作命令及结果如下:

    select  sex,age   from   user  group  by  1   having    count(id)<=2; 

      当然聚合函数有很多,比如max求最大值,min求最小值,avg求平均值,sum求和等等,因为他们永远只有一个返回结果。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    四、ORDER BY

      对查询结果进行排序

    [ORDER BY {col_name | expr | position} [ASC | DESC],…]

      除了可以对分组指定条件以外,还可以对分组的结果进行排序,从语法结构莪们可以看出,我们可以对字段,表达式或位置进行排序,和刚才的group by 是一样,ASC是升序,而且是默认的,DESC表示降序,下面我们来做个演示,我们让id字段降序排列。操作命令及结果如下:

    select   *  from   user  order   by   id   desc;

      那么可不可以对两个字段同时做排序呢,当然可以,当然他会先看第一个字段能不能排成你想要的结果,如果第一个字段能排成你想要的结果,那么他就会直接忽略掉第二个字段,如果第一个字段不能排成你想要的结果,那么他就会考虑第二个字段,甚至第三、第四个。

     

     

     

     

     

     

      下面我们做一个演示,假设我们先让age字段按升序排列,为了保证有相同的年龄的记录,我们提前再插入一条年龄相同的记录,操作命令及结果如下:

    insert    user    values(null,'123','234','30',1);
    
    
    
    
    select   *  from   user  order   by  age;

      假设我们让age相同的字段的id字段按照降序排列,我们就可以这样写,操作命令及结果如下:

    select  *   from   user    order   by  age,id    desc;

      我们发现已经变成了我们想要的结果。

     

  • 相关阅读:
    LeetCode 230. 二叉搜索树中第K小的元素(Kth Smallest Element in a BST)
    LeetCode 216. 组合总和 III(Combination Sum III)
    LeetCode 179. 最大数(Largest Number)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)
    指针变量、普通变量、内存和地址的全面对比
    MiZ702学习笔记8——让MiZ702变身PC的方法
    你可能不知道的,定义,声明,初始化
    原创zynq文章整理(MiZ702教程+例程)
  • 原文地址:https://www.cnblogs.com/zlslch/p/6541736.html
Copyright © 2011-2022 走看看