• 【原创】SQL语句原理解析


    基本的sql语句很好理解这里不做分析,这里只考虑复杂的sql语法和关键词用法的实验分析:

    一,join关联:

    参考:

    https://www.runoob.com/sql/sql-join.html

    作用:

    1,为了生成信息信息更加全面的中间表;
    2,为了where可以使用含有单表外字段的条件
    3,如果既不需要得到更多的字段信息,也不需要where查询更多条件,就不需要关联

    join的使用细节:

    1,2张表的join共有7中可能的结果 4+3(where)
    2,join相当于创建一张临时表使用on作为连接条件,临时表具有更精准的信息
    3,join的两张表之间的关系相当于ER实体之间的关系,所有在连接的时候可能会产生更多的行,这些行里面可能会很多null值
    4,如果是3张或以上表的join,从左往右分解成2张表的join关系

    二,where,having与group by连用的区别

    select 列a,聚合函数 from 表名 where 过滤条件 group by 列a having 过滤条件

    group by 字句也和where条件语句结合在一起使用。当结合在一起时,where在前,group by 在后。即先对select xx from xx的记录集合用where进行筛选,然后再使用group by 对筛选后的结果进行分组 使用having字句对分组后的结果进行筛选

    需要注意having和where的用法区别:

    1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。

    2.where肯定在group by 之前

    3.where后的条件表达式里不允许使用聚合函数,而having可以。

    三、当一个查询语句同时出现了where,group by,having,order by的时候,

    执行顺序和编写顺序是:

    1.执行where xx对全表数据做筛选,返回第1个结果集。

    2.针对第1个结果集使用group by分组,返回第2个结果集。

    3.针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。

    4.针对第3个结集执行having xx进行筛选,返回第4个结果集。

    5.针对第4个结果集排序。

    举例:
    按由高到低的顺序显示个人平均分在70分以上的学生姓名和平均分,为了尽可能地提高平均分,在计算平均分前不包括分数在60分以下的成绩,并且也不计算贱人(jr)的成绩。
     
    分析:
    1.要求显示学生姓名和平均分
    因此确定第1步
    select s_name,avg(score) from student
    2.计算平均分前不包括分数在60分以下的成绩,并且也不计算贱人(jr)的成绩
    因此确定第2步 
    where score>=60 and s_name !=’jr’
    3.显示个人平均分
    相同名字的学生(同一个学生)考了多门科目 因此按姓名分组
    确定第3步 
    group by s_name
    4.显示个人平均分在70分以上
    因此确定第4步 
    having avg(s_score)>=70
     5.按由高到低的顺序
    因此确定第5步
    order by avg(s_score) desc

    四,子查詢

    子查询是一个比较复杂的话题,需要一篇的篇幅分析,请查看

    https://www.cnblogs.com/tkzc2013/p/10767336.html

    五,表连接与连接查询

    https://blog.csdn.net/xiao1_1bing/article/details/81112620

    六,SQL执行顺序

    –第一步:执行FROM

    –第二步:WHERE条件过滤

    –第三步:GROUP BY分组

    –第四步:执行SELECT投影列,聚集函数

    –第五步:HAVING条件过滤

    –第六步:执行ORDER BY 排序

    举例:

    //错误写法
    SELECT student_class, AVG(student_age) FROM t_student WHERE AVG(student_age)>20 GROUP BY student_class;
    //正确写法
    SELECT student_class, AVG(student_age) FROM t_student GROUP BY (student_class) HAVING AVG(student_age)>20;
  • 相关阅读:
    电话号码的字母组合(力扣第17题)
    太平洋大西洋水流问题(力扣第417题)
    被围绕的区域(力扣第130题)
    ZooKeeper的本地安装和分布式安装
    朋友圈(力扣第547题)
    岛屿数量(力扣第200题)
    岛屿的最大面积(力扣第695题)
    再论力扣第279题--完全平方数
    .net core使用CSRedisCore连接哨兵集群,并用作redis使用分布式缓存。
    使用docker搭建reids主从,哨兵。
  • 原文地址:https://www.cnblogs.com/tkzc2013/p/10766530.html
Copyright © 2020-2023  润新知