数据如何查询

分组查询

分组查询(Group By)是在关系型数据库中用来对数据进行分组并对每个组应用聚合函数的一种操作。这种查询通常结合聚合函数(如 COUNT、SUM、AVG、MAX、MIN 等)使用,用于在查询结果中生成汇总信息

特点(聚合):输入多行,最终输出一行,且分组函数(COUNT、SUM、AVG、MAX、MIN)需要分组了才能使用,如果不进行分组则将会聚合整张表的数据

语法

SELECT 字段1, 分组/聚合函数(字段2)
FROM 表名
WHERE 条件
GROUP BY 字段1;

分组查询的工作原理如下:

  • 数据库首先按照 GROUP BY 子句中指定的列对数据进行分组。
  • 然后,对每个分组应用 SELECT 中指定的聚合函数,计算每个分组的汇总值。
  • 最后,返回每个分组的汇总结果作为查询结果集。
注意事项
  • 必须包含在 SELECT 子句中的列:在使用 GROUP BY 子句时,SELECT 子句中的列要么是分组列,要么是聚合函数。非聚合函数列必须包含在 GROUP BY 子句中,否则将导致语法错误。
  • NULL 值处理:分组查询中,数据库会将 NULL 值视为一个分组。
  • 性能考虑:当数据量较大时,分组查询可能会影响性能,尤其是在没有正确索引支持的情况下。

聚合/分组函数

COUNT

计算某一列中的行数,或者符合特定条件的行数。

假设有一个 students 表,包含学生的信息,可以使用 COUNT() 函数来统计学生的总数或者符合某些条件的学生数。

-- 统计学生总数
SELECT COUNT(*) AS total_students
FROM students;-- 统计年龄大于等于 18 岁的学生数
SELECT COUNT(*) AS adults
FROM students
WHERE age >= 18;
SUM

计算数值列的总和。

示例: 假设有一个 orders 表,包含订单信息,可以使用 SUM() 函数来计算订单总金额。

-- 计算所有订单的总金额
SELECT SUM(order_amount) AS total_amount
FROM orders;-- 计算特定客户的订单总金额
SELECT customer_id, SUM(order_amount) AS total_spent
FROM orders
WHERE customer_id = 123
GROUP BY customer_id;
AVG

计算数值列的平均值。

示例: 继续使用 orders 表的例子,可以使用 AVG() 函数来计算平均订单金额。

sql-- 计算所有订单的平均金额
SELECT AVG(order_amount) AS average_amount
FROM orders;-- 计算特定客户的平均订单金额
SELECT customer_id, AVG(order_amount) AS average_spent
FROM orders
WHERE customer_id = 123
GROUP BY customer_id;
MAX

找出数值列的最大值。

示例: 使用 MAX() 函数来查找订单表order中的最高订单金额。

sql-- 找出订单表中的最高订单金额
SELECT MAX(order_amount) AS max_amount
FROM orders;-- 找出每个客户的最高订单金额
SELECT customer_id, MAX(order_amount) AS max_spent
FROM orders
GROUP BY customer_id;
MIN

找出数值列的最小值。

示例: 使用 MIN() 函数来查找订单表order中的最低订单金额。

-- 找出订单表中的最低订单金额
SELECT MIN(order_amount) AS min_amount
FROM orders;-- 找出每个客户的最低订单金额
SELECT customer_id, MIN(order_amount) AS min_spent
FROM orders
GROUP BY customer_id;

连接查询

从一张表中单独查询,称为单表查询。假设有a表和b表联合起来查询数据,从表a中取a1字段,从b表中取b1字段。这种跨表查询,多张表联合起来查询数据,被称为连接查询。

连接查询的应用场景
  • 关联查询:用于在多个表中检索相关联的数据,比如客户和订单、产品和订单等。
  • 数据整合:将多个表中的数据整合为一个结果集,便于分析和报告。
  • 复杂条件过滤:通过连接不同表,并结合条件过滤,可以实现复杂的数据查询和分析需求。
  • 数据分析和报表:连接查询可以帮助生成更具体和详细的报表,涵盖多个业务方面的数据。
表连接的方式分类

内连接:

  • 等值连接
  • 非等值连接
  • 自连接

外连接:

  • 左外连接(左连接)
  • 右外连接(右连接)
  • 全连接(FULL JOIN)
⚠️注意避免笛卡尔积

当两张表进行连接查询的时候,没有任何条件限制会发生笛卡尔积现象

例如A表有1000条数据,B表有200条数据,同时在链接查询时并没有去做表的连接限制,例如ON关键字(下面会讲),或者Where关键字,那么查询出的数据行数约:1000 * 200 = 200000条数据,且很大可能性没有任何质量

语法

内连接查询(AB两个表没有主次关系)
  • 等值连接
SELECT 字段
FROM1 INNER JOIN2 ON1.字段 =2.字段
WHERE 条件-- orders 表和 customers 表通过 customer_id 列进行内连接,返回订单信息和对应客户的名称。
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
  • 非等值连接
