笛卡儿积
- 如果两张表进行连接查询的时候没有任何条件限制,最终的查询结果总数是两张表记录的成绩,这个就是笛卡尔积现象
1 |
select ename,dname from emp,dept; |
年代分类
sql92
1 |
select ename,dname from emp as e,dept as d where e.deptno = d.deptno; |
sql99
1 2 3 4 5 6 7 8 9 |
//好一点的格式 select e.ename,d.dname from emp as e join dept as d on e.deptno = d.deptno; |
连接方式
概述
- 在
MySQL
中,表的连接方式主要有内连接(INNER JOIN
)、左连接(LEFT JOIN
)、右连接(RIGHT JOIN
)和全连接(FULL JOIN
) - 此外,还有一些特殊类型的连接,如交叉连接(
CROSS JOIN
)和自连接(SELF JOIN
) - 这些连接方式用于从两个或多个表中提取相关数据
内连接
- 内连接返回两个表中满足连接条件的所有行
- 如果行在任何一个表中没有匹配的,则不会出现在结果集中
等值连接
1 2 3 4 |
SELECT columns FROM table1 INNER JOIN table2 ON table1.column = table2.column; |
非等值连接
1 2 3 4 5 6 7 8 |
select e.ename,e,sal,s.grade from emp as e join salgrade as s on e.sal between s.losal and s.hisal; |
外连接
左连接
- 左连接返回左表中的所有行以及右表中满足连接条件的行
- 如果右表中没有匹配的,则结果集中包含左表的行,右表的列为
NULL
1 2 3 |
SELECT employees.emp_name, departments.dept_name FROM employees LEFT JOIN departments ON employees.dept_id = departments.dept_id; |
右连接
- 右连接返回右表中的所有行以及左表中满足连接条件的行
- 如果左表中没有匹配的,则结果集中包含右表的行,左表的列为
NULL
1 2 3 |
SELECT employees.emp_name, departments.dept_name FROM employees RIGHT JOIN departments ON employees.dept_id = departments.dept_id; |
全连接
MySQL
不直接支持FULL JOIN
,但可以通过联合(UNION
)左连接和右连接来实现全连接- 全连接返回两个表中所有行,如果行在任何一个表中没有匹配的,则结果集中相应的列为
NULL
1 2 3 4 5 6 7 |
SELECT employees.emp_name, departments.dept_name FROM employees LEFT JOIN departments ON employees.dept_id = departments.dept_id UNION SELECT employees.emp_name, departments.dept_name FROM employees RIGHT JOIN departments ON employees.dept_id = departments.dept_id; |
自连接
- 自连接是表与自身的连接,通常用于比较表中的行或处理层次结构数据
- 它可以是内连接(
INNER JOIN
)、外连接(LEFT JOIN
、RIGHT JOIN
)、交叉连接(CROSS JOIN
)的一种
- 它可以是内连接(
1 2 3 4 5 6 7 8 |
select l.ename as leader,e.ename as emp from emp as l join emp as e on l.empno = e.mgr; |
交叉连接
- 交叉连接返回两个表的笛卡尔积,即每个表中的每一行与另一个表中的每一行组合
1 2 3 |
SELECT employees.emp_name, departments.dept_name FROM employees CROSS JOIN departments; |
比较
- 内连接(INNER JOIN):返回两个表中满足连接条件的所有行
- 表1
- 左连接(LEFT JOIN):返回左表中的所有行,以及右表中满足连接条件的行
- 右连接(RIGHT JOIN):返回右表中的所有行,以及左表中满足连接条件的行
- 全连接(FULL JOIN):通过联合左连接和右连接来实现,返回两个表中所有行
- 交叉连接(CROSS JOIN):返回两个表的笛卡尔积
- 自连接(SELF JOIN):表与自身的连接,用于比较表中的行或处理层次结构数据
理解
- 内连接返回成功匹配行的集合
- 外连接会返回所有行的集合,然后根据返回是哪个表是所有行,可以再分成左连接或右连接
- 如果两个表的所有行都返回了,那就是全连接
- 自连接由于是和自己去连,所以它可以按照需求去选择返回匹配行或所有行
- 所以它可能是内连接,也可能是外连接,也可能是交叉连接
- 交叉连接就是返回笛卡尔积,它都不需要连接条件
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 表_唯一约束、非空约束10/26
- ♥ 表_约束-外键10/27
- ♥ 视图10/28
- ♥ 表操作_条件查询-运算符10/23
- ♥ 表_约束-主键10/26
- ♥ 数据处理函数:单行处理函数10/24