加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

相关mysql中sql的执行顺序的小问题

发布时间:2022-03-13 16:42:26 所属栏目:编程 来源:互联网
导读:天工作中碰到一个sql问题,关于left join的,后面虽然解决了,但是通过此问题了解了一下sql的执行顺序 场景还原 为避免安全纠纷,把场景模拟。 有一个学生表-S,一个成绩表G CREATE TABLE `test_student` ( `id` bigint(20) NOT NULL COMMENT 学号, `sex` TI
  天工作中碰到一个sql问题,关于left join的,后面虽然解决了,但是通过此问题了解了一下sql的执行顺序
 
  场景还原
 
  为避免安全纠纷,把场景模拟。
 
  有一个学生表-S,一个成绩表G
 
  CREATE TABLE `test_student` (
   `id` bigint(20) NOT NULL COMMENT '学号',
   `sex` TINYINT DEFAULT '0' COMMENT '性别 0-男 1-女',
   `name` varchar(255) DEFAULT NULL COMMENT '姓名'
  ) ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='学生表';
  
  CREATE TABLE `test_score` (
   `id` bigint(20) NOT NULL COMMENT '学号',
   `score` int NOT NULL COMMENT '分数',
   `level` TINYINT COMMENT '成绩 0-不及格 1-及格 2-优良 3-优秀'
  ) ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='成绩表';
  
  -- 初始化学生
  INSERT INTO test_student VALUES(1, 0, '张三'), (2, 0, '李四'), (3, 1, '王X芳');
  -- 初始化成绩
  INSERT INTO test_score VALUES(1, 10, 0), (2, 20, 0), (3, 100, 3);
  现在有一个需求,查出学生的考试成绩,可能的sql
 
  SELECT ts.name AS '名字', tc.score AS '分数'
  FROM test_student ts
  LEFT JOIN test_score tc
  ON ts.id = tc.s_id;
  有关mysql中sql的执行顺序的小问题
 
  一切都很顺利,突然,刚考完试,就转来一个学生
 
  INSERT INTO test_student VALUES(4, 0, '新来的');
  他没成绩,还是刚才的sql查
 
  有关mysql中sql的执行顺序的小问题
 
  老师只要看参加考试的学生的成绩,怎么办
  1.用inner join
 
  SELECT ts.name AS '名字', tc.score AS '分数'
  FROM test_student ts
  INNER JOIN test_score tc
  ON ts.id = tc.s_id;
  2.加条件过滤
 
  SELECT ts.name AS '名字', tc.score AS '分数'
  FROM test_student ts
  LEFT JOIN test_score tc
  ON ts.id = tc.s_id
  AND tc.score is NOT NULL
  ;
  有关mysql中sql的执行顺序的小问题
 
  发现加了条件过滤还是不对,额,改用where呢
 
  SELECT ts.name AS '名字', tc.score AS '分数'
  FROM test_student ts
  LEFT JOIN test_score tc
  ON ts.id = tc.s_id
  WHERE tc.score is NOT NULL
  ;
  有关mysql中sql的执行顺序的小问题
 
  bingo,那where为什么就对了呢。
 
  这就涉及到sql的执行顺序了
 
  where与join on
 
  从上面的例子推断
 
  where会从结果集中过滤出符合条件的记录,不符合条件的丢弃
 
  join操作:有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。
 
  除了我们在上面的例子中使用的 INNER JOIN(内连接),我们还可以使用其他几种连接。
 
  sql顺序
 
  从上面看到,在sql中,on是写在了where条件之前,那么数据库引擎分析执行sql时,是否on也是在where前面呢?
 
  一般sql的写法顺序
 
  1.SELECT [列名称 *代表所有的列]
 
  2.FROM [表名称]
 
  3.join_type JOIN [表名称]
 
  4.ON [join条件]
 
  5.WHERE [过滤条件]
 
  6.GROUP BY [分组字段]
 
  7.HAVING [分组条件]
 
  8.ORDER BY [排序字段]
 
  那么sql在执行时,顺序是怎样的呢?
 
  标准的sql解析顺序为:
 
  1.FROM    组装数据,来自不同数据源(表)
 
  2.WHERE    根据条件过滤记录
 
  3.GROUP BY 对数据分组
 
  4.计算聚集函数,如avg,sum
 
  5.使用HAVING子句筛选分组
  6.计算所有表达式
 
  7.使用ORDER BY对结果排序

  到了这里,应该发现,要写好sql不容易。但是了解了sql的执行顺序,能在开发的同理,更好的帮助写出好的程序。
 
  比如join表不能太多(先过滤条件然后再根据表连接 同时在表中建立相关查询字段的索引这样在大数据多表联合查询的情况下速度相当快),这种sql优化问题,下次再学习整理下。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读