CREATE TABLE `20121105_teacher` (
`teacher_id` int(11) NOT NULL,
`school_id` int(11) NOT NULL,
PRIMARY KEY (`teacher_id`),
KEY `20121105_teacher_idx_school` (`school_id`)
) ENGINE=InnoDB
教师表,里面有1000个教师,随机分布在40个学校里
CREATE TABLE `20121105_subject_teacher_class` (
`teacher_id` int(11) NOT NULL,
`subj` varchar(10) NOT NULL,
`class` varchar(10) NOT NULL,
PRIMARY KEY (`teacher_id`,`subj`,`class`)
) ENGINE=InnoDB
教师任课科目表,教师随机在24个班级内随机教三个科目.为了方便演示,直接将科目名称和班级名称放到数据库中
假设要查询教师的授课情况,每个教师这样显示
英语:11班,12班,8班##语文:13班,1班,21班,6班##数学:12班,14班,6班,7班
很容易想到这个sql能把每个教师的授课情况显示出来
select tid,GROUP_CONCAT( cls SEPARATOR '##') c1 from
(
select teacher_id tid,CONCAT(subj,':',GROUP_CONCAT(class)) cls
from 20121105_subject_teacher_class stc
GROUP BY teacher_id,subj
) t GROUP BY tid,
那么把这个作为一个子查询呢?似乎很容易想到
select teacher_id,
(
select GROUP_CONCAT( cls SEPARATOR ' ## ') from
(
select teacher_id tid,CONCAT(subj,':',GROUP_CONCAT(class)) cls
from 20121105_subject_teacher_class stc where stc.teacher_id=t1.teacher_id
GROUP BY teacher_id,subj) t GROUP BY tid
)
from 20121105_teacher t1 where school_id=2
不过可惜在最里面那层子查询已经无法引用最外层的t1表的teacher_id这个字段了,
只能拿到外面一层
select teacher_id,
(
select GROUP_CONCAT( cls SEPARATOR ' ## ') from
(
select teacher_id tid,CONCAT(subj,':',GROUP_CONCAT(class)) cls
from 20121105_subject_teacher_class stc
GROUP BY teacher_id,subj) t where t.tid=t1.teacher_id GROUP BY tid
)
from 20121105_teacher t1 where school_id=2
不过因为这样无法高效利用索引,这个sql花了0.05s
所以可以建个函数
CREATE FUNCTION `20121105f`(p_teacher_id int) RETURNS varchar(2000)
READS SQL DATA
BEGIN
DECLARE v_result VARCHAR(2000);
DECLARE EXIT HANDLER for not found return null;
select GROUP_CONCAT( cls SEPARATOR ' ## ') into v_result from
(
select teacher_id tid,CONCAT(subj,':',GROUP_CONCAT(class)) cls
from 20121105_subject_teacher_class stc where stc.teacher_id=p_teacher_id
GROUP BY teacher_id,subj
) t GROUP BY tid;
return v_result;
END
然后这样用
select SQL_NO_CACHE teacher_id,
20121105f(teacher_id)
from 20121105_teacher t1 where school_id=2
马上成瞬时的了.
不用子查询,也可以用左连接的方法
select t1.teacher_id,t2.c1
from 20121105_teacher t1
left join (
select tid,GROUP_CONCAT( cls SEPARATOR '##') c1 from
(
select teacher_id tid,CONCAT(subj,':',GROUP_CONCAT(class)) cls
from 20121105_subject_teacher_class stc
GROUP BY teacher_id,subj
) t GROUP BY tid
) t2
on t1.teacher_id=t2.tid
where school_id=2
这种情况下因为20121105_subject_teacher_class表没用索引,是0.04s左右
加上条件
select t1.teacher_id,t2.c1
from 20121105_teacher t1
left join (
select tid,GROUP_CONCAT( cls SEPARATOR '##') c1 from
(
select stc.teacher_id tid,CONCAT(subj,':',GROUP_CONCAT(class)) cls
from 20121105_subject_teacher_class stc ,20121105_teacher te
where stc.teacher_id=te.teacher_id and te.school_id=2
GROUP BY stc.teacher_id,subj
) t GROUP BY tid
) t2
on t1.teacher_id=t2.tid
where school_id=2
这样这个也成了瞬时的,不过筛选teacher的条件(school_id=2)执行了两次,
如果这个条件比较耗资源,应该就更慢了
分享到:
相关推荐
4. **关联子查询(Correlated Subquery)**: - 关联子查询依赖于外部查询的每一行数据,每次执行时都会根据外部查询的当前行计算子查询。 - 常用于找出满足特定条件的最近、最大、最小等值。 5. **优化子查询**...
在SparkSQL中,子查询是一个重要的概念,它在SQL查询语句中扮演着不可或缺的角色。本篇文章主要探讨SparkSQL对子查询的处理源码,涵盖了从基础到优化的多个方面。以下是对这些知识点的详细说明: 首先,我们要明确...
- **相关子查询** (Correlated Subquery): 相关子查询依赖于外部查询中的值。这意味着每次外部查询处理一行时,子查询都会重新计算一次。 ##### 3.1 无关子查询示例 ```sql SELECT EmployeeId, Name FROM ...
Correlated Q-learning
Correlated Subquery(相关子查询):子查询的查询条件依赖于父查询。 Dangling Tuple(悬浮元组):自然连接中被舍弃的元组。 Data(数据):描述事物的符号记录称为数据。 Data Constraints(数据约束):对...
文章“On the distribution of the product of correlated normal random variables.pdf”主要探讨了相关正态随机变量乘积的分布问题。相关正态随机变量指的是两个正态随机变量之间存在一定的相关性,其相关性通常由...
然而,无线传感器网络面临的最大挑战之一就是在环境因素、设备故障或者恶意攻击的影响下,网络中可能发生的大规模集中式错误(massive correlated failure)。 大规模集中式错误指的是大量的传感器节点在同一时间...
在这个场景中,我们关注的是“matlab-codes_rayleigh_NOISE_generates_correlated_ColorEd_”项目,它涉及到使用MATLAB生成相关色噪声和雷利(Rayleigh)分布噪声。 首先,让我们深入理解这两个概念: 1. **相关色...
例如,相关子查询(correlated subqueries)在执行时可能会多次扫描同一数据集,造成不必要的计算开销。 4. 分析和优化表的连接顺序。在复杂的查询中,表的连接顺序会对查询性能产生很大影响。优化器尝试各种可能的...
MySQL索引最佳实践是数据库管理中的重要环节,它关乎到数据查询速度、系统性能和资源利用率。本篇文章将深入探讨MySQL索引的原理、类型、最佳实践以及它们对数据库操作的影响。 首先,索引的主要目的是加快数据访问...
本文将深入探讨“matlab_tool.rar”压缩包中的“Correlated sources”和“高阶谱”相关知识,以及核心文件“rpiid.m”。 首先,"correlated_sources"指的是具有相关性的信号源。在实际应用中,如通信系统、环境监测...
"CCToolbox"则是工具箱的主目录,可能包含子文件夹和.m文件,这些.m文件是MATLAB的脚本或函数,用于实现聚类算法和其他相关功能。 在使用CCToolbox时,用户首先需要将工具箱的路径添加到MATLAB的工作空间中,以便...
标题“correlated_noise_from_covariance”表明这是一个关于如何从协方差矩阵生成相关噪声的示例。接下来,我们将深入探讨相关噪声、协方差矩阵以及如何在MATLAB中实现这一过程。 首先,我们需要理解什么是相关噪声...
- **使用相关子查询**(Correlated Subqueries):子查询依赖于外部查询中的某个值。 - **计算运行总和**:通过相关子查询实现对每行数据的累计求和。 - **派生表**(Derived Tables):将查询结果视为临时表使用...
相关瑞利信道的仿真,在不同多普勒波长的影响下,产生出不同的瑞利信道
除了JOIN,本章还介绍了**相关子查询(Correlated Subqueries)**和**非相关子查询(Noncorrelated Subqueries)**。相关子查询是在外部查询的上下文中执行的,其结果依赖于外部查询的每一行。而非相关子查询则先...
This thesis presents neutron scattering studies of three correlated electron systems, each of which exhibit di®erent competing interactions. These include charge order, magnetic order and lattice ...
- **Subqueries and Correlated Subqueries**(子查询与相关子查询):解释了子查询的概念及其应用场景,并特别强调了相关子查询的使用方法。 - **Aggregate Functions**(聚合函数):探讨了Oracle SQL提供的聚合...
首先,"spatially correlated Gnoise"指的是空间相关的广义噪声,这在雷达信号处理中是重要的考虑因素。在雷达系统中,接收的噪声不仅有随机性,还可能因为环境或硬件特性而呈现出空间相关性,这种噪声会影响目标...
- **函数声明**:在`Correlate.h`头文件中,可能会声明用于执行相关运算的函数,如`correlate()`,该函数接收两个数组作为输入,计算它们的相关值,并返回结果。 - **数据结构**:可能定义了结构体或其他数据类型...