MySQL初学之旅(5)详解查询


目录

1.前言

2.正文

2.1聚合查询

2.1.1count()

2.1.2sum()

2.1.3avg()

2.1.4max()

2.1.5min()

2.1.6总结

2.2分组查询

2.2.1group by字句

2.2.2having字句

2.2.3group by与having的关系

2.3联合查询

2.3.1笛卡尔积

2.3.2内连接

2.3.3外连接

2.3.4自连接

2.3.5子查询

3.小结


1.前言

哈喽大家好吖,今天继续给大家分享MySQL的学习——查询的详解,本篇也是干货多多语法与示例讲解都很详细,希望大家耐心学习哦,那么话不多说让我们开始吧。

2.正文

2.1聚合查询

聚合查询当然离不开许多聚合函数的使用,常常用于对数据进行分组并计算每个组的汇总值,通常在分析、统计数据时非常有用。以下是 MySQL 中常用的聚合函数的详细解释:


聚合查询本质上是针对数据表中的行和行进行运算

2.1.1count()

功能: 计算某列中非空值的行数或计算所有行数。

COUNT([DISTINCT] column_name / *)--指定某一列或者统计全列
  • COUNT(*): 计算所有行的数量,包括 NULL 值。
  • COUNT(column_name): 只计算非 NULL 的行数。
  • COUNT(DISTINCT column_name): 计算不同值的行数。

2.1.2sum()

功能: 计算某列中所有值的总和。

SUM(column_name)

虽然说我们知道当一个数和NULL相加时也会变成NULL,那么这里为什么仍有结果呢,显然在实际应用中,如果我们使用这一个函数显然不是为了仅仅排查这张表中是否有NULL而无法计算出结果,所以这个函数的调用NULL值不影响。

  • 适用于数值类型的列,会忽略 NULL

2.1.3avg()

功能: 计算某列值的平均值。

AVG(column_name / 表达式 / 别名)
  • 适用于数值类型的列,会忽略 NULL 值。

2.1.4max()

功能: 返回某列中的最大值。

MAX(column_name)
  • 适用于数值、日期或字符串类型的列,会忽略 NULL 值。

2.1.5min()

功能: 返回某列中的最小值。

MIN(column_name)
  • 适用于数值、日期或字符串类型的列,会忽略 NULL 值。

2.1.6总结

这里让我们总结一下:

函数

功能

COUNT()

计算某列中的行数

SUM()

计算某列值的总和

AVG()

计算某列值的平均值

MAX()

返回某列中的最大值

MIN()

返回某列中的最小值

2.2分组查询

分组查询是 MySQL 中通过对数据进行分组并对每组数据执行聚合操作的一种查询方式。其中GROUP BYHAVING 是 MySQL 中用于分组查询的重要字句,常与聚合函数(上文所提)结合使用。以下详细介绍其功能、语法规则和用法。


2.2.1group by字句

功能:GROUP BY 用于将查询结果按照一个或多个列的值进行分组,并对每组数据执行聚合运算。

SELECT column1, column2,
aggregate_function(column3)
FROM table_name
[WHERE condition]
GROUP BY column1, column2
[ORDER BY column1];--[]内是根据情况选填项

使用说明:

  • column1, column2 是分组依据的列。
  • 聚合函数(如 SUMCOUNTAVG)在分组的基础上对每组数据进行统计。

下面给一个实例方便大家理解:

SELECT department_id, job_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id, job_id;

假设我们现在要统计所有部门不同职位的员工数量,按照这个语句就会给出新表展示结果,下面是调试代码:

-- 创建表 employees
CREATE TABLE employees (employee_id INT AUTO_INCREMENT PRIMARY KEY,employee_name VARCHAR(50),department_id INT,job_id VARCHAR(50),salary DECIMAL(10, 2)
);-- 插入测试数据
INSERT INTO employees (employee_name, department_id, job_id, salary) VALUES
('Alice', 1, 'IT', 5000.00),
('Bob', 1, 'IT', 6000.00),
('Charlie', 1, 'HR', 4000.00),
('David', 2, 'IT', 7000.00),
('Eve', 2, 'SALES', 3000.00),
('Frank', 2, 'SALES', 3500.00),
('Grace', 3, 'HR', 4500.00);-- 多列分组查询
SELECT department_id, job_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id, job_id;

