首页 > 数据库 >【MySQL】MySQL基础07— SQL学习 — DQL — 分组查询(转载请注明出处)

【MySQL】MySQL基础07— SQL学习 — DQL — 分组查询(转载请注明出处)

时间:2023-04-08 22:22:30浏览次数:53  
标签:group 07 MySQL 查询 分组 SQL GROUP id SELECT

SQL学习 — DQL — 分组查询

5. 分组查询
  • 背景:在分组函数的内容中,我们提及和分组函数一起查询的字段会有限制,产生错误。因为分组函数是将所以的参数统计成一个结果,而查询的字段是返回符合条件的个数,那么就会出错。所以引入了分组查询,将表中的相同的内容切分成数块,然后分别进行统计后返回结果,这样就不会单纯返回一个结果。

    # 分组查询
    /*
    工具:可以使用group by子句将表中的数据分成若干组
    
    语法:
    select  分组函数, 字段(要求出现在group by的后面)
    from 表名
    [where 筛选条件]
    [group by 分组的字段]
    [having 筛选条件]
    [order by 子句]
    
    注意:
    1.查询列表比较特殊,要求得是分组函数和出现在group by后的分组字段
    
    特点:
    1.分组查询中的筛选条件分为两类:
    			数据源	关键字	位置
    	分组前筛选	原始表	where	group by子句前
    	分组后筛选	分组表	having	group by子句后
    	结论:1.分组函数做条件肯定是放在having子句中
    	      2.能用分组前筛选的,就优先考虑使用分组前筛选,提高性能
    	      
    	      
    2.group by子句支持单个字段分组,多个字段分组(多个字段分组没有顺序要求),表达式,函数
    
    3.也可以添加排序,放在整个查询的最后
    
    */
    
  • 简单的分组查询:分组前的筛选用where

    # 简单的分组查询:分组前的筛选用where
    # 案例1:查询每个部门的平均工资
    SELECT AVG(salary), department_id
    FROM employees
    GROUP BY department_id;
    
    
    # 案例2:查询每个工种的最高工资
    SELECT MAX(salary), job_id
    FROM employees
    GROUP BY job_id;
    
    # 案例3:查询每个位置上的部门个数
    SELECT COUNT(*), location_id
    FROM departments
    GROUP BY location_id; 
    
    
    # 案例4:查询邮箱中包含a字符,每个部门的平均工资
    SELECT AVG(salary), email, department_id
    FROM employees
    WHERE email LIKE '%a%'
    GROUP BY department_id;
    
    
    # 案例5:查询有奖金的每个领导手下员工的最高工资
    SELECT MAX(salary), manager_id
    FROM employees
    WHERE commission_pct IS NOT NULL
    GROUP BY manager_id;
    
  • 复杂的分组查询:分组后的筛选用having

    # 复杂的分组查询:分组后的筛选用having
    # 案例1:查询哪个部门的员工个数>2
    SELECT department_id, COUNT(*)
    FROM employees
    GROUP BY department_id
    HAVING COUNT(*)>2;	# having, 指在分组后的表中进行条件筛选,能套用分组函数
    
    
    # 案例2:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
    SELECT MAX(salary), job_id
    FROM employees
    WHERE commission_pct IS NOT NULL
    GROUP BY job_id
    HAVING MAX(salary)>12000;
    
    
    # 案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资
    SELECT MIN(salary), manager_id
    FROM employees
    WHERE manager_id>102
    GROUP BY manager_id
    HAVING MIN(salary)>5000;
    
  • 按表达式或函数分组 : group by后加表达式或单行函数/分组函数

    # 按表达式或函数分组 : group by后加表达式或单行函数/分组函数
    # 案例1:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
    SELECT last_name ,LENGTH(last_name) AS len_name, COUNT(*)
    FROM employees
    GROUP BY len_name	# mysql中group by后支持别名
    HAVING COUNT(*)>5;	# mysql中having后支持别名
    
  • 按多个字段分组:group by后加多个字段进行分组

    # 按多个字段分组
    # 案例1:查询每个部门每个工种的员工平均工资
    SELECT AVG(salary), department_id, job_id
    FROM employees
    GROUP BY department_id, job_id;
    
  • 分组后添加排序

    # 添加排序
    # 案例1:查询每个部门每个工种的员工平均工资,并且按平均工资的高低显示
    SELECT AVG(salary), department_id, job_id
    FROM employees
    GROUP BY department_id, job_id
    ORDER BY AVG(salary) DESC;
    

