基本聚集函数和case的应用

news2024/9/22 1:25:49

文章目录

  • 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 weekday
        WHEN '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,
    CASE
        WHEN 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 = CASE
                WHEN sales_amount >= 100000 THEN 10000
                WHEN sales_amount >= 50000 THEN 5000
                ELSE 1000
            END
FROM sales
WHERE employees.emp_id = sales.emp_id;

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

在 ORDER BY语句中使用

自定义排序

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

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

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

6.CASE 语句的注意事项

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

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

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

相关文章

虚拟化环境中如何实现以业务为中心的网络隔离?Everoute 推出虚拟专有云网络(VPC)功能

目前&#xff0c;不少企业都利用云计算和虚拟化技术提升 IT 系统灵活性、敏捷性和成本效益。然而&#xff0c;云环境的“多租户”特性也为业务安全带来了新的挑战&#xff0c;如何保障不同业务主体或租户之间的数据安全和网络隔离&#xff0c;成为企业关注的焦点。 作为 Smart…

(C++) 智能指针指定删除器

文章目录 ⌚前言⏲️注意 ⌚unique_ptr⏲️说明⏲️实例 ⌚shared_ptr⏲️说明⏲️实例 ⌚拓展⏲️函数类型 & 函数指针类型 ⌚END&#x1f31f;关注我 ⌚前言 自C11后&#xff0c;推出了三个智能指针。其中 unique_ptr和shared_ptr可以指定删除器。 但两者的形式却不太一…

【Canvas与艺术】红底白色压边五角星

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>精确压边五角星版本2</title><style type"text/css&qu…

Java IO模型深入解析:BIO、NIO与AIO

Java IO模型深入解析&#xff1a;BIO、NIO与AIO 一. 前言 在Java编程中&#xff0c;IO&#xff08;Input/Output&#xff09;操作是不可或缺的一部分&#xff0c;它涉及到文件读写、网络通信等方面。Java提供了多种类和API来支持这些操作。本文将从IO的基础知识讲起&#xff…

虚拟现实和增强现实技术系列—Expressive Talking Avatars

文章目录 1. 概述2. 背景介绍3. 数据集3.1 设计标准3.2 数据采集 4. 方法4.1 概述4.2 架构4.3 目标函数 5. 实验评测5.1 用户研究5.2 我们方法的结果5.3 比较与消融研究 1. 概述 支持远程协作者之间的交互和沟通。然而&#xff0c;明确的表达是出了名的难以创建&#xff0c;主…

两台电脑之间如何进行数据传输?两台电脑数据传输攻略

在数字化时代&#xff0c;电脑之间的数据传输变得日益重要。无论是个人用户还是企业用户&#xff0c;经常需要在不同的电脑之间共享或迁移数据。那么&#xff0c;两台电脑之间如何进行数据传输呢&#xff1f;本文将详细介绍两台电脑之间进行数据传输的几种常见方法&#xff0c;…

奖金+奖杯+荣誉证书 | FPGA硬件扑克牌比赛邀你参加

关键词&#xff1a;个人赛&#xff0c;随机发牌&#xff0c;比运气&#xff0c;还比设计&#xff0c;好玩又有趣 想用FPGA玩一场有趣的游戏吗&#xff1f;想检验自己的FPGA算法水平吗&#xff1f; “向日葵杯”全国教育仿真技术大赛——FPGA硬件扑克牌对抗赛等你来体验&#…

I can‘t link the chatbot model with react

题意&#xff1a;我无法将聊天机器人模型 chatbot 与React连接起来 问题背景&#xff1a; This is the model from flask import Flask, request, jsonify from flask_cors import CORS import json import nltk import numpy as np import random import pickle from time i…

英特尔终于宣布了解决CPU崩溃和不稳定性问题的方法,声称过高的电压是根本原因;补丁预计将于8月中旬推出【更新】

英特尔终于宣布了解决CPU崩溃和不稳定性问题的方法&#xff0c;声称过高的电压是根本原因&#xff1b;补丁预计将于8月中旬推出【更新】 英特尔官方宣布&#xff0c;已找到困扰其CPU的崩溃问题的根本原因&#xff0c;并将于8月中旬前发布微码更新以解决这一问题&#xff0c;从而…

聊聊 C# 中的顶级语句

