声明:本文参考:数据库左连接、右连接、内连接、全连接笔记
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子句->最终结果