另外,Mysql的存储引擎接口定义良好。有兴趣的开发者通过阅读文档编写自己的存储引擎。
解析:
1、只需name字段
2、需所有课程(2门)的fenshu字段均>80——>where筛选条件,count计算筛选where后是否不少于2门高于80分
3、显示的结果不重复——>group by
select name from users
where fenshu >= 80
group by name
having count(name) >= 2;
解析:
1、每年只4个月
2、由于是求每月总金额——> SUM函数(可据实际替换成AVG、MAX、MIN)
3、别名要求M1-M4——> as
4、如果某个月份无金额则为0——> if函数(和三目运算符一样)
5、显示结果不重复——> group by
SELECT year,
SUM(IF(`month`=1,amount,0)) as 'M1',
SUM(IF(`month`=2,amount,0)) as 'M2',
SUM(IF(`month`=3,amount,0)) as 'M3',
SUM(IF(`month`=4,amount,0)) as 'M4'
FROM Bill
GROUP BY year
(union要求列数相同,列数据类型相同,顺序相同)
select year,1 as month,M1 as amount from Bill
union all
select year,2 as month,M2 as amount from Bill
union all
select year,3 as month,M3 as amount from Bill
union all
select year,4 as month,M4 as amount from Bill
order by years
解析:
1、日期不变,使用别名——>as
2、第二列字段要求所有当月费用连接在一起——>concat()
3、显示结果不重复——>group by
Select date as '日期',
concat('租金',IF(`fee_name`='租金',amount,0),',','物业费',IF(`fee_name`='物业费',amount,0)) as '每月费用收取情况'
from Bill
group by date
① selete * from testtable limit 2,1;
② selete * from testtable limit 2 offset 1;
①是从数据库中第三条开始查询,取一条数据,即第三条数据读取,一二条跳过
②是从数据库中的第二条数据开始查询两条数据,即第二条和第三条。
由于id为主键索引,所以使用嵌套查询所需的10个id,再进行内连接筛选
1、题目的sql会访问1000010次数据页。而优化后的1的sql只访问10次数据页
select * from user u1
inner join (select id from user limit 1000000,10) u2 on u1.id=u2.id
2、适合id连续的系统,速度极快。不适合带有条件的、id不连续的查询
select * from user
where id between 1000000 and 1000010
order by id desc