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

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

    ①.手写
    写手Sql图

    ②. 机读
    机读Sql图
  2. sql解析顺序


    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不会出现这种情况。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 50个常用的sql语句Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname...
    哈哈海阅读 1,266评论 0 7
  • 50个常用的sql语句 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cna...
    最美的太阳WW阅读 3,281评论 0 23
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,874评论 18 399
  • 马应天 前天与韩总聊天,谈到未来的孩子思想与现在成人有何不同的时候,韩总说:随着时代的进步,...
    破土的芬芳阅读 429评论 0 1