当前位置: 首页 > news >正文

【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_idorders.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. 聚合函数与分组查询

聚合函数用于对数据进行计算,如COUNTSUMAVG等。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语句是关系数据库中数据查询的核心部分,能够帮助用户从多个表中提取、分析和汇总数据。通过连接查询、子查询、聚合函数和分组查询等技术,用户可以灵活地处理和分析数据,以支持业务决策和数据分析需求。

延伸阅读

  1. SQL教程

    • W3Schools SQL Tutorial

    • SQLZoo

  2. 数据库设计与管理

    • 《数据库系统概念》 - 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&#xff…...

一个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中&#xff0c;要获取图片的尺寸&#xff08;宽度和高度&#xff09;&#xff0c;你可以使用 getimagesize() 函数。这个函数不仅返回图片的宽度和高度&#xff0c;还返回图片的类型和MIME类型等信息。 以下是 getimagesize() 函数的基本用法&#xff1a; <?php /…...

MySQL启动失败解决方案

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

Spring Boot中使用MyBatis-Plus和MyBatis拦截器来实现对带有特定注解的字段进行AES加密。

1. 添加依赖 首先&#xff0c;在pom.xml文件中添加必要的依赖项&#xff1a; xml 深色版本 <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifac…...

Python GUI 编程:tkinter 初学者入门指南——框架、标签框架

在本文中&#xff0c;将介绍 tkinter Frame 框架小部件、 LabelFrame 标签框架小部件的使用方法。 Frame 框架 Frame 框架在窗体上建立一个矩形区域&#xff0c;作为一个容器&#xff0c;用于组织分组排列其他小部件。 要创建框架&#xff0c;请使用以下构造函数。 frame …...

Mac 远程 Windows 等桌面操作系统工具 Microsoft Remote Desktop for Mac 下载安装详细使用教程

最近需要在 Mac 上远程连接控制我的 windows 电脑系统&#xff0c;经过一番尝试对于 win 来说还是微软自家推出的 Microsoft Remote Desktop for Mac 最最好用&#xff0c;没有之一 简介 Microsoft Remote Desktop是一款由微软公司开发的远程桌面连接工具&#xff0c;可以让用…...

初级网络工程师之从入门到入狱(四)

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

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...