最近在研究Mysql查询语句执行的问题,遇到如下情况
有如下一张表
mysql> select * from test;
+----+------+----------+
| id | name | password |
+----+------+----------+
| 1 | aaa | aaa |
| 2 | bbb | bbb |
| 3 | ccc | ccc |
| 4 | aaa | aaa |
| 5 | bbb | bbb |
| 6 | ddd | ddd |
| 7 | fff | fff |
+----+------+----------+
7 rows in set (0.00 sec)
现在要取出记录相同的数据
首先按照name分组得到下表 :T1
mysql> select * from test group by name;
+----+------+----------+
| id | name | password |
+----+------+----------+
| 1 | aaa | aaa |
| 2 | bbb | bbb |
| 3 | ccc | ccc |
| 6 | ddd | ddd |
| 7 | fff | fff |
+----+------+----------+
5 rows in set (0.00 sec)
然后在根据记录数筛选得到结果
mysql> select * from test group by name having count(*) > 1;
+----+------+----------+
| id | name | password |
+----+------+----------+
| 1 | aaa | aaa |
| 2 | bbb | bbb |
+----+------+----------+
2 rows in set (0.02 sec)
结果倒是得出来了,但是在网上查了很多资料,都说group by执行的顺序先于having
也就是说先执行分组,但是从我以上测试的结果来看,分组之后得到的结果是T1表的数据
在T1表的数据中并没有记录数重复的数据,也就是having count(*)>1的结果应该是不存在的。
想请教一下有没有知道这是啥情况?
查询语句中select from where group by having order by的执行顺序
1.查询中用到的关键词主要包含六个,并且他们的顺序依次为
select--from--where--group by--having--order by
其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序
与sql语......
答案就在这里:查询语句中select from where group by having order by的执行顺序
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?
having是在group结果中再进行过滤 类似where的条件查询
通过你写的例子你会发现having后面跟的都是聚合函数,这些函数在where后面是不可以的。
1、where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
2、having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
3、having 子句被限制子已经在SELECT语句中定义的列和聚合表达式上。通常,你需要通过在HAVING子句中重复聚合函数表达式来引用聚合值,就如你在SELECT语句中做的那样。