您的位置:首页 > 数据库

SQL语言 - 子查询练习

2007-05-06 17:18 288 查看
接下来进入子查询的练习。难度可能有所增大,但是子查询在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 这句。因为如果不给此条件,那么就不会得到任何结果。自己和自己比较永远也不会得出比它大三倍的结果,所以结果也不会有任何国家满足此条件。因此我们加上不允许自己和自己比较这一条件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: