join on 和 left join on的区别,他们和直接两张表关联查询(使用,连接)的区别

1、背景:

        在数据库多表查询数据的时候发现问题,使用(,)连接,查询的结果竟然少很多,使用left join on就没问题。所以就仔细研究了一下。

        JOIN ON、LEFT JOIN ON 和直接使用逗号连接表(隐式内连接)是 SQL 中三种常见的表关联方式,它们在语法、功能和适用场景上有所不同。以下从定义、语法、功能、适用场景和示例等方面进行详细对比。

1. 定义和功能

(1)JOIN ON(内连接)
  • 定义:JOIN ON 默认是内连接(INNER JOIN),它返回两个表中满足连接条件的记录。如果某条记录在任一表中没有匹配项,则该记录不会出现在结果集中。
  • 功能:强调数据的精确匹配,适用于需要严格匹配的场景。
(2)LEFT JOIN ON(左连接)
  • 定义:LEFT JOIN ON 返回左表中的所有记录,以及右表中满足连接条件的记录。如果右表中没有匹配的行,则右表的列将填充为 NULL。
  • 功能:保留左表的完整性,即使右表中没有匹配的记录,也能保证左表的记录出现在结果集中。
(3)逗号连接(隐式内连接)
  • 定义:逗号连接是早期 SQL 语法中的一种隐式内连接方式,通过逗号分隔表名,并在 WHERE 子句中指定连接条件。
  • 功能:类似于内连接,返回两个表中满足连接条件的记录。如果某条记录在任一表中没有匹配项,则该记录不会出现在结果集中。

2. 语法结构

(1)JOIN ON(内连接)
SELECT column1, column2, ...
FROM table1 JOIN table2
ON table1.commoncolumn = table2.commoncolumn;
(2)LEFT JOIN ON(左连接)
SELECT column1, column2, ...
FROM table1 LEFT JOIN table2
ON table1.commoncolumn = table2.commoncolumn;
(3)逗号连接(隐式内连接)
SELECT column1, column2, ...
FROM table1, table2
WHERE table1.commoncolumn = table2.commoncolumn;

3. 功能对比

对比维度JOIN ON(内连接)LEFT JOIN ON(左连接)逗号连接(隐式内连接)
结果集范围仅返回满足连接条件的记录返回左表所有记录,右表不匹配时为 NULL仅返回满足连接条件的记录
左表完整性不保留左表完整性保留左表完整性不保留左表完整性
右表完整性不保留右表完整性不保留右表完整性不保留右表完整性
连接条件位置在 ON 子句中指定在 ON 子句中指定在 WHERE 子句中指定
性能优化优化器更易理解连接逻辑可能更消耗资源,建议右表创建索引优化器较难理解,可能影响性能

 

4. 适用场景

(1)JOIN ON(内连接)
  • 适用场景:需要两个表中的数据严格匹配时,例如查询两个表中都存在的记录。
  • 示例:查询有部门的员工信息。
  SELECT e.name, d.department_name
  FROM employees e JOIN departments d
  ON e.department_id = d.id;
(2)LEFT JOIN ON(左连接)
  • 适用场景:需要保留左表完整性时,例如查询所有员工信息,包括没有部门的员工。
  • 示例:查询所有员工及其部门信息,没有部门的员工部门字段为 NULL。
  SELECT e.name, d.department_name
  FROM employees e LEFT JOIN departments d
  ON e.department_id = d.id;
(3)逗号连接(隐式内连接)
  • 适用场景:适用于简单查询,但现代 SQL 建议避免使用,因为它可能降低可读性和性能。
  • 示例:查询有部门的员工信息。
  SELECT e.name, d.department_name
  FROM employees e, departments d
  WHERE e.department_id = d.id;

5、实际遇到的问题

(1)使用,连接
SELECT A.RECORDERCODE 提报单位编码,
       A.REMARK       备注,
       B.DESC1        换算单位,
       B.DESC2        换算分子,
       B.DESC3        换算分母
  FROM MDM_*****_CODE A, MDM_****_CODELIST B
 WHERE A.CODEID = B.CODEID
   AND A.DESC11 = '有效'
   AND A.CATEGORYCODE LIKE 'A01%'
   AND LENGTH(A.CATEGORYCODE) = 7;

