求大神指点以下SQL查询语句

题目:有些国家的人口是同洲份的所有其他国的3倍或以上。列出国家名字name 和 洲份 continent
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;

温馨提示:答案为网友推荐,仅供参考
相似回答