您的位置:68399皇家赌场 > 域名注册 > MySQL中无GROUP BY处境下直接使用HAVING语句的主题素

MySQL中无GROUP BY处境下直接使用HAVING语句的主题素

发布时间:2019-05-22 09:21编辑:域名注册浏览(135)

    今日有同学给自个儿反应,有一张表,id是主键,那样的写法可以回来一条记下:

    MySQL中无GROUP BY景况下直接接纳HAVING语句的主题素材研究,mysqlhaving

    后日有同学给自身反应,有一张表,id是主键,那样的写法能够回来一条记下:

      “SELECT * FROM t HAVING id=MIN(id);”
    

       不过只是把MIN换来MAX,那样回去就是空了:

      “SELECT * FROM t HAVING id=MAX(id);”
    

       那是干吗呢?

       大家先来做个考试,验证这种气象。

       那是表结构,开端化两条记下,然后试验:

    [email protected] : plx 10:25:10> show create table t2G
    *************************** 1. row ***************************
        Table: t2
    Create Table: CREATE TABLE `t2` (
     `a` int(11) DEFAULT NULL,
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
     PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
    
    [email protected] : plx 10:25:15> select * from t2;
     ------ ---- 
    | a  | id |
     ------ ---- 
    |  1 | 1 |
    |  1 | 3 |
     ------ ---- 
    2 rows in set (0.00 sec)
    
    [email protected] : plx 10:25:20> SELECT * FROM t2 HAVING id=MIN(id);
     ------ ---- 
    | a  | id |
     ------ ---- 
    |  1 | 1 |
     ------ ---- 
    1 row in set (0.00 sec)
    
    [email protected] : plx 10:25:30> SELECT * FROM t2 HAVING id=MAX(id);
    Empty set (0.00 sec)
    

       初看之下,好像真的是这样啊,怎么会这么吗?

       笔者再试一下,把a字段改一个为十,然后试下a字段:

    [email protected] : plx 10:26:58> select * from t2;
     ------ ---- 
    | a  | id |
     ------ ---- 
    |  10 | 1 |
    |  1 | 3 |
     ------ ---- 
    2 rows in set (0.00 sec)
    
    [email protected] : plx 10:28:20> SELECT * FROM t2 HAVING a=MAX(a);
     ------ ---- 
    | a  | id |
     ------ ---- 
    |  10 | 1 |
     ------ ---- 
    1 row in set (0.00 sec)
    
    [email protected] : plx 10:28:28> SELECT * FROM t2 HAVING a=MIN(a);
    Empty set (0.00 sec)
    

       笔者擦,那回MAX能回到,MIN不能够了,那又是怎么呢?

       旁白

       一般的话,HAVING子句是相称GROUP BY使用的,单独使用HAVING本身是不符合规范的,

       可是MySQL会做二个重写,加上三个GROUP BY NULL,”SELECT * FROM t HAVING id=MIN(id)”会被重写为”SELECT * FROM t GROUP BY NULL HAVING id=MIN(id)”,那样语法就符合标准了。

       继续……

       不过,那么些 GROUP BY NULL 会爆发怎么样结果吗?经过查阅代码和调查,能够证实,GROUP BY NULL 等价于 LIMIT 壹:

    [email protected] : plx 10:25:48> SELECT * FROM t2 GROUP BY NULL;
     ------ ---- 
    | a  | id |
     ------ ---- 
    |  10 | 1 |
     ------ ---- 
    1 row in set (0.00 sec)
    

       也正是说,GROUP BY NULL 今后,只会有二个分组,里面便是首先行数据。

       可是如果这么,MIN、MAX结果应该是同一的,这也不该MAX和MIN一个有结果,3个没结果啊,那是干吗呢,再做贰个测试。

       修改一下数目,然后直接查看MIN/MAX的值:

    [email protected] : plx 10:26:58> select * from t2;
     ------ ---- 
    | a  | id |
     ------ ---- 
    |  10 | 1 |
    |  1 | 3 |
     ------ ---- 
    2 rows in set (0.00 sec)
    
    [email protected] : plx 10:27:04> SELECT * FROM t2 GROUP BY NULL;
     ------ ---- 
    | a  | id |
     ------ ---- 
    |  10 | 1 |
     ------ ---- 
    1 row in set (0.00 sec)
    
    [email protected] : plx 10:30:21> SELECT MAX(a),MIN(a),MAX(id),MIN(id) FROM t2 GROUP BY NULL;
     -------- -------- --------- --------- 
    | MAX(a) | MIN(a) | MAX(id) | MIN(id) |
     -------- -------- --------- --------- 
    |   10 |   1 |    3 |    1 |
     -------- -------- --------- --------- 
    1 row in set (0.00 sec)
    

       是还是不是开掘标题了?

       MAX/MIN函数取值是大局的,而不是LIMIT 一那个分组内的。

       由此,当GROUP BY NULL的时候,MAX/MIN函数是取全数数据里的最大和最小值!

       所以啊,”SELECT * FROM t HAVING id=MIN(id)”本质上是”SELECT * FROM t HAVING id=1″, 就会回去一条记下,而”SELECT * FROM t HAVING id=MAX(id)”本质上是”SELECT * FROM t HAVING id=叁″,当然未有再次来到记录,那就是难点的来自。

       测试一下GROUP BY a,那样就对了,每一种分组内唯有1行,所以MAX/MIN相同大,那回是获取组内最大和微小值。

    [email protected] : plx 11:29:49> SELECT MAX(a),MIN(a),MAX(id),MIN(id) FROM t2 GROUP BY a;
     -------- -------- --------- --------- 
    | MAX(a) | MIN(a) | MAX(id) | MIN(id) |
     -------- -------- --------- --------- 
    |   1 |   1 |    3 |    3 |
    |   10 |   10 |    5 |    5 |
     -------- -------- --------- --------- 
    2 rows in set (0.00 sec)
    

       GROUP BY NULL时MAX/MIN的表现,是那一个主题材料的真面目,所以啊,尽量使用标准语法,玩花样SQL以前,一定要搞掌握它的一坐一起是或不是与精通的等同。

    BY情状下直接行使HAVING语句的难题索求,mysqlhaving 今日有同学给自家反应,有一张表,id是主键,那样的写法能够回来一条记下:...

    有一张表,id是主键,那样的写法可以回来一条记下:

    著作给我们介绍有关化解MySQL中无GROUP BY直接HAVING的标题,如若你不想行使group by而直白动用having蒙受难题可仿效此小说。

      “SELECT * FROM t HAVING id=MIN(id);”
    

    复制代码 代码如下:

    明天有同学给小编反应,有一张表,id是主键,那样的写法可以回到一条记下:

       不过只是把MIN换到MAX,那样回去正是空了:

    “SELECT * FROM t HAVING id=MIN(id);”

     代码如下

      “SELECT * FROM t HAVING id=MAX(id);”
    

    只是只是把MIN换来MAX,那样回去就是空了:

    复制代码

       这是干什么吗?

    复制代码 代码如下:

    “SELECT * FROM t HAVING id=MIN(id);”

       大家先来做个考试,验证这种景色。

    “SELECT * FROM t HAVING id=MAX(id);”

    唯独只是把MIN换来MAX,那样回去便是空了:

       那是表结构,初阶化两条记下,然后试验:

    那是为什么吗?
    大家先来做个试验,验证这种情况。
    那是表结构,起首化两条记下,然后试验:

     代码如下

    root@localhost : plx 10:25:10> show create table t2G
    *************************** 1. row ***************************
        Table: t2
    Create Table: CREATE TABLE `t2` (
     `a` int(11) DEFAULT NULL,
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
     PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
    
    root@localhost : plx 10:25:15> select * from t2;
     ------ ---- 
    | a  | id |
     ------ ---- 
    |  1 | 1 |
    |  1 | 3 |
     ------ ---- 
    2 rows in set (0.00 sec)
    
    root@localhost : plx 10:25:20> SELECT * FROM t2 HAVING id=MIN(id);
     ------ ---- 
    | a  | id |
     ------ ---- 
    |  1 | 1 |
     ------ ---- 
    1 row in set (0.00 sec)
    
    root@localhost : plx 10:25:30> SELECT * FROM t2 HAVING id=MAX(id);
    Empty set (0.00 sec)
    

    复制代码 代码如下:

    复制代码

       初看之下,好像真的是那样啊,怎么会如此吗?

    root@localhost : plx 10:25:10> show create table t2G
    *************************** 1. row ***************************
           Table: t2
    Create Table: CREATE TABLE `t2` (
      `a` int(11) DEFAULT NULL,
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

    “SELECT * FROM t HAVING id=MAX(id);”

       小编再试一下,把a字段改二个为10,然后试下a字段:

    root@localhost : plx 10:25:15> select * from t2;
    ------ ----
    | a    | id |
    ------ ----
    |    1 |  1 |
    |    1 |  3 |
    ------ ----
    2 rows in set (0.00 sec)

    那是为什么吧?

    本文由68399皇家赌场发布于域名注册,转载请注明出处:MySQL中无GROUP BY处境下直接使用HAVING语句的主题素

    关键词: 68399皇家赌场