Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【重学 MySQL】四十二、单行子查询

【重学 MySQL】四十二、单行子查询

作者头像
用户11332765
发布于 2024-10-28 09:15:42
发布于 2024-10-28 09:15:42
10100
代码可运行
举报
文章被收录于专栏:编程编程
运行总次数:0
代码可运行
【重学 MySQL】四十二、单行子查询

MySQL中,子查询(Subquery)是一种嵌套在其他SQL查询中的查询。子查询可以出现在SELECT、FROM、WHERE等子句中。单行子查询(Single-row Subquery)是返回单个值的子查询,通常用于与主查询中的某个值进行比较。

单行子查询的基本用法

单行子查询通常用在WHERE子句中,与某个列的值进行比较。由于它只返回一个值,因此可以使用比较运算符(如=><<>等)来比较。

示例1:查找薪资高于公司平均水平的员工

假设有一个员工表employees,包含字段id(员工ID)、name(员工姓名)和salary(员工薪资)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT *
FROM employees
WHERE salary > (
    SELECT AVG(salary)
    FROM employees
);

这个查询中,子查询(SELECT AVG(salary) FROM employees)计算了公司所有员工的平均薪资,然后外层查询选择了薪资高于这个平均值的所有员工。

示例2:查找没有分配项目的员工

假设有两个表:employees(员工表)和projects(项目表),其中projects表有一个employee_id字段来关联员工。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT *
FROM employees
WHERE id NOT IN (
    SELECT DISTINCT employee_id
    FROM projects
);

虽然这个示例中的子查询不是严格意义上的单行子查询(因为它可能返回多行),但它展示了子查询在WHERE子句中的用法。如果要将其转换为单行子查询(假设我们只想检查某个特定员工),可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT *
FROM employees
WHERE id = 1 AND id NOT IN (
    SELECT employee_id
    FROM projects
    WHERE employee_id = 1
);

但请注意,对于检查单个员工是否分配了项目,使用EXISTSNOT EXISTS可能更有效率。

示例3:使用单行子查询进行等值比较

假设我们要查找薪资与某个特定员工(比如ID为1的员工)相同的所有员工。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT *
FROM employees
WHERE salary = (
    SELECT salary
    FROM employees
    WHERE id = 1
);

这个查询中的子查询返回了ID为1的员工的薪资,然后外层查询选择了薪资与之相同的所有员工。

注意事项

  • 当子查询可能返回多行时,如果外层查询期望的是单行结果(如使用=进行比较),MySQL会报错。此时,可以使用INANYALL或确保子查询确实只返回一行(如通过LIMIT 1)。
  • 使用单行子查询时,确保子查询的逻辑确实只返回一行数据,否则可能会遇到意外的错误或结果。
  • 在某些情况下,使用JOINEXISTS/NOT EXISTS可能比单行子查询更高效。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【详解】Hive怎样写exist/in子句
