MYSQL————联合查询

联合多个表进行查询

设计数据时把表进行拆分,为了消除表中字段的依赖关系,比如部分函数依赖,传递依赖,这时会导致一条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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值