首页 > 数据库 >Mysql使用实际01---SQL分组查询

Mysql使用实际01---SQL分组查询

时间:2022-08-17 20:46:13浏览次数:57  
标签:salary 01 GROUP deparmant utf8mb4 --- 分组 Mysql employee

1.SQL分组查询使用场景

对记录的分组是通过关键字 GROUP BY 实现的, GROUP BY 后面跟着一个定义组的构成的属性列表。 如果我们使用语句 GROUP BY A1,……, Ak 我们就把记录分成了组,这样当且仅当两条记录 在所有属性 A1,……, Ak 上的值达成一致,它们才是同一组的。 SQL 允许我们把一个表里面的记录用GROUP BY 分成组。

分组查询通常用于配合聚合函数,达到分类汇总统计的信息。

group by,顾名思义即为分组,即将原来的一整块数据分成几小块。分组是聚合的前提,聚合是在每个分组内进行一些统计,如在分组内的最大值,最小值,平均值,个数等。

下表列出了SQL的执行顺序:

子句说明使用场景
select 查询数据 在db数据检索时使用
from 检索的表 检索时使用
where 过滤数据的条件 需要对数据进行筛选时
group by 分组select的结果集 需要聚合统计时常用
having 过滤分组 对分组进行过滤时需要
order by 排序结果集 需要按照某种顺序展示数据

 

新建employee表:

