求大神指点以下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;

温馨提示:内容为网友见解,仅供参考
无其他回答

求大神指点以下SQL查询语句
1、这是sql中常用的“相关子查询”;2、相关子查询的执行依赖于外部查询。多数情况下是子查询的WHERE子句中引用了外部查询的表。 执行过程:(1)从外层查询中取出一个元组,将元组相关列的值传给内层查询。(2)执行内层查询,得到子查询操作的值。(3)外查询根据子查询返回的结果或结果集得到满足条...

sql语句之三表联查,优化?
SELECT distinctypi.pi_id FROM ymx_order AS yoh INNER JOIN ymx_combination AS ypc ON ypc.pco_skuuppdate = yoh.home_backkINNER JOIN ymx_product_info AS ypi ON ypc.pi_id = ypi.pi_id where home_yunstate='已采购'具体还是要看数据量定的.

sql 语句查询判断是否为空并关联
用Case 语句可以将两列合有一列,然后用结果作为一个表去关联其它表就可以 Select * from (Select Case when customer_id is null then manager_id else customer_id end as customer_id from table) as a left join b on a.customer_id=b.customer_id ......

SQL-查询上海和北京的客户在1996年订购的所有订单的订单ID,所订购的产...
如果这些你都写对的话,那么 你把这条SQL分为两部分执行:select 订单明细.数量,产品名称,订单.订单ID,城市from 订单明细,产品,订单,客户where 城市 IN('上海','北京')select 订单明细.数量,产品名称,订单.订单ID,城市from 订单明细,产品,订单,客户where 订购日期 ='1996'再分别看里面的数据是否存...

求个SQL 查询列含有某
select * from a Where Code=123 通常数据量大情况下使用表连接,不建议使用子查询 重新读了下你的需求,你要的应该是方式一,(以表2列作为条件查表1)select a.* from a Inner Join (select DISTINCT id from a where code =123 ) as b On a.id=b.id 或者:使用with语句(如果你的...

sql语句怎么在一个数据库中查找拥有同一字段名的所有表
1、在Oracle数据库中 select column_name,table_name from user_tab_columns where column_name= 'test_name'2、在SqlServer数据库中 SELECT COLUMN_NAME,TABLE_NAME FROM INFORMATION_SCHEMA.columns WHERE COLUMN_NAME='test_name'SQL语言是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,...

mybatisSQL语句查询问题
name from admin a where a.admin_id = am.receiver_id) end as admin,case when am.receiver_id = 0 then (select b.role_name from admin_role b where b.role_id = am.role_id) else null end as role from admin_msg am where am.send_flg = 0 AND am.sender_id = 1 ...

SQL语句求一个表中两列数据中的最大\/最小值\/标准差
select case( when MAX(col1) > MAX(col2) then 'col1大'when MAX(col1) < MAX(col2) then 'col2大'else '相等' end)as COL1,case( when MIN(col1) < MIN(col2) then 'col1小'when MIN(col1) > MIN(col2) then 'col2小'else '相等' end)as COL2,case( when avg(col...

sql语句怎么在一个数据库中查找拥有同一字段名的所有表?
SQL即结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。SQL语句无论是种类还是数量都是繁多的,很多语句也是经常要用到的,SQL查询语句就是一个典型的例子,无论是...

SQL语句,一张表中。三列合并问题。在线等。
SELECT 责任区号, isnull(林班1,'') + ',' + isnull(林班2,'') + ',' +isnull( 林班3,'') AS 林班 FROM dbo.责任区号与林班小班对照表

相似回答