运行结果:


2.2.2having字句

功能:HAVING 用于过滤分组后的结果,通常结合聚合函数使用,与 WHERE 的区别在于,HAVING 作用于分组后的聚合数据,而 WHERE 作用于分组前的原始数据。

SELECT column1, aggregate_function(column2)
FROM table_name
[WHERE condition]
GROUP BY column1
HAVING aggregate_function(column2) condition;

使用说明:

  • HAVING 接收的条件通常涉及聚合函数。
  • 如果仅对分组前的数据筛选,使用 WHERE;如果需要对分组结果筛选,则使用 HAVING

还是上文的背景,如果我们只想保留员工数量等于2的部门呢,代码如下:

SELECT department_id, job_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id, job_id
having employee_count = 2;

结果:


2.2.3group by与having的关系
  • GROUP BY 是分组操作的核心
    • 先对数据按照分组条件整理为若干组,每组作为一个单位。
  • HAVING 是对分组结果的过滤
    • 只保留符合条件的分组结果。

2.3联合查询

在 MySQL 中,联合查询用于将多个表中的数据结合在一起。联合查询通过某种条件将多个表中的行合并成单个结果集。以下详细介绍其功能、语法规则和用法。


2.3.1笛卡尔积

笛卡尔积就是将表中每行与其他表的行进行全排列。

select ...... from 表1,表2;

借用上一背景,这里给出示例:

CREATE table hobby(
id bigint,
e_hobby varchar(20)
);INSERT into hobby(id,e_hobby) values(1,'骑行'),(2,'吃饭');select * from employees;
select * from hobby;
select * from employees,hobby;

运行结果:


2.3.2内连接

INNER JOIN 是最常用的联合查询类型之一。它用于从多个表中返回那些满足连接条件的行。INNER JOIN 只会返回两个表中 匹配 的行,如果在其中一个表中没有匹配的记录,则这些记录将不会出现在最终的结果中。

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

解释:

  • table1table2:要连接的两个表。
  • column_name(s):需要返回的列。
  • INNER JOIN:表示进行内连接操作。
  • ON table1.column_name = table2.column_name:连接条件,定义两个表如何关联。通常是根据两表中的某些相同字段(如外键)来建立关联。

继续按照上文背景给出调试案例:

select e.employee_name ,e.department_id , h.e_hobby
from employees e
inner join hobby h
on e.department_id = h.id;

结果:


2.3.3外连接

外连接(Outer Join)是 SQL 中用于返回两张或多张表中符合条件的记录以及一张表中不符合条件的记录的查询操作。外连接的关键特点是:即使某一表中的记录在另一个表中没有匹配的记录,外连接也会返回该表中的记录,未匹配的部分会填充为 NULL

SELECT columns
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;

join 左侧的表完全显示我们就说是左外连接,join右侧的表完全显示我们就说是右外连接。

代码示例:

select e.employee_name ,e.department_id , h.e_hobby
from employees e
left join hobby h
on e.department_id = h.id;select e.employee_name ,e.department_id , h.e_hobby
from employees e
right join hobby h
on e.department_id = h.id;

运行结果:


2.3.4自连接

自连接(Self Join) 是一种特殊类型的连接,它是指在同一个表内进行连接。也就是说,表与表本身连接,从而允许你从同一表中获取不同的记录。自连接常用于查找与同一表中其他记录相关的信息,尤其是在树形结构或层级关系的数据中非常有用,但是必须要对表进行起不同的别名。

SELECT columns
FROM table1 AS t1
JOIN table1 AS t2
ON t1.column = t2.column
where 条件 
and 其他条件;
  • table1:是需要进行自连接的表。
  • t1t2:表 table1 的两个别名,用来区分连接的两个实例。
  • ON t1.column = t2.column:连接条件,通常是某些字段的匹配。

