概述
Ø 概念:子查询返回的值,与父查询的每一行的值都相关。这种子查询叫做~。
Ø 判断相关子查询的方法:子查询不能脱离父查询而独立运行。
Ø 理解的要点:父查询返回N行,子查询就分别执行N次。
计算列子查询
示例:查询各班有多少人。
select c_id,c_name,
(select count(*) from t_stu s where s.c_id=c.c_id) as 人数
from t_class c;
其中:
父查询是:select c_id,c_name from t_class c
子查询是:select count(*) from t_stu s where s.c_id=c.c_id
父查询返回:
c_id c_name
1 一班
2 二班
3 三班
父查询返回3行,子查询就必须分别执行3次:
c_id c_name
1 一班 select count(*) from t_stu s where s.c_id=1 返回4
2 二班 select count(*) from t_stu s where s.c_id=2 返回2
3 三班 select count(*) from t_stu s where s.c_id=3 返回0
可以看到,子查询的返回值(4,2,0)分别与父查询的值(1,2,3)是息息相关的。即:
select c_id,c_name,
(select count(*) from t_stu s where s.c_id=c.c_id) as 人数
from t_class c;
返回:
c_id c_name 人数
1 一班 4
2 二班 2
3 三班 0
exists子查询
查询哪些班上没有人,最简单的方法是:
select * from t_class c
where c_id not in (select distinct c_id from t_stu s)
它的意思是如果一个班级编号,不在学生表的班级编号中,就证明这个班上没有学生。
但是运行效率很低,其中之一就是not in用不到索引,所以在实际工作中,这种查询“不存在”的情况,往往要用not exists来代替。“not exists与not in”的区别必须掌握,这也是面试常问的问题之一。
用not exists替代的代码是:
select * from t_class c
where not exists
(select * from t_stu s where s.c_id=c.c_id)
注意:使用exists是唯一where后面不需要指定字段的情况。
理解的要点仍然是:父查询返回N行,子查询就分别执行N次。
父查询“select * from t_class c”返回:
c_id c_name
1 一班
2 二班
3 三班
父查询返回3行,子查询分别执行3次:
c_id c_name
1 一班 select * c_id from t_stu s where s.c_id=1
2 二班 select * c_id from t_stu s where s.c_id=2
3 三班 select * c_id from t_stu s where s.c_id=3
执行“select * c_id from t_stu s where s.c_id=1”,返回4行数据。这证明exists为true,而not exists为false。所以1班有人,而要的是没有人的班级,即1班不满足条件,不显示。
同理:执行“select * c_id from t_stu s where s.c_id=2”,也不满足条件,不显示。
当执行“select * c_id from t_stu s where s.c_id=3”时,返回0行数据,这证明满足not exists的条件,所以3班就显示出来了。
重点,exists的高效的原因之一:
子查询只要找到任何一条满足条件的数据,即可证明exists为true,不会查询所有满足条件的记录,这大大提高的查询的效率。
例如:上面1班有4行数据,但exists只会找到任何一个1班学生,就证明1班不满足条件了,马上就会接着判断下一个班。
exists的高效的原因之二:
子查询返回的数据没有任何限制,因为只要证明有数据返回就可以了,而无须关心是什么数据。所以上面的查询经常也写为:
select * from t_class c
where not exists
(select ‘x’ from t_stu s where s.c_id=c.c_id)
注意:子查询返回的数据不再是“*”,而是“x”。
这表示,如果有一行数据返回,则必有一个“x”返回,这是计算列的相关知识。用“x”代表分配char(1),是最节约内存的做法。
exists的高效的原因之三:exists子查询用的是相等比较,如“where s.c_id=c.c_id”,如果在子查询上建立相应的索引(如t_stu表的c_id字段有创建索引,索引名称任意),则用自动用到该索引,从而大大提高效率。
分享到:
相关推荐
【SQL查询与子查询组合】 SQL (Structured Query Language) 是用于管理和处理数据库的标准语言,而SQL Server 2000是Microsoft提供的一款关系型数据库管理系统。在这个实验中,你将学习如何使用SQL Server 2000的...
在数据库管理领域,子查询是一种强大的SQL工具,用于在单个查询...6. 实验不同集合操作符与子查询的组合,观察它们对结果的影响。 通过这些实验,你将能够熟练掌握子查询的运用,提高在数据库管理和数据分析中的效率。
### MySQL 子查询与连表查询的效率比较及优化 #### 一、子查询与连表查询概述 在SQL查询语言中,子查询与连表查询是两种非常重要的查询技术,广泛应用于各种复杂的业务场景中。为了更好地理解这两种查询方式的特点...
在SQL查询中,`IN`子查询是一种非常实用的技术,它允许我们筛选出满足特定条件的记录,这些条件是基于另一个查询的结果。本教程将深入探讨`IN`子查询的概念、用途以及如何在实际数据库操作中有效利用它。 首先,...
- **HAVING子句**:`HAVING AVG(sal) > (子查询结果)` 用于筛选出平均薪资高于“MARTIN”员工薪资的部门和职位组合。 #### 三、总结 通过以上几个示例,我们可以看到子查询在SQL中的应用非常广泛,它可以极大地...
在本话题中,我们将探讨数据库设计的基础,特别关注SELECT语句、子查询以及语句嵌套这三个核心概念。 首先,数据库设计不仅仅是创建表格,更重要的是理解和分析业务需求,以构建一个能够支持高效数据存储、检索和...
SQL的数据查询功能之四是关于子查询的使用。子查询,也称为嵌套查询,是将一个SELECT-FROM-WHERE语句插入到另一个查询的WHERE子句或HAVING短语中的查询,增强了SQL的查询能力。它允许我们用一系列简单的查询构建复杂...
### 内联视图、标量子查询与WITH子查询在Oracle中的应用 #### 内联视图(Inline View) 在Oracle数据库中,内联视图是一种特殊的视图形式,它直接在查询语句中定义而不是作为独立的对象创建并存储在数据库中。这种...
总结起来,普元EOS CriteriaType `_or` 结合子查询的使用,可以有效地处理复杂的数据查询需求,包括对多个条件的逻辑组合,以及通过子查询进行多表关联和数据筛选。这在处理大量数据和构建动态查询逻辑时具有很高的...
- 分解复合子查询:大型子查询可以分解成多个小的子查询,分别处理,然后组合结果。 6. **案例分析**: - 查找销售最高和最低的产品:通过子查询找出销售额最高的产品ID,再在外层查询中找出该ID对应的产品详情。...
在SQL(Structured Query Language)中,子查询是一种强大的工具,用于在更复杂的查询语句中嵌套查询。它允许我们在一个查询中使用另一个查询的结果,从而实现数据的筛选、组合和分析。本压缩包文件“sql数据库子...
综上所述,Oracle子查询是数据库查询的重要工具,它可以提供灵活的数据筛选和组合能力。在实际应用中,需要根据具体需求选择合适的子查询类型,并关注其对查询性能的影响。在给定的示例中,我们可以通过子查询来查询...
子查询是SQL查询中的一个重要概念,它是在一个更复杂的查询语句中嵌入的独立查询,用于提供外部查询所需的条件或信息。子查询可以出现在SELECT、UPDATE或DELETE语句中,通常作为WHERE或HAVING子句的一部分。在本章的...
"数据库连接查询和子查询" 数据库连接查询和子查询是数据库管理系统中两种重要的查询方式。连接查询允许用户从多个相关表中检索数据,而子查询则允许用户在查询中嵌套另一个查询。下面是对这两种查询方式的详细介绍...
子查询在SQL中是一种强大的工具,它允许在一个查询内部嵌套另一个查询,用于获取或比较数据。本章我们将深入探讨如何使用子查询来解决复杂的数据库查询问题。 1. 查询和BLAKE相同部门的员工姓名和雇用日期: 使用...
Oracle数据库在处理复杂查询时,子查询和高级查询技术起到了至关重要的作用。子查询,简单来说,就是在SQL语句中嵌套另一个SQL查询,用于提供外部查询的条件或比较对象。本教程主要涵盖以下几个方面: 1. **子查询...
本章节主要关注的是连接查询和子查询,这两种方法是数据库查询中的高级技术,尤其对于初学者来说,理解并掌握它们至关重要。 T-SQL(Transact-SQL)是SQL Server所使用的扩展SQL语言,用于管理和处理SQL Server...
### C# WinForm 组合查询条件解析 在软件开发领域,特别是在Windows应用程序开发中,组合查询条件是一项非常实用的功能。本文将详细分析一个具体的代码片段,该代码用于实现C# WinForm中的组合查询功能。 #### ...