A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1.1 案例一:将商城的案例中的表结构进行分析:1.1.1 需求:
在最后的综合案例中,会创建数据库,为数据库中创建很多表.表与表之间是有关系存在,分析表之间关系并且完成表的创建.
1.1.2 分析:1.1.2.1 技术分析
【数据库的多表设计】
数据库都是关系型的数据库,存的是实体之间的关系.实体之间有哪些关系?
实体的关系总结起来就有三种关系:
一对多:
    * 客户和订单:一个客户可以产生多个订单,一个订单只能属于是某一个客户.
    * 部门和员工:一个部门下可以有多个员工,一个员工只能属于某一个部门.
多对多:
    * 学生和课程:一个学生可以选择多门课程,一门课程可以被多个学生选择.
    * 订单和商品:一个订单中包含多个商品,一个商品也可以出现多个订单中.
一对一:
    * 公司和地址:一个公司只能有一个注册地址,一个地址也只能被一个公司注册.
【多表的设计】
Ø 一对多的关系的建表原则:
* 在多的一方创建一个字段,这个字段作为外键执向一的一方的主键.
Ø 多对多的关系的建表原则:
* 创建一个第三种表,中间表中至少需要两个字段分别作为外键执向多对多双方的各自的主键.
Ø 一对一的关系的建表原则:
* 唯一外键对应:假设一对一的双方是一对多的关系.在多的一方创建外键执向一的一方的主键.需要在外键上添加一个unique约束.
* 主键对应:将一对一的双方的主键建立映射.
【使用SQL创建一对多的关系】
创建客户表:
[AppleScript] 纯文本查看 复制代码
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);
1.1.3 商城模型分析:
图片1.png
1.2 案例二:使用SQL完成多表的查询:1.2.1 需求:
使用多表的查询,完成某个分类下的商品的显示.很多的情况下都需要使用多表的查询.
1.2.2 分析:1.2.2.1 技术分析:
【多表的查询的SQL】
[AppleScript] 纯文本查看 复制代码
Ø 多表的查询的方式:
* 交叉连接:
    * 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 '海淀%');
【多表练习】
按客户名称统计订单的个数.
SELECT c.cname,COUNT(*) FROM customer c,orders o WHERE c.cid = o.cid GROUP BY c.cname;

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马