7、1_连接查询:概念和分类
一 连接查询概述
join 单词本意:连接 连接查询就是多表查询。 实际开发中,我们不可能一张表查询,都是多张表联合查询,取出最终的结果。 在实际开发中,一个业务都会对应多张表。比如学生和班级
一张表的弊端
+-------+--------+-----------+--------------------+ | 学生编号 | 学生名字 | 班级编号 | 班级名称 | +-------+--------+-----------+--------------------+ | 1 | 张三 | 10 | 太原市小店一中高三一班| | 2 | 李四 | 20 | 太原市小店一中高三一班| | 3 | 王五 | 30 | 太原市小店一中高三一班| +-------+--------+-----------+---------------------+
数据会大量重复 造成数据冗余,所以我们必须分为 班级表 和 学生表
二 连接查询的分类
1)内连接 inner join
根据查询条件,取出两张表数据的交集部分
select e.ename,d.ename from emp e inner join emp d on e.mgr = d.empno;
+--------+-------+
| ename | ename |
+--------+-------+
| SMITH | FORD |
| ALLEN | BLAKE |
| WARD | BLAKE |
| JONES | KING |
| MARTIN | BLAKE |
| BLAKE | KING |
| CLARK | KING |
| SCOTT | JONES |
| TURNER | BLAKE |
| ADAMS | SCOTT |
| JAMES | BLAKE |
| FORD | JONES |
| MILLER | CLARK |
+--------+-------+
13 rows in set (0.00 sec)
内连接以两张表为基准,查出13条信息
2)左外连接 left outer join
查询结果有两部分:1 左表的全部信息 2 左右两表符合关联查询条件的信息
左表展示出全部信息,而右表没有则以NULL填充
select
e.ename,d.ename
from emp e
left outer join emp d
on e.mgr = d.empno;
+--------+-------+
| ename | ename |
+--------+-------+
| SMITH | FORD |
| ALLEN | BLAKE |
| WARD | BLAKE |
| JONES | KING |
| MARTIN | BLAKE |
| BLAKE | KING |
| CLARK | KING |
| SCOTT | JONES |
| KING | NULL |
| TURNER | BLAKE |
| ADAMS | SCOTT |
| JAMES | BLAKE |
| FORD | JONES |
| MILLER | CLARK |
+--------+-------+
14 rows in set (0.00 sec)
左外连接以左表为基准,查出了所有员工,保证了数据的完整性
3)右外连接 right outer join
和左外查询一样,以右表为基准。左表匹配不上的,用NULL填充
4)全连接 full join
展示的是a表和b表的全部信息(a和b的并集)。但需要注意的是,对于没有匹配的记录(即a.id和b.id没有一一对应的),则会以null做为值。可以使用IFNULL判断。
mysql不支持,可以用 union 代替
5) 交叉连接 cross join (没有连接条件)
1 不带where条件子句,返回被连接两个表的笛卡尔积,返回结果的函数等于:两个表行数的乘积
select e.ename,d.ename from emp e cross join emp d;
返回 14*14 196条记录
2 带where条件子句,返回
select e.ename,d.ename from emp e cross join emp d where e.mgr = d.empno;

浙公网安备 33010602011771号