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

SQL复杂查询功能介绍及示例

文章目录

        • 1. 多表连接(JOIN)
          • 功能介绍
          • 应用场景
          • 示例查询及初始表格
            • `customers` 表(未查询前)
            • `orders` 表(未查询前)
            • INNER JOIN 示例
            • LEFT JOIN 示例
        • 2. 子查询(Subquery)
          • 功能介绍
          • 应用场景
          • 示例查询及初始表格
            • `orders` 表(未查询前)
            • 非相关子查询 示例
            • 相关子查询 示例
        • 3. 聚合函数与分组(GROUP BY)
          • 功能介绍
          • 应用场景
          • 示例查询及初始表格
            • `customers` 表(未查询前)
            • `orders` 表(未查询前)
        • 4. 条件筛选(WHERE)
          • 功能介绍
          • 应用场景
          • 示例查询及初始表格
            • `orders` 表(未查询前)
        • 5. 排序(ORDER BY)
          • 功能介绍
          • 应用场景
          • 示例查询及初始表格
            • `orders` 表(未查询前)
        • 6. 组合使用
          • 功能介绍
          • 应用场景
          • 示例查询及初始表格
            • `customers` 表(未查询前)
            • `orders` 表(未查询前)

1. 多表连接(JOIN)
功能介绍

多表连接是 SQL 中用于从多个表中检索数据的重要操作。它通过指定一个或多个条件来组合来自两个或多个表的数据行。主要类型包括:

  • INNER JOIN:返回两个表中满足连接条件的匹配行。
  • LEFT JOIN (或 LEFT OUTER JOIN):返回左表中的所有记录,即使右表中没有匹配项。对于右表中没有匹配项的情况,结果集中对应的字段将包含 NULL。
  • RIGHT JOIN (或 RIGHT OUTER JOIN):与 LEFT JOIN 相反,返回右表中的所有记录。
  • FULL JOIN (或 FULL OUTER JOIN):返回两个表中的所有记录,当某一方没有匹配时,使用 NULL 填充。
  • CROSS JOIN:返回两个表的笛卡尔积,即每个表的每一行都与其他表的所有行配对。
应用场景

当你需要合并来自多个表的数据时,例如获取客户的订单信息、产品分类详情等,JOIN 是不可或缺的操作。

示例查询及初始表格
customers 表(未查询前)
customer_idcustomer_name
1Alice
2Bob
3Charlie
4Dave
5Eve
orders 表(未查询前)
order_idcustomer_idorder_datetotal_amount
10112024-01-15100.00
10212024-02-20200.00
10322024-03-10150.00
10432024-04-1575.00
10532024-05-22180.00
10612024-06-3090.00
10712024-11-2890.00
10822024-11-30125.00
10932024-12-0175.00
INNER JOIN 示例

查询

SELECT customers.customer_name, orders.order_id, orders.order_date, orders.total_amount
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;

模拟查询结果

customer_nameorder_idorder_datetotal_amount
Alice1012024-01-15100.00
Alice1022024-02-20200.00
Alice1062024-06-3090.00
Alice1072024-11-2890.00
Bob1032024-03-10150.00
Bob1082024-11-30125.00
Charlie1042024-04-1575.00
Charlie1052024-05-22180.00
Charlie1092024-12-0175.00
LEFT JOIN 示例

查询

SELECT customers.customer_name, orders.order_id, orders.order_date, orders.total_amount
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;

模拟查询结果

customer_nameorder_idorder_datetotal_amount
Alice1012024-01-15100.00
Alice1022024-02-20200.00
Alice1062024-06-3090.00
Alice1072024-11-2890.00
Bob1032024-03-10150.00
Bob1082024-11-30125.00
Charlie1042024-04-1575.00
Charlie1052024-05-22180.00
Charlie1092024-12-0175.00
DaveNULLNULLNULL
EveNULLNULLNULL

2. 子查询(Subquery)
功能介绍

子查询是在另一个查询内部执行的查询,它可以出现在 SELECT、FROM、WHERE 或 HAVING 子句中。根据子查询是否依赖于外部查询的结果,可以分为相关子查询和非相关子查询。

  • 非相关子查询:独立于外部查询,通常用于计算聚合值如平均数、最大值等。
  • 相关子查询:依赖于外部查询提供的参数,每次外部查询处理一行时,相关子查询都会重新评估。
应用场景

子查询常用于复杂的条件筛选、查找特定条件下的最值或者进行跨表比较。

