【MySQL】入门篇—SQL基础:数据查询语言(DQL):复杂的SELECT语句
在实际应用中,复杂的SELECT
语句可以帮助我们从多个表中提取相关信息,进行数据分析,生成报告,甚至进行数据挖掘。
掌握复杂的SELECT
语句对于数据分析师、数据库管理员和开发者来说是必不可少的技能。
应用场景:
-
多表查询:从多个相关表中提取信息,例如从用户表和订单表中获取用户的订单记录。
-
数据分析:对销售数据进行分析,计算总销售额、平均销售额等。
-
报告生成:生成复杂的报表,例如按地区和产品分类的销售报告。
接下来,我将通过具体示例详细介绍复杂的SELECT
语句,包括连接查询、子查询、聚合函数和分组查询等。
1. 连接查询(JOIN)
连接查询用于从多个表中提取相关数据。常见的连接类型有内连接(INNER JOIN)、外连接(LEFT JOIN、RIGHT JOIN)和全连接(FULL JOIN)。
1.1 内连接(INNER JOIN)
示例:查询用户及其订单信息
-- 查询所有用户及其订单信息
SELECT users.username, orders.order_id, orders.total_amount
FROM users
INNER JOIN orders ON users.user_id = orders.user_id;
解释:
-
SELECT users.username, orders.order_id, orders.total_amount
:选择要返回的列,包括用户名、订单ID和订单金额。 -
FROM users
:指定主表为users
。 -
INNER JOIN orders ON users.user_id = orders.user_id
:通过INNER JOIN
连接orders
表,连接条件是users.user_id
与orders.user_id
相等。此查询将返回所有有订单的用户及其对应的订单信息。
1.2 左连接(LEFT JOIN)
示例:查询所有用户及其订单信息(包括没有订单的用户)
-- 查询所有用户及其订单信息,包括没有订单的用户
SELECT users.username, orders.order_id, orders.total_amount
FROM users
LEFT JOIN orders ON users.user_id = orders.user_id;
解释:
-
LEFT JOIN
:与内连接不同,左连接会返回users
表中的所有记录,即使在orders
表中没有匹配的记录。没有订单的用户的订单ID和金额将返回为NULL。
2. 子查询
子查询是指在一个SELECT
语句中嵌套另一个SELECT
语句。它可以用于过滤、计算和获取特定数据。
2.1 单行子查询
示例:查询订单金额大于某个用户的订单
-- 查询订单金额大于用户 'alice' 的订单
SELECT * FROM orders
WHERE total_amount > (SELECT total_amount FROM orders WHERE user_id = (SELECT user_id FROM users WHERE username = 'alice'));
解释:
-
(SELECT total_amount FROM orders WHERE user_id = (SELECT user_id FROM users WHERE username = 'alice'))
:这是一个嵌套子查询,首先找到用户名为alice
的用户ID,然后找到该用户的订单金额。 -
WHERE total_amount > ...
:外层查询将返回所有订单金额大于alice
订单金额的记录。
2.2 多行子查询
示例:查询所有订单金额大于平均订单金额的订单
-- 查询所有订单金额大于平均订单金额的订单
SELECT * FROM orders
WHERE total_amount > (SELECT AVG(total_amount) FROM orders);
解释:
-
(SELECT AVG(total_amount) FROM orders)
:计算所有订单的平均金额。 -
WHERE total_amount > ...
:外层查询将返回所有订单金额大于平均金额的记录。
3. 聚合函数与分组查询
聚合函数用于对数据进行计算,如COUNT
、SUM
、AVG
等。GROUP BY
子句用于将查询结果按某个列进行分组。
3.1 使用聚合函数
示例:统计每个用户的订单数量
-- 统计每个用户的订单数量
SELECT users.username, COUNT(orders.order_id) AS order_count
FROM users
LEFT JOIN orders ON users.user_id = orders.user_id
GROUP BY users.username;
解释:
-
COUNT(orders.order_id) AS order_count
:使用COUNT
函数统计每个用户的订单数量,并将结果命名为order_count
。 -
GROUP BY users.username
:根据用户名进行分组,确保每个用户的订单数量统计在一行中。
3.2 计算总销售额
示例:计算每个用户的总销售额
-- 计算每个用户的总销售额
SELECT users.username, SUM(orders.total_amount) AS total_sales
FROM users
INNER JOIN orders ON users.user_id = orders.user_id
GROUP BY users.username;
解释:
-
SUM(orders.total_amount) AS total_sales
:使用SUM
函数计算每个用户的总销售额,并将结果命名为total_sales
。 -
INNER JOIN
:确保只统计有订单的用户。
4. 排序与限制结果
4.1 排序查询结果
示例:按总销售额降序排序
-- 计算每个用户的总销售额并按降序排序
SELECT users.username, SUM(orders.total_amount) AS total_sales
FROM users
INNER JOIN orders ON users.user_id = orders.user_id
GROUP BY users.username
ORDER BY total_sales DESC;
解释:
-
ORDER BY total_sales DESC
:根据计算出的总销售额进行降序排序,确保销售额最高的用户排在前面。
4.2 限制结果数量
示例:查询销售额最高的前5个用户
-- 查询销售额最高的前5个用户
SELECT users.username, SUM(orders.total_amount) AS total_sales
FROM users
INNER JOIN orders ON users.user_id = orders.user_id
GROUP BY users.username
ORDER BY total_sales DESC
LIMIT 5;
解释:
-
LIMIT 5
:限制查询结果只返回前5条记录,即销售额最高的5个用户。
结论
复杂的SELECT
语句是关系数据库中数据查询的核心部分,能够帮助用户从多个表中提取、分析和汇总数据。通过连接查询、子查询、聚合函数和分组查询等技术,用户可以灵活地处理和分析数据,以支持业务决策和数据分析需求。
延伸阅读
-
SQL教程:
-
W3Schools SQL Tutorial
-
SQLZoo
-
-
数据库设计与管理:
-
《数据库系统概念》 - Abraham Silberschatz, Henry Korth, S. Sudarshan
-
《SQL必知必会》 - Ben Forta
-
通过这些资源,您可以进一步加深对SQL及其应用的理解,提升数据查询和分析的能力。
相关文章:

【MySQL】入门篇—SQL基础:数据查询语言(DQL):复杂的SELECT语句
在实际应用中,复杂的SELECT语句可以帮助我们从多个表中提取相关信息,进行数据分析,生成报告,甚至进行数据挖掘。 掌握复杂的SELECT语句对于数据分析师、数据库管理员和开发者来说是必不可少的技能。 应用场景: 多表查…...

Appium环境搭建、Appium连接真机
文章目录 一、安装Android SDK二、安装Appium-desktop三、安装Appium Inspector 一、安装Android SDK 首先需要安装jdk,这里就不演示安装jdk的过程了 SDK下载地址:Android SDK 下载 1、点击 Android SDK 下载 -> SKD Tools 2、选择对应的版本进行下…...

【X线源】关于滨松MCS2软件的说明
【X线源】关于滨松MCS2软件的说明 1.软件背景2.MCS2界面3.MCS2操作4.常见问题 1.软件背景 滨松为了方便客户将滨松MFX集成进自己的系统,滨松提供了MFX二次开发相关的信息和Demo代码。参考博客说明: 【X线源】关于滨松MFX二次开发demo示例简介 https://…...

【深度学习代码调试2】环境配置篇(中) -- 列出conda环境中所有env的pytorch版本
【深度学习代码调试2】环境配置篇(中) -- 列出conda环境中所有env的pytorch版本 写在最前面如何检查所有 Conda 环境中的 PyTorch 版本(并重点提示 PyTorch 1.7.1 版本)1. 列出所有 Conda 环境2. 检查每个环境中的 PyTorch 版本方…...

C语言运算符和表达式
1.C语言赋值运算符实例讲解 C 使用运算符(operator)来代表算术运算。例如,运算符可以使它两侧的值加在一起。如果您觉得术语“运算符”听起来比较奇怪,那么请您记住那些东西总得有个名称。与其被称之为“那些东西”或“数学符号”,被称之为“…...

RetinaNet 分类头和回归头的网络结构分析
RetinaNet 是由 Facebook AI Research(FAIR)在 2017 年提出的一种高效的一阶段(one-stage)目标检测算法。相比于两阶段(two-stage)方法,RetinaNet 通过引入 Focal Loss 解决了类别不平衡问题&am…...