SELECT 字段
FROM1 INNER JOIN2 ON1.字段 between2.字段1 and2.字段2
WHERE 条件-- 找出员工的薪资等级
SELECT	e.name,e.sal,s.grade
FROM emp e INNER JOIN salgrade s 
ON e.sal BETWEEN s.losal AND s.hisal
  • 自连接
    • 自连接就是同一张表进行连接查询
SELECT 字段
FROM1 INNER JOIN1 ON1.字段1 =1.字段2
WHERE 条件
-- 查询员工的上级领导
SELECT a.ename AS '员工名',b.ename AS '领导名'
FROM 
emp a INNER JOIN emp b
a.mgr = b.empno
外连接(AB两个表有主次关系)
  • 左连接(Left Join)
    • 左连接返回左边表(即左表)中的所有行,以及右表中满足连接条件的行。如果右表中没有匹配的行,则返回 NULL 值。
-- 语法
SELECT 列名 FROM1 LEFT JOIN2 ON1.=2.-- 返回所有客户的名称,以及他们的订单信息(如果有的话),如果客户没有订单,则订单信息列显示为 NULL
SELECT customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;
  • 右连接(Right Join)
    • 右连接与左连接类似,不同之处在于它返回右表中的所有行,以及左表中满足连接条件的行。如果左表中没有匹配的行,则返回 NULL 值。
-- 语法
SELECT 列名 FROM1 RIGHT JOIN2 ON1.=2.-- 返回所有订单的信息,以及对应的客户名称,如果订单没有对应的客户信息,则客户名称列显示为 NULL。
SELECT orders.order_id, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;
  • 全连接(Full Join):
    • 全连接返回左表和右表中所有的行,无论是否满足连接条件。
-- 语法
SELECT 列名 FROM1 FULL JOIN2 ON1.=2.-- 返回所有客户和订单的组合,无论是否有匹配的条件。
-- 如果某个客户没有订单或某个订单没有客户,则对应的列会显示 NULL。
SELECT customers.customer_name, orders.order_id
FROM customers
FULL JOIN orders ON customers.customer_id = orders.customer_id;
⚠️注意事项

性能影响:连接操作可能会影响查询性能,特别是在大型数据集上或者未优化的情况下。
索引优化:在进行连接查询之前,确保相关的连接字段上存在适当的索引,可以提高查询效率。
结果集理解:理解不同类型连接查询的行为和生成的结果集,以避免数据丢失或者意外的数据组合。

子查询

查询语句中嵌套的select语句被称为子查询

子查询出现在如下部分:查询的字段列表中、FROM的临时表、WHERE的子条件,如下

SELECT 字段..,(子查询)
FROM ..,(子查询)
WHERE ..,(子查询)

现在有一张表为员工薪资表emp

where中的子查询
  • 利用where子查询找出工资最低的员工信息
SELECT ename,sal 
FROM emp 
WHERE sal > (SELECT MIN(sal) FROM emp)
from中的子查询

from后的子查询,可以将子查询的结果当做一张临时表

  • 利用from子查询找出每个岗位的平均工资的薪资等级
SELECT
t.*,s.grade
FROM 
(SELECT job,avg(sal) as avgsal FROM emp group by job) t
INNER JOIN 
salgrade s
ON t.avgsal BETWEEN s.losal AND s.hisal
select中的子查询
  • 利用select的子查询实现根据员工编号获取员工的部门名称
SELECT 
e.ename,e.deptno,(SELECT d.dname FROM dept d WHERE e.deptno = d.deptno) as dname
FROM emp e

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

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

相关文章

从零开始做题:My_lllp

