`
kabike
  • 浏览: 609485 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

mysql函数取代相关子查询(Correlated subquery)

阅读更多
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)执行了两次,
如果这个条件比较耗资源,应该就更慢了
分享到:
评论

相关推荐

    oracle子查询相关帮助

    4. **关联子查询(Correlated Subquery)**: - 关联子查询依赖于外部查询的每一行数据,每次执行时都会根据外部查询的当前行计算子查询。 - 常用于找出满足特定条件的最近、最大、最小等值。 5. **优化子查询**...

    SparkSQL子查询源码阅读1

    在SparkSQL中,子查询是一个重要的概念,它在SQL查询语句中扮演着不可或缺的角色。本篇文章主要探讨SparkSQL对子查询的处理源码,涵盖了从基础到优化的多个方面。以下是对这些知识点的详细说明: 首先,我们要明确...

    SQL查询语言技术8

    - **相关子查询** (Correlated Subquery): 相关子查询依赖于外部查询中的值。这意味着每次外部查询处理一行时,子查询都会重新计算一次。 ##### 3.1 无关子查询示例 ```sql SELECT EmployeeId, Name FROM ...

    Correlated Q-learning

    Correlated Q-learning

    专有名词速查字典-PRO PLUS MAX X 版1

    Correlated Subquery(相关子查询):子查询的查询条件依赖于父查询。 Dangling Tuple(悬浮元组):自然连接中被舍弃的元组。 Data(数据):描述事物的符号记录称为数据。 Data Constraints(数据约束):对...

    On the distribution of the product of correlated normal random variables.pdf

    文章“On the distribution of the product of correlated normal random variables.pdf”主要探讨了相关正态随机变量乘积的分布问题。相关正态随机变量指的是两个正态随机变量之间存在一定的相关性,其相关性通常由...

    论文研究-The Research of Massive Correlated Failure in Wireless Sensor Networks: Activated Swarm Failt Tolerance.pdf

    然而,无线传感器网络面临的最大挑战之一就是在环境因素、设备故障或者恶意攻击的影响下,网络中可能发生的大规模集中式错误(massive correlated failure)。 大规模集中式错误指的是大量的传感器节点在同一时间...

    matlab-codes_rayleigh_NOISE_generates_correlated_ColorEd_

    在这个场景中,我们关注的是“matlab-codes_rayleigh_NOISE_generates_correlated_ColorEd_”项目,它涉及到使用MATLAB生成相关色噪声和雷利(Rayleigh)分布噪声。 首先,让我们深入理解这两个概念: 1. **相关色...

    Oracle查询优化改写 技巧与案例.pdf

    例如,相关子查询(correlated subqueries)在执行时可能会多次扫描同一数据集,造成不必要的计算开销。 4. 分析和优化表的连接顺序。在复杂的查询中,表的连接顺序会对查询性能产生很大影响。优化器尝试各种可能的...

    MySQL索引最佳实践1

    MySQL索引最佳实践是数据库管理中的重要环节,它关乎到数据查询速度、系统性能和资源利用率。本篇文章将深入探讨MySQL索引的原理、类型、最佳实践以及它们对数据库操作的影响。 首先,索引的主要目的是加快数据访问...

    matlab_tool.rar_Correlated sources_MATLAB 高阶谱_rpiid.m_tool_高阶谱

    本文将深入探讨“matlab_tool.rar”压缩包中的“Correlated sources”和“高阶谱”相关知识,以及核心文件“rpiid.m”。 首先,"correlated_sources"指的是具有相关性的信号源。在实际应用中,如通信系统、环境监测...

    CCToolbox matlab

    "CCToolbox"则是工具箱的主目录,可能包含子文件夹和.m文件,这些.m文件是MATLAB的脚本或函数,用于实现聚类算法和其他相关功能。 在使用CCToolbox时,用户首先需要将工具箱的路径添加到MATLAB的工作空间中,以便...

    correlated_noise_from_covariance

    标题“correlated_noise_from_covariance”表明这是一个关于如何从协方差矩阵生成相关噪声的示例。接下来,我们将深入探讨相关噪声、协方差矩阵以及如何在MATLAB中实现这一过程。 首先,我们需要理解什么是相关噪声...

    Advanced Transact-SQL for SQL Server 2000

    - **使用相关子查询**(Correlated Subqueries):子查询依赖于外部查询中的某个值。 - **计算运行总和**:通过相关子查询实现对每行数据的累计求和。 - **派生表**(Derived Tables):将查询结果视为临时表使用...

    doppler.zip_Correlated Rayleigh_correlated channel_doppler_多普勒信道

    相关瑞利信道的仿真,在不同多普勒波长的影响下,产生出不同的瑞利信道

    Advanced SQL.ppt

    除了JOIN,本章还介绍了**相关子查询(Correlated Subqueries)**和**非相关子查询(Noncorrelated Subqueries)**。相关子查询是在外部查询的上下文中执行的,其结果依赖于外部查询的每一行。而非相关子查询则先...

    Neutron Scattering Studies of Correlated Electron Systems

    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 ...

    oracle-sql-the-essential-reference

    - **Subqueries and Correlated Subqueries**(子查询与相关子查询):解释了子查询的概念及其应用场景,并特别强调了相关子查询的使用方法。 - **Aggregate Functions**(聚合函数):探讨了Oracle SQL提供的聚合...

    spatially correlated Gnoise_2d-music_ula_bistaticradar_

    首先,"spatially correlated Gnoise"指的是空间相关的广义噪声,这在雷达信号处理中是重要的考虑因素。在雷达系统中,接收的噪声不仅有随机性,还可能因为环境或硬件特性而呈现出空间相关性,这种噪声会影响目标...

    correlate.rar

    - **函数声明**:在`Correlate.h`头文件中,可能会声明用于执行相关运算的函数,如`correlate()`,该函数接收两个数组作为输入,计算它们的相关值,并返回结果。 - **数据结构**:可能定义了结构体或其他数据类型...

Global site tag (gtag.js) - Google Analytics