1. 测试数据
测试数据如下所示,数据库脚本(含数据)在文章最后的附录中给出。
测试工具:MySQL8.0 , Navicat Premium。
首先是一个班级表:class,class表中的数据如下所示。
学生表: student,student表中的数据如下所示。
2. 等值连接
class表 和 student表 进行 基于classID 属性的等值连接,SQL 语句如下。
SELECT student.stuID, class.className
FROM student INNER JOIN class ON student.classID = class.classID;
等值连接结果如下所示:
3. 交叉连接
两个表的交叉连接就是这两个表的笛卡尔积,SQL 语句如下。
SELECT student.stuID, class.className
FROM student JOIN class;
结果如下所示:
4. 左外连接
结果表中包含“左表”的全部记录,右表中不存在的数据用NULL来代替,student是“左表”,SQL 语句如下。
SELECT student.stuID, class.className
FROM student LEFT JOIN class ON student.classID = class.classID;
结果如下所示:
5. 右外连接
结果表中包含“右表”的全部记录,左表中不存在的数据用NULL来代替,class是“右表”,SQL 语句如下。
SELECT student.stuID, class.className
FROM student RIGHT JOIN class ON student.classID = class.classID;
结果如下所示:
6. 全外连接
MySQL中不支持全外连接,测试SQL语句如下。
SELECT *
FROM student FULL JOIN class;
结果如图所示,这显然不是全外连接,是全连接。
可以通过 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;
附录:
/*
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');