sqlzoo第三天

网站:https://sqlzoo.net/wiki/SELECT_from_Nobel_Tutorial/zh
https://sqlzoo.net/wiki/SELECT_within_SELECT_Tutorial/zh
1.可以将表达式主题IN(“化学”,“物理”)用作值-它可以是0或1。 显示1984年获奖者和主题(按主题和获奖者名称排序);但最后列出化学和物理。
SELECT winner, subject FROM nobel
WHERE yr=1984
ORDER BY subject IN (‘Physics’,‘Chemistry’),subject,winner

可先执行select subject,subject in (‘Physics’,‘Chemistry’) from noble
发现多出的那一列为0和1,即是化学和物理为1其他为0
所以在执行order by的时候排序 先找到是化学和物理的为1,通过asc码排序后这两种在后边,然后进行后续排序

2.显示欧洲国家name和每个国家的对德国的人口比例,以百分比做显示,并且去除小数
select name ,
concat(round((population*100/(select population from world where name = ‘Germany’)),0),‘%’)
from world
where continent = ‘Europe’

concat 在where和select的后的表现不同
3.那些国家的GDP比全部欧洲国家的GDP还要高
select name
from world
where GDP>all(select GDP from world where continent = ‘Europe’ and gdp is not null)

使用all函数来查找最高,有些国家的GDP为null 应该使用is not null 或者>0跳过这些行

4.在每个州找出最大面积的国家(有些国家面积为null)
SELECT continent, name, area FROM world x
WHERE area >= ALL(SELECT area FROM world WHERE continent=x.continent AND area>0)

关联子查询,参考https://www.cnblogs.com/heenhui2016/p/10574695.html
子查询的执行顺序:外部查询->子查询->外部查询
本题的执行顺序:
1.先进行外部查询,查找world表中第一个记录,假设第一条记录为continent=‘Asia’
2.进入子查询,where条件为continent=x.continent,即查找所有的continent=‘Asia’的记录
3.all()函数找出continent=‘Asia’的所有国家中拥有的最大面积
4.进入外部查询,步骤一中的记录是否满足外部条件
5.循环执行1234步骤
问:会重复计算嘛?
答:不会,效率并没有降低,SQL已经对此进行过优化。
另外all()函数应该和<>!=一起使用,此题必须使用>=号

5.有些国家的人口是所在本州其他所有国家人口的三倍以上,列出国家名字和大洲

select name,continent
from world as w
where population/3 >=all(
select population from world where continent = w.continent and name!=w.name
)
**子查询语句不能直接做四则运算
在all前*3是错误的
**
6.首次颁发经济奖的获奖者
select winner
from nobel
where subject=‘Economics’ and
yr = (select yr from nobel where subject=‘Economics’ order by yr limit 1)

order by也可以用来选择极大极小值
limit 来限制语句数量 后跟两个参数 第一个是索引第二个为数量

7.哪几年颁发了物理奖而没颁发化学奖
select distinct yr
from nobel
where yr not in (select yr from nobel where subject =‘Chemistry’) and subject = ‘Physics’

分析:可以画出交并图,四种情况:颁发物理没颁发化学;物理化学都颁发;颁发化学没物理;化学物理都没颁发。
因此只需要去掉颁发过化学的年份,从中找出颁发物理的年份就可。注意要去重。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值