程序员、测试、DB、MYSQL
面试官特别喜欢问SQL,写的SQL不好性能影响也特别大
SQL基本功,顶起
一张学生表
Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别
一张学生成绩表
成绩表
score(SID,CID,score) --SID 学生编号,CID 课程编号,score 分数
学生表 9条记录
成绩表18条记录
第一个问题两表关联查询结果数量是多少
select count(*) from student a,score b
答案是 (学生表 9条*成绩表18条)=162条
第二个问题两表关联查询列名会怎么
select * from student a,score b
答案是 相加
左连接
要查所有学生的考试情况,左连接很不错
下图空白部分的B就是上图NULL
这个NULL什么意思,就是没参加考试的学生。
内容连接
如果要精确查询某数据,内连接不错
参加过考试的学生和成绩就出来了
左不包括连接
很多参加是查询不存在的数据,这个时候左不包括连接就有用了
例子,查没参加考试的学生
这是刚刚左连接的SQL,那些NULL的学生其实就是没参加考试的学生
因此把左连接SQL小调整下就满足需求了
性能优化思路:
左不包括连接完胜嵌套子查询
因为join会自动优化特别是关联的ID是有索引的时候
group by
查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
直接关联学生表和成绩表会发现学生的所有成绩记录会平铺
- group by 就是分组的意思,关键点要找重复出现的值把它合并成一组后方便统计
上图重复的值当然是姓名
2 . group by 分组后,在加是统计函数AVG帮助就可以计算出学生的平均成绩
- 在配合HAVING去过滤掉60以下的
在理解下group by的效果,重复的字段值合并,在配合统计函数来统计,
HAVING函数去过滤掉不满足的 统计结果
join on后面的条件与where后面的条件的区别
这个很多人没注意
例子来了第一个是where 后面条件,第二个是 on后面加条件
结果都是不一样的 where查询到12 条,on查询到16条
原因:
- where 后面的条件是对连接后的数据进行筛选 ,即先连接再筛选
- on 条件是先过滤数据后,在于表join 即先筛选再连接
- 筛选的对象范围不一样,结果当然可能不一样。
总结
- SQL里还有非常多的函数,有空我在整理下加强下理解
- 平时大家多把运行结果在脑海里多放放,加函数前和加函数后结果的变化规律
閱讀更多 程序汪汪 的文章