【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、…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
