笛卡尔积现象

笛卡尔积现象:当进行多张表联合查询的时候,在没有任何条件进行限制情况下,最终查询结果条数是多张表记录条数的乘积!

1、建表

create table `student` (
    `sid` int(15) not null auto_increment comment '学号',
    `sname` varchar(30) not null  comment '姓名',
    `cid` varchar(30) null comment '班号',
    primary key (`sid`)
)engine=innodb default charset=utf8
insert into student(`sname` , `cid`) 
value ('张三', '1'), ('李四', '1'), ('王五', '1'),
       ('赵六', '2'), ('钱七', '2')
create table classroom(
    cid varchar(30) not null comment '班号',
    cname varchar(30) not null comment '班级名',
    primary key(`cid`)
)engine=innodb default charset=utf8;
insert into classroom(`cid`, `cname`) value ('1', '软件工程'), ('2', '网络工程')

笛卡尔积现象


2、笛卡尔积现象分析

现在给定一个查询需要查出学生所在的班级,显示学生名字、班级名字。

select s.sname, c.cname from student s, classroom c;

笛卡尔积现象

  • 这就是笛卡尔积现象,在没有进行条件干预的情况下查询的结果是多张表数据的乘积!

  • 既然是积,那么底层计算的时候可能是就是二重循环。(个人理解)


为了解决上述的问题,需要加上一个where条件,只有当学生表中的的班级号和班级表中的班级号对应才进行显示! 注意这里是显示

select s.sname, c.cname from student s, classroom c where s.cid = c.cid;

笛卡尔积现象

  • 最后答案就是五条记录,但是笛卡尔积并没有解决,笛卡尔积现象解决了!

  • 底层还是可以理解为二重循环,只不过等价于多加了一个if判断条件。因此还是进行了笛卡尔积操作!

  • 这也就是为什么说是显示,因为只有if条件成立才进行输出打印,运算依旧进行了10次!

上一篇:易扩展二次开发的web快速开发平台


下一篇:Redisson解决redis分布式锁过期业务没执行完问题