在MySQL中,JOIN操作用于将两个或多个表的行结合在一起,基于这些表之间的共同列,这是数据库查询中最常用的操作之一,因为它允许我们从多个表中获取数据。
1. INNER JOIN(内连接)
INNER JOIN是最常用的JOIN类型,它返回两个表中都有匹配的行,如果在一个表中存在某个值,而在另一个表中没有匹配的值,则不返回该值。
我们有两个表,一个是employees
,一个是departments
:
employees
表:
id | name | department_id |
1 | Tom | 1 |
2 | Bob | 2 |
3 | Alice | 3 |
departments
表:
id | name |
1 | Sales |
2 | Marketing |
3 | IT |
如果我们想要获取每个员工及其对应的部门名称,我们可以使用INNER JOIN:
SELECT employees.name, departments.name FROM employees INNER JOIN departments ON employees.department_id = departments.id;
这将返回以下结果:
employees.name | departments.name |
Tom | Sales |
Bob | Marketing |
Alice | IT |
2. LEFT JOIN(左连接)
LEFT JOIN返回左表中的所有行,即使右表中没有匹配的值,如果在右表中没有匹配的值,则结果是NULL。
如果我们只对部门进行查询,而不关心员工的名字,我们可以使用LEFT JOIN:
SELECT departments.name, employees.name FROM employees LEFT JOIN departments ON employees.department_id = departments.id;
这将返回以下结果:
departments.name | employees.name |
Sales | Tom |
Marketing | Bob |
IT | Alice |
NULL | NULL |
注意,最后一行表示没有员工的部门。
3. RIGHT JOIN(右连接)
RIGHT JOIN返回右表中的所有行,即使左表中没有匹配的值,如果在左表中没有匹配的值,则结果是NULL,这与LEFT JOIN相反。
如果我们只对员工进行查询,而不关心部门的名称,我们可以使用RIGHT JOIN:
SELECT employees.name, departments.name FROM employees RIGHT JOIN departments ON employees.department_id = departments.id;
这将返回与LEFT JOIN相同的结果,因为无论我们是左连接还是右连接,只要我们更改了表的顺序,结果都会相同,这是因为MySQL首先处理第一个表,然后将其结果与第二个表进行比较,改变表的顺序不会影响结果。
4. FULL JOIN(全连接)
FULL JOIN返回左表和右表中的所有行,如果没有匹配的值,则结果是NULL,这相当于LEFT JOIN和RIGHT JOIN的组合,FULL JOIN并不是MySQL的标准语法,我们需要使用LEFT JOIN和UNION来模拟全连接。
SELECT employees.name, departments.name FROM employees LEFT JOIN departments ON employees.department_id = departments.id UNION ALL SELECT employees.name, departments.name FROM employees RIGHT JOIN departments ON employees.department_id = departments.id;
这将返回与LEFT JOIN和RIGHT JOIN相同的结果,这种方法的效率较低,因为它需要执行两次查询,除非必要,否则最好避免使用FULL JOIN。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/508103.html