mysql上三种连接方式 left join (左连接),right join (右连接),inner join (等值连接或者叫内连接)的使用及区别

in mysql with 0 comment

前言

  1. left join (左连接):返回包括左表中的所有记录和右表中连接字段相等的记录,通俗讲左表数据全部显示,按要求连接右表,满足要求二表想要查询的字段都显示,一个都不满足右表的字段显示为null。
  2. right join (右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。通俗讲右表表数据全部显示,按要求连接左表,满足要求二表想要查询的字段都显示,一个都不满足左表的字段显示为null。
  3. inner join (等值连接或者叫内连接):只返回两个表中连接字段相等的行。通俗讲,这个就是去掉为空的数据,也可以理解为左连接的结果和右连接结果取交集。
  4. full join (全外连接):返回左右表中所有的记录和左右表中连接字段相等的记录。通俗讲就是左连接和右连接取并集,这个mysql不支持
  1. 左连接和右连接使用场合一般需要一张表的所有数据,去找出另外一张表的数据。
  2. 而内连接这个则找出二个表满足条件的
  3. 全外连接则是二张表需要查询的字段都有,和满足条件的
  1. 内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括相等联接和自然联接。
      内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。

  2. 外联接。外联接可以是左向外联接、右向外联接或完整外部联接。
      在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:
    EFT JOIN或LEFT OUTER JOIN
      左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
    RIGHT JOIN 或 RIGHT OUTER JOIN
      右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
    FULL JOIN 或 FULL OUTER JOIN
      完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

  3. 交叉联接
      交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。

使用方法

二个表的表结构如下

CREATE TABLE `student` (
  `id` int(11) NOT NULL,
  `name` varchar(45) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

CREATE TABLE `mark` (
  `mark_id` int(11) NOT NULL AUTO_INCREMENT,
  `score` int(11) DEFAULT NULL,
  `subject` varchar(45) COLLATE utf8_bin DEFAULT NULL,
  `id` int(11) DEFAULT NULL,
  PRIMARY KEY (`mark_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

数据如下

INSERT INTO `new_schema`.`student` (`id`, `name`) VALUES ('1', '张三');
INSERT INTO `new_schema`.`student` (`id`, `name`) VALUES ('2', '李四');
INSERT INTO `new_schema`.`student` (`id`, `name`) VALUES ('3', '王二');
INSERT INTO `new_schema`.`student` (`id`, `name`) VALUES ('4', '麻子');

INSERT INTO `new_schema`.`mark` (`score`, `subject`, `id`) VALUES ('80', '数学', '1');
INSERT INTO `new_schema`.`mark` (`score`, `subject`, `id`) VALUES ('70', '语文', '1');
INSERT INTO `new_schema`.`mark` (`score`, `subject`, `id`) VALUES ('99', '数学', '2');
INSERT INTO `new_schema`.`mark` (`score`, `subject`, `id`) VALUES ('88', '语文', '2');
INSERT INTO `new_schema`.`mark` (`score`, `subject`, `id`) VALUES ('77', '数学', '5');
INSERT INTO `new_schema`.`mark` (`score`, `subject`, `id`) VALUES ('61', '语文', '5');
select * from mark,student where mark.id=student.id

image.png

select * from mark left join student on mark.id=student.id

image.png

select * from mark right join student on mark.id=student.id

image.png

select * from mark inner join student on mark.id=student.id

image.png

X O