学完了mysql后发现有很多地方不是很明白,于是总结了mysql的经典题型,不论是工作还是面试,我相信还是有一定帮助的。
例题一
在我的数据库中数据如下(排序有些差别,但是不影响结果)
分析:分两步解答
1)查询除了学号外其他数据重复时显示小的学号id
select MIN(id) id from tbl_students group by name,sax,age(6,7不应该显示,4要有注意,如果不按年龄分组就没有4出现)
2)最终答案如下(用到了子查询)
合并:delete from tbl_students
where id not in (select id from (select MIN(id) id from tbl_students group by name,sax) t )
扩展:
这个题型还有一点陷阱,初学者容易犯的两个错误
问题一:为什么这里需要加 别名t呢?
就是如果改成如下sql语句会怎么样呢?
delete from tbl_students
where id not in (select id from (select MIN(id) id from tbl_students group by name,sax) )
提示:每个派生表都必须有自己的别名。
与子查询不同,派生表必须具有别名,以便稍后在查询中引用其名称(不了解派生表的自己网上查,有很多文章)。
问题二:如果这样写会怎么样呢?
delete from tbl_students
where id not in (select MIN(id) id from tbl_students group by name,sax )
这样的话会报一个异常如下
就是不能为FROM子句中的更新指定目标表“tbl_students”
在MySQL中,你不能修改在选择部分中使用的同一个表。你需要停止使用嵌套子查询,或者在两个部分执行操作,或者使用简单的where子句clause子句。
总结:如果是查询操作不会引发我说的这两个问题,有兴趣的可以尝试更新时会不会引发上面的问题。
题型二:
(要求查询出参加考试的各科成绩都高于60分,不管参加了多少科考试)
就是只显示及格的科目:
1.select username,score from tbl_score
where id not in (select id from tbl_score where score < 60)
扩展1:查询所有成绩都及格的学生
1)查出成绩不及格的学生名字
select username from tbl_score where score<60
结果:
select * from tbl_score where username not in (select username from tbl_score where score<60 )