程序汪发掘在MySQL中,内连接、左连接和右连接都是用来从两个或多个表中按照某些相关要求检索数据的方式,它们的重点区别在于返回结果集的规则区别。下面经过详细案例来讲明这些区别:
假设有两个表:employees(员工表): 包括员工ID (emp_id) 和姓名 (name)。departments(分部表): 包括分部ID (dept_id) 和分部名叫作 (dept_name)。并且假设不是每一个员工都有知道的分部分配。内连接 (INNER JOIN)
内连接只返回两个表中匹配的行。倘若在一边的表中无匹配项,那样这些行就不会出此刻结果集中。
SQL 示例: SELECT
employees.name, departments.dept_name FROM
employees INNER JOIN departments ON
employees.emp_id = departments.dept_id;
结果:
仅表示哪些在employees表中有对应分部ID的员工及其分部名叫作。 左连接 (LEFT JOIN 或 LEFT OUTER JOIN)
左连接返回左表(LEFT JOIN后面的表)的所有行,即使在右表中无匹配。倘若右表中无匹配项,则结果集中右表的部分将为NULL。
SQL 示例: SELECT
employees.name, departments.dept_name FROM
employees LEFT JOIN departments ON
employees.emp_id = departments.dept_id;
结果:
表示所有员工的姓名,即使某些员工无分配到分部(这些员工的dept_name字段值为NULL)。
右连接 (RIGHT JOIN 或 RIGHT OUTER JOIN)
右连接与左连接相反,它返回右表(RIGHT JOIN后面的表)的所有行,即使在左表中无匹配。倘若左表中无匹配项,则结果集中左表的部分将为NULL。
SQL 示例: SELECT
employees.name, departments.dept_name FROM
employees RIGHT JOIN departments ON
employees.emp_id = departments.dept_id;
结果:
表示所有分部名叫作,即使某些分部还无任何员工分配(这些行的name字段值为NULL)。
总结内连接:返回两个表中匹配的记录。左连接:返回左表的所有记录,加上右表中匹配的记录,右表无匹配的记录以NULL填充。右连接:返回右表的所有记录,加上左表中匹配的记录,左表无匹配的记录以NULL填充。按照你的数据需求选取合适的连接类型,以保证你得到期望的结果集。
---------------------------------------------------------------------------------------------
当然,让咱们经过一个详细的例子来讲明MySQL中的内连接、左连接、右连接的区别。假设咱们有两个表:一个是employees(员工表),另一个是departments(分部表)。
employees 表: employee_idfirst_namedepartment_id1程序汪1012Bob1023Carol1014DaveNULLdepartments 表: department_iddepartment_name101HR102IT103Finance内连接 (INNER JOIN)
内连接只返回两个表中匹配的记录。如果employees表中的某行在departments表中找不到对应的department_id,那样这行就不会出此刻结果集中。一样,departments表中倘若无员工,则亦不会出此刻结果中。
SQL 示例: SELECT
employees.first_name, departments.department_name FROM
employees INNER JOIN departments ON
employees.department_id = departments.department_id;
结果:
first_namedepartment_name程序汪 HRBobITCarolHR左连接 (LEFT JOIN)
左连接返回employees表(左表)的所有记录,即使在departments表中无匹配。倘若departments表中无匹配的记录,那样结果集中对应的department_name字段将会是NULL。
SQL 示例: SELECT
employees.first_name, departments.department_name FROM
employees LEFT JOIN departments ON
employees.department_id = departments.department_id;
结果: first_namedepartment_name程序汪HRBobITCarolHRDaveNULL右连接 (RIGHT JOIN)
右连接与左连接相反,它返回departments表(右表)的所有记录,即使在employees表中无匹配。倘若employees表中无匹配的记录,那样结果集中对应的first_name字段将会是NULL。
SQL 示例: SELECT
employees.first_name, departments.department_name FROM
employees RIGHT JOIN departments ON
employees.department_id = departments.department_id;
结果: first_namedepartment_name程序汪HRBobITCarolHRNULLFinance经过这些例子,你能够看到内连接、左连接、右连接分别怎样按照相关要求决定结果集的内容,帮忙你在区别场景下选取最合适的连接类型。
总结内连接:返回两个表中匹配的记录。左连接:返回左表的所有记录,加上右表中匹配的记录,右表无匹配的记录以NULL填充。右连接:返回右表的所有记录,加上左表中匹配的记录,左表无匹配的记录以NULL填充。按照你的数据需求选取合适的连接类型,以保证你得到期望的结果集。然则要求过滤时必须重视 on 和 where 的位置不可乱用,详细能够见下面文案
面试官:left join 后用 on 还是 where?
|