实验4 sql的复杂查询_4.SQL复杂查询

实验进入第四关,SQL复杂查询难度提升,作者通过编写注释记录学习过程。在第五题中,通过多次尝试解决了涉及德国人口分母的问题,意识到必须使用精确的SQL语句。第八题和第十题仍存在困惑,第八题不理解name<=all name的用法,第十题未能正确排除自身比较的情况。文章提供了所有习题代码,并附上第八题和第十题的解答截图。
摘要由CSDN通过智能技术生成

c06b179f1ffef3be3b4c9e44174927ba.png
#创建视图
create view 按性别汇总(性别,人数)
as
select 性别,count(*)
from student
group by 性别;

select 性别,人数
from 按性别汇总;

#子查询
select 性别,人数
from(
select 性别,count(*) as 人数
from student
group by 性别
)as 按性别汇总;

select 学号,成绩
from score
where 成绩 in(
select min(成绩)
from score
group by 课程号
);

select 学号,成绩
from score
where 成绩 > all(
select 成绩
from score
where 课程号 = '0002'
);

ff1dfa9f3f0dafd37e6326258ac90627.png
#标量子查询
select 学号,成绩
from score
where 成绩 > (
select avg(成绩)
from score
);

select 学号,成绩
from score
where 成绩 between 
(select avg(成绩)
from score
where 成绩 <= 60) and
(select avg(成绩)
from score
where 成绩 >= 80);

select 学号,成绩,(select avg(成绩)
                 from score) as 平均成绩
from score;

6a9a13092f196634f8f40e81989cfa5d.png
#关联子查询,比较难理解
select 学号,课程号,成绩
from score as s1
where 成绩 >
(select avg(成绩)
from score as s2
where s1.课程号 = s2.课程号
group by 课程号
);

32759ea475844bd6d5bbd7479ea017e9.png

明显能感觉到第四关开始难度上升了很多,无论是课程还是习题。所以我都有开始写注释了,怕以后忘了看不懂,知乎live的图片我也做成了PPT和PDF两种格式,以后看起来方便一些。

220f3a0aa96506156f4486f9f0e1ed89.png

5,8,10三个题目想了很久,5最后还是做出来了,感觉自己在瞎凑。。把那个语句写的特别复杂,主要是要表示出德国的人口作为分母,我最开始用的是题目给出的80million,后来发现不行,精度对不上,就说明必须用SQL语句找出精确的德国人口了,感觉最后的写出公式特别复杂。。

8,10两题还是没有写出来,总觉得10快要接近了,可是就是差了点的感觉。

8还是不太理解的感觉。。我一直是觉得要按照名字排序的,觉得会用到order by,可是这里用了name<=all name,不太懂。

Select continent,name 
from world as x
where name <= all
(select name 
from world as y
where y.continent=x.continent);

10看了答案后找到了自己的问题,因为后面的子句中没有去掉和自己比较的情况,自己的三倍是不可能>=自己的。

#10题原想法
SELECT name,continent
FROM world s1
  WHERE population/3 >= all
    (SELECT population 
     FROM world s2
     WHERE s1.continent=s2.continent)

#改正后
SELECT name,continent
FROM world s1
  WHERE population/3 >= all
    (SELECT population 
     FROM world s2
     WHERE s1.continent=s2.continent
and s1.name <> s2.name) 

所有习题代码

1.
SELECT name 
FROM world
  WHERE population >
     (SELECT population 
      FROM world
      WHERE name='Russia')

2.
SELECT name 
FROM world
  WHERE gdp/population >
     (SELECT gdp/population
      FROM world
      WHERE name='United Kingdom') and continent = 'Europe'

3.
SELECT name,continent
FROM world
  WHERE continent in
     (SELECT continent
      FROM world
      where continent in ('Argentina','Australia')
or name in ('Argentina','Australia'))
order by name

4.
SELECT name,population
FROM world
  WHERE population >
     (SELECT population
      FROM world
      where name = 'Canada') and population <
(SELECT population
      FROM world
      where name = 'Poland')

5.
select name,CONCAT(round(population/
((select population 
from world
where name = 'Germany')/100),0),'%')
FROM world
where 
continent = 'Europe'

6.
select name
from world 
where gdp > (select max(gdp)
from world 
where continent = 'Europe')

7.
SELECT continent,name,area
FROM world s1
  WHERE area >= ALL
    (SELECT area 
     FROM world s2
     WHERE s1.continent=s2.continent)

8.
Select continent,name 
from world as x
where name <= all
(select name 
from world as y
where y.continent=x.continent);

9.
SELECT name,continent,population
FROM world s1
  WHERE 25000000 >= all
    (SELECT population
     FROM world s2
     WHERE s1.continent=s2.continent)

10.
select name, continent 
from world as x
where population > all
(select 3*population 
from world as y
where y.continent=x.continent and x.name <> y.name);

再单独再把8,10的图片发一下吧。

4f3c9d6185cd2a27208093cc216353bc.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值