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与聚合函 ...
随机推荐
- 【WIP】MVVM
创建: 2018/04/05 懒得写了
- K
https://codeforces.com/gym/101982/attachments K 打表暴力 /*#include<bits/stdc++.h> using namespace ...
- 洛谷 - P2335 - 位图 - 简单dp
https://www.luogu.org/problemnew/show/P2335 假如我们使用dp的话,每次求出一个点的左上方.右上方.左下方.右下方的最近的白点的距离.那么只是n²的复杂度.这 ...
- Android Fragment使用小结及介绍
目录(?)[-] 一什么是Fragment 二Fragment的生命周期 三Fragment的两种添加方式addreplace 四两种添加方式性能比较 偶记得第一次接触Fragment,觉得好牛叉的组 ...
- bzoj 3160: 万径人踪灭【FFT+manacher】
考虑正难则反,我们计算所有对称子序列个数,再减去连续的 这里减去连续的很简单,manacher即可 然后考虑总的,注意到关于一个中心对称的两点下标和相同(这样也能包含以空位为对称中心的方案),所以设f ...
- nginx用户统计
1 概念 PV:页面访问量,即PageView,用户每次对网站的访问均被记录,用户对同一页面的多次访问,访问量累计. UV:独立访问用户数:即UniqueVisitor,访问网站的一台电脑客户端为一个 ...
- CentOS下查看网络状态
查看网络状态:lsof -Pnl +M -i4 显示ipv4服务及监听端情况netstat -anp 所有监听端口及对应的进程netstat -tlnp 功能同上 网络基本命令 (1)network ...
- windows session 管理
Killing an Oracle process from inside Oracle I had a following situation few days ago – I was runnin ...
- HDU 2227 Find the nondecreasing subsequences dp思想 + 树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=2227 用dp[i]表示以第i个数为结尾的nondecreasing串有多少个. 那么对于每个a[i] 要去找 & ...
- json字符串和字典类型的相互转换
在开发过程中,有时候需要将json字符串转为字典类型,反之亦然,通常采用.Net的开源类库Newtonsoft.Json进行序列化,这里我也是采用这个,不过我更喜欢写扩展方法方便在项目的调用. 首先新 ...