5.1 分组查询练习
# 将以下内容复制到sql图像化客户端界面进行思考
#1. 查询各 job_id 的员工工资的最大值,最小值,平均值,总和,并按 job_id 升序
#2. 查询员工最高工资和最低工资的差距(DIFFERENCE)
#3. 查询各个管理者手下员工的最低工资,其中最低工资不能低于 6000,没有管理者的员工不计算在内
#4. 查询所有部门的编号,员工数量和工资平均值,并按平均工资降序
#5. 选择具有各个 job_id 的员工人数

5.2 分组查询练习答案

文件名:06SQL_Groupingquery.sql
下载地址:链接:https://pan.baidu.com/s/1_slO9LaDORqLKIQtbLs3Ww?pwd=ccjz
提取码:ccjz

标签:group,07,MySQL,查询,分组,SQL,GROUP,id,SELECT
From: https://www.cnblogs.com/blog-cjz/p/17299408.html

相关文章

  • Python ORM Pony MySQL数据库 常用操作
    Pony是一个高级的对象关系映射器ORM框架。Pony它能够使用Python生成器表达式和lambdas向数据库编写查询。Pony分析表达式的抽象语法树,并将其转换为SQL查询。支持SQLite,MySQL,PostgreSQL和Oracle等数据库,本文主要介绍PythonORMPony中MySQL数据库常用操作,及数据增加、删除、修......
  • 3.MySQL数据库 - 3
    MySQL数据库-3视图问题对于复杂的查询,往往是有多个数据表进行关联查询而得到,如果数据库因为需求等原因发生了改变,为了保证查询出来的数据与之前相同,则需要在多个地方进行修改,维护起来非常麻烦解决办法:定义视图视图是什么通俗的讲,视图就是一条SELECT语句执行后返回的结果集......
  • 2.MySQL数据库 - 2数据表数据的增删改查
    数据表数据的增删改查专项训练创建数据库、数据表--创建数据库createdatabasepython_test_1charset=utf8;--使用数据库usepython_test_1;--students表createtablestudents(idintunsignedprimarykeyauto_incrementnotnull,namevarchar(20)def......
  • 1.MySQL数据库 - 1
    MySQL数据库-1一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,包括数据字段的类型、约束数据类型可以通过查看帮助文档查阅所有支持的数据类型使用数据......
  • Mysql数据库基础(3)
    一、数据库的备份与还原1、备份的目的做灾难恢复:对损坏的数据进行恢复和还原需求改变:因需求改变而需要把数据还原到改变以前测试(测试新功能是否可用)2、备份命令(1)cmd命令行示例:mysqldump-uusername-ppassworddatabase>D:\backup.sql;执行完后如下:(2)SQLyog ......
  • COMP3311 PostgreSQL 数据库写法
    COMP331123T1Assignment2Python,PostgreSQL,psycopg2DatabaseSystemsLastupdated:Thursday6thApril9:06amMostrecentchangesareshowninred...olderchangesareshowninbrown.[AssignmentSpec][DatabaseDesign][Examples][Testing][Submitting][F......
  • 【MySQL】MySQL基础05 — SQL学习 — DQL — 常见函数 — 分组函数(转载请注明出处)
    SQL学习—DQL—常见函数—分组函数4.常见函数(附加)/*概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名。好处:1.隐藏了实现细节2.提高代码的重用性调用语法:select函数名(实参列表)【from表】;特点: 1.叫什么(函数名) 2.干什么(函数功能)分类: 1.单......
  • STM32F407代码记录
    魔术棒c/c++中Includepaths中添加所有头文件路径;define中添加USE_STDPERIPH_DRIVER,STM32F40_41xxx,.c文件创建函数后,若不在.h中声明函数会造成报警:warning:fuction"xxxx"declaredimplicitly避免重复声明:#ifndef_XXX_XXX_H#ifndef_XXX_XXX_H#define_XXX_XXX_H#endif/*_X......
  • mysql学习日记-02 数据表的基本操作
    一、创建和查看数据表创建数据表:前提要选择一个数据库,命令:USE数据库;CREATETABLE表名称(字段名数据类型,...);CREATETABLEuser(u_nameVARCHAR(10),u_ageint(3),u_sexVARCHAR(1)); 查看所有数据表SHOWTABLES; 查看已创建的数据表信息SHOWCREATETAB......
  • 基于墨者靶场报错盲注分析SQL注入之报错盲注
    报错注入是利用了数据库的某些机制,人为的制造错误条件,是的查询结果能够出现在错误信息中。有xpath语法错误xpath语法错误利用xpath语法错误进行报错注入时利用了extractvlue与updatexml两个函数。使用条件:nysql版本大于5.1.5extractvalue函数原型:extractvalue(xml_document,Xpath......