1.1 什么是join
查询?
join
查询,即连接查询,当我们需要查询两张或两张以上表的关联数据的时候就需要使用连接查询,数据库中的连接查询分为:内连接查询(INNER JOIN
)、左外连接查询(LEFT OUTER JOIN
或 LEFT JOIN
)、右连接查询(RIGHT OUTER JOIN
或RIGHT JOIN
)以及全连接查询(FULL OUTER JOIN
)。
1.2 内连接、外连接、全连接查询之间的区别是什么?
类型 | 描述 | 图示 |
---|---|---|
INNER JOIN | 内连接查询,会把关联表中,有关联关系的所有记录查询出来 | |
LEFT JOIN | 左连接查询,它会以左表为主表,并且会将左表中的所有记录查询出来,如果右表没有与之对应关联数据,则用NULL 填充指定字段 |
|
RIGHT JOIN | 右连接查询,它会以右表为主表,并且会将右表中的所有记录都查询出来,如果左表中没有与之对应的关联数据,则用NULL 填充左表中的指定字段 |
|
FULL OUTER JOIN | 全连接查询,会将关联表中的所有数据都查询出来 |
1.3 常见的七种join
查询
1.3.1 使用mysql实现以上七种join
查询
部门表
SELECT * FROM tbl_dept;
查询结果:
员工表
SELECT * FROM tbl_emp;
查询结果:
1.3.1.1 内连接查询
#内连接查询 查询两张表都有的记录
SELECT * FROM tbl_dept dept
INNER JOIN tbl_emp emp
ON dept.id=emp.id;
查询结果:
1.3.1.2 左连接查询
#左连接查询 只查询左表中有的记录
SELECT * FROM tbl_dept dept
LEFT JOIN tbl_emp emp
ON dept.id=emp.deptId;
查询结果:
1.3.1.3 右连接查询
#右连接查询
SELECT * FROM tbl_dept dept
RIGHT JOIN tbl_emp emp
ON dept.id=emp.deptId;
查询结果:
1.3.1.4 只查询左表中独有的数据
#查询dept表中独有的记录
SELECT * FROM tbl_dept dept
LEFT JOIN tbl_emp emp
ON dept.id=emp.deptId
WHERE emp.deptId IS NULL;
查询结果:
1.3.1.5 只查询右表中独有的数据
#查询emp表中独有的记录
SELECT * FROM tbl_dept dept
RIGHT JOIN tbl_emp emp
ON dept.id=emp.deptId
WHERE dept.id IS NULL;
查询结果:
1.3.1.6 全连接查询
注意:
因为mysql不支持full outer join所以通过union实现全连接查询
#把两张表中的记录都查询出来 并进行去重 因为mysql不支持full outer join所以通过union实现全连接查询
SELECT * FROM tbl_dept dept
LEFT JOIN tbl_emp emp
ON dept.id=emp.deptId
UNION
SELECT * FROM tbl_dept dept
RIGHT JOIN tbl_emp emp
ON dept.id=emp.deptId;
查询结果:
1.3.1.7 查询两张表中各自独有的数据
#查询两张表中所有没有关联关系的记录
SELECT * FROM tbl_dept dept
LEFT JOIN tbl_emp emp
ON dept.id=emp.deptId
WHERE emp.deptId IS NULL
UNION
SELECT * FROM tbl_dept dept
RIGHT JOIN tbl_emp emp
ON dept.id=emp.deptId
WHERE dept.id IS NULL;
查询结果: