求大神指点以下SQL查询语句
SELECT name,continent FROM world x
WHERE x.population / 3 >= ALL(SELECT population FROM world y WHERE y.continent = x.continent AND population >0 AND y.name != x.name
请高手指点上面的语句是通过什么思路编写出来的,SQL刚入门小白完全不理解为什么会出现那么多的x,y。能帮助我理解这个语句的思路,一定会再加分,先谢谢各位指点 展开
1、这是sql中常用的“相关子查询”;
2、相关子查询的执行依赖于外部查询。多数情况下是子查询的WHERE子句中引用了外部查询的表。
执行过程:
(1)从外层查询中取出一个元组,将元组相关列的值传给内层查询。
(2)执行内层查询,得到子查询操作的值。
(3)外查询根据子查询返回的结果或结果集得到满足条件的行。
(4)然后外层查询取出下一个元组重复做步骤1-3,直到外层的元组全部处理完毕。
3、分析你的这个sql:
(1)从外层查询中取出一个元组,也就是'Afghanistan'这个国家,这时x指的就是该条数据;
(2)执行内层查询,
SELECT population FROM world y WHERE y.continent = x.continent AND population >0 AND y.name != x.name
这里的y这的是子查询中wold表里的数据;
这个子查询的意思是,把 除了'Afghanistan'这条数据,所有与'Afghanistan' 同一个州的且人口大于0的国家 筛选出来;
ALL(子查询结果) 表示将所有人口数相加;
(3) x.population / 3 >= ALL(子查询结果),意思是: 'Afghanistan' 这个国家的人口的三分之一大于等于其他同洲的国家人口之和;如果满足这个条件,x也就是'Afghanistan'这条数据将添加到结果集中;
(4)然后外层查询取出下一个元组重复做步骤1-3,直到外层的元组全部处理完毕。
真的很详细,非常感谢。但是理解上还有一个疑问,x是相当于是把每行的结果套入进去语句中进行查询吗?那y又相当于是什么呢?最主要对x,y觉得很难理解,查了很多相关网站都还是不理解
1、x相当于外层查询的数据,y相当于内层查询的数据;
2、给你举个例子:
List<int> list1 = new List<int> { 1, 2, 3 };
List<int> list2 = new List<int> { 2, 3, 4 };
list1.ForEach(x =>
{
list2.ForEach(y =>
{
if (x == y)
{
Console.WriteLine(x);
}
});
});
例子里的x,y就好比sql中的x,y;