示例查询及初始表格
orders 表(未查询前)
order_idcustomer_idorder_datetotal_amount
10112024-01-15100.00
10212024-02-20200.00
10322024-03-10150.00
10432024-04-1575.00
10532024-05-22180.00
10612024-06-3090.00
10712024-11-2890.00
10822024-11-30125.00
10932024-12-0175.00
非相关子查询 示例

查询

SELECT *
FROM orders
WHERE total_amount > (SELECT AVG(total_amount) FROM orders);

模拟查询结果

order_idcustomer_idorder_datetotal_amount
10212024-02-20200.00
10322024-03-10150.00
10532024-05-22180.00
10822024-11-30125.00
相关子查询 示例

查询

SELECT o1.customer_id, o1.order_id, o1.order_date, o1.total_amount
FROM orders o1
WHERE o1.total_amount = (SELECT MAX(o2.total_amount)FROM orders o2WHERE o1.customer_id = o2.customer_id
);

模拟查询结果

customer_idorder_idorder_datetotal_amount
11022024-02-20200.00
21032024-03-10150.00
31052024-05-22180.00

3. 聚合函数与分组(GROUP BY)
功能介绍

聚合函数如 COUNT(), SUM(), AVG(), MIN(), MAX() 等用于执行数值汇总操作。GROUP BY 子句用于将数据按照一个或多个列进行分组,然后对每个组应用聚合函数。

应用场景

当你需要对数据进行分类汇总时,例如计算每个客户的总订单金额、统计不同类别的商品数量等,GROUP BY 结合聚合函数是非常有效的工具。

示例查询及初始表格
customers 表(未查询前)
customer_idcustomer_name
1Alice
2Bob
3Charlie
4Dave
5Eve
orders 表(未查询前)
order_idcustomer_idorder_datetotal_amount
10112024-01-15100.00
10212024-02-20200.00
10322024-03-10150.00
10432024-04-1575.00
10532024-05-22180.00
10612024-06-3090.00
10712024-11-2890.00
10822024-11-30125.00
10932024-12-0175.00

查询

SELECT c.customer_name, SUM(o.total_amount) AS total_spent
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_name
ORDER BY total_spent DESC;

模拟查询结果

customer_nametotal_spent
Alice480.00
Charlie330.00
Bob275.00

4. 条件筛选(WHERE)
功能介绍

WHERE 子句用于过滤记录,只有符合条件的记录才会被包含在最终的结果集中。可以在 WHERE 中使用比较运算符(=, <, >, <=, >=, <>)、逻辑运算符(AND, OR, NOT)以及其他一些特定的运算符(LIKE, IN, BETWEEN…AND…)来进行复杂的条件组合。

应用场景

WHERE 子句广泛应用于数据过滤,比如选择特定日期范围内的记录、查找特定类别或状态的数据等。

示例查询及初始表格
orders 表(未查询前)
order_idcustomer_idorder_datetotal_amount
10112024-01-15100.00
10212024-02-20200.00
10322024-03-10150.00
10432024-04-1575.00
10532024-05-22180.00
10612024-06-3090.00
10712024-11-2890.00
10822024-11-30125.00
10932024-12-0175.00

查询

SELECT *
FROM orders
WHERE YEAR(order_date) = 2024;

模拟查询结果

order_idcustomer_idorder_datetotal_amount
10112024-01-15100.00
10212024-02-20200.00
10322024-03-10150.00
10432024-04-1575.00
10532024-05-22180.00
10612024-06-3090.00
10712024-11-2890.00
10822024-11-30125.00
10932024-12-0175.00

5. 排序(ORDER BY)
功能介绍

ORDER BY 子句用于对查询结果按照一个或多个列进行排序,默认为升序排列(ASC),可以通过指定 DESC 实现降序排列。你还可以对多个列进行排序,优先级从左到右。

应用场景

当你希望按某种顺序展示查询结果时,例如按照时间先后、金额大小等,ORDER BY 是必不可少的。

示例查询及初始表格
orders 表(未查询前)
order_idcustomer_idorder_datetotal_amount
10112024-01-15100.00
10212024-02-20200.00
10322024-03-10150.00
10432024-04-1575.00
10532024-05-22180.00
10612024-06-3090.00
10712024-11-2890.00
10822024-11-30125.00
10932024-12-0175.00

查询

SELECT *
FROM orders
ORDER BY order_date DESC;

模拟查询结果

order_idcustomer_idorder_datetotal_amount
10932024-12-0175.00
10822024-11-30125.00
10712024-11-2890.00
10612024-06-3090.00
10532024-05-22180.00
10432024-04-1575.00
10322024-03-10150.00
10212024-02-20200.00
10112024-01-15100.00

