第十一题
现有数据表World,字段为Name、Continent、Area、Population、Gdp
如果一个国家的面积超过300万平方公里,或者人口超过2500万,那么这个国家就是大国家
要求:请编写一个SQL,筛选出所有大国家的名称、人口和面积
select Name, Population, Area from World where Area>3000000 or Population>25000000;
解析:或条件语句可以使用or关键字
第十二题
现有数据表Courses,字段为Student、class
要求:请编写一个SQL,筛选出所有超过5名学生的课程
此外,学生在每门课中不应被重复计算
select class from courses group by class having count(distinct student)>=5;
解析:计数时需要将相同姓名的学生进行过滤
第十三题
现有数据表Logs,字段为Id、Num
要求:编写一个SQL,查找所有至少连续出现三次的数字
方案一
select distinct L1.Num ConsecutiveNums from Logs L1, Logs L2, Logs L3
where
L1.Num=L2.Num and L2.Num=L3.Num and L1.id=L2.id-1 and L2.id=L3.id-1;
方案二
select distinct Num as ConsecutiveNums
from (
select Num,
case
when @prev = Num then @count:=@count+1
when @(prev := Num) is not null then @count := 1
end as CNT
from Logs, (select @prev := null, @count := null) as t
) as temp
where temp.CNT>=3
解析:’:='表示初始化, @prev表示用户自定义变量名,首先初始化变量@prev, @count,当有新值时都会进行初始化@count,将其初始化为1,随后进行判断当Num等于@prev时,会进行自增1
第十四题
现有数据表Employee、字段为Id、Name、Salary、ManagerId
要求:请查询出收入超过他们经理的姓名
select Name from Employee e where Salary>(select Salary from Employee where id =e.ManagerId);
解析:本表自关联查询
第十五题 部门工资最高的员工
现有数据表Employee,字段为Id、Name、Salary、DepartmentId; 数据表Department, 字段为Id、Name
要求:找出每个部门工资最高的员工,获取其部门,姓名,工资
select
d.Name Department,
e.Name Employee,
e.Salary Salary
from
Employee e join Department d
on e.DepartmentId = d.Id
where e.Salary >= (
select max(Salary) from Employee e1 where e.DepartmentId = e1.DepartmentId
);
解析:首先两表关联,随后Employee自连接,只有当工资等于最高工资时,才会返回员工的各个信息