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

  

今天工作中碰到一个sql问题,关于左加入的,后面虽然解决了,但是通过此问题了解了一下sql的执行顺序

  

场景还原

  

为避免安全纠纷,把场景模拟。

  

有一个学生表- s,一个成绩表G

        创建表“test_student”(   “id”bigint (20) NOT NULL评论“学号”,   “性”非常小的整数默认“0”评论“性别0 -男1女”,   “名字”varchar(255)默认空评论的姓名”   )引擎=InnoDB CHARSET=utf8mb4评论='学生表”;      创建表“test_score”(   “id”bigint (20) NOT NULL评论“学号”,   “分数”int NOT NULL评论“分数”,   “水平”非常小的整数评论“成绩0 -不及格1 -及2 -优格良3 -优秀的   )引擎=InnoDB CHARSET=utf8mb4评论='成绩表”;      ——初始化学生   插入test_student值(1,0,张三”),(2 0”李四”),(3、1,“王X芳”);            ——初始化成绩   插入test_score值(1 10 0),(2,20岁,0)、(100 3),      

现在有一个需求,查出学生的考试成绩,可能的sql

        选择ts.name作为“名”字,tc。得分为“分数”   从test_student ts   离开加入test_score tc   在ts.id=tc.s_id;      

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

  

一切都很顺利,突然,刚考完试,就转来一个学生

        插入test_student值(4 0的新来的”);      

他没成绩,还是刚才的sql查

  

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

  

老师只要看参加考试的学生的成绩,怎么办
  

  

<强> 1。用内连接

        选择ts.name作为“名”字,tc。得分为“分数”   从test_student ts   内连接test_score tc   在ts.id=tc.s_id;      

<强> 2。加条件过滤

        选择ts.name作为“名”字,tc。得分为“分数”   从test_student ts   离开加入test_score tc   在ts.id=tc.s_id   和tc。分数不是零   ;      

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

  

发现加了条件过滤还是不对,额,改用在哪里呢

        选择ts.name作为“名”字,tc。得分为“分数”   从test_student ts   离开加入test_score tc   在ts.id=tc.s_id   tc。分数不是零   ;      

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

  

宾果,那为什么就对了呢。

  

这就涉及到sql的执行顺序了

  

<强>与加入在

  

从上面的例子推断

  

,会从结果集中过滤出符合条件的记录,不符合条件的丢弃

  

加入操作:有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行加入。

  

除了我们在上面的例子中使用的内连接(内连接),我们还可以使用其他几种连接。

  

下面列出了您可以使用的加入类型,以及它们之间的差异。

  
      <李>加入:如果表中有至少一个匹配,则返回行   <李>左加入:即使右表中没有匹配,也从左表返回所有的行   <李>正确的加入:即使左表中没有匹配,也从右表返回所有的行   <李>完全加入:只要其中一个表中存在匹配,就返回行<强> (mysql不支持,可以考虑用视图实现)   
  

这里推荐一个写的通俗易懂的简单学习SQL的各种连接加入

  

<强> sql顺序

  

从上面看的到,在sql中,上是写在了那里的条件之前,那么数据库引擎分析执行sql时,是在也否是在哪里前面呢& # 63;

  

一般sql的写法顺序

  

1。选择[列名称*代表所有的列)

  

2。从[表名称)

  

3。join_type加入(表名称)

  

4。在[加入条件)

  

5。在[过滤条件)

  

6。集团(分组字段)

  

7。在[分组条件)

  

8。ORDER BY(排序字段)

  

那么sql在执行时,顺序是怎样的呢?

  

<强>标准的sql解析顺序为:

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