目录
内外连接和多表查询的区别
内连接
外连接
左外连接
右外连接
简单案例
内外连接和多表查询的区别
- 在 MySQL 中,内连接是多表查询的一种方式,但多表查询包含的范围更广泛。
- 外连接也是多表查询的一种具体形式,而多表查询是一个更广泛的概念。
内连接(INNER JOIN)主要用于获取两个或多个表中相互匹配的数据行组合。它返回仅在连接条件满足时,两个表中相关行的交集部分。
而多表查询不仅仅局限于内连接,还可能包括其他连接类型,如左连接(LEFT JOIN)、右连接(RIGHT JOIN)、全外连接(FULL OUTER JOIN)等。
内连接
内连接确保了结果集是基于关联条件的精确匹配,
排除了那些在一个表中有而在另一个表中没有对应匹配的行。
SELECT ... FROM t1 INNER JOIN t2
ON 连接条件 [INNER JOIN t3 ON 连接条件] ... AND 其他条件;
- SQL中大写的表示关键字,[ ]中代表的是可选项。
- 内连接的条件通过
连接条件
指明,用户的其他筛选条件通过其他条件
指明。
雇员信息表中包含三张表,分别是员工表(emp)、部门表(dept)和工资等级表(salgrade)。
员工表(emp)中包含如下字段:
- 雇员编号(empno)
- 雇员姓名(ename)
- 雇员职位(job)
- 雇员领导编号(mgr)
- 雇佣时间(hiredate)
- 工资月薪(sal)
- 奖金(comm)
- 部门编号(deptno)
部门表(dept)中包含如下字段:
- 部门编号(deptno)
- 部门名称(dname)
- 部门所在地点(loc)
工资等级表(salgrade)中包含如下字段:
- 等级(grade)
- 此等级最低工资(losal)
- 此等级最高工资(hisal)
显示SMITH的名字和部门名称
复合查询的做法就是,取员工表(emp)和部门表(dept)的笛卡尔积,在where子句中指明筛选条件为员工表(emp)的部门号等于部门表(dept)的部门号,筛选出每个员工匹配的部门信息,并指明员工姓名为SMITH,筛选出SMITH的信息和其所在部门的信息。
select ename,dname from emp,dept
where emp.deptno=dept.deptno and ename='SMITH';
实际内连接本质就是 多表查询德一种
- 将员工表(emp)和部门号(dept)放在from子句中并通过 inner join 关键字隔开。
- 在 on 子句后指明内连接的条件为员工表(emp)的部门号等于部门号(dept)的部门号,保证筛选出来的数据是有意义的。
- 在 and 之后指明筛选条件为员工的姓名为SMITH。
select ename,dname from emp inner join dept on
emp.deptno=dept.deptno and ename='SMITH';
外连接
左外连接
- 它会以左边的表为基础,将左边表中的所有记录都包含在结果集中。
- 对于左边表中的每一条记录,会去右边的表中查找匹配的记录,如果找到匹配的记录,则将两表相关联的数据组合显示;
- 如果没有找到匹配的记录,那么右边表相关列的值会显示为 NULL。
SELECT ... FROM t1 LEFT JOIN t2 ON
连接条件 [LEFT JOIN t3 ON 连接条件] ... AND 其他条件;
- SQL中大写的表示关键字,[ ]中代表的是可选项。
- 左外连接的条件通过
连接条件
指明,用户的其他筛选条件通过其他条件
指明。
给出一张学生表(stu)和一张成绩表(exam)
查询所有学生的成绩,就算这个学生没有成绩,也要将学生的个人信息显示出来
如果直接使用内连接将学生表和成绩表连接起来,然后筛选出学生学号等于考试学生学号的记录,那么只能筛选出有考试成绩的学生信息。
select stu.id,name,score from stu inner join exam on stu.id=exam.id;
这个时候我们就要使用左外连接了!!!
select stu.id,name,score from stu left join exam on stu.id=exam.id;
右外连接
- 右外连接(RIGHT OUTER JOIN)是以右边的表为基础,将右边表中的所有记录都包含在结果集中。
- 对于右边表中的每一条记录,会去左边的表中查找匹配的记录,如果找到匹配的记录,则将两表相关联的数据组合显示;
- 如果没有找到匹配的记录,那么左边表相关列的值会显示为 NULL。
SELECT ... FROM t1 RIGHT JOIN t2 ON
连接条件 [RIGHT JOIN t3 ON 连接条件] ... AND 其他条件;
- SQL中大写的表示关键字,[ ]中代表的是可选项。
- 左外连接的条件通过
连接条件
指明,用户的其他筛选条件通过其他条件
指明。
查询所有学生的成绩,就算这个成绩没有学生与它对应,也要将成绩信息显示出来
select * from exam right join stu on stu.id=exam.id;
简单案例
列出部门名称和这些部门的员工信息,同时列出没有员工的部门
题目要求同时列出没有员工的部门,也就是部门表当中的内容需要完全被显示出来,如果在连接部门表(dept)和员工表(emp)时将部门表(dept)放在左侧,那么就可以使用左外连接。
select dname,emp.* from dept left join emp on dept.deptno=emp.deptno;
如果在连接部门表(dept)和员工表(emp)时将员工表(emp)放在左侧,那么就可以使用右外连接。
select dname,emp.* from emp right join dept on dept.deptno=emp.deptno;