【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及其应用的理解,提升数据查询和分析的能力。

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

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

相关文章

如何快速部署一套智能化openGauss测试环境

一、openGauss介绍 openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行,允许用户自由地复制、使用、修改和分发软件。openGauss内核深度融合了华为在数据库领域多年的研发经验,结合企业级场景需求,持续构建竞争力…

基于SpringBoot+Vue+uniapp微信小程序的婚庆摄影小程序的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

在docker的容器内如何查看Ubuntu系统版本

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境: docker 一、问题描述 由于 lsb_release -a 只能查看自己电脑(宿主机)的系统版本,如果在docker的容器内又应该如何查看Ubuntu系统版本呢&#xff…

机器学习—学习率的选择

如果你选择适当的学习率,你的学习算法将运行得更好,如果太小,它会跑得很慢,如果太大,它甚至可能不会收敛,那么如何为模型选择一个好的学习率呢? 如果绘制多次迭代的成本,注意到成本…

深度学习笔记20_数据增强

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境:Python 3.9 2.编译器:Pycharm 3.深度学习环境:TensorFlow 2.10.0 二、GPU设置…

LLM实践--支线:拯救Continue Pretrain的数据

背景 首先介绍下什么是Continue Pretrain(CP)。CP 和 Pretrain、SFT一样指的是 LLM 训练的一个阶段,在前大模型时代还被称作Post Pretrain。CP 是在Pretrain和SFT之间的训练阶段,目的是为模型注入领域知识,这个领域是…

mqtt客户端订阅一直重复连接?

文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 他们是天生勇敢的开发者,我们创造bug,传播bug,毫不留情地消灭bug,在这个过程中我们创造了很多bug以供娱乐。 前端bug这里是博主总结的一些前端的bug以及解决方案,感兴…

解决使用MobaXterm不能向Ubuntu上传下载文件的问题

如上图所示 解决方案 新建连接,使用root账户建立ssh会话,就是建立会话的时候,用户名使用root。ubuntu系统默认不允许远程root账户建立连接,表现就是你新建ssh会话,在第一步输入root密码的时候,密码正确会报…

一文探索RareShop:首个面向消费者的RWA NFT商品发售平台

作者:Weilin,PANews 本轮牛市中,加密消费级应用正成为一种热门趋势,比如pump.fun和Polymarket等产品已成为C端用户的明星。加密货币正日益渗透到日常消费者的产品、服务和行为中。这意味着加密货币的使用不再局限于投机交易或去中…

appium启动hbuild打包的apk异常解决

目录 一、错误信息 二、问题解决 2.1 通过以下命令获取安装包名称: 2.2 这个launcher状态下的安装包名称和active,替换原先的安装包名称 一、错误信息 通过adb shell dumpsys activity | findstr "mResume" 命令获取的安装包信息&#xff…

从零开始学习OMNeT++系列第三弹——新建一个使用INET框架的工程

上一篇学习了如何新建一个omnet的工程,这篇来学习下INET框架以及如何使用INET框架来新建一个工程。 INET框架是什么 INET框架是一个开源模型库,用于OMNeT仿真环境。它为研究者和学生在使用通信网络时提供协议、代理和其他模型。当设计和验证新协议或探…

深入理解计算机系统--计算机系统漫游

对于一段最基础代码的文件hello.c&#xff0c;解释程序的运行 #include <stdio.h>int main() {printf ( "Hello, world\n") ;return 0; }1.1、信息就是位上下文 源程序是由值 0 和 1 组成的位&#xff08;比特&#xff09;序列&#xff0c;8 个位被组织成一组…

安防监控摄像头图传模组,1公里WiFi无线传输方案,监控新科技

在数字化浪潮汹涌的今天&#xff0c;安防监控领域也迎来了技术革新的春风。今天&#xff0c;我们就来聊聊这一领域的产品——摄像头图传模组&#xff0c;以及它如何借助飞睿智能1公里WiFi无线传输技术&#xff0c;为安防监控带来未有的便利与高效。 一、安防监控的新篇章 随着…

mysql--基本查询

目录 搞定mysql--CURD操作&#xff0c;细节比较多&#xff0c;不难&#xff0c;贵在多多练 1、Create--创建 &#xff08;1&#xff09;单行插入 / 全列插入 &#xff08;2&#xff09;插入否则替换 &#xff08;3&#xff09;替换 2、Retuieve--select 1&#xff09;全…

FreeRTOS - 软件定时器

在学习FreeRTOS过程中&#xff0c;结合韦东山-FreeRTOS手册和视频、野火-FreeRTOS内核实现与应用开发、及网上查找的其他资源&#xff0c;整理了该篇文章。如有内容理解不正确之处&#xff0c;欢迎大家指出&#xff0c;共同进步。 1. 软件定时器 软件定时器也可以完成两类事情…

JDK-23与JavaFX的安装

一、JDK-23的安装 1.下载 JDK-23 官网直接下载&#xff0c;页面下如图&#xff1a; 2.安装 JDK-23 2.1、解压下载的文件 找到下载的 ZIP 文件&#xff0c;右键点击并选择“解压到指定文件夹”&#xff0c;将其解压缩到您希望的目录&#xff0c;例如 C:\Program Files\Java\…

多进程思维导图

1> 思维导图 2> 使用父子进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;两个进程同时进行&#xff08;君子作业&#xff09; #include <myhead.h> typedef struct sockaddr_in addr_in_t; typedef struct sockaddr…

毕业设计选题:基于django+vue的个人博客系统设计与开发

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 博主管理 博客文章管理 博文排行管理 博文打赏管理 博文…

Spring 的依赖注入的最常见方式

在 Spring 中&#xff0c;依赖注入的方式有多种选择。下面我们来逐一分析它们的特点、适用场景和注意事项&#xff1a; 1. 构造函数注入 构造函数注入要求在对象创建时提供所有依赖。这种方式确保依赖在对象创建后不可变&#xff0c;特别适合必须强制存在的依赖。所有依赖在对…

JavaWeb 22.Node.js_简介和安装

有时候&#xff0c;后退原来是向前 —— 24.10.7 一、什么是Node.js Node.js 是一个于 Chrome V8 的 JavaScript 运行时环境&#xff0c;可以使 JavaScript 运行在服务器端。使用 Node.js&#xff0c;可以方便地开发服务器端应用程序&#xff0c;如 Web 应用、API、后端服务&a…