【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、…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

【java面试】微服务篇
【java面试】微服务篇 一、总体框架二、Springcloud(一)Springcloud五大组件(二)服务注册和发现1、Eureka2、Nacos (三)负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...
Python的__call__ 方法
在 Python 中,__call__ 是一个特殊的魔术方法(magic method),它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时(例如 obj()),Python 会自动调用该对象的 __call__ 方法…...
【题解-洛谷】P10480 可达性统计
题目:P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M,接下来 M M M 行每行两个整数 x , y x,y x,y,表示从 …...

英国云服务器上安装宝塔面板(BT Panel)
在英国云服务器上安装宝塔面板(BT Panel) 是完全可行的,尤其适合需要远程管理Linux服务器、快速部署网站、数据库、FTP、SSL证书等服务的用户。宝塔面板以其可视化操作界面和强大的功能广受国内用户欢迎,虽然官方主要面向中国大陆…...