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

SQL自学:什么是子查询,如何使用它们

在 SQL(Structured Query Language,结构化查询语言)的世界里,子查询是一种强大的工具,它允许我们在一个 SQL 查询内部嵌套另一个查询。子查询也被称为内部查询或嵌套查询,为我们提供了一种灵活且强大的方式来处理复杂的数据检索和操作任务。

一、什么是子查询

子查询是一个嵌套在另一个 SQL 查询(通常是 SELECT、INSERT、UPDATE 或 DELETE 语句)中的查询。它的结果被用作外部查询的一部分,以进一步筛选、聚合或连接数据。子查询可以返回单个值、一行或一列数据,甚至是一个完整的结果集,具体取决于它在外部查询中的使用方式。

例如,以下是一个简单的子查询示例:

SELECT product_name
FROM products
WHERE product_id IN (SELECT product_id FROM orders WHERE quantity > 10);

在这个例子中,内部查询 SELECT product_id FROM orders WHERE quantity > 10 返回了订单数量大于 10 的产品 ID,外部查询则使用这些产品 ID 从 products 表中检索出对应的产品名称。

二、子查询的类型 

1、标量子查询(Scalar Subquery)

  • 标量子查询返回单个值,通常用于与比较运算符一起使用,例如 =< > 等。
  • 例如:
    SELECT product_name
    FROM products
    WHERE price > (SELECT AVG(price) FROM products);
    首先,它会在子查询中计算出 “products” 表中所有产品价格的平均值。然后,在主查询中,从 “products” 表里面逐个检查每一个产品,如果这个产品的价格比刚才计算出来的平均价格要高,那么就把这个产品的名称选出来。这个查询找出价格高于平均价格的产品名称。

2、列子查询(Column Subquery)

  • 列子查询返回一列数据,可以在外部查询中与 INNOT INANYALL 等运算符一起使用。
  • 例如:
    SELECT product_name
    FROM products
    WHERE category_id IN (SELECT category_id FROM categories WHERE category_name = 'Electronics');
    首先看子查询部分,SELECT category_id FROM categories WHERE category_name = 'Electronics',它从 “categories” 表中找出类别名称为 “Electronics” 的那些行,并提取出对应的类别编号。然后在主查询中,SELECT product_name FROM products WHERE category_id IN (SELECT category_id FROM categories WHERE category_name = 'Electronics'),从 “products” 表中选择产品名称,但只有当产品的类别编号在子查询得到的那些类别编号之中时,才会被选中返回。这个查询找出属于 “电子” 类别的产品名称。

3、行子查询(Row Subquery)

  • 行子查询返回一行数据,可以在外部查询中与比较运算符一起使用,例如 =<> 等。
  • 例如:
    SELECT product_name
    FROM products
    WHERE (product_id, price) = (SELECT product_id, MAX(price) FROM products);
    首先看子查询部分,SELECT product_id, MAX(price) FROM products,它从 “products” 表中找出价格的最大值,同时也返回具有这个最大价格的产品的编号。然后在主查询中,SELECT product_name FROM products WHERE (product_id, price) = (SELECT product_id, MAX(price) FROM products),从 “products” 表中选择产品名称,但只有当产品的编号和价格与子查询返回的产品编号和最大价格完全一致时,这个产品的名称才会被选中返回。这个查询找出价格最高的产品名称。

4、表子查询(Table Subquery)

  • 表子查询返回一个结果集,可以在外部查询中作为一个临时表使用。
  • 例如:
    SELECT *
    FROM (SELECT product_id, product_name, price FROM products WHERE price > 100) AS temp_table;
    具体来说,首先有一个子查询,SELECT product_id, product_name, price FROM products WHERE price > 100,这个子查询从 “products” 表中筛选出价格大于 100 的产品,并提取出这些产品的编号、名称和价格。然后,使用AS temp_table给这个子查询的结果取一个别名叫做 “temp_table”,就好像给这个临时的结果集起了一个名字。最后,主查询SELECT * FROM temp_table从这个临时结果集 “temp_table” 中选择所有的列,也就是把价格大于 100 的那些产品的编号、名称和价格全部展示出来。这个查询创建一个临时表,包含价格大于 100 的产品信息,并从临时表中选择所有列。

三、如何使用子查询

1、用于筛选数据

  • 子查询可以作为 WHERE 子句的一部分,用于筛选满足特定条件的数据。
  • 例如:
    SELECT employee_name
    FROM employees
    WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'Sales');
    首先,通过子查询从 “departments” 表中找出部门名称是 “Sales” 的部门的编号。然后,在主查询中,从 “employees” 表中选择员工名字,但只选择那些员工所在部门的编号在子查询结果中的员工。 

       这个查询找出属于 “销售” 部门的员工姓名。

