MySQL高级第二篇(sql语句解析)

  1. 手写sql顺序与机读sql数据的区别

    ①.手写
    MySQL高级第二篇(sql语句解析)_第1张图片
    写手Sql图

    ②. 机读
    MySQL高级第二篇(sql语句解析)_第2张图片
    机读Sql图
  2. sql解析顺序


    MySQL高级第二篇(sql语句解析)_第3张图片
    sql解析图
  3. 注意:
    ①. sql 解析是从from开始,先是获取笛卡尔积(笛卡尔积的数量是两个表总数的乘积),然后进行过滤
    ②. 若面试官问 where 和 having的区别则从以下几点进行回答:
    1. 最大的区别就是执行顺序不一样,where要比having先执行
    2. 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聚合函数已经执行,所以可以进行过滤。
    3. 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不会出现这种情况。

你可能感兴趣的:(MySQL高级第二篇(sql语句解析))