基本聚集函数和case的应用

文章目录

  • 1.基本聚集函数
    • (1)基本聚集函数的介绍
    • (2)使用基本聚集函数的简单例子
      • (1)查询最大年龄,最小年龄年龄和平均年龄
        • <1>最大年龄
        • <2>最小年龄
        • <3>平均年龄
      • (2)配合上where语句,查询女士的平均年龄
      • (3)多个函数的共同使用
  • 2.分组聚集
    • (1)一个简单的例子
      • 统计学生所在城市
  • 3.having子句
    • (1) where 和 having的区别
      • <1>group by + where 的执行流程
      • <2>group by + having 的执行
      • <3>同时有where、group by 、having的执行顺序
      • <4>having子句和where 的区别和联系
      • <5>使用group by需要注意的问题
        • A.group by不一定要配合聚合函数使用
        • B.group by后面的字段也不一定要出现在查询字段中
        • C.分组导致的慢Sql问题
        • D.分组导致的慢Sql的优化方案
          • (a)不排序
          • (b)不使用磁盘
  • 4.Sql的书写顺序和执行顺序
    • 1.书写顺序
      • distinct的含义和使用方法
        • 作用:
        • 使用方法
        • 例子
    • 2.执行顺序
  • 5.CASE语句的两种形式
    • (1)简单CASE语句
    • (2)搜索CASE语句
      • 在查询语句使用CASE
      • 在更新语句中使用
      • 在 ORDER BY语句中使用
  • 6.`CASE` 语句的注意事项

聚集函数是以一组值作为执行的输入,返回单个值函数,聚集函数也被称为组函数。聚集函数通常会和GROUP BY子句和HAVING一同使用的,SQL提供了五个固有聚集函数。

1.基本聚集函数

(1)基本聚集函数的介绍

函数作用语法
avg平均值SELECT AVG(字段名/列名) FROM 表名
min最小值SELECT MIN(column_name) FROM 表名
max最大值SELECT MAX(字段名/列名) FROM 表名
sum总和SELECT SUM(字段名/列名) FROM 表名
count计数SELECT COUNT(字段名/列名) FROM 表名

(2)使用基本聚集函数的简单例子

表结构大概就是这个样子

在这里插入图片描述


SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',`id_card` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '身份证号码',`name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名',`age` int(4) NOT NULL COMMENT '年龄',`city` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '城市',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '学生表' ROW_FORMAT = Compact;-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '', '小李', 9, '北京');
INSERT INTO `student` VALUES (15, '', '小李', 11, '北京');
INSERT INTO `student` VALUES (16, '', '小李', 23, '北京');
INSERT INTO `student` VALUES (17, '', '小李', 22, '北京');
INSERT INTO `student` VALUES (18, '', '小李', 18, '上海');
INSERT INTO `student` VALUES (19, '', '小李', 47, '上海');
INSERT INTO `student` VALUES (20, '', '小李', 6, '上海');
INSERT INTO `student` VALUES (21, '', '小李', 47, '上海');
INSERT INTO `student` VALUES (22, '', '小李', 16, '魔都');
INSERT INTO `student` VALUES (23, '', '小李', 19, '魔都');
INSERT INTO `student` VALUES (24, '', '小李', 21, '魔都');SET FOREIGN_KEY_CHECKS = 1;

(1)查询最大年龄,最小年龄年龄和平均年龄

<1>最大年龄
select max(age) from student
<2>最小年龄
select min(age) from student
<3>平均年龄
select avg(age) from student

(2)配合上where语句,查询女士的平均年龄

select avg(age) from student WHERE sex = '女'

(3)多个函数的共同使用

iphone表

idnamePrice
1HuaWei6000
2XiaoMi8000
3Vivo600
4Quant9000
5NUoa1200
SELECT COUNT(*) AS nums,
MIN(Price) AS min_Price,
MAX(Price) AS max_Price,
AVG(Price) AS avg_Price,
SUM(Price) AS sum_Price 
FROM iphone

查询结果

numsmin_Pricemax_Priceavg_Pricesum_Price
56009000496024800

2.分组聚集

group by 子句作用:对给出的一个或多个属性来构造分组,将属性上取值相同的元组(数据库中的每一行就是一个元组)分到同一组中。

(1)一个简单的例子

统计学生所在城市

select city,count(*) as num from student group by city;

在这里插入图片描述


还可以在这个基础上加上一个按照性别分组的字段,如下

select sex,city,count(*) as num from student group by city,sex;

在这里插入图片描述

3.having子句

(1) where 和 having的区别

<1>group by + where 的执行流程

执行下面的语句

explain select city ,count(*) as num from student where age> 20 group by city;

在这里插入图片描述

可以发现查询条件使用了全表扫描,并且使用了临时表和排序

  1. 创建内存临时表,表里有两个字段citynum
  2. 全表扫描,找到大于年龄大于20的主键ID,找到city = ‘X’
  • 判断临时表中是否有为 city='X’的行,没有就插入一个记录 (X,1);
  • 如果临时表中有city='X’的行的行,就将x 这一行的num值加 1;
  1. 继续重复2步骤,找到所有满足条件的数据,
  2. 最后根据字段city排序,得到结果集返回给客户端。

<2>group by + having 的执行

查询居住人数大于等于4的城市名

select city ,count(*) as num from student  group by city having num >= 4;

在这里插入图片描述

having子句被称为分组过滤条件

<3>同时有where、group by 、having的执行顺序

<4>having子句和where 的区别和联系

区别:

  • 过滤对象不同
    • where后面跟的过滤对象是数据库中已经有的字段名,过滤的对象是行
    • having子句后面跟的是聚合函数,过滤的对象是是分组
  • 过滤时间不同,在sql语句中书写位置不同
    • having是在分组后对数据进行过滤
    • where是在分组前对数据进行过滤
    • having只能用在group by之后,where执行在group by之前

联系:

两者都是限定条件对数据进行筛选

<5>使用group by需要注意的问题

A.group by不一定要配合聚合函数使用

没错你没看错,group by可以不配合聚合函数使用,这在语法上是没有任何问题的,不过一般配合聚合函数使用才会有具体意义。

下面给一个不配合聚合函数使用的例子:

**注意:**不配合聚合函数使用的话,会返回每个分组中的第一行数据

select city,age from student group by  city;

在这里插入图片描述

在这里插入图片描述

B.group by后面的字段也不一定要出现在查询字段中

是的你没看错,group by后面的字段,在语法中不出现在select后面的字段中也是没问题的

来个例子来帮助理解一下吧

select id from student group by city;

在这里插入图片描述

C.分组导致的慢Sql问题

使用group by不当的话其实是容易产生慢SQL的问题的,产生这个问题的原因是因为在执行sql的过程中,用到了临时表和默认的排序,有时候甚至会遇到磁盘临时表。

  • 在执行过程中,如果达到临时表的上限后,内存临时表会转成磁盘临时表,速度就会慢下来
D.分组导致的慢Sql的优化方案
  1. 不使用磁盘临时表
  2. 不进行排序
(a)不排序
  • 给group后面的字段加索引(这样可以保证字段本身就是有序的,自然不需要排序)

  • 使用order by null

select city ,count(*) as num from student group by city order by null

(b)不使用磁盘
  • 适当调大tmp_table_size参数,这样会扩大内存临时表的容量。
  • 使用SQL_BIG_RESULT优化

在数据量过大一定会用到内存临时表时,使用SQL_BIG_RESULT 这个关键字直接用磁盘临时表

4.Sql的书写顺序和执行顺序

1.书写顺序

SELECT- DISTINCT- FROM- JOIN ON- WHERE- GROUP BY- HIVING- ORDER BY- LIMIT

distinct的含义和使用方法

作用:

distinct用来查询不重复字段值,可以使用"count(distinct city)"来返回不重复字段值的条数,distinct只能返回他的目标字段,而无法返回其他字段。

使用方法

distinct 字段名(如id)

例子
  1. 对单个字段使用
select distinct city from student

查询结果

city
北京
上海
魔都
  1. 对多个字段使用
select distinct age,city from student

查询结果

idcity
9北京
11北京
22北京
18上海
47上海
6上海
16魔都
19魔都
22魔都

2.执行顺序

FROM- ON- JOIN- WHERE- GROUP BY- HAVING- SELECT- DISTINCT- ORDER BY- LIMIT

5.CASE语句的两种形式

  • CASE 语句是 SQL 的条件判断类似于编程语言中的 if-else 语句。
  • 可以在 SELECTUPDATEDELETE 等 SQL 语句中使用,以基于不同条件返回不同的值或执行不同的操作。
  • 简单 CASE 语句
  • 搜索 CASE 语句

(1)简单CASE语句

简单CASE语句是对一个表达式的多个可能值进行比较

举个栗子

SELECT id, weekday,CASE weekdayWHEN '1' THEN '周一'WHEN '2' THEN '周二'WHEN '3' THEN '周三'WHEN '4' THEN '周四'WHEN '5' THEN '周五'ELSE '周末'END AS Weekday
FROM week where id in (1,4,6);

