1、查询tids字段包含的多个tid,tid是用分隔,例如tid111tid222。
重点:用like+and
select * from tag where tids like 't111' and tids like 't222' ;
2、查询书籍下有多少个章节。
重点:用group by+聚合函数
select bid,count(cid) cnt from chapter where group by bid order by cnt desc;
3、查询每笔提现大于100的作者。
思路:先查出类型为作者提现的数据,再按作者分组,筛选出最小提现金额大于100的作者。
重点:HAVING子句可以让我们筛选成组后的各组数据
SELECT DISTINCT author FROM (SELECT * FROM author_money WHERE type=2) AS cn GROUP BY author HAVING min(amount)>100 ;
4、表一test1 id fgid source,表二test2 id fgid cuid,test1的fgid和source是一一对应的,求每个source的cuid的个数。
重点:左连接,返回左表中的所有行,即使右表中没有相应的匹配行。
SELECT test1.source,count(test2.cuid) FROM `test1` LEFT JOIN test2 ON test1.fgid=test2.fgid GROUP BY source;
5、学生表student id name class score,找出每门功课都大于80分的同学名字
思路1:先找到每个学生所有科目中最低分数,再取最低分大于80的同学就能得到每门科目都大于80的同学
SELECT name FROM(SELECT name,min(score) minscore FROM `student` GROUP BY `name`) a WHERE minscore>80;
思路2:找到成绩小于80的数据,再从中筛选出不在内学生名字去重
SELECT DISTINCT name FROM student WHERE name not in (SELECT `name` from student WHERE score<80)
6、学生表student id name class score,查询除id外,name、class、socre相同的冗余数据。
注意:①不能对同一张表同时进行更新和查询操作,比如查询的结果作为更新表的筛选条件,只能把查询出来额数据作为一个第三方表。②分组一般需要和聚合函数使用。
思路:按名字、科目、分数分组查询最小值的id表a,再删除不在表a里的id数据
DELETE from student WHERE id NOT IN (SELECT * FROM(SELECT min(id) FROM `student` GROUP BY name,class,score) a);
7、插入数据
insert into 表名 values(值1,值2....)
insert into 表名 (列1,列2....) values(值1,值2....)
8、一张score表有id、name、course、score四个字段,需要删除掉里面重复的数据,保留id最小的数据
思路:①查出所有重复的数据的name course和重复数据分组中最小的id
delete from score where name,course in (select name,course,score from score group by name,course,score having count(*)>1) and id not in (select min(id) from score group by name,course,score having count(*)>1)
9、查询学生成绩表,根据学生成绩对查询结果添加新的一列,score>=60显示pass,score<60显示fail
select *,result=(case when score>=60 then 'pass' else 'fail' end) from score