zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Mysql入门技能树-聚合和分组

mysql入门 技能 分组 聚合
2023-09-14 09:13:33 时间

聚合和分组

计数

Joe 建立了一个名为items的表

mysql> select * from items;
+----+-----------+
| id | item      |
+----+-----------+
|  1 |         2 |
|  2 |      NULL |
|  3 |         9 |
|  4 | 534214123 |
+----+-----------+

当他执行

select count(*), count(item) 
from items;

会得到什么结果?
在这里插入图片描述

无正确答案
正确答案应该是4,3
知识点:
count(*)和count(1)都是统计表中所有的行数,包括null值的列
count(field)在列上统计个数,会忽略null值

求和

Joe 想要得到 orders 表

create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    total decimal(12, 4),
    description varchar(2000),
    ts timestamp default now(),
    deal bool default false
);

中所有单价(unit_price)超过 1000 的订单中,已成交(deal 为 true)的总值(total),这个查询应该是:
在这里插入图片描述
正确答案是:D
A order by 是排序,没有限制deal 为 true
BC语法错误,having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚合函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。

最小值

Joe 想要得到 employee 表

create table employee
(
    id     serial primary key,
    name   varchar(256),
    dept   varchar(256),
    salary decimal(12, 4)
);

中每个部门工资最低的员工的工资信息,这条查询应该怎么写?
在这里插入图片描述
正确答案是:A
BCD中min()函数用法错误,在有结果情况下也只是一条记录,不满足题意各个部门,况且D中的total都不是表中的字段
MIN()函数可以和GROUP BY语句一起使用,用来查询数据表中每个分组下的某列数据的最小值

最大值

利用员工信息表Joe 做了一些关于 max 函数的练习,其中不正确的是:
在这里插入图片描述
在这里插入图片描述
不正确的是:A
如果要得到每个部门工资最高的员工的全部信息,该怎么实现呢?

select
	id,
	name,
	u1.dept,
	u1.salary
from
	employee u1
join (
	select
		dept,
		max(salary) as salary
	from
		employee
	group by
		dept
) u2 
on
	u1.dept = u2.dept
	and u1.salary = u2.salary