2、用于聚合数据

  • 子查询可以用于计算聚合值,并在外部查询中使用这些值进行进一步的计算或筛选。
  • 例如:
    SELECT product_name
    FROM products WHERE price > (SELECT AVG(price) FROM products);

    首先,看子查询部分SELECT AVG(price) FROM products,它从 “products” 表中计算出所有产品价格的平均值。接着,在主查询中,SELECT product_name FROM products WHERE price > (SELECT AVG(price) FROM products),从 “products” 表中选择 “product_name”(产品名称)列的数据,但有一个条件限制,即只有当该产品的价格大于子查询所计算出的平均价格时,才会被选中返回。

    这个查询找出价格高于平均价格的产品名称。

 3、用于连接数据

  • 子查询可以在 JOIN 子句中使用,以连接两个表并筛选满足特定条件的数据。
  • 例如:
    SELECT e.employee_name, d.department_name
    FROM employees e JOIN departments d ON e.department_id = d.department_id
    WHERE e.salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id);
    首先,通过JOIN关键字将 “employees” 表和 “departments” 表连接起来,连接条件是员工表中的 “department_id”(员工所在部门编号)等于部门表中的 “department_id”。然后,设置了一个筛选条件,即员工的工资 “e.salary” 要大于子查询的结果。子查询SELECT AVG(salary) FROM employees WHERE department_id = e.department_id是计算出与当前员工所在部门相同的那些员工的平均工资。

       这个查询找出每个部门中工资高于该部门平均工资的员工姓名和部门名称。

练习题:

1.使用子查询,返回购买价格为10美元或以上产品的顾客列表。你需要使用OrderItems表查找匹配的订单号(order_num)​,然后使用Order表检索这些匹配订单的顾客ID(cust_id)​。

2.你想知道订购BR01产品的日期。编写SQL语句,使用子查询来确定哪些订单(在OrderItems中)购买了prod_id为BR01的产品,然后从Orders表中返回每个产品对应的顾客ID(cust_id)和订单日期(order_date)​。按订购日期对结果进行排序。

3.现在我们让它更具挑战性。在上一个挑战题,返回购买prod_id为BR01的产品的所有顾客的电子邮件(Customers表中的cust_email)​。提示:这涉及SELECT语句,最内层的从OrderItems表返回order_num,中间的从Customers表返回cust_id。

4.我们需要一个顾客ID列表,其中包含他们已订购的总金额。编写SQL语句,返回顾客ID(Orders表中的cust_id)​,并使用子查询返回total_ordered以便返回每个顾客的订单总数。将结果按金额从大到小排序。提示:之前已经使用SUM()计算订单总数。

5.编写SQL语句,从Products表中检索所有的产品名称(prod_name)​,以及名为quant_sold的计算列,其中包含所售产品的总数(在OrderItems表上使用子查询和SUM(quantity)检索)​。

相关文章:

SQL自学:什么是子查询,如何使用它们

在 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;的世界里&#xff0c;子查询是一种强大的工具&#xff0c;它允许我们在一个 SQL 查询内部嵌套另一个查询。子查询也被称为内部查询或嵌套查询&#xff0c;为我们提供了一种灵活且强大的方式…...

No.10 笔记 | PHP学习指南:PHP数组掌握

本指南为PHP开发者提供了一个全面而简洁的数组学习路径。从数组的基本概念到高级操作技巧&#xff0c;我们深入浅出地解析了PHP数组的方方面面。无论您是初学者还是寻求提升的中级开发者&#xff0c;这份指南都能帮助您更好地理解和运用PHP数组&#xff0c;提高编码效率和代码质…...

RS-232 串口通信和 RS-485 串口通信的区别

RS-232 串口通信和 RS-485 串口通信有以下区别&#xff1a; 1. 通信方式&#xff1a; RS-232&#xff1a;全双工通信方式&#xff0c;即数据的发送和接收可以同时进行。在全双工模式下&#xff0c;通信双方可以在同一时刻既发送数据又接收数据&#xff0c;就像两个人可以同时…...

【K8s】专题十四(1):Kubernetes 安全机制之 RBAC

本文内容均来自个人笔记并重新梳理,如有错误欢迎指正! 如果对您有帮助,烦请点赞、关注、转发、订阅专栏! 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决…...

8. 多态、匿名内部类、权限修饰符、Object类

文章目录 一、多态 -- 花木兰替父从军1. 情境2. 小结 二、匿名内部类三、权限修饰符四、Object -- 所有类的父类(包括我们自己定义的类)五、内容出处 一、多态 – 花木兰替父从军 1. 情境 我们现在新建两个类HuaMuLan和HuaHu。HuMuLan是HuaHu的女儿&#xff0c;所以她会有她父…...

CentOS/Ubuntu/Debian安装LibeventCentOS安装Libevent库(含示例代码)库(含示例代码)

使用命令&#xff1a;CentOS安装Libevent库&#xff08;含示例代码&#xff09; sudo yum install libevent-devel Ubuntu/Debian: sudo apt install libevent-dev 示例代码&#xff1a; #include <stdio.h> #include <stdlib.h> #include <unistd.h> …...

【大数据】数据采集工具sqoop介绍

文章目录 什么是sqoop?一、Sqoop的起源与发展二、Sqoop的主要功能三、Sqoop的工作原理四、Sqoop的使用场景五、Sqoop的优势六、Sqoop的安装与配置 sqoop命令行一、Sqoop简介与架构二、Sqoop特点三、Sqoop常用命令及参数四、使用示例五、注意事项 什么是sqoop? Sqoop是一款开…...