在大数据处理领域,Hive 是一个广泛使用的数据仓库工具,它允许用户通过类似于 SQL 的查询语言来操作存储在 Hadoop 分布式文件系统中的数据。本文将探讨如何在 Hive 中使用 ​​EXISTS​​ 和 ​​IN​​ 子句进行数据查询,这两种方法是 SQL 中常见的用于检查子查询结果是否存在的条件表达式。
大盘鸡拌面
2025/01/17
580
【重学 MySQL】四十一、子查询举例与分类
在MySQL中,子查询是一种嵌套在其他查询中的查询,它可以出现在SELECT、FROM、WHERE等子句中,为外部查询提供数据或条件。
用户11332765
2024/10/28
1410
【重学 MySQL】四十一、子查询举例与分类
MySQL学习笔记【基础篇】
1、DB:数据库,保存一组有组织的数据的容器 2、DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据 3、SQL:结构化查询语言,用于和DBMS通信的语言
_DIY
2020/08/19
2.2K0
MySQL学习笔记【基础篇】
10道常考SQL笔试题
题目:在 Employees 表中,获取每个部门(department)薪资最高的员工的姓名、部门和工资。表结构如下:
SQL数据库开发
2024/09/24
1680
10道常考SQL笔试题
【MySQL】基础实战篇(2)—数据查询操作
数据查询是数据库管理系统应用的主要内容,也是用户对数据库最频繁、最常见的操作请求。 数据查询可以根据用户提供的限定条件,从已存在的数据表中检索用户需要的数据。 MySQL使用SELECT语句既可以完成简单的单表查询、联合查询,也可以完成复杂的联接查询、子查询,从数据库中检索符合用户需求的数据,并将结果集以表格的形式返回给用户。
洁洁
2024/09/27
2010
MySQL数据库,从入门到精通:第九篇——MySQL子查询
在实际数据处理中,子查询是一项非常常用的技术,在MySQL数据库中也有着广泛的应用。使用子查询可以更细致地查询数据,并减少查询的复杂度。本文将全面讲解MySQL中的子查询,包括单行子查询、多行子查询和相关子查询等的基本用法和进阶技巧,同时也会抛出一个思考题,帮助读者更好地理解和运用子查询。
默 语
2024/11/20
2070
MySQL数据库,从入门到精通:第九篇——MySQL子查询
【重学 MySQL】四十四、相关子查询
在 MySQL 中,相关子查询(也称为相关子查询或关联子查询)是一种特殊类型的子查询,其执行依赖于外部查询的当前行值。这意味着相关子查询在外部查询的每一行上都会重新执行一次,并且可以使用外部查询的列值。
用户11332765
2024/10/28
1710
【重学 MySQL】四十四、相关子查询
MySQL子查询
在 MySQL 中,子查询(Subquery)是指在一个 SQL 查询中嵌套的另一个 SQL 查询。子查询可以在 SELECT、INSERT、UPDATE 或 DELETE 语句中使用,通常用于实现复杂的查询条件、过滤、聚合等操作。
是山河呀
2025/01/26
910
玩转Mysql系列 - 第12篇:子查询(非常重要,高手必备)
浏览器中打开链接:http://www.itsoku.com/article/209
路人甲Java
2019/09/24
1.3K0
第09章_子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 MySQL 4.1 开始引入。
程序员Leo
2023/08/07
1610
第09章_子查询
【MySQL】02_子查询与多表查询
指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。
鸡先生
2022/10/29
2.8K0
【MySQL】02_子查询与多表查询
【数据库设计和SQL基础语法】--连接与联接--多表查询与子查询基础(二)
子查询是指在一个查询语句内部嵌套另一个查询语句的过程。子查询可以嵌套在 SELECT、FROM、WHERE 或 HAVING 子句中,用于从数据库中检索数据或执行其他操作。子查询通常返回一个结果集,该结果集可以被包含它的主查询使用。 以下是子查询的一般概述:
喵叔
2023/12/21
3740
2-SQL语言中的函数
出现在其他语句中的select语句,称为子查询或内查询 外部出现的查询语句,称为主查或外查询
Ywrby
2022/10/27
2.8K0
MySQL实战面试题(附案例答案+建表语句+模拟数据+案例深度解析),练完直接碾压面试官
使用YEAR()和MONTH()函数从signup_date字段中提取年份和月份,并匹配给定的条件。
小白的大数据之旅
2024/11/20
1500
【数据库设计和SQL基础语法】--SQL语言概述--SQL的基本结构和语法规则(二)
数据控制语言(DCL)是SQL的一个子集,用于控制数据库中的数据访问和权限。GRANT语句是DCL中的一种,用于向用户或角色授予特定的数据库操作权限。以下是GRANT语句的基本语法:
喵叔
2023/12/04
3990
MySQL基础-子查询
分类方式1: 按内查询的结果返回一条还是多条记录,将子查询分为 单行子查询 、 多行子查询
用户9645905
2023/03/25
2.7K0
MySQL基础-子查询
子查询与子查询的分类(一)
在 SQL 中,子查询是一个查询嵌套在另一个查询中的查询,也被称为内部查询。子查询可以用来创建更复杂的查询,从而实现更高级的数据检索和分析。
堕落飞鸟
2023/05/10
1.8K0
【mysql】子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。
兮动人
2022/03/27
3.5K0
子查询(2)
如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询 。相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。
一个风轻云淡
2022/11/13
7810
子查询(2)
学习python第四天——Oracle查询
3.子查询(难): 当进行查询的时候,发现需要的数据信息不明确,需要先通过另一个查询得到, 此查询称为子查询; 执行顺序:先执行子查询得到结果以后返回给主查询 组成部分: 1).主查询部分 2).子查询部分 【注意事项】: 子查询一定需要被定义/包裹在小括号内部,可以认为是显示的提升了代码执行的优先级 需求1: 查询薪资比Abel的高的有谁? 分析: ①.先查询出Abel的薪资是多少? ②.将过滤条件定义为>①,然后进行查询得到最终需要的结果 代码实现: select last_name,salary from employees where salary > ( select salary from employees where last_name = 'Abel' ); 需求2: 查询job_id与141号员工相同,salary比143号员工多的员工的姓名,job_id和salary? 代码实现: select last_name,job_id,salary from employees where job_id = ( select job_id from employees where employee_id = 141 ) and salary > ( select salary from employees where employee_id = 143 ); 课堂练习: 1).返回公司工资最少的员工的employee_id,job_id和salary select employee_id,job_id,salary from employees where salary = ( select min(salary) from employees ); 2).查询平均工资高于公司平均工资的部门有哪些 select department_id,avg(salary) from employees group by department_id having avg(salary) > ( select avg(salary) from employees ) order by department_id desc; 3).查询最低工资大于20号部门最低工资的部门id和最低工资 select department_id,min(salary) from employees where department_id is not null group by department_id having min(salary) > ( select min(salary) from employees having department_id = 20 ); 4).返回其它职位中比job_id为'IT_PROG'中最低工资低的员工的员工号,姓名,job_id以及salary select employee_id,last_name,job_id,salary from employees where salary < ( select min(salary) from employees where job_id = 'IT_PROG' ); 4.多表查询/多表联查 概念: 使用场景,如果一条select语句中需要查询的列遍布多张数据表, 那么我们就必须使用多表查询了!! 分类: 等值连接和非等值连接 对于等值连接分方向: 1).内连接:返回多张表中共同满足的数据,取交集 2).外连接(左、右、满):返回内连接数据的同时还会继续返回某张表中不匹配的一些记录数 3).自连接:从始至终都是一张表,模拟一张表派生为两张(它们的结构式一模一样的),自己连自己 等值连接中的内连接: 需求: 查询所有员工的员工号、员工姓名以及部门的名字? select employee_id,last_name,department_name from employees,departments; 【注意】 以上查询得到了2889条记录,很多都是没有用的数据(脏数据), 出现的原因是:没有添加有效的连接条件导致的, 而这种现象我们称为笛卡尔集现象; 我们日后的学习和开发环境中是绝对要避免的!! 如何保证我们之后的多表查询绝对不会出现笛卡尔集现象? 1).不能不写连接条件 2).连接条件必须是有效的 思考:如何修改上述的代码? 代码实现如下: select employee_id,last_name,department_name from employees,departments where employees.department_id = depart
hankleo
2020/09/16
4150
相关推荐
【详解】Hive怎样写exist/in子句
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验