数据库左连接、右连接、内连接+全连接

声明:本文参考:数据库左连接、右连接、内连接、全连接笔记

1、新建表

  • 表 table_a
-- ----------------------------
-- Table structure for table_a
-- ----------------------------
DROP TABLE IF EXISTS `table_a`;
CREATE TABLE `table_a` (
  `a_pk` int(11) NOT NULL AUTO_INCREMENT,
  `a_name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`a_pk`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
image.png
  • 表 table_b
-- ----------------------------
-- Table structure for table_b
-- ----------------------------
DROP TABLE IF EXISTS `table_b`;
CREATE TABLE `table_b` (
  `b_pk` int(11) NOT NULL AUTO_INCREMENT,
  `b_name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`b_pk`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
image.png

2、内连接

  • 内连接是一种一一映射关系,就是两张表都有的才能显示出来

  • 韦恩图


    内连接.png
  • 代码:

-- 内连接
select *
from table_a a,table_b b
where a.a_pk = b.b_pk
  • 查询结果:


    image.png

3、左连接

  • 左连接是左边表的所有数据都有显示出来,右边的表数据只显示共同有的那部分,没有对应的部分只能补空显示,所谓的左边表其实就是指放在left join的左边的表

  • 韦恩图


    image.png
  • 代码

-- 左连接
select * 
from table_a a
LEFT JOIN table_b b
on a.a_pk = b.b_pk
  • 查询结果


    image.png

4、右连接

  • 右连接正好是和左连接相反的,这里的右边也是相对right join来说的,在这个右边的表就是右表
  • 韦恩图


    右连接.png
-- 右连接
select * 
from table_a a
RIGHT JOIN table_b b
on a.a_pk = b.b_pk
image.png

5、外连接或全连接

  • 查询出左表和右表所有数据,但是去除两表的重复数据

  • 韦恩图


    image.png
  • 代码

select * 
from table_a a
FULL  JOIN table_b b
on a.a_pk = b.b_pk
  • 运行结果
    以上代码运行的话,会出现错误,这是因为Mysql不支持全连接,所以,我们需要换另外一种方式。


    运行结果
  • 代码
    以下的代码采用的是 左连接+右连接+去重得到全连接的效果

select * 
from table_a a
LEFT JOIN table_b b
on a.a_pk = b.b_pk
UNION
select * 
from table_a a
RIGHT JOIN table_b b
on a.a_pk = b.b_pk
  • 运行结果


    image.png

SQL 语句执行顺序

开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果

你可能感兴趣的:(数据库左连接、右连接、内连接+全连接)