MySQL七种Join详解——让你轻松搞定数据表连接
在SQL语言中,Join操作是进行多表联合查询的重要技巧之一。MySQL中提供了七种不同的join类型,分别是inner join、left join、right join、full outer join、cross join、self join和union join。本文将对这七种Join类型进行详细解释和演示。
1. inner join
inner join又称为等值连接,它是根据两个表中的某个共同的列,将两个表中的数据连接起来。在inner join中,只有两个表中的共同部分会显示,其余没有共同的数据将被忽略掉。如下面的两个表:
表1:employees
| emp_id | first_name | last_name | job_title | salary |
|——-|————|———–|—————-|——–|
| 1 | John | Doe | Manager | 5000 |
| 2 | Jane | Smith | Sales Associate| 3000 |
| 3 | Tom | Jones | Sales Manager | 6000 |
表2:departments
| dept_id | dept_name |
|———|————-|
| 1 | HR |
| 2 | Sales |
| 3 | Operations |
要将这两个表通过emp_id连接起来,可以使用下面的SQL语句:
SELECT *
FROM employees
INNER JOIN departments ON employees.emp_id = departments.emp_id;
2. left join
left join也叫左连接,它会显示左表中的所有记录,并且只显示右表中与左表有共同记录的数据。如果右表中没有与左表匹配的记录,则该部分为空值。如下面的两个表:
表1:employees
| emp_id | first_name | last_name | job_title | salary |
|——-|————|———–|—————-|——–|
| 1 | John | Doe | Manager | 5000 |
| 2 | Jane | Smith | Sales Associate| 3000 |
| 3 | Tom | Jones | Sales Manager | 6000 |
表2:departments
| dept_id | dept_name |
|———|————-|
| 1 | HR |
| 2 | Sales |
要将这两个表通过dept_id连接起来,可以使用下面的SQL语句:
SELECT *
FROM employees
LEFT JOIN departments ON employees.dept_id = departments.dept_id;
3. right join
right join也叫右连接,它与left join正好相反,会显示右表中的所有记录,并且只显示左表中与右表有共同记录的数据。如果左表中没有与右表匹配的记录,则该部分为空值。如下面的两个表:
表1:employees
| emp_id | first_name | last_name | job_title | salary |
|——-|————|———–|—————-|——–|
| 1 | John | Doe | Manager | 5000 |
| 2 | Jane | Smith | Sales Associate| 3000 |
| 3 | Tom | Jones | Sales Manager | 6000 |
表2:departments
| dept_id | dept_name |
|———|————-|
| 2 | Sales |
| 3 | Operations |
要将这两个表通过dept_id连接起来,可以使用下面的SQL语句:
SELECT *
FROM employees
RIGHT JOIN departments ON employees.dept_id = departments.dept_id;
4. full outer join
full outer join也叫全外连接,它会把左右两个表中的所有记录都显示出来,并在没有匹配的记录处填充空值。如下面的两个表:
表1:employees
| emp_id | first_name | last_name | job_title | salary |
|——-|————|———–|—————-|——–|
| 1 | John | Doe | Manager | 5000 |
| 2 | Jane | Smith | Sales Associate| 3000 |
表2:departments
| dept_id | dept_name |
|———|————-|
| 2 | Sales |
| 3 | Operations |
要将这两个表通过dept_id连接起来,可以使用下面的SQL语句:
SELECT *
FROM employees
FULL OUTER JOIN departments ON employees.dept_id = departments.dept_id;
5. cross join
cross join也叫笛卡尔积查询,它是将两个表中的所有数据进行全排列的方式进行连接。如下面的两个表:
表1:employees
| emp_id | first_name | last_name | job_title | salary |
|——-|————|———–|—————-|——–|
| 1 | John | Doe | Manager | 5000 |
| 2 | Jane | Smith | Sales Associate| 3000 |
表2:departments
| dept_id | dept_name |
|———|————-|
| 2 | Sales |
| 3 | Operations |
要将这两个表进行cross join连接,可以使用下面的SQL语句:
SELECT *
FROM employees
CROSS JOIN departments;
6. self join
self join也叫自连接,它主要是用于连接同一个表的不同记录。假如有一个表,里面有一个字段包含了另一个字段的所有值,此时可以使用self join来查询这个表。如下面的表:
表:employee
| emp_id | first_name | last_name | manager_id | salary |
|——-|————|———–|—————-|——–|
| 1 | John | Doe | 3 | 5000 |
| 2 | Jane | Smith | 3 | 3000 |
| 3 | Tom | Jones | -1 | 6000 |
| 4 | Bob | Johnson | 1 | 4000 |
要对这个表进行self join操作,可以使用下面的SQL语句:
SELECT *
FROM employee e1, employee e2
WHERE e1.manager_id = e2.emp_id;
7. union join
union join也叫联合查询,它是将两个或多个查询结果合并成一个结果集合。如下面的两个表:
表1:employees
| emp_id | first_name | last_name | job_title | salary |
|——-|————|———–|—————-|——–|
| 1 | John | Doe | Manager | 5000 |
| 2 | Jane | Smith | Sales Associate| 3000 |
表2:suppliers
| supplier_id | supplier_name | city |
|————-|—————|———|
| 1 | A | London |
| 2 | B | New York|
要将这两个表进行union join操作,可以使用下面的SQL语句:
SELECT first_name, last_name, job_title AS type
FROM employees
UNION
SELECT supplier_name AS first_name, city AS last_name, 'supplier' AS type
FROM suppliers;
总结
MySQL提供了七种不同的Join类型,分别是inner join、left join、right join、full outer join、cross join、self join和union join。掌握这些Join的使用方法,可以让我们轻松搞定数据表连接,提高数据查询效率,同时也能让我们更好地处理数据分析和处理工作。