题目 给出一张png图片 解题 ┌──(holyeyes㉿kali2023)-[~/Misc/题目/zulu/My_lllp] └─$ python2 lsb.py extract my_lllp.png out.txt my_lllp [] Image size: 1080x1079 pixels. [] Written extracted data to out.txt. ┌──(holyeyes㉿kali2023)-[~/Misc/题目/zul…

python的线程池和进程池

Python 3.2 就已经引入了 concurrent.futures 模块,提供了线程池(ThreadPoolExecutor)和进程池(ProcessPoolExecutor),用于简化并发编程的管理和调度。 ThreadPoolExecutor 在ThreadPoolExecutor 是 conc…

简易Qt串口助手

界面显示如下 关于串口类 初始化 设置串口号 设置波特率 打开串口 发送按钮功能实现 接收数据显示在控件中 关闭串口

使用 MFA 保护对企业应用程序的访问

多因素身份验证(MFA)是在授予用户访问特定资源的权限之前,使用多重身份验证来验证用户身份的过程,仅使用单一因素(传统上是用户名和密码)来保护资源,使它们容易受到破坏,添加其他身份…

springboot非物质文化遗产管理系统-计算机毕业设计源码16087

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…

前端开发过程中经常遇到的问题以及对应解决方法 (持续更新)

我的朋友已经工作了 3 年,他过去一直担任前端工程师。 不幸的是,他被老板批评了,因为他在工作中犯了一个错误,这是一个非常简单但容易忽视的问题,我想也是很多朋友容易忽视的一个问题。 今天我把它分享出来&#xff…

Linux三剑客(grep、awk和sed)操作及与管道结合使用

1. 总览 grep、sed和awk被称为Linux三剑客,是因为它们在文本处理和数据操作方面极其强大且常用。 Linux三剑客在文件处理中的作用: grep(数据查找定位):文本搜索工具,在文件中搜索符合正则表达式的文本内容…

Redis原理-数据结构

Redis原理篇 1、原理篇-Redis数据结构 1.1 Redis数据结构-动态字符串 我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串,因为C语言字符串存…

【大模型LLM面试合集】大语言模型架构_attention

1.attention 1.Attention 1.1 讲讲对Attention的理解? Attention机制是一种在处理时序相关问题的时候常用的技术,主要用于处理序列数据。 核心思想是在处理序列数据时,网络应该更关注输入中的重要部分,而忽略不重要的部分&…

BJT的结构(晶体管电压/电流+β+晶体管特性曲线/截止与饱和+直流负载线(Q点))+单片机数码管基础

2024-7-8,星期一,20:23,天气:晴,心情:晴。今天没有什么特殊的事情发生,周末休息了两天,周一回来继续学习啦,加油加油!!! 今日完成模电…

视频号矩阵管理系统:短视频内容营销的智能助手

随着短视频行业的蓬勃发展,视频号矩阵管理系统应运而生,为内容创作者和品牌提供了一站式的短视频管理和营销解决方案。本文将深入探讨视频号矩阵管理系统的核心功能,以及它如何助力用户在短视频营销领域取得成功。 视频号矩阵管理系统概述 …

在PyTorch中使用TensorBoard

文章目录 在PyTorch中使用TensorBoard1.安装2.TensorBoard使用2.1创建SummaryWriter实例2.2利用add_scalar()记录metrics2.3关闭Writer2.4启动TensorBoard 3.本地连接服务器使用TensorBoard3.1方法一:使用SSH命令进行本地端口转发3.2方法二:启动TensorBo…

Python 全栈体系【三阶】(二)

第一章 Django 五、模板 1. 概述 Django中的模板是指可以动态生成任何基于文本格式文件的技术(如HTML、CSS等)。 Django中内置了自己的模板系统,称为DTL(Django Template Language), Django模板语言。 2. 配置 settings.py中关于模板的…

如何将资源前端通过 Docker 部署到远程服务器

作为一个程序员,在开发过程中,经常会遇到项目部署的问题,在现在本就不稳定的大环境下,前端开发也需要掌握部署技能,来提高自己的生存力,今天就详细说一下如何把一个前端资源放到远程服务器上面通过docker部…

紫外线芯片杀菌灯问题

1.265nm深紫外光子能量是多少 504kj/mol 2.紫外光分解有害物质的原理是什么? 通过紫外光分子键打断有害物质的分子键,使其分解成co2和H2o等无害物质 3.紫外光杀菌的原理是什么? 通过特定波长的紫外光照射,破坏和改变微生物的…

【网络协议】PIM

PIM 1 基本概念 PIM(Protocol Independent Multicast)协议,即协议无关组播协议,是一种组播路由协议,其特点是不依赖于某一特定的单播路由协议,而是可以利用任意单播路由协议建立的单播路由表完成RPF&…

【Python】不小心卸载pip后(手动安装pip的两种方式)

文章目录 方法一:使用get-pip.py脚本方法二:使用easy_install注意事项 不小心卸载pip后:手动安装pip的两种方式 在使用Python进行开发时,pip作为Python的包管理工具,是我们安装和管理Python库的重要工具。然而&#x…

产品经理技能揭秘:如何巧妙启发需求,引领市场新潮流

文章目录 引言一、需求启发的定义二、需求启发的艺术三、需求启发的重要性四、需求启发的流程五、需求启发的问题与挑战内部自身的问题与挑战:挑战一:知识的诅咒挑战二:做与定义的不同挑战三:沟通障碍挑战四:需求变更频…

solidity:构造函数和修饰器、事件

构造函数​ 构造函数(constructor)是一种特殊的函数,每个合约可以定义一个,并在部署合约的时候自动运行一次。它可以用来初始化合约的一些参数,例如初始化合约的owner地址: address owner; // 定义owner变…

电脑找回彻底删除文件?四个实测效果的方法【一键找回】

电脑数据删除了还能恢复吗?可以的,只要我们及时撤销上一步删除操作,还是有几率找回彻底删除文件。 当我们的电脑文件被彻底删除后,尽管恢复的成功率可能受到多种因素的影响,但仍有几种方法可以尝试找回这些文件。本文整…