某图书馆收藏有书籍具有不同的出版年份,管理员需要做一下统计工作:

(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的更多相关文章

  1. MYSQL:SQL中Group By的使用

    SQL中Group By的使用   1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By ...

  2. 转载:SQL中Group By 的常见使用方法

    SQL中Group By 的常见使用方法  转载源:http://www.cnblogs.com/wang-meng/p/5373057.html 前言今天逛java吧看到了一个面试题, 于是有了今天 ...

  3. sql中group by用来干嘛的

    sql中group by用来干嘛的 一.总结 一句话总结: 1.group by用来分类汇总的,by后面接要分的类 2.group by既然是分类汇总,那就要和聚合函数结合使用,因为要汇总啊 3.ha ...

  4. sql中group by 和having 用法解析

    --sql中的group by 用法解析:-- Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.--它的作用是通过一定的规则将一个数据集划分成若干个小的 ...

  5. SQL中group by后面的having中不能使用别名

    如下图中,SQL中需要对group by的结果使用having进行过滤,不能使用select中定义的别名,需要使用查询字段的原始名.否则会报错,列明未定义. 下图未错误演示: 修改后,正确的SQL语句 ...

  6. SQL中Group By的使用

    1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By All 7.Group By与聚合函 ...

  7. SQL中Group By 的使用

    1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 2.原始表 3.简 ...

  8. [数据库]SQL中Group By 的常见使用方法.

    前言今天逛java吧看到了一个面试题, 于是有了今天这个文章, 回顾下Group By的用法.题目如下:Select name from table group by name having coun ...

  9. 【转】SQL中Group By的使用

    1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By All 7.Group By与聚合函 ...

随机推荐

  1. adb logcat 查看日志 (转载)

    转自:http://blog.csdn.net/xyz_lmn/article/details/7004710 使用 logcat 命令 查看和跟踪系统日志缓冲区的命令logcat的一般用法是: [a ...

  2. STL - merge()

    merge用来对两个有序容器进行合并.返回合并后存入容器中的元素的下一个位置的迭代器(可以认为是超尾). merge(v1.first(),v1.end(),v2.first(),v2.end(),r ...

  3. hdoj5821【贪心-神题】

    啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,比赛的时候直接读错题了,实力带坑队友.... 题意: 有两个序列都代表筐,每个筐里只有一个球,然后序列的值代表筐里的球的颜色,问你在m次操作后,a序列的球能否变成b ...

  4. python 容器 生成器 迭代器 总结

    一.容器 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元素存储在内存中. >> ...

  5. 纯JS实现元素加速运动的函数封装

    //elem:给哪个元素添加位移:direction:是垂直方向的话就传入top,水平方向left:speed控制速度,向下.向右传入正值,反之传入负值:distance表示位移的距离function ...

  6. IT兄弟连 JavaWeb教程 HTTP协议

    超文本传输协议(HTTP,Hypertext Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的Web文件都必须遵守这个标准.设计HTTP最初的目的是为了提供一种发布和接 ...

  7. wamp2.5版本配置多端口虚拟主机

    1.保证httpd.conf下 LoadModule php5_module "D:/E/php/wamp/bin/php/php5.5.12/php5apache2_4.dll" ...

  8. SpringMVC + ajax

    1.ajax 返回汉字乱码 解决方法: http://blog.sina.com.cn/s/blog_5f39177b0101it7h.html //方案一 response.setCharacter ...

  9. Codeforces 1107E(区间dp)

    用solve(l, r, prefix)代表区间l开始r结束.带了prefix个前缀str[l](即l前面的串化简完压缩成prefix-1个str[l],加上str[l]共有prefix个)的最大值. ...

  10. 【Codeforces1139D_CF1139D】Steps to One (Mobius_DP)

    Problem: Codeforces 1139D Analysis: After ACing E, I gave up D and spent the left 30 minutes chattin ...