或者根据多个字段排序:

查询

SELECT *
FROM orders
ORDER BY customer_id ASC, order_date DESC;

模拟查询结果

order_idcustomer_idorder_datetotal_amount
10712024-11-2890.00
10612024-06-3090.00
10212024-02-20200.00
10112024-01-15100.00
10822024-11-30125.00
10322024-03-10150.00
10932024-12-0175.00
10532024-05-22180.00
10432024-04-1575.00

6. 组合使用
功能介绍

实际应用中,通常会结合多种 SQL 特性来构建复杂的查询。例如,你可以同时使用 JOIN、子查询、聚合函数、WHERE 过滤、HAVING 筛选以及 ORDER BY 排序,以精确控制查询的结果集。

应用场景

这种组合使用非常普遍,尤其是在需要处理复杂业务逻辑或分析大量数据时。例如,查找特定年份内每个客户的订单总数,并且只显示订单数超过一定阈值的客户,同时按订单数降序排列。

示例查询及初始表格
customers 表(未查询前)
customer_idcustomer_name
1Alice
2Bob
3Charlie
4Dave
5Eve
orders 表(未查询前)
order_idcustomer_idorder_datetotal_amount
10112024-01-15100.00
10212024-02-20200.00
10322024-03-10150.00
10432024-04-1575.00
10532024-05-22180.00
10612024-06-3090.00
10712024-11-2890.00
10822024-11-30125.00
10932024-12-0175.00

查询

SELECT c.customer_name, COUNT(o.order_id) AS order_count
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE YEAR(o.order_date) = 2024
GROUP BY c.customer_name
HAVING COUNT(o.order_id) > 5
ORDER BY order_count DESC;

模拟查询结果

customer_nameorder_count
Alice4

示例数据中没有一个客户的订单数量超过5个,所以这里只有Alice满足条件。如果有更多的订单数据,可能会有更多的客户出现在结果中。

相关文章:

SQL复杂查询功能介绍及示例

文章目录 1. 多表连接&#xff08;JOIN&#xff09;功能介绍应用场景示例查询及初始表格customers 表&#xff08;未查询前&#xff09;orders 表&#xff08;未查询前&#xff09;INNER JOIN 示例LEFT JOIN 示例 2. 子查询&#xff08;Subquery&#xff09;功能介绍应用场景示…...

shell基础用法

shell基础知识 shell中的多行注释 :<<EOF read echo $REPLY # read不指定变量&#xff0c;则默认写入$REPLY EOF # :<<EOF ...EOF 多行注释&#xff0c;EOF可以替换为&#xff01;# 等文件目录和执行目录 echo $0$0 # ./demo.sh echo $0的realpath$(realpath…...

C#设计模式--策略模式(Strategy Pattern)

策略模式是一种行为设计模式&#xff0c;它使你能在运行时改变对象的行为。在策略模式定义了一系列算法或策略&#xff0c;并将每个算法封装在独立的类中&#xff0c;使得它们可以互相替换。通过使用策略模式&#xff0c;可以在运行时根据需要选择不同的算法&#xff0c;而不需…...

【opencv入门教程】15. 访问像素的十四种方式

文章选自&#xff1a; 一、像素访问 一张图片由许多个点组成&#xff0c;每个点就是一个像素&#xff0c;每个像素包含不同的值&#xff0c;对图像像素操作是图像处理过程中常使用的 二、访问像素 void Samples::AccessPixels1(Mat &image, int div 64) {int nl imag…...

【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)

导航&#xff1a; 本文一些内容需要聚簇索引、非聚簇索引、B树、覆盖索引、索引下推等前置概念&#xff0c;虽然本文有简单回顾&#xff0c;但详细可以参考下文的【MySQL高级篇】 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/谷粒商城/学成在线设计模…...

根据html的段落长度设置QtextBrowser的显示内容,最少显示一个段落

要根据 HTML 段落的长度设置 QTextBrowser 的显示内容&#xff0c;并确保至少显示一个段落&#xff0c;可以通过以下步骤来实现&#xff1a; 加载 HTML 内容&#xff1a;首先&#xff0c;你需要加载 HTML 内容到 QTextBrowser 中。可以通过 setHtml() 方法来设置 HTML。 计算段…...

基于Huffman编码的GPS定位数据无损压缩算法

