mysql中的join和where优先级顺序解读

目录
  • mysql 的 join 和 where 优先级
    • 定义
    • 测试数据表
    • 查询 sql 及结果
  • 总结

mysql 的 join 和 where 优先级

定义

join功能

  • inner join(内连接,或等值连接) : 获取两个表中字段匹配关系的记录。
  • left join (左连接) : 获取左表所有记录,即使右表没有对应匹配的记录。
  • right join (右连接) : 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

where

where 是 mysql 语句的查询条件

测试数据表

  • 表 a1
x y
1 10
2 20
3 30
  • 表 a2
x y
10 100
20 200
20 300
create table if not exists `a1`(
    `x` int(10),
    `y` int(10)
);

create table if not exists `a2`(
    `y` int(10),
    `z` int(10)
)

查询 sql 及结果

正常左连接

select * from a1 left join a2 on a1.y = a2.y;
x y y z
1 10 10 100
2 20 20 200
2 20 20 300
3 30 NULL NULL

左连情况下, 由于左边a1.y = 30在右表无数据所以右表数据 (y,z)为 NULL

左连 on && and

select * from a1 left join a2 on a1.y = a2.y and a2.y = 10;
x y y z
1 10 10 100
2 20 NULL NULL
3 30 NULL NULL

由于是左连, 所以判断 (a1.y = a2.y && a2.y = 10) 只能筛选出(10, 100)与左边匹配, 所以后面均为 NULL.

即实际优先级是

select * from (a1 left join a2 on a1.y = a2.y and a2.y = 10)

左连 on && where

select * from a1 left join a2 on a1.y = a2.y where a2.y = 10;
x y y z
1 10 10 100

只有一条数据, 因此可判断其优先级为

select * from (a1 left join a2 on a1.y = a2.y) where a2.y = 10​​​​​​​

也就是说 会先左连生成临时表, 然后再在整体表上进行 where 查询.

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • MySQL left join操作中on和where放置条件的区别介绍

    优先级 两者放置相同条件,之所以可能会导致结果集不同,就是因为优先级.on的优先级是高于where的. 首先明确两个概念: LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行. 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在left join下,两者的区别: on是在生成临时表的时候使用的条件,不管on的条件是否起到作用,都会返回左表 (table_nam

  • mysql中的join和where优先级顺序解读

    目录 mysql 的 join 和 where 优先级 定义 测试数据表 查询 sql 及结果 总结 mysql 的 join 和 where 优先级 定义 join功能 inner join(内连接,或等值连接) : 获取两个表中字段匹配关系的记录. left join (左连接) : 获取左表所有记录,即使右表没有对应匹配的记录. right join (右连接) : 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录. where where 是 mysql 语

  • mysql中left join设置条件在on与where时的用法区别分析

    本文实例讲述了mysql中left join设置条件在on与where时的用法区别.分享给大家供大家参考,具体如下: 一.首先我们准备两张表来进行测试. CREATE TABLE `a` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(32) DEFAULT '' COMMENT '名称', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET

  • 在MySQL中使用JOIN语句进行连接操作的详细教程

    到目前,我们已经学习了从一个表中获取数据.这是简单的需要,但在大多数现实MySQL的使用,经常需要将数据从多个表中的一个单一的查询. 可以使用多个表中的单一SQL查询.在MySQL中联接(join)行为是指两个或多个表到一个表中可以使用连接在SELECT,UPDATE和DELETE语句中加入MySQL表.我们将看到一个例子LEFT JOIN简单的MySQL连接. 在命令提示符使用联接: 假设我们两个表的教程tcount_tbl和tutorials_tbl的完整列表如下: 例子: 试试下面的例子:

  • MySQL中 and or 查询的优先级分析

    这个可能是容易被忽略的问题,首选我们要清楚: MySQL中,AND的执行优先级高于OR.也就是说,在没有小括号()的限制下,总是优先执行AND语句,再执行OR语句. 比如: select * from table where  条件1 AND 条件2 OR 条件3 等价于 select * from table where  ( 条件1 AND 条件2 )  OR 条件3 select * from table where  条件1 AND  条件2 OR 条件3 AND 条件4 等价于 sel

  • mysql中inner join和left join使用详解

    目录 区别 inner join 场景 inner join 场景 区别 返回不同1.inner join只返回两个表中联结字段相等的行2.left join的数量小于等于左表和右表中的记录数量. 数量不同1.inner join返回包括左表中的所有记录和右表中联结字段相等的记录.2.left join的数量以左表中的记录数量相同 记录属性不同1.inner join不足的记录属性会被直接舍弃2.left join不足的记录属性用NULL填充 inner join 场景 设计两张表: chann

  • MySQL中(JOIN/ORDER BY)语句的查询过程及优化方法

    在MySQL查询语句过程和EXPLAIN语句基本概念及其优化中介绍了EXPLAIN语句,并举了一个慢查询例子: 可以看到上述的查询需要检查1万多记录,并且使用了临时表和filesort排序,这样的查询在用户数快速增长后将成为噩梦. 在优化这个语句之前,我们先了解下SQL查询的基本执行过程: 1.应用通过MySQL API把查询命令发送给MySQL服务器,然后被解析 2.检查权限.MySQL optimizer进行优化,经过解析和优化后的查询命令被编译为CPU可运行的二进制形式的查询计划(quer

  • 听说mysql中的join很慢?是你用的姿势不对吧

    目录 驱动表与被驱动表 驱动表和被驱动表有什么差异 基于索引的join join查询中如何选择驱动表 不使用join,执行效率是否会更高 join 是进行两个或多个数据表进行关联查询的过程中,经常使用的一种查询手段.提到join,你一定会想到"笛卡尔积",当数据量很大的时候,"笛卡尔积"运算量会成倍的增加,在我们的印象中,join是一种运算效率不高的查询语句. 除了定性的判断join慢之外,你能定量的判断join的执行效率吗? 经过下面对join执行效率定量分析后,

  • MySQL中的join以及on条件的用法解析

    目录 join的用法:连接 on的用法:添加约束 在数据库中验证 MySQL中连接表时join和on的区别 MySQL中 join的用法:join具有 连接的作用,即当两个或者两个以上的表有关系时,需要用join来连接这些相关的表,来处理或分析数据: join的用法:连接 举例先看看,就懂了: 例如: 有一个表叫做stu,一个表叫class,stu join class会生成一个新的表, 我们执行: stu join class 后,新的表成为: 通过上面的例子总结一下: join后的列名是两个

  • Mysql中的join操作

     join的类型 1.  内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结. 2.  外联结:分为外左联结和外右联结. 案例背景 create table java (name varchar(255)); insert into java values ('java1'),('java2'),('blue'); create table mysql (name varchar(255)); insert into mysql values ('mysql1'),('m

  • MySQL中Nested-Loop Join算法小结

    不知不觉的玩了两年多的MySQL,发现很多人都说MySQL对比Oracle来说,优化器做的比较差,其实某种程度上来说确实是这样,但是毕竟MySQL才到5.7版本,Oracle都已经发展到12c了,今天我就看了看MySQL的连接算法,嗯,现在来说还是不支持Hash Join,只有Nested-Loop Join,那今天就总结一下我学习的心得吧. Nested-Loop Join基本算法实现,伪代码是这样: for each row in t1 matching range { for each r

随机推荐