前言 在 C# 9.0 版本之前&#xff0c;即使只编写一行输出 “Hello world” 的 C# 代码&#xff0c;也需要创建一个 C# 类&#xff0c;并且需要为这个 C# 类添加 Main 方法&#xff0c;才能在 Main 方法中编写代码。从 C# 9.0 开始&#xff0c;C# 增加了 “顶级语句” 语法&…

获取对象碎片情况

查看oracle数据库表上碎片 先创建个函数 FUNCTION get_space_usage1(owner IN VARCHAR2,object_name IN VARCHAR2,segment_type IN VARCHAR2,partition_name IN VARCHAR2 DEFAULT NULL) RETURN sys.DBMS_DEBUG_VC2COLL PIPELINEDASufbl NUMBER;ufby NUMBER;fs1bl NUMBER…

赋值运算符重载和运算符重载

1.运算符重载 在C中&#xff0c;运算符重载是一种强大的特性&#xff0c;它允许我们为已有的运算符赋予新的意义&#xff0c;以便它们能够应用于自定义类型上。 这一特性极大地增强了C的表达能力&#xff0c;使得自定义类型的使用更加直观和自然。例如&#xff0c;如果我们定义…

【区块链+绿色低碳】包头林草市域碳中和体系建设项目 | FISCO BCOS应用案例

在双碳体系建设背景下&#xff0c;政府、企业都在积极探索碳中和价值实现路径。但是在林业碳汇场景中&#xff0c;存在着林权认证、 身份授权、多方机构协作、数据交换等流程&#xff0c;在这些复杂的业务协作中存在一些风险&#xff0c;如&#xff1a;身份信息泄漏、数据造假、…

BSV区块链技术现实应用原理解析

BSV区块链以其卓越的可扩展性、坚如磐石的安全性、极低的交易成本等特性&#xff0c;成为满足企业当下需求并为企业未来成功奠基铺路的理想技术。 BSV协会近期发布了一个题为《驾驭数字化转型&#xff1a;在自动化世界中建立信任——区块链在数据保护和交易优化中的角色》的报…

Java代码基础算法练习-竞猜卡片值-2024.07.22

任务描述&#xff1a; 小米和小王玩竞猜游戏&#xff1a;准备7张卡片包含数字2、3、4、5、6、7、8&#xff0c;从中抽出2张&#xff08;有 顺序之分&#xff0c;抽2、3跟抽3、2是两种情况&#xff09;&#xff0c;猜2张卡片的和&#xff0c;如果是奇数&#xff0c;则猜对。小米…

mmpretrain报错解决记录-socket.gaierror: [Errno -2] Name or service not known

在使用Beit模型时出现 mmengine - INFO - load model from: https://download.openmmlab.com/mmselfsup/1.x/target_generator_ckpt/dalle_encoder.pth 07/19 11:27:30 - mmengine - INFO - Loads checkpoint by http backend from path: https://download.openmmlab.com/mmsel…

unity2022 il2cpp 源码编译

新建一个XCODE静态库工程 从unity安装目录中找到il2cpp源码 Editor\Data\il2cpp\ 改名 il2cpp/libil2cpp -> il2cpp/il2cpp 加入工程中 ->工程根目录 extends/zlib libil2cpp/ buildSettings 相关设置 IOS Deployment Target ios 12.0 Header Search Paths $(in…

总结——TI_音频信号分析仪

一、简介 设备&#xff1a;MSPM0G3507 库&#xff1a;CMSIS-DSP TI 数据分析&#xff1a;FFT 软件&#xff1a;CCS CLion MATLAB 目的&#xff1a;对音频信号进行采样&#xff08;滤波偏置处理&#xff09;&#xff0c;通过FFT获取信号的频率成分&am…

7.23模拟赛总结 [数据结构优化dp] + [神奇建图]

目录 复盘题解T2T4 复盘 浅复盘下吧… 7:40 开题 看 T1 &#xff0c;起初以为和以前某道题有点像&#xff0c;子序列划分&#xff0c;注意到状态数很少&#xff0c;搜出来所有状态然后 dp&#xff0c;然后发现这个 T1 和那个毛关系没有 浏览了一下&#xff0c;感觉 T2 题面…

前端(1)HTML

1、标签 创建1.html文件&#xff0c;浏览器输入E:/frontheima/1.html&#xff0c;可以访问页面 页面展示 在VSCODE安装IDEA的快捷键&#xff0c;比如ctld复制一行、ctrlx剪切 <p id"p1" title"标题1">Hello,world!</p> <p id"p2"…