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

news2024/12/13 2:34:06


目录

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.coloradmin.cn/o/2253922.html

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

相关文章

Java Web 2 JS Vue快速入门

一 JS快速入门 1.什么是JavaScript? 页面交互: 页面交互是指用户与网页之间的互动过程。例如,当用户点击一个按钮,网页会做出相应的反应,如弹出一个对话框、加载新的内容或者改变页面的样式等;当用户在表…

浅谈MySQL路由

华子目录 mysql-router介绍下载mysql-router安装mysql-router实验 mysql-router介绍 mysql-router是一个对应用程序透明的InnoDB Cluster连接路由服务,提供负载均衡、应用连接故障转移和客户端路由利用路由器的连接路由特性,用户可以编写应用程序来连接到…

Python语法基础---正则表达式

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 我们这个文章所讲述的,也是数据分析的基础文章,正则表达式 首先,我们在开始之前,引出一个问题。也是我们接下来想要解决的问题。…

AMEYA360 | 杭晶电子:晶振在AR/VR中的应用

晶振在AR/VR设备中扮演重要角色,为其核心电子系统提供稳定的时钟信号,确保设备的高性能运行。 以下是晶振在AR/VR应用中的具体作用: 01、图像处理与同步 1、晶振为图形处理单元(GPU)和显示芯片提供精准的时钟信号,支持高速图像渲染…

如何将python项目导出为docker镜像

如何将python项目导出为docker镜像 前提条件步骤 1: 创建并准备 Python 项目步骤 2: 创建 `setup.py`步骤 3: 打包项目步骤 4: 创建 Dockerfile步骤 5: 构建 Docker 镜像步骤 6: 运行 Docker 容器步骤 7: 保存修改并继续开发总结要将修改后的Python代码导出为 .tar.gz 格式,并…

预训练模型与ChatGPT:自然语言处理的革新与前景

目录 一、ChatGPT整体背景认知 (一)ChatGPT引起关注的原因 (二)与其他公司的竞争情况 二、NLP学习范式的发展 (一)规则和机器学习时期 (二)基于神经网络的监督学习时期 &…

红日靶场vulnstack (五)

前言 好久没打靶机了,今天有空搞了个玩一下,红日5比前面的都简单。 靶机环境 win7:192.168.80.150(外)、192.168.138.136(内) winserver28(DC):192.168.138.138 环境搭建就不说了,和之前写…

5G CPE组成及功能介绍(二)

5G CPE 组成及功能介绍 5G CPE 将5G信号转换为Wi-Fi或有线信号, 其由5G基带芯片、主控处理器、WIFI、电源、天线、结构等多个部件组成。5G基带: 这是5G CPE中最核心的组件,负责接收和解码来自5G基站的信号,然后将这些数据转换成用户设备可以使用的格式。采用了先进的5G芯片…

Vue Web开发(一)

1. 环境配置 1.1. 开发工具下载 1.1.1. HbuilderX 官网地址:https://uniapp.dcloud.net.cn/ 1.1.2. Visual Studio Code 官网地址:https://code.visualstudio.com/Download 1.1.3. Node环境 官网地址:https://nodejs.cn/   正常软件安装…

四、自然语言处理_02RNN基础知识笔记

1、RNN的定义 RNN(Recurrent Neural Network,循环神经网络)是一种专门用于处理序列数据的神经网络架构,它与传统的前馈神经网络(Feedforward Neural Network)不同,主要区别在于它能够处理输入数…

速通SpringBoot+vue全栈开发教程

本人的环境配置: idea 2019 java(jdk8) apache-maven 3.6.1 tomcat 8.5.5 mysql 8.0.12 navicat 16 一、SpringBoot快速上手——创建一个springboot项目 进去之后报红 在设置里面修改maven的配置,改成自己下载的maven的地址 还因…

【开源代码】图像水印移除-依赖python-tensorflow

下载源码 git clone https://github.com/zuruoke/watermark-removal创建conda环境 conda create -n tensorflow_gpu python=3.7 conda activate tensorflow_gpu conda install tensorflow-gpu==1.15

MySQL导入.sql文件后数据库乱码问题

问题分析: 当导入.sql文件后,发现数据库中的备注出现乱码,通常是由于一下原因导致: 字符集不匹配:.sql文件、MySQL服务器、客户端连接使用的字符集不一致。备注内容编码问题:备注内容本身的编码格式与数据…

Qt 2D绘图之五:图形视图框架的结构、坐标系统和框架间的事件处理与传播

参考文章链接: Qt 2D绘图之五:图形视图框架的结构和坐标系统 Qt 2D绘图之六:图形视图框架的事件处理与传播 图形视图框架的结构 在前面讲的基本绘图中,我们可以自己绘制各种图形,并且控制它们。但是,如果需要同时绘制很多个相同或不同的图形,并且要控制它们的移动、…

大模型面试题:P-tuning、Prompt-tuning和Prefix-tuning区别是什么?

我整理了1000道算法面试题,可以在下面的地方获取,面试题还是有点多的 P-tuning、Prompt-tuning和Prefix-tuning区别是什么? prefix-tuning对比P-tuning:Prefix-Tuning是将额外的embedding加在开头,看起来更像模仿Inst…

数据结构初阶之顺序表的介绍与动态顺序表的实现

一、线性表 线性表(linear list)是由 n 个具有相同特性的数据元素组成的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续…

学习日志020---qt信号与槽

作业 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QPushButton,QLineEditfrom Form import Ui_Form from second import Ui_second from PySide6.QtCore import Qtclass MyWidget(QWidget,Ui_Form):def __init__(self):super().__init__()self.setupUi(se…

大语言模型技术相关知识-笔记整理

系列文章目录 这个系列攒了很久。主要是前段之间面试大语言模型方面的实习(被拷打太多次了),然后每天根据面试官的问题进行扩展和补充的这个笔记。内容来源主要来自视频、个人理解以及官方文档中的记录。方便后面的回顾。 文章目录 系列文章…

9.13[debug]

这个错误表明 Git 尝试通过 HTTPS 协议连接到 Gitee 上的仓库时,实际上却尝试连接到了本地的 127.0.0.1(即 localhost)的 7890 端口,这通常是因为 HTTP 代理配置错误或全局 Git 配置中的代理设置不正确 如果这些命令返回了代理设…

Android笔记(三十四):onCreate执行Handler.post在onResume后才能执行?

背景 偶然发现一个点,就是在onCreate执行Handler.post在onResume后才执行,以下是测试代码 多次运行的结果一致,为什么execute runnable不是在onCreate和onResume之间执行的呢,带着疑问撸了一遍Activity启动流程 关键源码分析 …