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与聚合函 ...
随机推荐
- E20180418-hm
utility n. [计]工具; 公用事业; 功用,效用; 有用的物体或器械; 公用事业公司; identity n. 身份; identifier n. 识别符; 检验人,标识符; 鉴别器; 编 ...
- 关于git本地已有项目
终于要开始彻底掌握git了,第一步自然是自己建个test repository.然而,目前只学到git init, git clone啊.都没说怎么上传本地已有仓库,网上一搜吧,全是坑人的,标题还写的 ...
- loj#2541. 「PKUWC2018」猎人杀
传送门 思路太清奇了-- 考虑容斥,即枚举至少有哪几个是在\(1\)号之后被杀的.设\(A=\sum_{i=1}^nw_i\),\(S\)为那几个在\(1\)号之后被杀的人的\(w\)之和.关于杀了人 ...
- JAVA多线程(四) Executor并发框架向RabbitMQ推送消息
github代码地址: https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service ...
- 利用pyinstaller生成exe文件碰到的一些问题及解决方法
在“开源图像标注工具labelme的安装使用及汉化”这篇博客中,使用pyinstaller将labelme项目的入口python文件main.py打包,生成了main.exe文件,可以在Windows ...
- SpringAOP和Spring事物管理
Spring AOP : Pointcut表达式: designators-指示器 wildcards-通配符 operators-操作符 wildcards: * -- 匹配任意数量的字符 + -- ...
- JS获取屏幕的大小
<html><script>function a(){document.write("屏幕分辨率为:"+screen.width+"*" ...
- tcp聊天交互
#****setver端 import socket sk = socket.socket() adress = ('127.0.0.1', 8032) sk.bind(adress) sk.list ...
- N Queen Again LightOJ - 1061
N Queen Again LightOJ - 1061 首先预处理(或打表)出所有八皇后的解法(只有92种).然后枚举目标状态,对于每一个目标状态用一个状压dp求出到达那个状态的最小费用.到达任何一 ...
- JAVA常用知识总结(二)
JAVA中的参数传递总结先看两道笔试题: public class Test2 { public static void main (String [] args) { StringBuffer a ...