外键
概念
用来通知数据库两张表,列和列 之间的对应关系,并且让数据库维护这个关系的键,就叫外键
假如现在有两张表
此时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;
表关系
一对多:班级对学生,一个班级可以有多个学生,一个学生只能属于一个班级;
多对一:上面的反过来;
一对一:班级对教室;
多对多:学生对老师,学生可以有多个老师,老师可以教多个学生