面试官让你手写SQL,然后程序员不会,结果凉凉了

程序员、测试、DB、MYSQL

面试官特别喜欢问SQL,写的SQL不好性能影响也特别大

SQL基本功,顶起

面试官让你手写SQL,然后程序员不会,结果凉凉了

一张学生表

Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别

面试官让你手写SQL,然后程序员不会,结果凉凉了

一张学生成绩表

成绩表

score(SID,CID,score) --SID 学生编号,CID 课程编号,score 分数

面试官让你手写SQL,然后程序员不会,结果凉凉了

学生表 9条记录

成绩表18条记录

第一个问题两表关联查询结果数量是多少

select count(*) from student a,score b

答案是 (学生表 9条*成绩表18条)=162条

第二个问题两表关联查询列名会怎么

select * from student a,score b

答案是 相加

面试官让你手写SQL,然后程序员不会,结果凉凉了

左连接

面试官让你手写SQL,然后程序员不会,结果凉凉了

要查所有学生的考试情况,左连接很不错

下图空白部分的B就是上图NULL

这个NULL什么意思,就是没参加考试的学生。

面试官让你手写SQL,然后程序员不会,结果凉凉了

内容连接

如果要精确查询某数据,内连接不错

面试官让你手写SQL,然后程序员不会,结果凉凉了

参加过考试的学生和成绩就出来了

面试官让你手写SQL,然后程序员不会,结果凉凉了

左不包括连接

很多参加是查询不存在的数据,这个时候左不包括连接就有用了

例子,查没参加考试的学生

这是刚刚左连接的SQL,那些NULL的学生其实就是没参加考试的学生

面试官让你手写SQL,然后程序员不会,结果凉凉了

因此把左连接SQL小调整下就满足需求了

面试官让你手写SQL,然后程序员不会,结果凉凉了

性能优化思路:

左不包括连接完胜嵌套子查询

因为join会自动优化特别是关联的ID是有索引的时候

面试官让你手写SQL,然后程序员不会,结果凉凉了

面试官让你手写SQL,然后程序员不会,结果凉凉了

group by

查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

直接关联学生表和成绩表会发现学生的所有成绩记录会平铺

面试官让你手写SQL,然后程序员不会,结果凉凉了

  1. group by 就是分组的意思,关键点要找重复出现的值把它合并成一组后方便统计

上图重复的值当然是姓名

2 . group by 分组后,在加是统计函数AVG帮助就可以计算出学生的平均成绩

面试官让你手写SQL,然后程序员不会,结果凉凉了

  1. 在配合HAVING去过滤掉60以下的
面试官让你手写SQL,然后程序员不会,结果凉凉了

在理解下group by的效果,重复的字段值合并,在配合统计函数来统计,

HAVING函数去过滤掉不满足的 统计结果

面试官让你手写SQL,然后程序员不会,结果凉凉了

join on后面的条件与where后面的条件的区别

这个很多人没注意

例子来了第一个是where 后面条件,第二个是 on后面加条件

结果都是不一样的 where查询到12 条,on查询到16条

面试官让你手写SQL,然后程序员不会,结果凉凉了

原因:

  1. where 后面的条件是对连接后的数据进行筛选 ,即先连接再筛选
  2. on 条件是先过滤数据后,在于表join 即先筛选再连接
  3. 筛选的对象范围不一样,结果当然可能不一样。

总结

  • SQL里还有非常多的函数,有空我在整理下加强下理解
  • 平时大家多把运行结果在脑海里多放放,加函数前和加函数后结果的变化规律


分享到:


相關文章: