一.复杂查询语法
![f6fdbaf6c28fa92a69fcfce17cf5a467.png](https://i-blog.csdnimg.cn/blog_migrate/e2834acfda218f7c8f08b7d8c988639d.jpeg)
二.sqlzoo错题记录
1. 对于名称以A或B开头的国家,如果其大陆是“Europe”或者“Aisa”,将其替换为“Eurasia”;如果其大陆是“North America”、”South America“、“Caribbean”,将其替换为“America”。显示国家名称、大陆
SELECT name,
CASE WHEN continent IN ('Europe', 'Asia') THEN 'Eurasia'
WHEN continent IN ('North America', 'South America', 'Caribbean') THEN 'America'
ELSE continent END
/* 在ifs函数中,如果continent in ('Europe','Asia'),那么continent = 'Eurasia'。
在sql中表示式比ifs函数简洁*/
FROM world
WHERE name LIKE 'A%' OR name LIKE 'B%';-- where name like 'A%' or 'B%'不能这样表达
知识点:case when 条件1 then 结果 else 其它结果 end . 要理解这个表达式不难,难处在于它的用法不同于excel中ifs函数。
与它相反,如果是or ,and, 则不能简洁表达。补充一下,其实or与in 可以表达相同的意思。 推荐的表达是使用in,因为or会导致sql进行全表查询,从而使sql运行率下降。
2. 法国、德国、西班牙的总人口是多少
select sum(population)as '总人口' from world
where name in('France','Germany','Spain')
/*这里原本是很简单的,
但需要明确 'in' 的作用,
它可以相当于or,也可以相当于all,对括号中全部数据*/
4.1 对于每一个洲份,显示洲份和至少有1000万人口的国家数目
4.2 列出有至少一亿人口的洲份
-- 4.1
SELECT continent, COUNT(population) FROM world
WHERE population >= 10000000
GROUP BY continent;
-- 4.2
select continent,count(population) from world
group by continent
having population >= 10000000
注意着重看两者的比较
5. 在每一个洲中找出面积最大的国家,列出洲份、国家名称、面积
select continent,name,area from world x
where area>= all(
select area from world y
where y.continent=x.continent and area>0)
如何理解关联子查询:where y.continent=x.continent,表示按州对数据进行分组,world x表中的每一个area与 world y表中的所有数据进行比较,当world x中的area比world y中的数据所有的数据都大才满足条件。