在这里插入图片描述

(2)搜索CASE语句

举个栗子

在查询语句使用CASE

根据年龄来,对各个年龄的女性,称呼

[🐕]
SELECT id, age,CASEWHEN age <= 10 THEN '小妹妹'WHEN age <= 30 THEN '小姐姐'WHEN age >30 THEN '女士'ELSE '未知'END AS cal
FROM student 
where sex = '女'
order by age;

在这里插入图片描述

在更新语句中使用

进行动态的更新

在一个公司表中,根据销售额动态的确定员工的奖金:

  • employees 员工表
  • sales_amount 销售额
  • bonus 奖金
UPDATE employees
SET bonus = CASEWHEN sales_amount >= 100000 THEN 10000WHEN sales_amount >= 50000 THEN 5000ELSE 1000END
FROM sales
WHERE employees.emp_id = sales.emp_id;

员工按照销售额来动态的设置员工奖金

在 ORDER BY语句中使用

自定义排序

  • students 学生表
  • age 年龄
  • score 分数
SELECT * FROM students
ORDER BY CASE WHEN age < 18 THEN ageWHEN age >= 18 AND score >= 90 THEN scoreELSE nameEND
  • 首先按照年龄进行排序,年龄小于18的学生排在前面;

  • 然后按照成绩进行排序,成绩大于等于90的学生排在前面;

  • 最后按照姓名进行排序。

6.CASE 语句的注意事项

  1. 数据类型:所有的 result(就是when后面的值) 值必须是同一数据类型或可以隐式转换为同一数据类型。
  2. NULL 处理:在 CASE 语句中处理 NULL 值时,需要特别注意,因为 NULL 不等于任何值,包括它自己。可以使用 IS NULL 来检查 NULL 值。
  3. 顺序:条件的顺序很重要,因为CASE 语句会按顺序评估条件,遇到第一个为真的条件时返回相应的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA笔记十四

十四、集合 1.集合概述 (1)集合是存储其它对象的特殊对象&#xff0c;可以将集合当作一个容器 (2)集合的相关接口和类位于java.util包中 (3)集合中的接口和类是一个整体、一个体系 2.集合接口 接口定义了一组抽象方法&#xff0c;实现该接口的类需要实现这些抽象方法&…

Docker核心技术:Docker原理之Cgroups

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Docker核心技术 系列文章&#xff1a;Docker原理之Cgroups&#xff0c;其他文章快捷链接如下&#xff1a; 应用架构演进容器技术要解决哪些问题Docker的基本使用Docker是如何实现的 Docker核心技术&#xff1a;…

C++初学者指南-5.标准库(第一部分)--标准库最小/最大算法

C初学者指南-5.标准库(第一部分)–标准库min/max算法 文章目录 C初学者指南-5.标准库(第一部分)--标准库min/max算法minmaxminmaxclamp (C17)min_elementmax_elementminmax_element相关内容 C标准库算法是一块新领域&#xff1f;⇒简短介绍 min min(a, b) → a 如果 a < b则…

Linux_实现UDP网络通信

目录 1、实现服务器的逻辑 1.1 socket 1.2 bind 1.3 recvfrom 1.4 sendto 1.5 服务器代码 2、实现客户端的逻辑 2.1 客户端代码 3、实现通信 结语 前言&#xff1a; 在Linux下&#xff0c;实现传输层协议为UDP的套接字进行网络通信&#xff0c;网络层协议为IPv4&am…

k8s+containerd(kvm版)

k8s&#xff08;Kubernetes&#xff09;是由Gogle开源的容器编排引擎&#xff0c;可以用来管理容器化的应用程序和服务&#xff0c;k 高可用&#xff1a;系统在长时间内持续正常地运行&#xff0c;并不会因为某一个组件或者服务的故障而导致整个系统不可用可扩展性&#xff1a…

【SpringBoot】 jasypt配置文件密码加解密

目前我们对yml配置文件中的密码都是明文显示&#xff0c;显然这不安全&#xff0c;有的程序员离职了以后可能会做一些非法骚操作&#xff0c;所以我们最好要做一个加密&#xff0c;只能让领导架构师或者技术经理知道这个密码。所以这节课就需要来实现一下。 我们可以使用jasypt…

爬虫学习3:爬虫的深度爬取

爬虫的深度爬取和爬取视频的方式 深度爬取豆瓣读书 import time import fake_useragent import requests from lxml import etree head {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 …

陶德:边种田边写代码,3年300万行,一个人写出了“国产大满贯QT”

这是《开发者说》的第12期&#xff0c;本期我们邀请的开发者是陶德&#xff0c;从小在国企矿山里长大&#xff0c;计算机成绩是文科班里最差的一个&#xff0c;毕业两年找不到工作&#xff0c;睡过公园&#xff0c;讨过剩饭&#xff0c;用打魔兽世界的方式磨炼技术&#xff0c;…

.NET 8+Vue2 部署到Window Server

.NET 8Vue2 部署到Window Server 1 配置环境 1.1 下载安装.NET 8 SDK&#xff0c;下载时需注意目标服务器的系统类型&#xff08;64位 or 32位&#xff09; https://dotnet.microsoft.com/zh-cn/download 1.2 下载安装SQL Server数据库&#xff08;服务和管理工具&#xff…

海外短剧系统搭建开发定制,H5/APP源码搭建部署,支持二开

目录 前言&#xff1a; 一、系统功能 二、部署流程 前言&#xff1a; 海外短剧系统搭建部署&#xff0c;前端uniapp&#xff0c;PHP语言。支持二开功能。 一、系统功能 以下是改写后的内容&#xff1a; 1. 多语言环境集成 —— 提供一键式翻译功能&#xff0c;轻松切换多…

【Vue3】计算属性

【Vue3】计算属性 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文内…

IT common sense常识

how to input formative json data in console console.log({"message": [{"cat_id": 1,"cat_name": "大家电","cat_pid": 0,"cat_level": 0,"cat_deleted": false,,,,})2) how to clear unecessary c…

基于生物地理算法的MLP多层感知机优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 生物地理算法&#xff08;BBO&#xff09;原理 4.2 多层感知机&#xff08;MLP&#xff09; 4.3 BBO优化MLP参数 5.完整程序 1.程序功能描述 基于生物地理算法的MLP多层感知机优化mat…

【数学建模】——前沿图与网络模型:新时代算法解析与应用

目录 1.图与网络的基本概念 1. 无向图和有向图 2. 简单图、完全图、赋权图 3. 顶点的度 4. 子图与图的连通性 2.图的矩阵表示 1. 关联矩阵 2. 邻接矩阵 3.最短路问题 1.Dijkstra 算法 2.Floyd 算法 4.最小生成树问题 1.Kruskal 算法 2.Prim 算法 5.着色问题 6.…

[Linux]Mysql之主从同步

AB复制 一、主从复制概述 主从复制&#xff0c;是用来建立一个和主数据库完全一样的数据库环境&#xff0c;称为从数据库&#xff1b;主数据库一般是准实时的业务数据库。 主从复制的作用 1.做数据的热备&#xff0c;作为后备数据库&#xff0c;主数据库服务器故障后&#xf…

数据价值网络:开启数据驱动的新时代

数据价值网络&#xff1a;开启数据驱动的新时代 数据已成为第五大生产要素&#xff0c;其价值的实现有赖于广泛的应用和高效的流通。数据价值网络涵盖了从数据生成到运用的一系列价值创造环节&#xff0c;各企业基于自身资源禀赋和比较优势进行专业化分工。政策的支持和技术的创…

入门C语言Day15——关系条件逻辑操作符

今天来学习操作符中的一些内容&#xff0c;主要讲的是关系&条件&逻辑操作符 1.关系操作符 首先要来了解一下什么是关系操作符&#xff0c;关系操作符其实就是关系运算符&#xff0c;关系运算符又和关系表达式有关。 C语言中用于比较的表达式&#xff0c;就被称为 “关…

Cadence学习笔记(十三)--设置边框与异形铺铜

直接导入板框用小眼睛可以看到所有的都是线的属性&#xff1a; 那么如何让它变成板框呢&#xff1f;这里先跳转到下图中的层&#xff1a; 将Z--CPOY这一层变成shape区&#xff1a; 之后用Z--copy: Z--COPY设置如下参数&#xff0c;铺铜内缩20mil: 之后选择长方形铺铜就可以了&…

【第5章】Spring Cloud之Nacos服务注册和服务发现

文章目录 前言一、提供者1. 引入依赖2.配置 Nacos Server 地址3. 开启服务注册 二、消费者1. 引入依赖2.配置 Nacos Server 地址3. 开启服务注册 三、服务列表四、服务发现1. 获取服务列表2. 测试2.1 获取所有服务2.2 根据服务名获取服务信息 五、更多配置项总结 前言 本节通过…