当前位置: 首页 > news >正文

mysql表的连接——内外连接

文章目录

  • mysql表的内外连接
    • 内连接
    • 外连接
      • 左外连接
      • 右外连接
    • 总结

mysql表的内外连接

在mysql的符合查询部分,我们学习了如何将两个表连接起来——笛卡尔积。
今天,我们将重点针对于表的连接做一个理解!

内连接

内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。

这里再提及这个概念,是因为使用内连接的说法,在语义上是更加清晰的!

接下来,我们将通过一个例子,来对内连接进行一个理解!
eg:显示SMITH的名字和其所在部门的相关信息

方法1

# 直接使用之前学习的方法,最后通过where进行筛选:
mysql> select * from EMP, DEPT 
where EMP.DEPTNO=DEPT.DEPTNO and ENAME='SMITH';
+-------+-------+-------+------+------------+--------+------+--------+--------+----------+--------+
| EMPNO | ENAME | JOB   | MGR  | HIREDATE   | SAL    | COMM | DEPTNO | DEPTNO | DNAME    | LOC    |
+-------+-------+-------+------+------------+--------+------+--------+--------+----------+--------+
|  7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL |     20 |     20 | RESEARCH | DALLAS |
+-------+-------+-------+------+------------+--------+------+--------+--------+----------+--------+
1 row in set (0.00 sec)

方法1我们已经很熟悉了,这里不再啰嗦。

方法2:使用内连接

# 语法
select (...) from table1 inner join table2 on ...and
# (若需要多条件级联,可以继续添加and)mysql> select * from EMP inner join DEPT on EMP.DEPTNO=DEPT.DEPTNO and ENAME='SMITH';
+-------+-------+-------+------+------------+--------+------+--------+--------+----------+--------+
| EMPNO | ENAME | JOB   | MGR  | HIREDATE   | SAL    | COMM | DEPTNO | DEPTNO | DNAME    | LOC    |
+-------+-------+-------+------+------------+--------+------+--------+--------+----------+--------+
|  7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL |     20 |     20 | RESEARCH | DALLAS |
+-------+-------+-------+------+------------+--------+------+--------+--------+----------+--------+
1 row in set (0.00 sec)

最后使用where来筛选也是可以的:
在这里插入图片描述

上述需要说明的是:

其实内连接就和直接对表进行筛选,使用笛卡尔积 + where的效果是一样的!
只不过是:在使用inner join的时候,语义更加的明确!

外连接

既然有表的内连接,也就会有表的外连接!
其中表的外连接是分为左外连接右外连接

左外连接

我们需要先解释,表的左外连接是什么意思呢?

当我们在连接两张表的时候,经常会需要进行筛选,把一些不太符合需求的数据筛选掉。
假设现在有一个数据是在左表是存在的,但是右表没有其对应的相关信息!
如果我们使用内连接筛选,那么只在左表存在的数据就会被过滤掉。
但是有时候我们又希望它能显示出来,哪怕其对应的信息是空!

所以,mysql提供了一种功能:表的左外连接
它能够在连接两张表的同时,把左边表的内容完好无损的显示出来!

mysql> desc students;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> desc marks;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id    | int  | YES  |     | NULL    |       |
| score | int  | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
2 rows in set (0.00 sec)

同时插入一些数据:

# 我们可以很清晰的发现:有一些学生查不到对应的成绩,有一些成绩查不到对应的学生!
# 这是故意这么做的 就是为了后序能够演示出效果!
insert into students values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
insert into marks values(1, 56),(2,76),(11, 8);

eg:显示所有学生对应的成绩(如果学生没有成绩显示空即可)

mysql> select students.id, name, score 
from students left join marks on students.id=marks.id;
+------+------+-------+
| id   | name | score |
+------+------+-------+
|    1 | jack |    56 |
|    2 | tom  |    76 |
|    3 | kity |  NULL |
|    4 | nono |  NULL |
+------+------+-------+
4 rows in set (0.00 sec)

我们发现,id=3,id=4的两个学生,在marks表中是找不到成绩的!但是通过左外连接,成功地把左表原封不动的筛选出来了!

