数据库中的表连接
数据库中表的连接可以分为:内连接、外连接。
1. 内连接(INNER JOIN)
内连接的关键字是INNER JOIN,语法如下:
INNER JOIN table_name ON condition;
用下来一个例子来解释:
存在一个Student表如下表示
存在一个Score表如下表示
如果执行SQL命令select * from student inner join score;
,可以得到以下结果:
…
可以发现内连接只是将两张表横向的拼接起来了,第二张表的每一行依次的添加到了第一张表每一行后面,Student表有9行,score表有13行,最终拼接的表是9*13=117行
如果在拼接的时候适当的增加条件,如执行SQL命令select * from student st inner join score sc on st.s_no=sc.s_no;
后,得到如下结果
可以发现得到了两个表的s_no的交集,在Student表中s_no为106,107,108的项被舍弃了。(这里人名出现重复是因为在score表的创建时我使用的是{s_no,c_no}联合主键,所以s_no可以重复,一般不会出现这种情况。)
2. 外连接(OUTER JOIN)
外连接应该是SQL中最常用的表连接方式,可以分为左连接、右连接和全连接。
2.1 左连接(LEFT JOIN)
左连接的关键字是LEFT JOIN
还是以Student和score两个表来说明左连接到底做了什么
如果执行SQL命令select * from student st left join score sc on st.s_no=sc.s_no;
,可以得到以下结果:
可以发现这里和内连接相比,保留了s_no为106,107,108的项,因为在以上SQL语句中,是用score表中的数据来匹配Student表中的数据
为了和下面的右连接做比较,再执行select * from score sc left join student st on st.s_no=sc.s_no;
,可以得到以下结果:
以上结果是用student表中的数据来匹配score表中的数据,在score表中没有s_no为106,107,108的项,所以最终结果中也没有s_no为106,107,108的项
2.2 右连接(RIGHT JOIN)
左连接的关键字是RIGHT JOIN
如果执行SQL命令select * from student st right join score sc on st.s_no=sc.s_no;
,可以得到以下结果:
再执行select * from score sc left join student st on st.s_no=sc.s_no;
,可以得到以下结果:
很容易发现左连接得到的两个结果与右连接得到的两个结果刚好相反,即Table A 左连接 Table B等价于Table B 右连接 Table A
2.3 全连接(FULL JOIN)
MYSQL8不支持全连接,可以用左连接+右连接+去重来模拟全连接
执行SQL语句select * from student st right join score sc on st.s_no=sc.s_no union select * from student st left join score sc on st.s_no=sc.s_no;
,可以得到以下结果: