黑马程序员技术交流社区

标题: 【石家庄校区】MySQL数据库--多表操作 [打印本页]

作者: perry2017    时间: 2018-1-23 15:04
标题: 【石家庄校区】MySQL数据库--多表操作
本帖最后由 小石姐姐 于 2018-1-24 16:05 编辑

MySQL数据库--多表操作

数据库都是关系型的数据库,存的是实体之间的关系.实体之间有哪些关系?
实体的关系总结起来就有三种关系:

一对多:
    * 客户和订单:一个客户可以产生多个订单,一个订单只能属于是某一个客户.
    * 部门和员工:一个部门下可以有多个员工,一个员工只能属于某一个部门.

多对多:
    * 学生和课程:一个学生可以选择多门课程,一门课程可以被多个学生选择.
    * 订单和商品:一个订单中包含多个商品,一个商品也可以出现多个订单中.

一对一:
    * 公司和地址:一个公司只能有一个注册地址,一个地址也只能被一个公司注册.

【多表的设计】
Ø  一对多的关系的建表原则:
* 在多的一方创建一个字段,这个字段作为外键执向一的一方的主键.
Ø  多对多的关系的建表原则:
* 创建一个第三种表,中间表中至少需要两个字段分别作为外键执向多对多双方的各自的主键.
Ø  一对一的关系的建表原则:
* 唯一外键对应:假设一对一的双方是一对多的关系.在多的一方创建外键执向一的一方的主键.需要在外键上添加一个unique约束.
* 主键对应:将一对一的双方的主键建立映射.

【使用SQL创建一对多的关系】
创建客户表:
create table customer(
    cid intprimary key auto_increment,
    cnamevarchar(20)
);

create table orders(
    oid intprimary key auto_increment,
    addrvarchar(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 Ainner join B on 条件;
        * SELECT * FROM customer c INNER JOIN orders o ON c.cid =o.cid;
    * 隐式内连接:select * from A,Bwhere 条件;
        * SELECT * FROM customer c ,orders o WHERE c.cid = o.cid;
* 外连接:outerjoin -- outer 可以省略
    * 左外连接:leftouter join  -- select * from A left outerjoin B on 条件;
        *SELECT * FROM customer c LEFT OUTER JOIN orders o ON c.cid = o.cid;
    * 右外连接:rightouter 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 FROMorders WHERE addr LIKE '海淀%');

【多表练习】
按客户名称统计订单的个数.
SELECT c.cname,COUNT(*) FROM customer c,orders oWHERE c.cid = o.cid GROUP BY c.cname;







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2