sql中group by
某图书馆收藏有书籍具有不同的出版年份,管理员需要做一下统计工作:
(1)每一年书籍的数目,如: 2000年有10本书, 2001年有5本书...
(2)每一种书籍的数目,如: 西游记有10本, 三国演义有5本...
(3)每一种书不同年份对应的数目, 如2本西游记在2000出版的,8本在2008年出版...
(4)每一年不同种类书籍的数目,如2000年出版的西游记有2本,三国演义有5本...
(5)某一种书不同年份对应的数目(与(3)的区别在于,(3)需要统计所有的书籍,(5)是统计指定的某一种书籍)
新建表与准备数据(books.sql)
create table `books`(
id int not null auto_increment,
title varchar(50) not null,
year int not null,
primary key(id)
)Engine=InnoDB default charset=utf8;
建表:
>>> (echo 'use test'; cat books.sql) | mysql - u root --password 密码;
数据如下:
+----+--------------+------+
| id | title | year |
+----+--------------+------+
| 1 | 三国演义 | 2000 |
| 2 | 三国演义 | 2000 |
| 3 | 三国演义 | 2000 |
| 4 | 三国演义 | 2010 |
| 5 | 三国演义 | 2010 |
| 6 | 红楼梦 | 2003 |
| 7 | 红楼梦 | 2003 |
| 8 | 红楼梦 | 2003 |
| 9 | 红楼梦 | 2003 |
| 10 | 红楼梦 | 2003 |
| 11 | 红楼梦 | 2016 |
| 12 | 红楼梦 | 2016 |
| 13 | 红楼梦 | 2016 |
| 14 | 红楼梦 | 2012 |
| 15 | 红楼梦 | 2015 |
| 16 | 红楼梦 | 2015 |
| 17 | 水浒传 | 2001 |
| 18 | 水浒传 | 2001 |
| 19 | 水浒传 | 2001 |
| 20 | 水浒传 | 2003 |
| 21 | 水浒传 | 2004 |
| 22 | 水浒传 | 2005 |
| 23 | 水浒传 | 2015 |
| 24 | 水浒传 | 2015 |
| 25 | 西游记 | 2015 |
| 26 | 西游记 | 2015 |
| 27 | 西游记 | 2015 |
| 28 | 西游记 | 2015 |
| 29 | 西游记 | 2012 |
| 30 | 西游记 | 2012 |
| 31 | 西游记 | 2014 |
| 32 | 西游记 | 2014 |
| 33 | 西游记 | 2011 |
| 34 | 西游记 | 2011 |
+----+--------------+------+
34 rows in set (0.00 sec)
1.统计每一年书籍的数目
select year, count(1) as book_nums from books group by year;
结果:
+------+-----------+
| year | book_nums |
+------+-----------+
| 2000 | 3 |
| 2001 | 3 |
| 2003 | 6 |
| 2004 | 1 |
| 2005 | 1 |
| 2010 | 2 |
| 2011 | 2 |
| 2012 | 3 |
| 2014 | 2 |
| 2015 | 8 |
| 2016 | 3 |
+------+-----------+
11 rows in set (0.00 sec)
2.统计每一种书籍的数目
select title, count(1) as book_nums from books group by title;
结果:
+--------------+-----------+
| title | book_nums |
+--------------+-----------+
| 三国演义 | 5 |
| 水浒传 | 8 |
| 红楼梦 | 11 |
| 西游记 | 10 |
+--------------+-----------+
4 rows in set (0.00 sec)
3.统计每一种书不同年份对应的数目
select title, year, count(1) as book_nums from books group by title, year;
结果:
+--------------+------+-----------+
| title | year | book_nums |
+--------------+------+-----------+
| 三国演义 | 2000 | 3 |
| 三国演义 | 2010 | 2 |
| 水浒传 | 2001 | 3 |
| 水浒传 | 2003 | 1 |
| 水浒传 | 2004 | 1 |
| 水浒传 | 2005 | 1 |
| 水浒传 | 2015 | 2 |
| 红楼梦 | 2003 | 5 |
| 红楼梦 | 2012 | 1 |
| 红楼梦 | 2015 | 2 |
| 红楼梦 | 2016 | 3 |
| 西游记 | 2011 | 2 |
| 西游记 | 2012 | 2 |
| 西游记 | 2014 | 2 |
| 西游记 | 2015 | 4 |
+--------------+------+-----------+
15 rows in set (0.00 sec)
4.统计每一年不同种类书籍的数目
select year, title, count(1) as book_nums from books group by year, title;
结果:
+------+--------------+-----------+
| year | title | book_nums |
+------+--------------+-----------+
| 2000 | 三国演义 | 3 |
| 2001 | 水浒传 | 3 |
| 2003 | 水浒传 | 1 |
| 2003 | 红楼梦 | 5 |
| 2004 | 水浒传 | 1 |
| 2005 | 水浒传 | 1 |
| 2010 | 三国演义 | 2 |
| 2011 | 西游记 | 2 |
| 2012 | 红楼梦 | 1 |
| 2012 | 西游记 | 2 |
| 2014 | 西游记 | 2 |
| 2015 | 水浒传 | 2 |
| 2015 | 红楼梦 | 2 |
| 2015 | 西游记 | 4 |
| 2016 | 红楼梦 | 3 |
+------+--------------+-----------+
5.统计某一种书不同年份对应的数目
select title, year, count(1) as book_nums from books where title = "西游记" group by year;
结果:
+-----------+------+-----------+
| title | year | book_nums |
+-----------+------+-----------+
| 西游记 | 2011 | 2 |
| 西游记 | 2012 | 2 |
| 西游记 | 2014 | 2 |
| 西游记 | 2015 | 4 |
+-----------+------+-----------+
讨论:
(1)与(2)结果不同是因为它们分别从年份和书名对书籍进行分类
(3)与(4)结果其实是一样的,只不过显示的格式不同,看起来不一样,两种方式都是对书籍进行了年份和书名的分类,只是先后顺序不同而已
(5) 指定某一种书的进行年份分类,此时有两种选择.第一种,先找出所有指定的书籍,再按年份进行分类;第二种,先按年份进行分类,再从不同年份中选出指定的书籍,也可以得到结果.
你会选第一种还是第二种?
先看第一种方式:
第一步找出所有的指定书籍,需要把全部书籍查找一遍;第二步,按年份分类,需要将所有指定的书籍查找一遍
第二种方式:
第一步按年份分类,需要把全部数据查找一遍;第二步,在不同年份书籍中找出指定的数据,相当于再次查找一次全部数据
因此,选择第一种方式比较合适,先找到指定的书籍,再按照时间分类.
在sql中, where title = '西游记' 代表找到指定的书籍; group by year 表示按时间分类.那么问题来了,sql执行 where 和 group by 时,哪个先执行?
(毕)
sql中group by的更多相关文章
- MYSQL:SQL中Group By的使用
SQL中Group By的使用 1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By ...
- 转载:SQL中Group By 的常见使用方法
SQL中Group By 的常见使用方法 转载源:http://www.cnblogs.com/wang-meng/p/5373057.html 前言今天逛java吧看到了一个面试题, 于是有了今天 ...
- sql中group by用来干嘛的
sql中group by用来干嘛的 一.总结 一句话总结: 1.group by用来分类汇总的,by后面接要分的类 2.group by既然是分类汇总,那就要和聚合函数结合使用,因为要汇总啊 3.ha ...
- sql中group by 和having 用法解析
--sql中的group by 用法解析:-- Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.--它的作用是通过一定的规则将一个数据集划分成若干个小的 ...
- SQL中group by后面的having中不能使用别名
如下图中,SQL中需要对group by的结果使用having进行过滤,不能使用select中定义的别名,需要使用查询字段的原始名.否则会报错,列明未定义. 下图未错误演示: 修改后,正确的SQL语句 ...
- SQL中Group By的使用
1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By All 7.Group By与聚合函 ...
- SQL中Group By 的使用
1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 2.原始表 3.简 ...
- [数据库]SQL中Group By 的常见使用方法.
前言今天逛java吧看到了一个面试题, 于是有了今天这个文章, 回顾下Group By的用法.题目如下:Select name from table group by name having coun ...
- 【转】SQL中Group By的使用
1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By All 7.Group By与聚合函 ...
随机推荐
- android调用第三方库——第一篇 (转载)
转自:http://blog.csdn.net/jiuyueguang/article/details/9447245 版权声明:本文为博主原创文章,未经博主允许不得转载. 0:前言: 这两天一直在研 ...
- yield 为什么不能进入回调函数
操他妈的, allowed_domains = ['voice.hupu.com'] 这里面必须是域名,而不能是个路径,遇见问题不要瞎几把想,及时Google才是正道!!!!!!!!!11 感谢: h ...
- JAVA实训总结:继承-——子类创建对象原理
继承关键字:extends Java只允许单继承存在 不可以被继承的东西: 1.private成员 体现了java的封装特点,外部类只允许set()get()方法调用,若无set()方法,则类创建的对 ...
- 使用Spring MVC的@RequestBody注解接收Json对象字符串
最近公司在开发移动APP,APP上通过jQuery提交表单的json字符串格式数据到Java后端,之前通过request手动接收,非常麻烦,其实Spring MVC已经为我们提供了一个注解@Reque ...
- 跟我一起玩Win32开发(4):创建菜单
也不知道发生什么事情,CSDN把我的文章弄到首页,结果有不少说我在误人子弟,是啊,我去年就说过了,如果你要成为砖家级人物,请远离我的博客,我这个人没什么特长,唯一厉害的一点就是不相信权威,鄙视砖家,所 ...
- document.body 与 document.documentElement区别介绍
什么是document.body? 返回html dom中的body节点 即<body> 什么是 document.documentElement? 返回html dom中的root 节点 ...
- bzoj 5019 [Snoi2017]遗失的答案
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=5019 题解 如果L不是G的倍数 答案为0 下面考虑G|L的情况 将G,L质因数分解 设$L= ...
- c库函数-字符串
一 strok:从字符串中按照分隔符提取所有字串 char s[] = "水发产品,47.6,不合格,mg/kg,17-05-21 15:04;"; char *delim = ...
- MySQL与RAID
RAID在mysq中适用场景 raid0:由于性能高和成本低,以及基本没有数据恢复的能力,而且它比单片磁盘损坏的概率要高.建议只在不担心数据丢失的情况下使用,如备库(slave)或者某些原因" ...
- 使用真正的 Redux 和 React-redux
现在 make-react-redux 工程代码中的 Redux 和 React-redux 都是我们自己写的,现在让我们来使用真正的官方版本的 Redux 和 React-redux. 在工程目录下 ...