【数据库笔记04】(表间建立联系)
如何联系表
多表之间的关系怎么维护?
- 外键约束:foreign key
- 如图建立两个表,给product的cno添加一个外键约束 //references 执行
alter table product add foreign key(cno) references category (cid);
- 删除表的时候注意
要先删除外键才能删除表
多表之间的建表原则
- 一对多(category、product)
– 在多的一方添加外键指向一的主键 - 多对多
– 将多对多拆成两个一对多,建一个中间表,至少有两个外键,对应两个表 - 一对一
– 不常用,拆标时候常用,将两张表合并成一张表 / 将两个表主键建立关系 / 当成一对多处理
多表查询
交叉连接查询 (笛卡儿积)
select * from product,ckinds;
会得到两个表数目乘积数目的数据
这样的数据杂乱且没有意义
内链接
隐式内链接
select * from product,ckinds where ckid=ckno;
增加where条件过滤
显式内链接 —— INNER JOIN……ON
select * from product p INNER JOIN ckinds ck ON p.ckid=ck.ckno;
增加where条件过滤
隐式 / 显式内链接的区别
- 隐式:在查询结果后进行where过滤
- 显示:带着条件去执行查询 效率更高
外连接
左外连接 —— LEFT OUTER JOIN……ON
select * from product p LEFT OUTER JOIN ckinds c ON p.ckno=c.ckid;
会将左表中的所有数据都查询出来,若右表中没有用 NULL 填充
右外连接 —— RIGHT OUTER JOIN……ON
- 与左表同理
图解
分页查询 —— limit
select * from product limit 起始索引,个数;
index 代表显示几页
startindex=(index-1)*每页显示个数
子查询
1.查出所有分类为方便食品的商品)
select * from product where ckno=(select ckid from ckinds where ckname="方便食品");
2.查询出(商品名称,商品分类名称的信息)
左连接
select pname,ckname from product p left outer join ckinds c on p.ckno=c.ckid;
子查询
select pname,(select ckname from ckinds where ckid=ckno) from product;