 
      	在 MySQL 数据库中,CROSS JOIN(交叉连接)是一种表连接操作,它将两个或多个表中的所有行进行组合,生成一个结果集。交叉连接的结果是每个表中每行与其他表中每行的组合,无论它们之间是否存在匹配的列。在 MySQL 中,有多种类型的表连接,包括交叉连接(也称为交叉连接,内连接,笛卡尔积,或等值连接)JOIN、左连接LEFT JOIN、右连接RIGHT JOIN。
SELECT * FROM <表1> CROSS JOIN <表2> [ON|where <表1>.<列名> = <表2>.<列名>]
语法说明:|是或者,[ ]中的内容是可选的,<>是中文解释。
表的连接查询都可以分为两种情况:有条件和无条件的。更详细的表链接知识可查看《MySQL 表连接》。

以学生表和成绩表做本案例讲解。
这是详细信息得内容。
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `sex` varchar(11) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '张三名', '男');
INSERT INTO `student` VALUES ('2', '李四浩', '男');
INSERT INTO `student` VALUES ('3', '王五期', '女');
INSERT INTO `student` VALUES ('5', '三七熊', '女');
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `studentid` int(11) DEFAULT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `score` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('1', '1', '语文', '81');
INSERT INTO `course` VALUES ('2', '1', '数学', '74');
INSERT INTO `course` VALUES ('3', '1', '英语', '56');
INSERT INTO `course` VALUES ('4', '2', '语文', '71');
INSERT INTO `course` VALUES ('5', '2', '数学', '77');
INSERT INTO `course` VALUES ('6', '2', '英语', '66');
INSERT INTO `course` VALUES ('7', '3', '语文', '61');
INSERT INTO `course` VALUES ('8', '3', '数学', '87');
INSERT INTO `course` VALUES ('9', '3', '英语', '86');
INSERT INTO `course` VALUES ('10', '4', '语文', '71');
INSERT INTO `course` VALUES ('11', '4', '数学', '57');
INSERT INTO `course` VALUES ('12', '4', '英语', '76');student学生表原始数据
mysql> SELECT * from student; +----+-----------+------+ | id | name | sex | +----+-----------+------+ | 1 | 张三名 | 男 | | 2 | 李四浩 | 男 | | 3 | 王五期 | 女 | | 5 | 三七熊 | 女 | +----+-----------+------+
course成绩表原始数据
学生分别有语文、数学、英语三门成绩,studentid是student学生表的id
mysql> SELECT * from course; +----+-----------+--------+-------+ | id | studentid | name | score | +----+-----------+--------+-------+ | 1 | 1 | 语文 | 81 | | 2 | 1 | 数学 | 74 | | 3 | 1 | 英语 | 56 | | 4 | 2 | 语文 | 71 | | 5 | 2 | 数学 | 77 | | 6 | 2 | 英语 | 66 | | 7 | 3 | 语文 | 61 | | 8 | 3 | 数学 | 87 | | 9 | 3 | 英语 | 86 | | 10 | 4 | 语文 | 71 | | 11 | 4 | 数学 | 57 | | 12 | 4 | 英语 | 76 | +----+-----------+--------+-------+
无条件交叉连接就是两表的行数相乘。学生表4条记录,成绩表12条记录,则输出48条记录
SELECT * from student CROSS JOIN course;
mysql> SELECT * from student CROSS JOIN course; +----+-----------+------+----+-----------+--------+-------+ | id | name | sex | id | studentid | name | score | +----+-----------+------+----+-----------+--------+-------+ | 1 | 张三名 | 男 | 1 | 1 | 语文 | 81 | | 2 | 李四浩 | 男 | 1 | 1 | 语文 | 81 | | 3 | 王五期 | 女 | 1 | 1 | 语文 | 81 | | 5 | 三七熊 | 女 | 1 | 1 | 语文 | 81 | | 1 | 张三名 | 男 | 2 | 1 | 数学 | 74 | | 2 | 李四浩 | 男 | 2 | 1 | 数学 | 74 | | 3 | 王五期 | 女 | 2 | 1 | 数学 | 74 | | 5 | 三七熊 | 女 | 2 | 1 | 数学 | 74 | | 1 | 张三名 | 男 | 3 | 1 | 英语 | 56 | | 2 | 李四浩 | 男 | 3 | 1 | 英语 | 56 | | 3 | 王五期 | 女 | 3 | 1 | 英语 | 56 | | 5 | 三七熊 | 女 | 3 | 1 | 英语 | 56 | | 1 | 张三名 | 男 | 4 | 2 | 语文 | 71 | | 2 | 李四浩 | 男 | 4 | 2 | 语文 | 71 | | 3 | 王五期 | 女 | 4 | 2 | 语文 | 71 | | 5 | 三七熊 | 女 | 4 | 2 | 语文 | 71 | | 1 | 张三名 | 男 | 5 | 2 | 数学 | 77 | | 2 | 李四浩 | 男 | 5 | 2 | 数学 | 77 | | 3 | 王五期 | 女 | 5 | 2 | 数学 | 77 | | 5 | 三七熊 | 女 | 5 | 2 | 数学 | 77 | | 1 | 张三名 | 男 | 6 | 2 | 英语 | 66 | | 2 | 李四浩 | 男 | 6 | 2 | 英语 | 66 | | 3 | 王五期 | 女 | 6 | 2 | 英语 | 66 | | 5 | 三七熊 | 女 | 6 | 2 | 英语 | 66 | | 1 | 张三名 | 男 | 7 | 3 | 语文 | 61 | | 2 | 李四浩 | 男 | 7 | 3 | 语文 | 61 | | 3 | 王五期 | 女 | 7 | 3 | 语文 | 61 | | 5 | 三七熊 | 女 | 7 | 3 | 语文 | 61 | | 1 | 张三名 | 男 | 8 | 3 | 数学 | 87 | | 2 | 李四浩 | 男 | 8 | 3 | 数学 | 87 | | 3 | 王五期 | 女 | 8 | 3 | 数学 | 87 | | 5 | 三七熊 | 女 | 8 | 3 | 数学 | 87 | | 1 | 张三名 | 男 | 9 | 3 | 英语 | 86 | | 2 | 李四浩 | 男 | 9 | 3 | 英语 | 86 | | 3 | 王五期 | 女 | 9 | 3 | 英语 | 86 | | 5 | 三七熊 | 女 | 9 | 3 | 英语 | 86 | | 1 | 张三名 | 男 | 10 | 4 | 语文 | 71 | | 2 | 李四浩 | 男 | 10 | 4 | 语文 | 71 | | 3 | 王五期 | 女 | 10 | 4 | 语文 | 71 | | 5 | 三七熊 | 女 | 10 | 4 | 语文 | 71 | | 1 | 张三名 | 男 | 11 | 4 | 数学 | 57 | | 2 | 李四浩 | 男 | 11 | 4 | 数学 | 57 | | 3 | 王五期 | 女 | 11 | 4 | 数学 | 57 | | 5 | 三七熊 | 女 | 11 | 4 | 数学 | 57 | | 1 | 张三名 | 男 | 12 | 4 | 英语 | 76 | | 2 | 李四浩 | 男 | 12 | 4 | 英语 | 76 | | 3 | 王五期 | 女 | 12 | 4 | 英语 | 76 | | 5 | 三七熊 | 女 | 12 | 4 | 英语 | 76 | +----+-----------+------+----+-----------+--------+-------+
这样输出很多重复数据,这时候可以加上条件
在多表连接可以加上条件where或者on(两表都有数据),只要成绩表对应的学生数据
mysql> SELECT * from student CROSS JOIN course where student.id=course.studentid; +----+-----------+------+----+-----------+--------+-------+ | id | name | sex | id | studentid | name | score | +----+-----------+------+----+-----------+--------+-------+ | 1 | 张三名 | 男 | 1 | 1 | 语文 | 81 | | 1 | 张三名 | 男 | 2 | 1 | 数学 | 74 | | 1 | 张三名 | 男 | 3 | 1 | 英语 | 56 | | 2 | 李四浩 | 男 | 4 | 2 | 语文 | 71 | | 2 | 李四浩 | 男 | 5 | 2 | 数学 | 77 | | 2 | 李四浩 | 男 | 6 | 2 | 英语 | 66 | | 3 | 王五期 | 女 | 7 | 3 | 语文 | 61 | | 3 | 王五期 | 女 | 8 | 3 | 数学 | 87 | | 3 | 王五期 | 女 | 9 | 3 | 英语 | 86 | +----+-----------+------+----+-----------+--------+-------+
在交叉连接中,需要注意以下几点:
交叉连接会返回两个或多个表的笛卡尔积,即每个表中的每一行与其他表中的每一行进行组合。如果表中的行数较大,可能会导致结果集非常大,因此在使用时需要谨慎考虑。
交叉连接没有明确的关联条件,因此结果集中可能会包含一些没有实际意义的组合。为了避免这种情况,可以在交叉连接中添加筛选条件,只返回满足特定条件的组合。
交叉连接通常用于创建临时表或中间结果集,而不是用于直接查询最终结果。在实际应用中,通常会在交叉连接的基础上进行进一步的查询和过滤,以得到最终的结果集。