精华内容
下载资源
问答
  • MySQL HAVING

    2021-02-07 08:26:01
    MySQL SELECT 语句中,除了能使用 GROUP BY 子句分组数据外,还可以使用 HAVING 子句过滤分组,在结果集中规定了包含哪些分组和排除哪些分组。语法格式如下:HAVING 其中,指的是指定的过滤条件。HAVING 子句和 ...

    在 MySQL SELECT 语句中,除了能使用 GROUP BY 子句分组数据外,还可以使用 HAVING 子句过滤分组,在结果集中规定了包含哪些分组和排除哪些分组。

    语法格式如下:

    HAVING

    其中,指的是指定的过滤条件。

    HAVING 子句和 WHERE 子句非常相似,HAVING 子句支持 WHERE 子句中所有的操作符和语法,但是两者存在几点差异:

    1、WHERE 子句主要用于过滤数据行,而 HAVING 子句主要用于过滤分组,即 HAVING 子句基于分组的聚合值而不是特定行的值来过滤数据,主要用来过滤分组。

    2、WHERE 子句不可以包含聚合函数,HAVING 子句中的条件可以包含聚合函数。

    3、HAVING 子句是在数据分组后进行过滤,WHERE 子句会在数据分组前进行过滤。WHERE 子句排除的行不包含在分组中,可能会影响 HAVING 子句基于这些值过滤掉的分组。

    【实例】根据 dept_id 对 测试表1 表中的数据进行分组,并显示学生人数大于1的分组信息,输入的 SQL 语句和执行结果如下所示。

    mysql> SELECT dept_id,GROUP_CONCAT(name) AS names FROM 测试表1 GROUP BY dept_id HAVING COUNT(name)>1;

    +---------+---------------+

    | dept_id | names         |

    +---------+---------------+

    |       1 | Dany,Jane,Jim |

    |       2 | Henry,John    |

    |       3 | Green,Thomas  |

    |       4 | Susan,Tom     |

    +---------+---------------+

    4 rows in set (0.07 sec)

    展开全文
  • MySQL having子句

    2021-01-18 20:32:32
    在本教程中,您将学习如何使用MySQL HAVING子句为行分组或聚合组指定过滤条件。MySQL HAVING子句简介在SELECT语句中使用HAVING子句来指定一组行或聚合的过滤条件。HAVING子句通常与GROUP BY子句一起使用,以根据指定...

    在本教程中,您将学习如何使用MySQL HAVING子句为行分组或聚合组指定过滤条件。

    MySQL HAVING子句简介

    在SELECT语句中使用HAVING子句来指定一组行或聚合的过滤条件。

    HAVING子句通常与GROUP BY子句一起使用,以根据指定的条件过滤分组。如果省略GROUP BY子句,则HAVING子句的行为与WHERE子句类似。

    请注意,HAVING子句将过滤条件应用于每组分行,而WHERE子句将过滤条件应用于每个单独的行。

    MySQL HAVING子句示例

    让我们举一些使用HAVING子句的例子来看看它是如何工作。 我们将使用示例数据库(yiibaidb)中的orderdetails表进行演示。

    f74bf00bc45e8223ecd5ef83cc4b46ed.png

    mysql> desc orderdetails;

    +-----------------+---------------+------+-----+---------+-------+

    | Field | Type | Null | Key | Default | Extra |

    +-----------------+---------------+------+-----+---------+-------+

    | orderNumber | int(11) | NO | PRI | NULL | |

    | productCode | varchar(15) | NO | PRI | NULL | |

    | quantityOrdered | int(11) | NO | | NULL | |

    | priceEach | decimal(10,2) | NO | | NULL | |

    | orderLineNumber | smallint(6) | NO | | NULL | |

    +-----------------+---------------+------+-----+---------+-------+

    5 rows in set

    可以使用GROUP BY子句来获取订单号,查看每个订单销售的商品数量和每个销售总额:

    SELECT

    ordernumber,

    SUM(quantityOrdered) AS itemsCount,

    SUM(priceeach*quantityOrdered) AS total

    FROM

    orderdetails

    GROUP BY ordernumber;

    执行上面查询语句,得到以下结果(部分) -

    +-------------+------------+----------+

    | ordernumber | itemsCount | total |

    +-------------+------------+----------+

    | 10100 | 151 | 10223.83 |

    | 10101 | 142 | 10549.01 |

    | 10102 | 80 | 5494.78 |

    | 10103 | 541 | 50218.95 |

    | 10104 | 443 | 40206.20 |

    | 10105 | 545 | 53959.21 |

    | 10106 | 675 | 52151.81 |

    | ------- 这里省略了一大波数据 ---------|

    | ........ ........... |

    | 10421 | 75 | 7639.10 |

    | 10422 | 76 | 5849.44 |

    | 10423 | 111 | 8597.73 |

    | 10424 | 269 | 29310.30 |

    | 10425 | 427 | 41623.44 |

    +-------------+------------+----------+

    326 rows in set

    现在,可以通过使用HAVING子句查询(过滤)哪些订单的总销售额大于55000,如下所示:

    SELECT

    ordernumber,

    SUM(quantityOrdered) AS itemsCount,

    SUM(priceeach*quantityOrdered) AS total

    FROM

    orderdetails

    GROUP BY ordernumber

    HAVING total > 55000;

    执行上面查询语句,得到以下结果 -

    +-------------+------------+----------+

    | ordernumber | itemsCount | total |

    +-------------+------------+----------+

    | 10126 | 617 | 57131.92 |

    | 10127 | 540 | 58841.35 |

    | 10135 | 607 | 55601.84 |

    | 10142 | 577 | 56052.56 |

    | 10165 | 670 | 67392.85 |

    | 10181 | 522 | 55069.55 |

    | 10192 | 585 | 55425.77 |

    | 10204 | 619 | 58793.53 |

    | 10207 | 615 | 59265.14 |

    | 10212 | 612 | 59830.55 |

    | 10222 | 717 | 56822.65 |

    | 10287 | 595 | 61402.00 |

    | 10310 | 619 | 61234.67 |

    | 10312 | 601 | 55639.66 |

    | 10390 | 603 | 55902.50 |

    +-------------+------------+----------+

    可以使用逻辑运算符(如OR和AND)在HAVING子句中构造复杂过滤条件。 假设您想查找哪些订单的总销售额大于50000,并且包含超过600个项目,则可以使用以下查询:

    SELECT

    ordernumber,

    SUM(quantityOrdered) AS itemsCount,

    SUM(priceeach*quantityOrdered) AS total

    FROM

    orderdetails

    GROUP BY ordernumber

    HAVING total > 50000 AND itemsCount > 600;

    执行上面查询语句,得到以下结果 -

    +-------------+------------+----------+

    | ordernumber | itemsCount | total |

    +-------------+------------+----------+

    | 10106 | 675 | 52151.81 |

    | 10126 | 617 | 57131.92 |

    | 10135 | 607 | 55601.84 |

    | 10165 | 670 | 67392.85 |

    | 10168 | 642 | 50743.65 |

    | 10204 | 619 | 58793.53 |

    | 10207 | 615 | 59265.14 |

    | 10212 | 612 | 59830.55 |

    | 10222 | 717 | 56822.65 |

    | 10310 | 619 | 61234.67 |

    | 10312 | 601 | 55639.66 |

    | 10360 | 620 | 52166.00 |

    | 10390 | 603 | 55902.50 |

    | 10414 | 609 | 50806.85 |

    +-------------+------------+----------+

    假设您想查找所有已发货(status='Shiped')的订单和总销售额大于55000的订单,可以使用INNER JOIN子句将orders表与orderdetails表一起使用,并在status列和总金额(total)列上应用条件,如以下查询所示:

    SELECT

    a.ordernumber, status, SUM(priceeach*quantityOrdered) total

    FROM

    orderdetails a

    INNER JOIN

    orders b ON b.ordernumber = a.ordernumber

    GROUP BY ordernumber, status

    HAVING status = 'Shipped' AND total > 5000;

    执行上面查询,得到以下结果 -

    +-------------+---------+----------+

    | ordernumber | status | total |

    +-------------+---------+----------+

    | 10126 | Shipped | 57131.92 |

    | 10127 | Shipped | 58841.35 |

    | 10135 | Shipped | 55601.84 |

    | 10142 | Shipped | 56052.56 |

    | 10165 | Shipped | 67392.85 |

    | 10181 | Shipped | 55069.55 |

    | 10192 | Shipped | 55425.77 |

    | 10204 | Shipped | 58793.53 |

    | 10207 | Shipped | 59265.14 |

    | 10212 | Shipped | 59830.55 |

    | 10222 | Shipped | 56822.65 |

    | 10287 | Shipped | 61402.00 |

    | 10310 | Shipped | 61234.67 |

    | 10312 | Shipped | 55639.66 |

    | 10390 | Shipped | 55902.50 |

    +-------------+---------+----------+

    HAVING子句仅在使用GROUP BY子句生成高级报告的输出时才有用。 例如,您可以使用HAVING子句来回答统计问题,例如在本月,本季度或今年总销售额超过10000的订单。

    在本教程中,您已经学习了如何使用具有GROUP BY子句的MySQL HAVING子句为行分组或聚合分组指定过滤器条件。

    ¥ 我要打赏

    纠错/补充

    收藏

    加QQ群啦,易百教程官方技术学习群

    注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

    展开全文
  • MySQL HAVING子句

    2021-03-03 18:26:04
    在本教程中,我们将学习如何使用MySQL HAVING子句来指定行分组或聚合的过滤条件。MySQL HAVING子句MySQLHAVING子句在SELECT语句中是用来为某一组行或聚合指定过滤条件。MySQLHAVING子句通常与GROUP BY子句一起...

    在本教程中,我们将学习如何使用MySQL HAVING子句来指定行分组或聚合的过滤条件。

    MySQL HAVING子句

    MySQL的HAVING子句在SELECT语句中是用来为某一组行或聚合指定过滤条件。

    MySQL的HAVING子句通常与GROUP BY子句一起使用。当它在GROUP BY子句中使用时,我们可以应用它在GROUP BY子句之后来指定过滤的条件。如果省略了GROUP BY子句,HAVING子句行为就像WHERE子句一样。

    请注意,HAVING子句应用筛选条件每一个分组的行,而WHERE子句的过滤条件是过滤每个单独的行。

    MySQL HAVING子句的示例

    让我们来看看使用MySQL HAVING子句的例子。在这里将使用示例数据库(studymysql)中的 order_detail 表作为示范。其表结构如下所示 -

    我们可以使用GROUP BY子句来获得订单编号,每个订单销售的产品数量,以及每个订单的总额:

    1

    2

    3

    4

    5

    6

    7

    SELECT

    order_id,

    SUM(buy_number)AS buy_count,

    SUM(total_money) AS money_count

    FROM

    studymysql.order_detail

    GROUP BY order_id;

    执行上面的 SQL 语句后,得到下面的结果 -

    现在,要查找那些销售总额超过 1500000 的订单信息。使用MySQL HAVING子句和聚合函数如下:

    1

    2

    3

    4

    5

    6

    7

    8

    SELECT

    order_id,

    SUM(buy_number)AS items_count,

    SUM(total_money) AS sum_total_money

    FROM

    studymysql.order_detail

    GROUP BY order_id

    HAVING sum_total_money>1500000;

    执行上面的 SQL 语句后,得到下面的结果 -

    我们还可以构造并使用逻辑运算符,如在HAVING子句中OR和AND运算符实现更复杂一点的过滤条件。假设要查找 order 表中总销售额大于100000,并且一个订单中包含 6 种以上的产品,参考使用下面的查询:

    1

    2

    3

    4

    5

    6

    7

    8

    SELECT

    order_id,

    SUM(buy_number) AS items_count,

    SUM(total_money) AS total

    FROM

    studymysql.order_detail

    GROUP BY order_id

    HAVING total>1000000 AND items_count>350;

    执行上面的 SQL 语句后,得到下面的结果 -

    假设要查找已发货(status=2)并且总销售额超过 160000 的所有订单,我们可以通过使用INNER JOIN子句将 order 表连接 order_detail 表,并在 status 和 total 列上指定条件,如下查询所示:

    1

    2

    3

    4

    5

    6

    7

    8

    SELECT

    od.order_id, SUM(od.total_money) total, o.status

    FROM

    studymysql.order_detail od

    INNER JOIN

    studymysql.order o ON od.order_id=o.order_id

    GROUP BY od.order_id

    HAVING o.status='2' AND total>160000 ;

    执行上面的 SQL 语句后,得到下面的结果 -

    当我们要通过GROUP BY子句来实现高级的报表输出时,使用HAVING子句就非常有用了。例如,我们可以使用HAVING子句来实现一些类似的查询,如:这个月,本季度和今年累计销售额超过10000 的订单信息。

    在本教程中,您已经学会了如何使用MySQL HAVING子句在GROUP BY中来指定记录或聚集组的筛选条件。

    相关教程

    Using MySQL SELECT Statement to Query Data

    MySQL GROUP BY

    展开全文
  • mysql having的用法

    2021-01-19 13:06:55
    having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。我的理解就是真实表中没有此数据,这些数据是通过一些...

    having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。我的理解就是真实表中没有此数据,这些数据是通过一些函数生存。

    SQL实例:

    一、显示每个地区的总人口数和总面积.

    SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region

    先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中

    的不同字段(一或多条记录)作运算。

    二、 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。

    SELECT region, SUM(population), SUM(area)

    FROM bbc

    GROUP BY region

    HAVING SUM(area)>1000000

    在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。

    相反,having子句可以让我们筛选成组后的各组数据

    MySQL判断某个字段的长度:

    select home_page from aaa表 where char_length(trim(home_page))<10 and char_length(trim(home_page))>1;

    mysql中的where和having子句的区别

    mysql中的where和having子句都可以实现过滤记录的功能,但他们的用法还是有一些区别的,看一例子:

    用group by和having子句联合来查出不重复的记录,sql如下:

    select uid,email,count() as ct from edm_user081217 GROUP BY email

    然后看这个,就容易理解了

    select uid,email,count() as ct from edm_user081217 GROUP BY email HAVING ct > 1

    先用group by 对email进行分组,在用having来过滤大于1的,这样查找出来的就是重复的记录了.

    以下是having和where的区别:

    Select city FROM weather WHERE temp_lo = (SELECT max(temp_lo) FROM weather);

    作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组。

    WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而 HAVING 在分组和聚集之后选取分组的行。因此,WHERE 子句不能包含聚集函数; 因为试图用聚集函数判断那些行输入给聚集运算是没有意义的。 相反,HAVING 子句总是包含聚集函数。(严格说来,你可以写不使用聚集的 HAVING 子句, 但这样做只是白费劲。同样的条件可以更有效地用于 WHERE 阶段。)

    在前面的例子里,我们可以在 WHERE 里应用城市名称限制,因为它不需要聚集。 这样比在 HAVING 里增加限制更加高效,因为我们避免了为那些未通过 WHERE 检查的行进行分组和聚集计算

    综上所述:

    having一般跟在group by之后,执行记录组选择的一部分来工作的。

    where则是执行所有数据来工作的。

    再者having可以用聚合函数,如having sum(qty)>1000

    2017-07-05 12:03:48更新:

    我们来对比一下

    SELECT ip,ip1,ip2,ip3,ip4,count() ct,mobile_info FROM lmaster_log

    GROUP BY ip1,ip2,ip3 ORDER BY ip1,ip2,ip3,ip4 HAVING ct > 2;

    SELECT ip,ip1,ip2,ip3,ip4,count() ct,mobile_info FROM lmaster_log

    GROUP BY ip1,ip2,ip3 HAVING ct > 2 ORDER BY ip1,ip2,ip3,ip4;

    一个语句

    [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'HAVING ct > 2' at line 2

    语句2是出现结果,所以我们在使用order by时要注意,他的位置HAVING子句必须位于GROUP BY之后ORDER BY之前。

    展开全文
  • mysql having

    2021-01-21 02:55:57
    having查询差价在200以上的列select goods_id,(market_price - shop_price ) as chajia from goods having chajia>200;查询挤压的总货款select sum(goods_number*shop_price) from goods;查询每个栏目下的积压...
  • mysql having子句学习

    2021-02-07 01:14:22
    在用到having子句的地方,出现最多的往往是sql的聚合函数,例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。示例:SELECT SUM(population) FROM bbc返回总人口数。通过使用...
  • mysql having用法解析

    2021-01-18 18:58:08
    having的用法having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。SQL实例:一、显示每个地区的总人口数和总...
  • mysql HAVING用法详解

    2021-01-18 18:58:08
    HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 和 SELECT 的交互方式类似。WHERE 搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以...
  • MySQL HAVING子句MySQLHAVING子句在SELECT语句中是用来为某一组行或聚合指定过滤条件。MySQLHAVING子句通常与GROUPBY子句一起使用。当它在GROUPBY子句中使用时,我们可以应用它在GROUPBY子句之后来指定过滤的...
  • having和where的使用知识 where与having同时使用时,执行顺序时where->having。 但只使用where或者having时,作用一样(不能(慎用)使用聚合函数)。 where不能使用聚合函数 因为聚合函数是从确定的结果集中...
  • MySQL HAVING介绍

    2021-01-18 20:32:32
    Summary:in this tutorial, you will learn how to useMySQL HAVINGclause to specify a filter condition for groups of rows or aggregates.Introducing MySQL HAVING clauseThe MySQL HAVING clause is used in.....
  • MySQL HAVING:过滤分组

    2021-01-21 02:44:41
    MySQL 中,可以使用 HAVING关键字对分组后的数据进行过滤。使用 HAVING 关键字的语法格式如下:HAVING HAVING 关键字和 WHERE 关键字都可以用来过滤数据,且 HAVING 支持 WHERE 关键字中所有的操作符和语法。但是...
  • 利用 Mysql 中的的聚合函数 count(*) 可以实现这个功能,例如需要查询 user 表中 name 出现次数最多的记录,可以先按照 group by name 分组,用 count 算出分组里的条数,再按照 count 排序,SQL语句如下:select ...
  • 区别唯一区别是为了区别where:其实是where只能跟着from后,having只能跟着group by后。即:having是对一个表的数据进行了分组之后,对“组信息”进行相应 条件筛选;可见:having筛选时,只能根据select子句中可...
  • Mysqlhaving筛选

    2021-01-25 17:31:58
    Mysql中where和having(筛选)的区别:下面是mysql中的select查询语句:mysql>selectsname,(age-sno)asafromstudent;+--------+------+|sname|a|+--------+------+|换换|22||刘丽|20||NULL|6||张友...
  • mysqlhaving语句

    2021-04-20 10:19:34
    mysql> use qq;Database changedmysql> #查询本店价比市场价省的钱,并且要求... select goods_id,market_price,shop_price,(market_price-shop_price) as discount from goods where having discount>200...
  • MySQL HAVING 和 WHERE

    2021-08-18 08:46:28
    MySQL中Where和Having的区别 Where是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之前起作用,且where后面不能使用聚合函数 Having是一个过滤声明,所谓过滤是在查询...
  • mysql having 使用方法

    2021-03-04 08:00:23
    having的用法having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。SQL实例:一、显示每个地区的总人口数和总...
  • mysql:having 用法

    2021-01-18 20:32:35
    顺序:where -> group by -> min -> order by -> limit在select语句中使用having 子句来指定一组行...如果省略group by子句,则having 子句的行为与where 子句类似MySQL HAVING子句示例1、查询重复的行s...
  • HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 和 SELECT 的交互方式类似。WHERE 搜索条件在进行分组操作之前应用;而HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以...
  • A portion of my query looks like:HAVING date > '2011-04-13 04:28:03'The date variable is indexed, does this have any effect on the query?EXPLAIN EXTENDED doesn't seem to be using the index, but I d...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 108,660
精华内容 43,464
关键字:

mysqlhaving

mysql 订阅