欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库SQL语言中exists和not exists语句用C语言理解

程序员文章站 2022-06-02 08:23:11
...

谈谈我对SQL语句中exists语句的理解

首先如果刚刚接触SQL语句看到exists语句一定会很难理解,因为在我们使用子查询时,是先执行子查询语句的,整个过程是由内至外,例如:

select Sname
from S
where Sno in (select Sno
from SC
where Grade >= 60);

上面这个语句就是查询分数大于六十分的学生姓名,需要先执行内层的子查询再执行外层的查询,是有明确的先后次序的

而我们再看exists语句:

select Sname
from S
where exists(select *
from SC
where S.Sno = SC.Sno and Grade > 60)

下面就说出我的理解,可能与实际工作的原理有些偏差,但是可以方便理解,有什么错误也请大家指正。

上面的用子查询完成的时候,是由内至外的,而exists语句是由外至内、循环执行的

它是将外层查询的选中的每一行作为输入,放入内层的查询进行判断,判断是否满足条件,若满足则此行就会被选中,否则不被选中。

这里可以用一个不恰当的C语言框架来解释一下:

date s[10];//假设是被外层查询选中的表,每一个元素就是表中的一行,注意这里是表
data sc[20];//这里代表的是sc表,每个元素是表中的一行
int i,j = 0;
for(i = 0; i < 10; i++)
{
	if(judge(s[i]))
	{
	s_s[j] = s[i];
	j++;
	}//等到此循环结束的时候,就会有一个s_s表,这个表中的所有行都可以使内存查询实现
	printf(s_s表中选中的列);
}

int judge(data s)
{
	int i = 0;
	while(s.sno != sc[i].sno)
	{
	i++;
	}//循环尝试找到s在SC表中对应的行
	if(s.sno == sc[i].sno && sc[i].grade > 60)
		return 1;
	else
		return 0;
}

上面这个框架就是我对exists语句的理解,当遇到not exists语句时,就是将第一个循环中的判断语句if( judge(s[ i ]) )改成if(! judge(s[ i ]) )即可。

上面的框架就是从外层的查询中选取一行然后进入内层判断,然后循环执行。

以上就是我对exists和not exists语句的理解。

当然有些人还有些糊涂的地方就是为什么内层的查询中是

select *

而不是

select sno,grade

当进入内层查询时,此时我们针对的是查询能否完成,能否实现,而不是具体的查询结果。因此,在内层查询中,可以select任意列,就是说可以把内层查询中的*改成任意表中存在的列,只是习惯问题而已。