联合多个表进行查询
设计数据时把表进行拆分,为了消除表中字段的依赖关系,比如部分函数依赖,传递依赖,这时会导致一条SQL查出来的数据,对于业务来说是不完整的,我们就可以使用联合查询把关系中的数据全部查出来,在一个数据行中显示详细信息
两张表建立主外键关系
这是两张表,而在实际生活中,我们想要的是将两张表合并,去掉不需要的部分
列入下面这张表:
select student.id 学生编号,student.name 学生姓名,class.name 班级名称 from student,class where student.class_id=class.id;
上面这段代码就是一句简单的联合查询
1.联合查询时MYSQL是如何执行的
1.1取多张表的笛卡尔积
语法:
select *from 表名1,表名2;
对多张表进行笛卡尔积的过程
1.先从第一张表中取一条记录,然后再与第二张表中的第一条记录进行组合,生成一条新的记录
2.先从第一张表中取一条记录, 然后再与第二张表中的第二条记录进行组合,生成一条新的记录
以此类推,将第一张表的每一条记录都与第二张表的每一条记录都组合一遍,生成新的记录
最后得到的结果就是一个全排列结果集
通过观察,两张表取笛卡尔积之后,有些数据是无效数据
如何过滤这些无效数据呢?
1.2通过连接条件过滤掉无效数据
在创建两张表时,我们在表中设置了主外键(即每一张表中的班级编号),故此,我们可以判断两张表的班级编号是否相等(也就是主外键是否相等)来过滤掉无效的数据
class_id在两张表中都存在,MYSQL分不清当前语句中的class_id来自哪一个表,我们可以通过表名.列名的方法来解决这个问题
通过判断主外键是否相等来达到过滤无效数据的效果
1.3能够指定列查询,来精减结果集
在第二步时,查询出来的表还达不到我们想要的效果,即我们不想要class_id和id列出现
查询列表中通过表名.列名的方式指定要查询的字段
select student.id,student.name,class.name from student,class where student.class_id=class