SQL语言 - 子查询练习

接下来进入子查询的练习。难度可能有所增大,但是子查询在SQL语言中非常重要,利用子查询可以解决很多复杂的问题。
相关练习的数据库请参看:http://www.sqlzoo.cn/1_1.htm
练习题地址:http://www.sqlzoo.cn/1a.htm
练习题答案及分析:
1a. 给出人口多于Russia(俄国)的国家名称.
SELECT name FROM bbc
  WHERE population>
     (SELECT population FROM bbc
      WHERE name='Russia')

1b. 给出'India'(印度), 'Iran'(伊朗)所在地区的所有国家的所有信息. 
SELECT * FROM bbc
  WHERE region IN
    (SELECT region FROM bbc
     WHERE name IN ('India','Iran'))
这道题使用了2个IN关键字,先在子查询找查找到‘India’和‘Iran’,外查询将根据子查询所返回的表来进行地区的查询。因为Where语句中不允许子查询返回多行纪录,所以可以使用In来查找多行纪录的表。

1c. 给出人均GDP超过'United Kingdom'(英国)的欧洲国家.
SELECT name FROM bbc
  WHERE region='Europe' AND gdp/population>
     (SELECT gdp/population FROM bbc
      WHERE name='United Kingdom')

1d. 哪个国家的人口比Canada(加拿大)多但少于Algeria(阿尔及利亚)?
SELECT name FROM bbc WHERE
 population >
 (SELECT population FROM bbc WHERE name='Canada')
    AND
  population <
 (SELECT population FROM bbc WHERE name='Algeria')
这道题使用了两个子查询,来确定人口数量在这两个国家之间的国家

2a. 给出GDP比任何欧洲国家都多的国家(只要显示国家名称).
SELECT name FROM bbc WHERE gdp > ALL
   (SELECT gdp FROM bbc
    WHERE region = 'Europe')
这里使用了ALL关键字,意思是只有子查询所查询到的所有记录都满足条件那么子查询才返回该记录

3a. 给出每个地区人口最大的国家。
SELECT region, name, population FROM bbc x
  WHERE population >= ALL
    (SELECT population FROM bbc y
        WHERE y.region=x.region)

3b. 给出地区中所有国家的人口总数为0的地区.
SELECT region FROM bbc x
 WHERE 0 = ALL
  (SELECT population FROM bbc y
   WHERE y.region = x.region)

3c. 有些国家的人口数比她的周边国家(周边国家指在同一地区的国家)要多三倍,列出这些国家和地区.
SELECT name, region FROM bbc x WHERE
 population > ALL
 (SELECT population*3 FROM bbc y
 WHERE y.region = x.region
 AND y.name <> x.name)
这道题稍微有点难度,主要是在最后一行y.name <> x.name 这句。因为如果不给此条件,那么就不会得到任何结果。自己和自己比较永远也不会得出比它大三倍的结果,所以结果也不会有任何国家满足此条件。因此我们加上不允许自己和自己比较这一条件。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值