0
点赞
收藏
分享

微信扫一扫

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

千行 2021-09-28 阅读 128

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

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;

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

2、内连接

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

  • 韦恩图


  • 代码:

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


3、左连接

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

  • 韦恩图


  • 代码

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


4、右连接

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


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

5、外连接或全连接

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

  • 韦恩图


  • 代码

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
  • 运行结果


SQL 语句执行顺序

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

举报

相关推荐

0 条评论