代码示例:

SELECT e1.employee_id, e1.employee_name, e1.department_id
FROM employees e1
JOIN employees e2
ON e1.employee_id = e2.department_id + 2;


2.3.5子查询

子查询(Subquery)是指在一个 SQL 查询中嵌套另一个查询。子查询通常用于在主查询中执行某些计算或获取某些条件,以便用于主查询的筛选或操作。

子查询一般由两个部分组成:

  • 外部查询(主查询):是执行最终数据检索的查询。

  • 内部查询(子查询):嵌套在外部查询中的查询,它返回一个结果集,可以作为外部查询的条件。

    SELECT column_name(s)
    FROM table_name
    WHERE column_name IN (SELECT column_name FROM table_name WHERE condition);


单行子查询:

SELECT * from employees where department_id = 
(select department_id from employees where employee_name = 'Bob')


多行子查询:

in关键字:

SELECT * from employees where department_id in
(select department_id from employees where employee_name = 'Bob' or employee_name = 'Eve');


where关键字:

条件括号与返回值一一进行比较。

SELECT employee_id, employee_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);


exists关键字:

若查询语句结果为空则不执行,反之不为空执行。

SELECT employee_name
FROM employees e1
WHERE EXISTS (SELECT 1 FROM employees e2 WHERE e1.department_id = e2.department_id);
  • EXISTS 子查询检查是否存在与外部查询的 department_id 匹配的部门。
  • 如果存在,外部查询就会返回该员工的 employee_name


from关键字:

SELECT department_id, AVG(salary)
FROM (SELECT department_id, salary FROM employees) AS temp
GROUP BY department_id;
  • 内部查询 (SELECT department_id, salary FROM employees) 返回 employees 表的部门和薪资数据。
  • 该查询结果作为虚拟表 temp 被外部查询使用,后者对每个部门计算平均薪资。


3.小结

今天的分享到这里就结束了,喜欢的小伙伴不要忘记点点赞点个关注,你的鼓励就是对我最大的支持,加油!

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

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

相关文章

深入解析 vLLM:高性能 LLM 服务框架的架构之美(二)调度管理

深入解析 vLLM:高性能 LLM 服务框架的架构之美(一)原理与解析 深入解析 vLLM:高性能 LLM 服务框架的架构之美(二)调度管理 1. vLLM 调度器结构与主要组件 在 vLLM 中,调度器的结构设计围绕任务…

2.20学习

crypto buu-这是什么 下载附件后打开看到是apk文件,试试直接用记事本打开,看到乱码以外,还有一堆有规律的符号,了解后发现是jsfuck编码,搜索在线工具解码就行 misc buu-[BJDCTF2020]藏藏藏 下载附件,得…

【Java八股文】08-计算机网络面试篇

【Java八股文】08-计算机网络面试篇 计算机网络面试篇网络模型网络OSI模型和TCP/IP模型分别介绍一下键入网址到网页显示,期间发生了什么? 应用层- HTTP应用层有哪些协议?HTTP是什么及HTTP报文有哪些部分?HTTP是怎么传输数据的HTTP…

DeepSeek 助力 Vue 开发:打造丝滑的瀑布流布局(Masonry Layout)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

基于知识图谱的问答系统:后端Python+Flask,数据库Neo4j,前端Vue3(提供源码)

基于知识图谱的问答系统:后端PythonFlask,数据库Neo4j,前端Vue3 引言 随着人工智能技术的不断发展,知识图谱作为一种结构化的知识表示方式,逐渐成为问答系统的重要组成部分。本文将介绍如何构建一个基于知识图谱的问答…

AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践

清华大学出品《DeepSeek:从入门到精通》分享 在忙碌的职场中,制作一份高质量的PPT往往需要投入大量时间和精力,尤其是在临近截止日期时。今天,我们将探索如何借助 AI 工具 —— DeepSeek 和 Kimi —— 让 PPT 制作变得既快捷又高…

基于Flask的京东商品信息可视化分析系统的设计与实现

