【MySQL数据库】:MySQL内外连接

 

目录

 

内外连接和多表查询的区别

内连接

外连接 

左外连接

右外连接 

简单案例 


内外连接和多表查询的区别

  • 在 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;

 

相关推荐

  1. MySQLMySQL内外连接

    2024-06-06 20:40:03       23 阅读
  2. MySQL内外连接

    2024-06-06 20:40:03       33 阅读
  3. MySQL内外连接

    2024-06-06 20:40:03       21 阅读
  4. mysql03-内外连接

    2024-06-06 20:40:03       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 20:40:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 20:40:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 20:40:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 20:40:03       20 阅读

热门阅读

  1. .Net 基于MiniExcel的导入功能接口示例

    2024-06-06 20:40:03       11 阅读
  2. 洛谷P3214 [HNOI2011] 卡农

    2024-06-06 20:40:03       9 阅读
  3. GIT仓库发布提交

    2024-06-06 20:40:03       7 阅读
  4. 【面试宝藏】Go语言运行时机制面试题

    2024-06-06 20:40:03       8 阅读
  5. vllm lora、gptq、awq推理使用

    2024-06-06 20:40:03       8 阅读
  6. 递推 7-1 sdut-C语言实验-母牛的故事

    2024-06-06 20:40:03       10 阅读
  7. 局域网电脑监控软件是如何监控到内网电脑的?

    2024-06-06 20:40:03       10 阅读
  8. 目标检测指标AP50/准确率/召回率说明

    2024-06-06 20:40:03       10 阅读