vite学习教程02、vite+vue2配置环境变量

文章目录 前言1、安装依赖2、配置环境变量3、应用环境变量4、运行和构建项目资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝3W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容&#xff1…...

k8s 的网络通信

目录 1 k8s通信整体架构 2 flannel 网络插件 2.1 flannel 插件组成 2.2 flannel 插件的通信过程 2.3 flannel 支持的后端模式 3 calico 网络插件 3.1 calico 简介 3.2 calico 网络架构 3.3 部署 calico 1 k8s通信整体架构 k8s通过CNI接口接入其他插件来实现网络通讯。目前比较…...

【编程基础知识】掌握Spring MVC:从入门到精通

摘要&#xff1a; 本文将深入探讨Spring MVC框架的核心概念、组件和工作流程。读者将学习如何将Spring MVC应用于现代Web应用程序开发中&#xff0c;并通过实际代码示例和流程图&#xff0c;理解其强大的功能和灵活性。文章最后&#xff0c;我们将通过一个Excel表格总结全文内容…...

多线程下,@Transactional失效解决

一、问题复现 批量插入时&#xff0c;使用多线程对插入数据实现分批插入&#xff0c;在service层使用Transactional注解&#xff0c;对应方法中线程池中开辟的子线程抛出异常时&#xff0c;没有回滚事务。 二、原因分析 事务管理范围不正确&#xff1a;Transactional注解仅对…...

PyCharm 项目解释器切换指南:如何在项目中更换 Python Interpreter

PyCharm 项目解释器切换指南&#xff1a;如何在项目中更换 Python Interpreter 文章目录 PyCharm 项目解释器切换指南&#xff1a;如何在项目中更换 Python Interpreter一 Settings 设置二 Project 选项三 Conda Environment四 更换 Environment 本文详细介绍了在 macOS 系统中…...

STM32F407寄存器操作(DMA+SPI)

1.前言 前面看B站中有些小伙伴吐槽F4的SPIDMA没有硬件可控的CS引脚&#xff0c;那么今天我就来攻破这个问题 我这边暂时没有SPI的从机芯片&#xff0c;并且接收的过程与发送的过程类似&#xff0c;所以这里我就以发送的过程为例了。 2.理论 手册上给出了如下的描述 我们关注…...

Oracle 的 OCP 与 MySQL 的 OCP 的区别

事务开始与提交&#xff08;以 Java 代码中的事务操作为例&#xff09; Oracle&#xff08;在 Java 中使用 JDBC 进行事务操作&#xff09; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;public cla…...

数据治理、数据清洗定义、区别以及数据清洗常用方法

一、数据治理定义 数据治理是一种组织数据管理的方法&#xff0c;涉及数据的收集、存储、处理、分析和共享等方面&#xff0c;旨在最大程度地利用数据资产并降低数据相关的风险。‌ 数据治理确保数据的质量、安全性、合规性和可用性&#xff0c;以支持组织的决策和运营活动。‌…...

web基础-攻防世界

get-post 一、WP &#xff08;题目本质&#xff1a;get与post传参方法&#xff09; 用 GET 给后端传参的方法是&#xff1a;在?后跟变量名字&#xff0c;不同的变量之间用&隔开。例如&#xff0c;在 url 后添加/&#xff1f;a1 即可发送 get 请求。 利用 hackbar 进行…...

Java基础-String Class(字符串类)

String Java String 类概览 String 类是 Java 中最常用的类之一&#xff0c;用于处理字符串。以下是 String 类的主要特性和操作&#xff1a; 特性/操作描述不可变性String 对象一旦创建就不能被修改创建方式使用双引号 “” 或 String 构造函数字符串池Java 维护字符串常量池…...

《Linux服务与安全管理》| 服务进程与网络配置

《Linux服务与安全管理》| 服务进程与网络配置 目录 《Linux服务与安全管理》| 服务进程与网络配置 &#xff08;1&#xff09; 写出查看NetworkManager服务状态的命令。 &#xff08;2&#xff09; 写出查看NetworkManager服务自启动状态的命令。 &#xff08;3&#xff0…...

No.15 笔记 | CSRF 跨站请求伪造

目录 一、基础知识 &#xff08;一&#xff09;cookie 和 session、同源策略 &#xff08;二&#xff09;CSRF 原理 二、CSRF 类型 &#xff08;一&#xff09;GET 类型 &#xff08;二&#xff09;POST 类型 三、CSRF 实例讲解 &#xff08;一&#xff09;真实案例 &am…...

解决linux中pip速度过慢问题

在 Linux 系统下&#xff0c;如果你发现使用 pip 下载 Python 库时速度非常慢&#xff0c;可以考虑以下几种方法来加速下载&#xff1a; 使用 pip 的 -i 选项&#xff1a; 如果你只想临时使用其他镜像&#xff0c;可以在安装时加上 -i 选项&#xff1a; pip install package_n…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

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

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

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...