【Flask】基于Flask的京东商品信息可视化分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 系统能够灵活地执行SQL查询,提取出用于分析的关键数据指标。为了将这…

Spring Cloud — 深入了解Eureka、Ribbon及Feign

Eureka 负责服务注册与发现;Ribbon负责负载均衡;Feign简化了Web服务客户端调用方式。这三个组件可以协同工作,共同构建稳定、高效的微服务架构。 1 Eureka 分布式系统的CAP定理: 一致性(Consistency)&am…

Ubuntu 22.04 一键部署MinerU1.1.0

MinerU MinerU是一款将PDF转化为机器可读格式的工具(如markdown、json),可以很方便地抽取为任意格式。 MinerU诞生于书生-浦语的预训练过程中,我们将会集中精力解决科技文献中的符号转化问题,希望在大模型时代为科技发…

如何才能写出好的prompt?

好的prompt设计需要遵循"明确具体、提供上下文、设定输出格式"三大原则。以下通过"解释量子计算"的案例展示优化过程: 优化前: Prompt:解释量子计算 输出结果: “量子计算是一种基于量子力学原理的新型计算模式,利用量子比特的叠加和纠缠特性实现并行…

计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

c++:模板进阶

1.非类型模板参数 我们之前的模板参数是类型模板参数,而非类型模板参数是常量,和宏功能类似 但是宏有个缺点,因为同一个宏的常量在一个项目中只有一个值,所以不能满足更加灵活多变的项目需求,但是非类型模板参数就可以…

Java 集合数据处理技巧:使用 Stream API 实现多种操作

​ 在 Java 开发中,对集合数据进行处理是非常常见的需求,例如去重、排序、分组、求和等。Java 8 引入的 Stream API 为我们提供了一种简洁、高效的方式来处理集合数据。本文将详细介绍如何使用 Stream API 实现多种集合数据处理操作,并给出相…

计算机网络基础杂谈(局域网、ip、子网掩码、网关、DNS)

目录 1. 简单局域网的构成 2. IP 地址 3. 子网掩码 4. IP地址详解自定义IP 5. IP 地址详解 6. 网关 7. DNS 域名解析 8. ping 1. 简单局域网的构成 交换机是组建局域网最重要的设备,换句话说,没有交换机就没法搭建局域网 交换机不能让局域网连…

基于SpringBoot的高校教学资料管理系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

Rust 未来会成为主流的编程语言吗?

Rust是由Mozilla团队主导开发的编程语言,首次亮相是在2010年。自发布以来,Rust凭借其内存安全性、出色的性能和对并发操作的支持,逐渐吸引了众多开发者的关注。据Stack Overflow的2021年调查数据显示,Rust连续多年被开发者评为最喜…

【Java】代理模式

代理模式 代理模式是指给某一个对象提供一个代理,并由代理对象来控制对真实对象的访问 代理模式是一种结构型设计模式 背景 如果不采用代理,对一个类的多个方法进行监控时,重复的代码总是重复出现,不但破坏了原方法,…

STM32 看门狗

目录 背景 独立看门狗(IWDG) 寄存器访问保护 窗口看门狗(WWDG) 程序 独立看门狗 设置独立看门狗程序 第一步、使能对独立看门狗寄存器的写操作 第二步、设置预分频和重装载值 第三步、喂狗 第四步、使能独立看门狗 喂狗…

LLM论文笔记 15: Transformers Can Achieve Length Generalization But Not Robustly

Arxiv日期:2024.2.14机构:Google DeepMind / University of Toronto 关键词 长度泛化位置编码数据格式 核心结论 1. 实验结论:十进制加法任务上的长度泛化最佳组合: FIRE位置编码 随机化位置编码 反向数据格式 索引提示&…

超详细!一文搞定PID!嵌入式STM32-PID位置环和速度环

本文目录 一、知识点1. PID是什么?2. 积分限幅--用于限制无限累加的积分项3. 输出值限幅--用于任何pid的输出4. PID工程 二、各类PID1. 位置式PID(用于位置环)(1)公式(2)代码使用代码 2. 增量式…