今天工作中碰到一个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;
一切都很顺利,突然,刚考完试,就转来一个学生
插入test_student值(4 0的新来的”);
他没成绩,还是刚才的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。分数不是零;
发现加了条件过滤还是不对,额,改用在哪里呢
选择ts.name作为“名”字,tc。得分为“分数” 从test_student ts 离开加入test_score tc 在ts.id=tc.s_id tc。分数不是零;
宾果,那为什么就对了呢。
这就涉及到sql的执行顺序了
<强>与加入在强>
从上面的例子推断
,会从结果集中过滤出符合条件的记录,不符合条件的丢弃
加入操作:有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行加入。
除了我们在上面的例子中使用的内连接(内连接),我们还可以使用其他几种连接。
下面列出了您可以使用的加入类型,以及它们之间的差异。
-
<李>加入:如果表中有至少一个匹配,则返回行李>
<李>左加入:即使右表中没有匹配,也从左表返回所有的行李>
<李>正确的加入:即使左表中没有匹配,也从右表返回所有的行李>
<李>完全加入:只要其中一个表中存在匹配,就返回行<强> (mysql不支持,可以考虑用视图实现)强> 李>
这里推荐一个写的通俗易懂的简单学习SQL的各种连接加入
<强> sql顺序强>
从上面看的到,在sql中,上是写在了那里的条件之前,那么数据库引擎分析执行sql时,是在也否是在哪里前面呢& # 63;
一般sql的写法顺序
1。选择[列名称*代表所有的列)
2。从[表名称)
3。join_type加入(表名称)
4。在[加入条件)
5。在[过滤条件)
6。集团(分组字段)
7。在[分组条件)
8。ORDER BY(排序字段)
那么sql在执行时,顺序是怎样的呢?
<强>标准的sql解析顺序为: