本帖最后由 哥.兜裡有煙 于 2017-12-3 18:03 编辑
【数据库的多表设计】数据库都是关系型的数据库,存的是实体之间的关系.实体之间有哪些关系? 实体的关系总结起来就有三种关系: 一对多:
- 客户和订单:一个客户可以产生多个订单,一个订单只能属于是某一个客户.
- 部门和员工:一个部门下可以有多个员工,一个员工只能属于某一个部门.
多对多:
- 学生和课程:一个学生可以选择多门课程,一门课程可以被多个学生选择.
- 订单和商品:一个订单中包含多个商品,一个商品也可以出现多个订单中.
- 一对一:
- 公司和地址:一个公司只能有一个注册地址,一个地址也只能被一个公司注册.
【多表的设计】 一对多的关系的建表原则:
- 在多的一方创建一个字段,这个字段作为外键执向一的一方的主键.
多对多的关系的建表原则:
- 创建一个第三种表,中间表中至少需要两个字段分别作为外键执向多对多双方的各自的主键.
一对一的关系的建表原则:
- 唯一外键对应:假设一对一的双方是一对多的关系.在多的一方创建外键执向一的一方的主键.需要在外键上添加一个unique约束.
- 主键对应:将一对一的双方的主键建立映射.
【使用SQL创建一对多的关系】 创建客户表: create table customer( cid int primary key auto_increment, cname varchar(20));create table orders( oid int primary key auto_increment, addr varchar(50), cid int);- 约束:用来保证数据的完成型.
- 多表约束:外键约束!!!
- ***** 给orders表中的cid添加外键约束.
- alter table orders add foreign key (cid) references customer(cid);
- 一对多的关系由多的一方维护
【多表的查询的SQL】 - 多表的查询的方式:
- 交叉连接:
- select * from A,B; --- 获得的是两个表的笛卡尔积.
- 内连接: inner join -- inner 可以省略
- 显式内连接:select * from A inner join B on 条件;
- SELECT * FROM customer c INNER JOIN orders o ON c.cid = o.cid;
- 隐式内连接:select * from A,B where 条件;
- SELECT * FROM customer c ,orders o WHERE c.cid = o.cid;
- 外连接:outer join -- outer 可以省略
- 左外连接:left outer join -- select * from A left outer join B on 条件;
- SELECT * FROM customer c LEFT OUTER JOIN orders o ON c.cid = o.cid;
- 右外连接:right outer join -- select * from A right outer join B on 条件;
- SELECT * FROM customer c RIGHT OUTER JOIN orders o ON c.cid = o.cid; ```
【多表查询的子查询】 - 一个SQL语句查询的过程中需要依赖另一个查询语句.
- SELECT * FROM customer c,orders o WHERE c.cid = o.cid AND c.cid IN (SELECT cid FROM orders WHERE addr LIKE '海淀%');
|