app测试有哪些内容?广东深圳软件测试机构推荐
随着智能手机的普及,手机应用app越来越多,因此,企业为了更好的保证用户留存率,开发完app之后必须进行app测试。一个成功的app,软件测试是必不可少的一步,那么app测试需要进行哪些测试内容呢?深圳又有哪些靠…...

新乡医学院第一附属医院启动巨额医疗设备整体维保招标
鉴于项目本身金额巨大,又恰逢省委巡视组进驻期间,该项目备受瞩目,在业内和省内医疗圈引起了极大轰动。全国影响力最大、实力最强的企业全部参与其中,民营企业上海柯渡医疗、上海昆亚医疗以其创新的服务模式和高效的管理机制备受关注;央企通用技术集团凯思轩达医疗科技凭借雄厚的…...

Linux——综合实用操作
目录 IP与主机 ping命令 wget命令 curl命令 端口:设备与外界通讯交流的出入口 进程管理 Linux top命令Windows 任务管理器 磁盘信息监控 df iostat 网络状态监控 sar -n DEV命令 环境变量 上传,下载 压缩 解压tar,zipÿ…...

一个Idea:爆改 T480
爆改 T480 准备大改 T480,家里有一台闲置很久的 T480,不舍得扔,打算升级一下。看了几位up主的视频后,决定动手改造。 计划如下 网卡:加装4G网卡硬盘:更换为 1T 的 NVMe 2280 固态硬盘内存:升…...

网络编程(21)——通过beast库快速实现http服务器
目录 二十一、day21 1. 头文件和作用域重命名 2. reponse时调用的一些函数 3. http_connection a. 构造函数 b. start() c. process_request() d. create_response() e. create_post_response() f. write_response() 4. Server 5. 主函数 6. 测试 1)测…...

Logback
Logback 简介 SpringBoot 内置日志框架 用来自定义控制台日志输出样式、生成日志文件 使用 由于是内置所以不需要引入,稍加配置就可以直接使用。 内置源头查看 配置application.yml # 日志配置 logging:level:com.ruoyi: logging.levelorg.springframework: war…...

Sub - Adjacent Transformer — 对AT的有趣改进
出处:IJCAI 2024 未开源,链接貌似是:jackyue1994/Sub-Adjacent-Transformer (github.com) 贡献:1. 提出:基于 “次邻域” 及 “注意力贡献” 的注意力学习机制,以增强异常、正常的区分;2. 首次…...

『Mysql集群』Mysql高可用集群之主从复制 (一)
Mysql主从复制模式 主从复制有一主一从、主主复制、一主多从、多主一从等多种模式. 我们可以根据它们的优缺点选择适合自身企业情况的主从复制模式进行搭建 . 一主一从 主主复制 (互为主从模式): 实现Mysql多活部署 一主多从: 提高整个集群的读能力 多主一从: 提高整个集群的…...

PHP获取图片属性(size, width, 和 height)的函数
在PHP中,要获取图片的尺寸(宽度和高度),你可以使用 getimagesize() 函数。这个函数不仅返回图片的宽度和高度,还返回图片的类型和MIME类型等信息。 以下是 getimagesize() 函数的基本用法: <?php /…...

MySQL启动失败解决方案
目录 引言 一、查看/启动mysql服务的两种方式 方法一: 方法二: 二、修改mysql服务启动路径的地址 三、"my.ini"文件的使用 设置my.ini文件的路径 给出一个使用my.ini文件的小例子 引言 造成启动闪退\失败的原因我仅仅以个人查询的一下博…...

Spring Boot中使用MyBatis-Plus和MyBatis拦截器来实现对带有特定注解的字段进行AES加密。
1. 添加依赖 首先,在pom.xml文件中添加必要的依赖项: xml 深色版本 <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifac…...

Python GUI 编程:tkinter 初学者入门指南——框架、标签框架
在本文中,将介绍 tkinter Frame 框架小部件、 LabelFrame 标签框架小部件的使用方法。 Frame 框架 Frame 框架在窗体上建立一个矩形区域,作为一个容器,用于组织分组排列其他小部件。 要创建框架,请使用以下构造函数。 frame …...

Mac 远程 Windows 等桌面操作系统工具 Microsoft Remote Desktop for Mac 下载安装详细使用教程
最近需要在 Mac 上远程连接控制我的 windows 电脑系统,经过一番尝试对于 win 来说还是微软自家推出的 Microsoft Remote Desktop for Mac 最最好用,没有之一 简介 Microsoft Remote Desktop是一款由微软公司开发的远程桌面连接工具,可以让用…...