如果使用内连接,3号和4号是没办法显示出来的:
在这里插入图片描述

右外连接

知道了左外连接是怎么一回事,右外连接其实也就很简单了:
其作用是连接表的时候,把右表完整显示出来!

其实,只有左外连接也是可以的!因为两个表可以互换位置!
所以:哪一个表需要完整显示,谁就放在left join的左边即可!
但是,mysql提供了这么一个功能,我们就直接用就好了!

eg:对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来:

mysql> select students.id as sid, marks.id as mid, name, score from 
students right join marks on students.id=marks.id;
+------+------+------+-------+
| sid  | mid  | name | score |
+------+------+------+-------+
|    1 |    1 | jack |    56 |
|    2 |    2 | tom  |    76 |
| NULL |   11 | NULL |     8 |
+------+------+------+-------+
3 rows in set (0.00 sec)

在我们最近常用的职工、部门、薪水等级表中,隐藏了这么一个细节:
在这里插入图片描述
故意留下一个部门是没有员工的!

需求:列出部门名称和这些部门的员工信息,同时列出没有员工的部门。

mysql> select ENAME, DEPT.DEPTNO, EMP.JOB from 
EMP right join DEPT on EMP.DEPTNO=DEPT.DEPTNO;
+--------+--------+-----------+
| ENAME  | DEPTNO | JOB       |
+--------+--------+-----------+
| CLARK  |     10 | MANAGER   |
| KING   |     10 | PRESIDENT |
| MILLER |     10 | CLERK     |
| SMITH  |     20 | CLERK     |
| JONES  |     20 | MANAGER   |
| SCOTT  |     20 | ANALYST   |
| ADAMS  |     20 | CLERK     |
| FORD   |     20 | ANALYST   |
| ALLEN  |     30 | SALESMAN  |
| WARD   |     30 | SALESMAN  |
| MARTIN |     30 | SALESMAN  |
| BLAKE  |     30 | MANAGER   |
| TURNER |     30 | SALESMAN  |
| JAMES  |     30 | CLERK     |
| NULL   |     40 | NULL      |
+--------+--------+-----------+
15 rows in set (0.00 sec)

总结

至此,我们就对mysql中表的连接做了一个简单的理解!
我们学习了表是如何进行连接的,如何使用内外连接对表进行筛选。

http://www.dtcms.com/a/594493.html

相关文章:

  • Java文件与IO流完全指南
  • 深圳建站公司兴田德润官网多少宁波网站推广建站
  • 学会网站建设能成为一项职业吗十大免费音乐网站
  • 零基础学JAVA--Day28(包装类+String类)
  • 网站的关键词排名怎么做怎么做网站优化的
  • 前端项目目录结构全解析
  • whisperX 安装及测试
  • 建立网站一般那些阶段成都工信部网站
  • 手机网站页面文字做多大网站开发课表查询
  • Python数据挖掘之聚类
  • 企业做网站需要注意事项广西建设安全员证查询网站
  • 网站统计WordPress轻量企业主题
  • 花都网站建设哪家好电子商务网站建设期末试题08答案
  • Node-RED生态中的Sparkplug B社区节点介绍
  • pyspark入门实操(收藏版)
  • 可以在家做兼职的网站做招聘信息的网站有哪些方面
  • 织梦网站图片修改不了网站建设专业性
  • 手机网站最小宽度网络文化经营许可证变更
  • 模板网站与定制网站的价格小蝌蚪视频网络科技有限公司
  • 基于Python Tkinter的批量IP地址归属地查询
  • 网站排名优化价格私人网络服务器
  • 资源网站优化排名北京网络营销网站
  • 如何做简单的网站wordpress分页阅读
  • 做网站软件 wordpage贵阳哪里做网站
  • 优秀网站模板欣赏行业网站建设公司推荐
  • iTwin UI
  • 虚拟主机和网站的关系西安大型网站制作
  • 积极推进在线网站建设网站运营计划书
  • 远程网页调试工具实战:跨端前端调试的核心利器与最佳实践
  • (二)Docker实战--Docker镜像部署与启动