/*
 Navicat Premium Data Transfer

 Source Server         : test01
 Source Server Type    : MySQL
 Source Server Version : 50723
 Source Host           : localhost:3306
 Source Schema         : flep

 Target Server Type    : MySQL
 Target Server Version : 50723
 File Encoding         : 65001

 Date: 17/08/2022 18:37:18
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for employee
-- ----------------------------
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee`  (
  `id` int(11) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
  `gender` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
  `salary` int(11) NULL DEFAULT NULL,
  `deparmant` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of employee
-- ----------------------------
INSERT INTO `employee` VALUES (1, '张三', '男', 2000, '    营销部');
INSERT INTO `employee` VALUES (2, '李四', '男', 4000, '营销部');
INSERT INTO `employee` VALUES (3, '王五', '女', 1000, '研发部');
INSERT INTO `employee` VALUES (4, '赵六', '男', 8000, '财务部');
INSERT INTO `employee` VALUES (5, '孙七', '女', 5000, '研发部');
INSERT INTO `employee` VALUES (6, '周八', '男', 6000, '人事部');
INSERT INTO `employee` VALUES (7, '吴九', '女', 8000, '研发部');
INSERT INTO `employee` VALUES (8, '郑十', '女', 4000, '人事部');

SET FOREIGN_KEY_CHECKS = 1;

2.SQL分组查询Group By+Group_concat

group by 是分组,分组并不是去重,而是分组;

将查询结果按一个或多个进行分组,字段值相同的为一组;

分组查询中,select后只能跟分组的字段和聚合函数

(1)Group By+Group_concat : 表示分组之后,根据分组结果,使用 group_contact() 来放置每一组的每字段的值的集合。

select deparmant, GROUP_CONCAT(`name`) from employee GROUP BY deparmant

根据 department 分组,通过 group_concat('name'),查看每组里面的姓名都有哪些

(2)案例2

SELECT gender,GROUP_CONCAT(`name`) from employee GROUP BY gender

3.SQL分组+聚合函数

3.1 根据department 分组,计算各部门下工资总数,平均工资,最高工资

select deparmant, GROUP_CONCAT(salary), SUM(salary),AVG(salary) 平均工资,MAX(salary) 最高工资 from employee GROUP BY deparmant;

3.2 查询每个部门的部门名称以及每个部门的人数

SELECT deparmant, GROUP_CONCAT(`name`), COUNT(*) from employee GROUP BY deparmant

3.SQL分组GroupBy+Having

  • group by + having 用来分组查询后指定一些条件来输出查询结果
  • having 和 where 一样,但 having 只能用于 group by

3.1 查询工资总和大于 9000的部门名称

SELECT deparmant, GROUP_CONCAT(salary), SUM(salary) FROM employee 
GROUP BY deparmant 
HAVING SUM(salary) > 9000;

having 和 where 的区别:

  • having 是在分组后对数据进行过滤,where 是在分组前对数据进行过滤
  • having后面可以使用分组函数(统计函数),where后面不可以使用分组函数
  • where 是对分组前记录的条件,如果某行记录没有满足where字句的条件,那么这行记录不会参加分组;而having是对分组后数据的约束

3.2 查询工资大于2000的,工资总和大于9000的部门名称以及工资和

select deparmant,GROUP_CONCAT(salary), SUM(salary) from employee 
WHERE salary > 2000 
GROUP BY deparmant 
HAVING sum(salary) > 9000
ORDER BY SUM(salary) DESC;

 

标签:salary,01,GROUP,deparmant,utf8mb4,---,分组,Mysql,employee
From: https://www.cnblogs.com/luckyplj/p/16596659.html

相关文章

  • q-binomial 学习笔记
    主要可以解决一些生成函数问题,网上资料不是很多,orzzaky的博客。part1q-Binomial考虑一个很经典的模型,就是从\((0,0)\)出发,每次向上或者向右走一格,走到\((n,m)\)的......
  • 2022-08-16 第五组 赖哲栋 学习笔记
    DQL数据库查询语言重点,DQL是我们每天都要接触编写最多也是最难的SQL,该语言用来查询记录,不会修改数据库和表结构。构建数据库创建一张student表:DROPTABLEIFEXISTSst......
  • 2022-08-17 第五组 赖哲栋 学习笔记
    DQL查询语言子查询按照结果集的行列数不同,子查询可以分为以下几类:标量子查询:结果集只有一行一列(单行子查询)列子查询:结果集有一列多行行子查询:结果集有一行多列表子......
  • Django连接MySQL与正反向迁移命令
    目录连接MySQL方法一:pymysql连接方法二:mysqlclient迁移命令连接MySQL方法一:pymysql连接第一步:修改settings.py配置文件中的DATABASES:DATABASES={'default':{......
  • 【MySQL】多表查询:自连接VS非自连接
    区别:多表查询时是否和自身连接(自恋)1.自连接查询员工last_name和他的领导名称SELECTCONCAT(worker.last_name,'的领导是',manager.last_name)FROMemployeesworke......
  • 20. Redis---发布订阅
    1.前言RedisPubSub模块又称发布订阅者模式,是一种消息传递系统,实现了消息多播功能。发布者(即发送方)发送消息,订阅者(即接收方)接收消息,而用来传递消息的链路则被称为 chan......
  • 技术专家说 | 如何基于 Spark 和 Z-Order 实现企业级离线数仓降本提效?
    【点击了解更多大数据知识】市场的变幻,政策的完善,技术的革新……种种因素让我们面对太多的挑战,这仍需我们不断探索、克服。今年,网易数帆将持续推出新栏目「金融专家说」......
  • Redis---服务端命令
    1.前言Redis服务器是对客户端提供服务的主体,只要是安装了Redis数据库的计算机都可以通过本地,或者远程的方式对外提供服务。Redis服务器能够以高可用集群的方式对外提......
  • leetcode45-跳跃游戏 II
    跳跃游戏II前向dp对于一个数i,从0到i-1进行遍历,如果在这个位置能跳跃到i,那么对i的dp值进行更新。这种方式时间复杂度为O(n^2),效率很低classSolution{publici......
  • 媒体宝-环境准备
    4.媒体宝-环境由于代码需要放在服务器上才能让所有的功能正常运行,所以,开发测试时也需要将代码同步到服务器。可以用的代码同步方案有三种:基于IDE的Deployment的功能实......