初级网络工程师之从入门到入狱(四)
本文是我在学习过程中记录学习的点点滴滴,目的是为了学完之后巩固一下顺便也和大家分享一下,日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、Wlan应用实战1.1、拓扑图详解1.2、LSW11.3、AC11.4、抓包1.5、Tunnel隧道模式解析1.6、AP、…...

MinIO配置与使用
在数字化时代,数据存储与管理变得尤为重要,尤其是对于非结构化数据如日志文件的处理。MinIO,作为一个高性能、可扩展的分布式对象存储系统,以其对Amazon S3的全面兼容性和轻量级设计,成为了众多企业和开发者存储大量数…...

【漏洞复现】SpringBlade menu/list SQL注入漏洞
》》》产品描述《《《 致远互联智能协同是一个信息窗口与工作界面,进行所有信息的分类组合和聚合推送呈现。通过面向角色化、业务化、多终端的多维信息空间设计,为不同组织提供协同门户,打破组织内信息壁垒,构建统一协同沟通的平台。 》》》漏洞描述《《《 致远互联 FE协作办公…...

物联网智能项目(含案例说明)
物联网(Internet of Things,简称IoT)智能项目是指利用物联网技术将各种物理设备、传感器、软件、网络等连接起来,实现设备之间的互联互通,并通过数据采集、传输、处理和分析,实现智能化管理和控制的项目。以…...

【YOLOv8改进】 YOLOv8 更换骨干网络之GhostNetV3步骤详解
这里yolov8源码版本是 ultralytics-8.2.54 GhostNetV3 源码下载 https://codeload.github.com/huawei-noah/Efficient-AI-Backbones 将ghostnetv3.py文件复制一份到源码./ultralytics-8.2.54/ultralytics/nn/modules路径下 我根据mobilenetv4的教程,修改了ghostne…...

成绩查询小程序,家长查分超方便~
这都马上2025年了,我不相信还有老师不知道怎么发成绩,如果你不知道,那么这篇文章不要错过,推荐给大家我用了7年的发成绩工具 易查分,新版本更新之后,发成绩只需要一分钟的时间即可生成一个成绩查询系统。 …...

鸿蒙开发(NEXT/API 12)【上传下载文件】远场通信场景
场景介绍 本协议栈框架支持将文件上传到服务器或者从服务器下载文件。 开发步骤 导包。 import { rcp } from kit.RemoteCommunicationKit; import {fileIo} from kit.CoreFileKit;下载文件。 let SESSION_CONFIG: rcp.SessionConfiguration {// 此处请根据业务设置合适的…...

快速理解AUTOSAR CP的软件架构层次以及各层的作用
在 AUTOSAR CP 的架构中,软件分为 应用层 (App)、运行时环境 (RTE) 和 基础软件层 (BSW) 三个主要层级。下面是每一层的主要功能与简单的代码示例来展示它们之间的关系。 1. 概述 应用层 (App):包含应用程序代码,主要实现业务逻辑。应用层通…...

【Unity】Unity中接入Admob聚合广告平台,可通过中介接入 AppLovin,Unity Ads,Meta等渠道的广告
一、下载Google Admob的SDK插件 到Google Admob官网中,切换到Unity平台 进来之后是这样,注意后面有Unity标识,然后点击下载,跳转到github中,下载最新的Admob插件sdk,导入到Unity中 二、阅读官方文档&…...

PythonExcel批量pingIP地址
问题: 作为一个电气工程师(PLC),当设备掉线的时候,需要用ping工具来检查网线物理层是否可靠连接,当项目体量过大时,就不能一个手动输入命令了。 解决方案一: 使用CMD命令 for /L %…...

软媒市场新蓝海:软文媒体自助发布与自助发稿的崛起
在信息时代的浪潮中,软媒市场以其独特的魅力和无限的潜力,成为了企业营销的新宠。随着互联网的飞速发展,软文媒体自助发布平台应运而生,为企业提供了更加高效、便捷的营销方式。而自助发稿功能的加入,更是让软媒市场的蓝海变得更加广阔。 软媒市场的独特价值 软媒市场之所以能…...