Mac环境下的MySQl基础操作(二)

外键

概念

用来通知数据库两张表,列和列 之间的对应关系,并且让数据库维护这个关系的键,就叫外键

假如现在有两张表

                      

此时CommandDetail表设置了外键,关联到了Command表的id,所以,此时如果删除Command表的牛仔裤或者毛衣,是无法删除的,因为CommandDetail中有数据与之关联,数据库自动帮我们维护了这个关系

多表查询

select * from Command,CommandDEtail;//两张表之间用逗号隔开

这种方式可以实现,但是会包含一些错误数据,也叫笛卡尔积查询

关联查询

过滤上面的错误数据,保留正确的属性对应的数据:这样的话保留下来的只有两个表中同时都有的数据

select * from Command,CommandDEtail where Command.id=CommandDetail.command_id;

左外连接查询和右外连接查询

select * from Command left join CommandDetail on Command.id=CommandDetail.command_id;

这里做个解释:表一 left join 表二 on 条件    这时候表一查询出来的是全部数据

 

select * from Command right join CommandDetail on Command.id=CommandDetail.command_id;

这里做个解释:表一 right join 表二 on 条件    这时候表二查询出来的是全部数据

结果作为临时表查询

比如我现在想查询每一种服装种类中价格最高的品类

如果我们这样写

select Command.id,CommandDetail.name,max(price) from CommandDetail left join Command on Command.id=CommandDetail.command_id group by command_id;

查询的结果:很明显不对,最高价格的毛衣是绒毛衣,因为这里显示的名字永远是第一行的

 

问题解决:

第一步:我们先关联查询两张表的全部相关数据:

select Command.id,Command.name,CommandDetail.name,CommandDetail.price from Command,CommandDetail where Command.id=CommandDetail.command_id;

第二步:我们查询最高价格以及对应的id:

select command_id,max(price) from CommandDetail group by command_id;

第三步:关联 我们把步骤2中查询的结果看成是一张临时表,只要id对应,并且价格和Command表对应上,这就演变成查询上面两张表的操作,就可以查询到最高价格对应服装种类中的品类

这里最好起别名,防止多张表字段有同名,查询出错

 

select CommandDetail.command_id,CommandDetail.name,CommandDetail.price, t.maxprice

                         from

                              CommandDetail,

                              (select max(price) as maxprice from CommandDetail group by command_id) as t

                                                 where CommandDetail.price=t.maxprice;

 

三张表

select

Command.name, CommandDetail.command_id,CommandDetail.name,CommandDetail.price,t.maxprice

from

CommandDetail,

Command,

(select max(price) as maxprice from CommandDetail group by command_id) as t

where

CommandDetail.price=t.maxprice

and

Command.id=CommandDetail.command_id;

 

表关系 

一对多:班级对学生,一个班级可以有多个学生,一个学生只能属于一个班级;

多对一:上面的反过来;

一对一:班级对教室;

多对多:学生对老师,学生可以有多个老师,老师可以教多个学生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小苏的小小苏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值