手写sql顺序与机读sql数据的区别
①.手写 写手Sql图
②. 机读 机读Sql图sql解析顺序
sql解析图
- 注意:
①. sql 解析是从from开始,先是获取笛卡尔积(笛卡尔积的数量是两个表总数的乘积),然后进行过滤
②. 若面试官问 where 和 having的区别则从以下几点进行回答:- 最大的区别就是执行顺序不一样,where要比having先执行
- where不可以对聚合函数进行过滤,但是having可以。例如:
select id,name ,count(name) as nameSum from student group by 'name' having nameSum > 3
; 这条语句与select id,name ,count(name) as nameSum from student where nameSum > 3 group by 'name'
之间区别,第一条是正确的,可以执行通过,第二条执行是失败的,为什么?答:因为having与where的执行顺序不同,从from开始先对表做了笛卡尔积,然后对count进行where条件过滤,这时笛卡尔积中没有count完成后的nameSum字段,所以会找不到字段nameSum,然后having是在group by后执行,这时count聚合函数已经执行,所以可以进行过滤。 -
select id,name,sex from student where sex = '男'
与语句select id ,name ,sex from student having sex='男'
这两句的执行效果是一样的,但是select id , name from student where sex ='男'
与select id, name from student having sex = '男'
这两条语句中,第一条是正常执行的,第二条执行报错,找不到sex这列。总结:在没有group by的前提下,使用having,如果对没有select 的字段进行过滤的话,就会找不到column,但是where不会出现这种情况。