group by与order by的区别

1. order by

order by比较简单,作用就是排序
asc 从上到下慢慢升序
desc 从上到下慢慢降序
默认为升序(就是你sql后面不写order by 它就是升序)
order by后面跟多个字段时,排序按就近原则依次而来

2. group by

group by我的理解是:聚合分组,值相等即为一组

聚合的意思就是聚合函数:例如 sum()、avg()、count()、max()等等

直接上个栗子:
group by与order by的区别_第1张图片
group by与order by的区别_第2张图片
group by与order by的区别_第3张图片
看到这,能明白GROUP BY把重复的元素(三个蛮王)分为了一组。
所谓对NAME进行GROUP BY,其实就是对NAME进行了分组聚合, 值相等的为一组。
继续往下走
group by与order by的区别_第4张图片
group by与order by的区别_第5张图片
单独查询一个name时,对name进行GROUP BY是的
但是这里查询中多了一个money字段,再对name进行GROUP BY 就会报错
继续往下
group by与order by的区别_第6张图片
看到这里,应该就明白:在对NAME字段进行GROUP BY 聚合的条件下,如果还要查询MONEY字段,就应该也用聚合函数对MONEY进行操作,否则这样查出来的MONEY是没有意义的(money前面的name都被分组聚合了,你还要查这一个个单独的money有什么用?誰是誰的誰?)。
接着往下,如果我在此基础上,还要查询sum(money)大于100的人呢?
group by与order by的区别_第7张图片
会报错,原因是:聚合函数是针对结果集进行的,但是where条件并不是在查询出结果集之后运行,所以主函数放在where语句中,会出现错误。
归根结底就一句话:聚合函数操作的是已查出的数据,where后面是查询条件,数据还没有,又怎么能当条件放到where里?
解决方法:having关键字
group by与order by的区别_第8张图片

注意:
1.having只能用在group by之后,对分组后的结果进行筛选(即:要使用having,你必须先用group by分组)。
2.如果还要使用where,那么where要放在group by 之前
3.where后的条件表达式里不允许使用聚合函数,但having可以

再来个大总结:
首先 ,是这样的:
group by与order by的区别_第9张图片
接着,是这样的:
group by与order by的区别_第10张图片
最后,是这样的:
group by与order by的区别_第11张图片
:下面是另一个sql例子,看不看无所谓,大家可以无视。

CREATE TABLE `comment` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `content` varchar(200) NOT NULL,
  `addtime` datetime NOT NULL,
  `lastmodify` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  KEY `addtime` (`addtime`),
  KEY `uid_addtime` (`user_id`,`addtime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `comment` (`id`, `user_id`, `content`, `addtime`, `lastmodify`) VALUES
(1, 1, '评论1', '2017-05-17 00:00:00', '2017-05-17 00:00:00'),
(2, 1, '评论2', '2017-05-17 00:00:01', '2017-05-17 00:00:01'),
(3, 2, '评论1', '2017-05-17 00:00:02', '2017-05-17 00:00:02'),
(4, 2, '评论2', '2017-05-17 00:00:03', '2017-05-17 00:00:03'),
(5, 3, '评论1', '2017-05-17 00:00:04', '2017-05-17 00:00:04'),
(6, 1, '评论3', '2017-05-17 00:00:05', '2017-05-17 00:00:05'),
(7, 4, '评论1', '2017-05-17 00:00:06', '2017-05-17 00:00:06'),
(8, 4, '评论2', '2017-05-17 00:00:07', '2017-05-17 00:00:07'),
(9, 4, '评论3', '2017-05-17 00:00:08', '2017-05-17 00:00:08'),
(10, 4, '评论4', '2017-05-17 00:00:09', '2017-05-17 00:00:09'),
(11, 3, '评论2', '2017-05-17 00:00:10', '2017-05-17 00:00:10');

select * from comment;
+----+---------+---------+---------------------+---------------------+
| id | user_id | content | addtime             | lastmodify          |
+----+---------+---------+---------------------+---------------------+
|  1 |       1 | 评论1   | 2017-05-17 00:00:00 | 2017-05-17 00:00:00 |
|  2 |       1 | 评论2   | 2017-05-17 00:00:01 | 2017-05-17 00:00:01 |
|  3 |       2 | 评论1   | 2017-05-17 00:00:02 | 2017-05-17 00:00:02 |
|  4 |       2 | 评论2   | 2017-05-17 00:00:03 | 2017-05-17 00:00:03 |
|  5 |       3 | 评论1   | 2017-05-17 00:00:04 | 2017-05-17 00:00:04 |
|  6 |       1 | 评论3   | 2017-05-17 00:00:05 | 2017-05-17 00:00:05 |
|  7 |       4 | 评论1   | 2017-05-17 00:00:06 | 2017-05-17 00:00:06 |
|  8 |       4 | 评论2   | 2017-05-17 00:00:07 | 2017-05-17 00:00:07 |
|  9 |       4 | 评论3   | 2017-05-17 00:00:08 | 2017-05-17 00:00:08 |
| 10 |       4 | 评论4   | 2017-05-17 00:00:09 | 2017-05-17 00:00:09 |
| 11 |       3 | 评论2   | 2017-05-17 00:00:10 | 2017-05-17 00:00:10 |
+----+---------+---------+---------------------+---------------------+

在comment表中,每个用户最后评论的内容就是id为6,4,11,10的记录。
使用group by查询:

select * from comment group by user_id;
+----+---------+---------+---------------------+---------------------+
| id | user_id | content | addtime             | lastmodify          |
+----+---------+---------+---------------------+---------------------+
|  1 |       1 | 评论1   | 2017-05-17 00:00:00 | 2017-05-17 00:00:00 |
|  3 |       2 | 评论1   | 2017-05-17 00:00:02 | 2017-05-17 00:00:02 |
|  5 |       3 | 评论1   | 2017-05-17 00:00:04 | 2017-05-17 00:00:04 |
|  7 |       4 | 评论1   | 2017-05-17 00:00:06 | 2017-05-17 00:00:06 |
+----+---------+---------+---------------------+---------------------+

你可能感兴趣的:(数据库相关)