目录 一、引言 二、霍夫曼编码 三、经典Huffman编码 四、适应性Huffman编码 五、GPS定位数据压缩 提示&#xff1a;文末附定位数据压缩工具和源码 一、引言 车载监控系统中&#xff0c;车载终端需要获取GPS信号&#xff08;经度、纬 度、速度、方向等&#xff09;实时上传…...

php:完整部署Grid++Report到php项目,并实现模板打印

一、下载Grid++Report软件 路径:开发者安装包下载 - 锐浪报表工具 二、 安装软件 1、对下载的压缩包运行内部的exe文件 2、选择语言 3、 完成安装引导 下一步即可 4、接收许可协议 点击“我接受” 5、选择安装路径 “浏览”选择安装路径,点击"安装" 6、完成…...

C标签和 EL表达式的在前端界面的应用

目录 前言 常用的c标签有&#xff1a; for循环 1 表示 普通的for循环的 2 常在集合中使用 表示 选择关系 1 简单的表示如果 2 表示如果。。否则。。 EL表达式 格式 &#xff1a; ${属性名/对象/ 集合} 前言 本篇博客介绍 c标签和el表达式的使用 使用C标签 要引入 …...

Linux絮絮叨(四) 系统目录结构

Linux 系统的目录结构&#xff08;Filesystem Hierarchy Standard, FHS&#xff09;定义了 Linux 系统中文件系统的标准布局&#xff0c;以下是一些常见目录的功能&#xff1a; 根目录 / 描述&#xff1a;所有文件和目录的起始点&#xff0c;Linux 文件系统的根。内容&#xf…...

Java基于SpringBoot的网上订餐系统,附源码

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…...

《Java核心技术I》死锁

死锁 账户1&#xff1a;200元账户2: 300元线程1&#xff1a;从账号1转300到账户2线程2&#xff1a;从账户2转400到账户1 如上&#xff0c;线程1和线程2显然都被阻塞&#xff0c;两个账户的余额都不足以转账&#xff0c;两个线程都无法执行下去。 有可能会因为每一个线程要等…...

【Windows11系统局域网共享文件数据】

【Windows11系统局域网共享文件数据】 1. 引言1. 规划网络2. 获取必要的硬件3. 设置网络4. 配置网络设备5. 测试网络连接6. 安全性和维护7. 扩展和优化 2. 准备工作2.1: 启用网络发现和文件共享2.2: 设置共享文件夹 3. 访问共享文件夹4. 小贴士5. 总结 1. 引言 随着家庭和小型办…...

MCU、ARM体系结构,单片机基础,单片机操作

计算机基础 计算机的组成 输入设备、输出设备、存储器、运算器、控制器 输入设备&#xff1a;将其他信号转换为计算机可以识别的信号&#xff08;电信号&#xff09;。输出设备&#xff1a;将电信号&#xff08;&#xff10;、&#xff11;&#xff09;转为人或其他设备能理解的…...

在办公室环境中用HMD替代传统显示器的优势

VR头戴式显示器&#xff08;HMD&#xff09;是进入虚拟现实环境的一把钥匙&#xff0c;拥有HMD的您将能够在虚拟现实世界中尽情探索未知领域&#xff0c;正如如今的互联网一样&#xff0c;虚拟现实环境能够为您提供现实中无法实现的或不可能实现的事。随着技术的不断进步&#…...

ssm 多数据源 注解版本

application.xml 配置如下 <!-- 使用 DruidDataSource 数据源 --><bean id"primaryDataSource" class"com.alibaba.druid.pool.DruidDataSource" init-method"init" destroy-method"close"></bean> <!-- 使用 数…...

selenium常见接口函数使用

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;测试_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 1. 查找 查找方式 css_s…...

STM32F103单片机使用STM32CubeMX新建IAR工程步骤

打开STM32CubeMX软件&#xff0c;选择File 选择新建工程 在打开的窗口输入单片机型号 在右下角选择单片机型号&#xff0c;然后点右上角 start project&#xff0c;开始新建工程。 接下来设置调试接口&#xff0c;在左边System Core中选择 SYS&#xff0c;然后在右右边debu…...

刷题重开:找出字符串中第一个匹配项的下标——解题思路记录

问题描述&#xff1a; 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入&…...

product/admin/list?page=0size=10field=jancodevalue=4562249292272

文章目录 1、ProductController2、AdminCommonService3、ProductApiService4、ProductCommonService5、ProductSqlService https://api.crossbiog.com/product/admin/list?page0&size10&fieldjancode&value45622492922721、ProductController GetMapping("ad…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...