MySQL 的等值连接、交叉连接、左外连接 、右外连接、全外连接实例

1. 测试数据

测试数据如下所示,数据库脚本(含数据)在文章最后的附录中给出。

测试工具:MySQL8.0 , Navicat Premium。

首先是一个班级表:class,class表中的数据如下所示。

MySQL 的等值连接、交叉连接、左外连接 、右外连接、全外连接实例

学生表: student,student表中的数据如下所示。

MySQL 的等值连接、交叉连接、左外连接 、右外连接、全外连接实例

2. 等值连接

class表 和 student表 进行 基于classID 属性的等值连接,SQL 语句如下。

SELECT student.stuID, class.className
FROM student INNER JOIN class ON student.classID = class.classID;

等值连接结果如下所示:

MySQL 的等值连接、交叉连接、左外连接 、右外连接、全外连接实例

3. 交叉连接

两个表的交叉连接就是这两个表的笛卡尔积,SQL 语句如下。

SELECT student.stuID, class.className
FROM student JOIN class;

结果如下所示:

MySQL 的等值连接、交叉连接、左外连接 、右外连接、全外连接实例                  

4. 左外连接

结果表中包含“左表”的全部记录,右表中不存在的数据用NULL来代替,student是“左表”,SQL 语句如下。

SELECT student.stuID, class.className
FROM student LEFT JOIN class ON student.classID = class.classID;

结果如下所示:

MySQL 的等值连接、交叉连接、左外连接 、右外连接、全外连接实例

5. 右外连接

结果表中包含“右表”的全部记录,左表中不存在的数据用NULL来代替,class是“右表”,SQL 语句如下。

SELECT student.stuID, class.className
FROM student RIGHT JOIN class ON student.classID = class.classID;

结果如下所示:

MySQL 的等值连接、交叉连接、左外连接 、右外连接、全外连接实例

 6. 全外连接

MySQL中不支持全外连接,测试SQL语句如下。

SELECT *
FROM student FULL JOIN class;

结果如图所示,这显然不是全外连接,是全连接。

MySQL 的等值连接、交叉连接、左外连接 、右外连接、全外连接实例

 

可以通过 UNION 左外连接 和 右外连接来实现 全外连接,SQL语句如下。

SELECT *
FROM student LEFT JOIN class ON student.classID = class.classID
UNION
SELECT *
FROM student RIGHT JOIN class ON student.classID = class.classID;

                   MySQL 的等值连接、交叉连接、左外连接 、右外连接、全外连接实例

附录:

/*
Navicat MySQL Data Transfer

Source Server         : mybatis
Source Server Version : 80011
Source Host           : localhost:3306
Source Database       : school

Target Server Type    : MYSQL
Target Server Version : 80011
File Encoding         : 65001

Date: 2019-04-09 21:48:15
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for class
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
  `classID` varchar(25) NOT NULL,
  `className` varchar(25) NOT NULL,
  `classTeacher` varchar(25) DEFAULT NULL,
  PRIMARY KEY (`classID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of class
-- ----------------------------
INSERT INTO `class` VALUES ('1', 'classname1', 'teacher1');
INSERT INTO `class` VALUES ('2', 'classname2', 'teacher2');
INSERT INTO `class` VALUES ('3', 'classname3', null);
INSERT INTO `class` VALUES ('5', 'classname5', null);

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `stuID` varchar(25) NOT NULL,
  `stuName` varchar(25) NOT NULL,
  `classID` varchar(25) NOT NULL,
  PRIMARY KEY (`stuID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '1', '1');
INSERT INTO `student` VALUES ('2', '2', '1');
INSERT INTO `student` VALUES ('3', '3', '2');
INSERT INTO `student` VALUES ('4', '4', '4');
INSERT INTO `student` VALUES ('5', '5', '3');