(2)使用 left join on
SELECT A.RECORDERCODE 提报单位编码,
       A.REMARK       备注,
       B.DESC1        换算单位,
       B.DESC2        换算分子,
       B.DESC3        换算分母
  FROM MDM_***_CODE A
  LEFT JOIN MDM_****_CODELIST B
    ON A.CODEID = B.CODEID
   AND A.DESC11 = '有效'
   AND A.CATEGORYCODE LIKE 'A28%'
   AND LENGTH(A.CATEGORYCODE) = 7;

     (3) 总结

        其实,内连接,逗号连接(隐式内连接),对于被连接表要展示的列如果都没有值,并非NULL,是不会作为结果展示出来的。如果关联表要显示的列空值较多,还需要展示出来这种情况就需要注意了。

6. 注意事项

  • 性能优化
    • JOIN ON 和 LEFT JOIN ON 的连接条件在 ON 子句中,数据库优化器更容易理解,从而优化查询性能。
    • 逗号连接的连接条件在 WHERE 子句中,优化器较难理解,可能导致性能下降。
  • 可读性和维护性
    • JOIN ON 和 LEFT JOIN ON 的语法更清晰,易于维护。
    • 逗号连接的语法较为隐晦,特别是当连接条件复杂时,可读性较差。
  • WHERE 和 ON 的区别
    • 在 JOIN 操作中,ON 子句用于指定连接条件,WHERE 子句用于过滤最终结果集。
    • 在 LEFT JOIN 中,ON 子句的条件不会过滤左表的记录,但 WHERE 子句会过滤左表的记录。

7. 总结

  • JOIN ON(内连接):适用于需要精确匹配的场景,仅返回两个表中都存在的记录。
  • LEFT JOIN ON(左连接):适用于需要保留左表完整性的场景,即使右表中没有匹配项,左表的记录也会被保留。
  • 逗号连接(隐式内连接):功能上等同于内连接,但语法较为隐晦,建议使用 JOIN ON 替代以提高可读性和性能。

根据实际业务需求和查询目标选择合适的连接方式,可以显著提升查询的效率和结果集的准确性。

### MyBatis 中 Join Left Join区别数据库查询中,`JOIN` `LEFT JOIN` 是用于连接多个的关键字,在 MyBatis 进行多关联查询时也广泛应用这两种方式。 #### Join 关键字 当使用 `JOIN`(内联接)时,只有那些满足连接条件的记录才会被返回。这意味着两个中的匹配项都存在的情况下才会有结果输出。对于不满足条件的数据,则不会显示出来[^1]。 ```sql SELECT t.id, t.no, t.type FROM demo t JOIN demo2 t1 ON (t.demo2id = t1.id AND t.type = 2) WHERE t.deleted = 0; ``` 这段 SQL 将仅展示 `demo` 中有对应 `demo2` 记录且类型等于 2 并未删除的所有条目。 #### Left Join 关键字 而采用 `LEFT JOIN`(左外联接),即使右侧没有相配对的信息也会保留左侧所有的原始数据,并将右边不符合条件的部分字段填充为 NULL 值来示缺失值[^3]。 ```sql SELECT t.id, t.no, t.type, t1.name AS demo2Name FROM demo t LEFT JOIN demo2 t1 ON (t.demo2id = t1.id AND t.type = 2) WHERE t.deleted = 0; ``` 此语句会列出所有符合条件 (`type=2`) 或者已被标记为已删除之外的所有 `demo` 条目的 ID 号码及其编号类别;同时还会尝试获取相应的名称来自另一个(`demo2`)。如果没有找到合适的关联对象,则这些额外列将会为空(null)。 通过上述对比可以看出: - **Join**: 返回的是两张或多张之间的交集部分; - **Left Join**: 不仅仅限于共同存在的记录,还包括左边那张里独有的全部内容。 因此,在实际开发过程中应根据业务逻辑的需求选择合适类型的联结方法来进行有效的多联合检索操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值