MySQL学习记录--分组与聚集

一、group by 子句

  group by 字句可对数据进行分组。

  以MySQL5.5的sakila数据库中的film数据表举例:查找出各个电影等级的电影总数

mysql>SELECT rating, COUNT(*) AS ratingCount FROM film
     > GROUP BY rating 

  结果如下:

  可以看出,group by 子句对其后接的字段进行了分组,而这里也用了聚集函数count()对各分组中的项目数进行统计。

二、聚集函数

  由上例可以知道,聚集函数是对某个分组的所有行执行特定的操作。下面介绍一些通用的聚集函数:

    MAX() : 返回集合中的最大值

    MIN() :返回集合中的最小值

    AVG() : 返回集合中的平均值

    SUM() : 返回集合所有值之和

    COUNT() : 返回集合的总条数

  还是以film 数据表举例:注:length字段在数据表中代表电影时长

mysql> select max(length),
    -> min(length),
    -> avg(length),
    -> sum(length),
    -> count(*)
    -> from film;

  结果以下

  聚集函数可以创建参数表达式,可以根据需要任意增加复杂度,只需要保证最后返回一个数字、字符串或日期即可。

三、聚集函数对null值的处理

  sum()、avg()、max()函数都会忽略分组集合中的null值。需要注意,count(字段)是对分组集合中的个数统计,会忽略null,而count(*)表示统计分组集合的行数,不会忽略null。

四、having 子句

  先看例子:查找出各个电影等级的电影总数且总数大于200

mysql> SELECT rating, COUNT(*) AS ratingCount FROM film
    -> GROUP BY rating
    -> WHERE ratingCount>200;

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that    -- 报错
corresponds to your MySQL server version for the right syntax to use near ‘WHERE
ratingCount>200‘ at line 3

  查询的where 子句中不能包含聚集函数,这是因为where 子句是在分组前执行的,服务器此时还不能对分组执行任何函数。因此,可用having 子句使用聚集函数进行过滤数据

mysql> select rating, count(*) as ratingCount from film
    -> group by rating
    -> having ratingCount>200;
+--------+-------------+
| rating | ratingCount |
+--------+-------------+
| PG-13  |         223 |
| NC-17  |         210 |
+--------+-------------+
2 rows in set (0.00 sec)

五、分组查询中的where 和 having

  当在包含group by子句的查询中增加过滤条件时,需要考虑过滤是针对原始数据(此时过滤条件应放在where 子句中),还是针对分组后的数据(此时过滤条件应放到having 子句中)。

时间: 2024-12-23 08:05:28

MySQL学习记录--分组与聚集的相关文章

MySQL学习记录

前提:数据库:books里面有table:customersorders 选择数据库use books 查询所有表格show tables查询单个表格select × from orders查询表格的数据类型show create table orders 修改数据类型alter table orders modify id vaechar(20) 增加两行数据insert into orders values('','','',''),('','','','')增加特定位置的数据insert

Mysql 学习记录

( xampp 的mysql 与 直接用 dnf 安装的 mysql 有冲突! ) 1. 数据库基本知识: 一张表的行 又称为 记录 一张表的列 又称为 字段 表结构:所有字段,规定了你的每一条记录所应该填的内容,不能随意乱写 2.mysql 登录: mysql -u root -p password (root密码) (待继续更新)

mysql 学习记录(二十五)--mysql日志

一.理论: 1.错误日志: a.记录了mysqld启动和停止时以及出错时的相关信息,当数据库出现故障导致无法启动时可以先查看此信息. b.可用--log-error来指定mysqld保存错误日志文件的位置 2.二进制日志: a.statement:记录的都是语句.优点:日志记录清晰易读.日志量少.对I/O影响较小,缺点:在某些情况下slave的日志复制会出错 b.row:将每一行的变更记录到日志中,而不是记录sql语句.优点:记录每一行的数据变化细节,不会出现某些情况下无法复制的情况,缺点:日志

MySQL学习记录一

1.MySQL join操作 left join以左表为基础,其记录会全部表示出来,而右表只显示满足搜索条件的记录.right join以右表为基础,其记录会全部显示出来,而左表只显示满足搜索条件的记录.下面先创建两个表进行测试,表a包含ID(aID)以及姓名(aName),表b包含ID(bID)以及学号(bNum). 图1 从上图可以看出,表格创建成功并插入了几条数据.下面开始测试左连接.右连接,结果如图2所示. 图2 从图2可以看出,左连接时,以表a为基础,共5条记录.结果中,表b只显示a.

MySQL学习记录--操作时间数据

1.返回日期的时间函数 date_add() : 可以为指定日期增加/减少任意一段时间间隔.下面举例将当前日期增加一个月和减少一个月 mysql> select date_add(current_date(), interval 1 month) as add_one_month; +---------------+ | add_one_month | +---------------+ | 2016-12-30 | +---------------+ 1 row in set (0.00 se

MySQL学习记录-group_concat

group_concat的用法: 可以配合group by来使用. select group_concat(column name1 separator ';') from tablename group by column name2; 解释: 按照column name2进行分组,然后将column name1的数据用分号隔开(默认分隔符为逗号),给出结果:

mysql学习记录(一)

一.cmd操作mysql 1.进入mysql mysql -h localhost -u root -p + enter >enter password:root 2.简单mysql命令 create database db_name create table table_name(field_name field_type) show databases/tables describe table_name 2.sql文件导入导出 导入:source file_path 导出:mysqldum

【MySQL】Linux MySQL学习记录

1.查看日志存放路径 show variables like 'general_log_file'; 2.查看日志是否开启 show global variables like 'log_bin%';

mysql学习记录(二)

一.索引 创建:create index index_name on table_name(field) 删除:drop index index_name on table_name 二.约束 create table tablename(field_name field_type {not null,unique,check(filed>0),primary key auto_increment,constraint constraint_name foreign key reference