首页 > 数据库 >【MySQL--09】表的内连和外连

【MySQL--09】表的内连和外连

时间:2023-05-15 20:31:35浏览次数:50  
标签:JOIN -- 09 连接 MySQL OUTER 关联 id select

【MySQL--09】表的内连和外连

表的连接分为内连接和外连接

1.1内连接

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

select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;

备注:前面所使用的基本上都是内连接

  • 显示SMITH的名字和部门名称
-- 用前面的写法
select ename, dname from emp, dept where emp.deptno=dept.deptno and 
ename='SMITH';

mysql> select ename, dname from emp, dept where emp.deptno=dept.deptno and 
    -> ename='SMITH';
+-------+----------+
| ename | dname    |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)


-- 用标准的内连接写法
select ename, dname from emp inner join dept on emp.deptno=dept.deptno and 
ename='SMITH';


mysql> select ename, dname from emp inner join dept on emp.deptno=dept.deptno and 
    -> ename='SMITH';
+-------+----------+
| ename | dname    |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)

1.2外连接

外连接分为左外连接和右外连接

1.2.1左外连接

如果联合查询,左侧的表完全显示我们就说左外连接

语法: select 字段名 from 表1 left join 表2 on 连接条件

  • 首先我们先建立两张测试表,然后再进行插入数据
create table stu (id int, name varchar(30)); -- 学生表

insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');

create table exam (id int, grade int); -- 成绩表

insert into exam values(1, 56),(2,76),(11, 8);
mysql> select * from stu;
+------+------+
| id   | name |
+------+------+
|    1 | jack |
|    2 | tom  |
|    3 | kity |
|    4 | nono |
+------+------+
4 rows in set (0.00 sec)

mysql> select * from exam;
+------+-------+
| id   | grade |
+------+-------+
|    1 |    56 |
|    2 |    76 |
|   11 |     8 |
+------+-------+
3 rows in set (0.00 sec)
  • 查询所有学生的成绩,如果这个学生没有成绩,也要讲学生的个人信息显示出来

当左边表和右边表没有匹配时,也会显示左边表的数据

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

1.2.2 右外连接

如果联合查询,右侧的表完全显示我们就说是右外连接

语法: select 字段名 from 表1 right join 表2 on 连接条件

  • stuexam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与之对应,也要显示出来
mysql> select * from stu right join exam on stu.id=exam.id;
+------+------+------+-------+
| id   | name | id   | grade |
+------+------+------+-------+
|    1 | jack |    1 |    56 |
|    2 | tom  |    2 |    76 |
| NULL | NULL |   11 |     8 |
+------+------+------+-------+

2.常见问题

2.1 表和表是怎么关联的?

表与表之间常用的关联方式有两种:内连接、外连接,下面以MySQL为例来说明这两种连接方式。

内连接: 内连接通过INNER JOIN来实现,它将返回两张表中满足连接条件的数据,不满足条件的数据不会查询出 来。

外连接:外连接通过OUTER JOIN来实现,它会返回两张表中满足连接条件的数据,同时返回不满足连接条件的 数据。外连接有两种形式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)。

  • 左外连接:可以简称为左连接(LEFT JOIN),它会返回左表中的所有记录和右表中满足连接条件 的记录。

  • 右外连接:可以简称为右连接(RIGHT JOIN),它会返回右表中的所有记录和左表中满足连接条 件的记录。

除此之外,还有一种常见的连接方式:等值连接。这种连接是通过WHERE子句中的条件,将两张表连 接在一起,它的实际效果等同于内连接。出于语义清晰的考虑,一般更建议使用内连接,而不是等值连 接。

以上是从语法上来说明表与表之间关联的实现方式,而从表的关系上来说,比较常见的关联关系有:一 对多关联、多对多关联、自关联。

  • 一对多关联:这种关联形式最为常见,一般是两张表具有主从关系,并且以主表的主键关联从表的 外键来实现这种关联关系。另外,以从表的角度来看,它们是具有多对一关系的,所以不再赘述多 对一关联了。

  • 多对多关联:这种关联关系比较复杂,如果两张表具有多对多的关系,那么它们之间需要有一张中 间表来作为衔接,以实现这种关联关系。这个中间表要设计两列,分别存储那两张表的主键。因 此,这两张表中的任何一方,都与中间表形成了一对多关系,从而在这个中间表上建立起了多对多 关系。

  • 自关联:自关联就是一张表自己与自己相关联,为了避免表名的冲突,需要在关联时通过别名将它 们当做两张表来看待。一般在表中数据具有层级(树状)时,可以采用自关联一次性查询出多层级 的数据。

2.2 说一说你对外连接的了解?

