澳门威利斯人_威利斯人娱乐「手机版」

来自 网络资讯 2019-12-11 16:28 的文章
当前位置: 澳门威利斯人 > 网络资讯 > 正文

BY直接HAVING返回空的问题分析

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

复制代码

复制代码 代码如下:

所以啊,”SELECT * FROM t HAVING id=MIN(id卡塔尔(英语:State of Qatar)”本质上是”SELECT * FROM t HAVING id=1″, 就能够回去一条记下,而”SELECT * FROM t HAVING id=MAX(id卡塔尔(英语:State of Qatar)”本质上是”SELECT * FROM t HAVING id=3″,当然未有回来记录,那正是主题材料的根源。

复制代码 代码如下:

 代码如下

GROUP BY NULL时MAX/MIN的作为,是以此难题的实质,所以啊,尽量选用正式语法,玩花样SQL以前,应当要搞精晓它的一言一行是还是不是与了然的大器晚成致。

 代码如下

复制代码 代码如下:

继续……
不过,这些 GROUP BY NULL 会产生什么结果吗?经过查阅代码和考试,能够表达,GROUP BY NULL 等价于 LIMIT 1:

旁白
诚如的话,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 1:

是否开采标题了?
MAX/MIN函数取值是大局的,并不是LIMIT 1那么些分组内的。
故此,当GROUP BY NULL的时候,MAX/MIN函数是取全部数据里的最大和最小值!

[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: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:25:30> SELECT * FROM t2 HAVING id=MAX(id);
Empty set (0.00 sec)

本身再试一下,把a字段改三个为10,然后试下a字段:

[email protected] : plx 10:25:20> SELECT * FROM t2 HAVING id=MIN(id);
------ ----
| a    | id |
------ ----
|    1 |  1 |
------ ----
1 row in set (0.00 sec)

测验一下GROUP BY a,那样就对了,每一种分组内只有黄金年代行,所以MAX/MIN同样大,那回是获取组内最大和细小值。

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

[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)

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

复制代码

复制代码 代码如下:

复制代码

[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)

 代码如下

有一张表,id是主键,那样的写法能够回到一条记下:

 代码如下

初看之下,好像真的是这么啊,怎会如此吧?小编再试一下,把a字段改叁个为10,然后试下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:27:04> SELECT * FROM t2 GROUP BY NULL;
------ ----
| a    | id |
------ ----
|   10 |  1 |
------ ----
1 row in set (0.00 sec)

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

本文由澳门威利斯人发布于网络资讯,转载请注明出处:BY直接HAVING返回空的问题分析

关键词: 澳门威利斯人