外连接通过OUTER JOIN来实现,它会返回两张表中满足连接条件的数据,同时返回不满足连接条件的 数据。常见的外连接有两种形式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)。

  • 左外连接:可以简称为左连接(LEFT JOIN),它会返回左表中的所有记录和右表中满足连接条件 的记录。

  • 右外连接:可以简称为右连接(RIGHT JOIN),它会返回右表中的所有记录和左表中满足连接条 件的记录。

实际上,外连接还有一种形式:完全外连接(FULL OUTER JOIN),但MySQL不支持这种形式。

2.3 说一说数据库的左连接和右连接?

外连接通过OUTER JOIN来实现,它会返回两张表中满足连接条件的数据,同时返回不满足连接条件的 数据。常见的外连接有两种形式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)。

  • 左外连接:可以简称为左连接(LEFT JOIN),它会返回左表中的所有记录和右表中满足连接条件 的记录。

  • 右外连接:可以简称为右连接(RIGHT JOIN),它会返回右表中的所有记录和左表中满足连接条 件的记录。

标签:JOIN,--,09,连接,MySQL,OUTER,关联,id,select
From: https://blog.51cto.com/xingyuli/6280827

相关文章

  • 剪映VS会声会影哪个好用,视频剪辑软件剪映会声会影之间对比之
    随着网络视频的发展,越来越多的人开始学习视频剪辑,毕竟技多不压身,而在众多剪辑软件中,剪映和会声会影是很适合新手使用的软件,那剪映与会声会影的区别有哪些?剪映会声会影哪个好用?下面就仔细说说。一、剪映与会声会影的区别在剪辑功能上,剪映和会声会影都差不多,基础的多轨道剪辑、滤镜、......
  • gdb如何比较core文件和image及buildid
    gdb从git上看到的提交记录,关键的修改是在elf_core_file_matches_executable_p函数中添加的对于build_id的比较。///@file:gdb-10.1\bfd\elfcore.hbfd_booleanelf_core_file_matches_executable_p(bfd*core_bfd,bfd*exec_bfd){char*corename;/*xvecsmustmatch......
  • Citect2018R2使用报警页面功能做操作记录1
    这一篇学习笔记我在新浪博客记录过,地址是Citect2018R2使用报警页面功能做操作记录1_来自金沙江的小鱼_新浪博客(sina.com.cn)这两天练习了做报警页面,稍微扩展一下,可以做操作记录功能。使用unityv13.1新建一个项目,简单配置一下硬件,新建变量: 新建程序段   这个练......
  • hdu:Party(2-SAT)
    ProblemDescription有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席。在2n个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时出现在聚会上的。有没有可能会有n个人同时列席?Inputn:表示有n对夫妻被邀请(n<=1000)m:表......
  • May Solution Set Part One
    MaySolutionSetPartOne篱笆实际上,我们采用不等式法去逼近我们的答案。先考虑是链的情况。设\(a_i\)表示原区间左端点,\(f_i\)表示最优解左端点,\(len=2r\),\(ans\)表示答案,\(all\)表示整个区间。那么容易得到:\[f_i=\min(f_{i-1}+len,a_i+ans)\\f_i=\min......
  • 力扣---872. 叶子相似的树
    请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列。 举个例子,如上图所示,给定一棵叶值序列为 (6,7,4,9,8) 的树。如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。如果给定的两个根结点分别为 root1和 root2......
  • 第十五天打卡
    定义一个Animal类,成员包括:(1)整数类型的私有数据成员m_nWeightBase,表示Animal的体重;(2)整数类型的保护数据成员m_nAgeBase,表示Animal的年龄;(3)公有函数成员set_weight,用指定形参初始化数据成员m_nWeightBase;(4)公有成员函数get_weight,返回数据成员m_nWeightBase的值;(5)公有函数成员set_age,用......
  • MATLAB快速傅里叶变换(fft)函数详解
    MATLAB快速傅里叶变换(fft)函数详解调用:​​1.Y=fft(y);Y=fft(y,N);式中,y是序列,Y是序列的快速傅里叶变换。y可以是一向量或矩阵,若y为向量,则Y是y的FFT,并且与y具有相同的长度。若y为一矩阵,则Y是对矩阵的每一列向量进行FFT。说明:函数fft返回值的数据结构具有对称性根据采样定......
  • CITECT2018R2操作记录继续
    这一篇学习笔记我在新浪博客记录过,地址是CITECT2018R2操作记录继续_来自金沙江的小鱼_新浪博客(sina.com.cn)昨天学习练习了Citect2018R2操作按钮的事件记录实现方法,今天练习一下在画面上修改设定值的操作事件记录。还是在昨天项目程序的基础上来做。在PLC程序上新建变量 ......
  • 力扣---104. 二叉树的最大深度
    给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树[3,9,20,null,null,15,7],3/\920/\157返回它的最大深度 3。来源:力扣(LeetCode)链接:https://leetcode......