MYSQL多表的建表的操作

需求:

分类表和商品表之间是不是有关系? 如果有关系,在数据库中如何表示这种关系 ​

技术分析:多表之间的关系如何来维护

外键约束: foreign key

  • 给product中的这个cno 添加一个外键约束:alter table product add foreign key(cno) references category(cid);
  • 删除的时候, 先删除外键关联的所有数据,再才能删除分类的数据

建数据库原则:

通常情况下,一个项目/应用建一个数据库

多表之间的建表原则

  • 一对多 : 商品和分类

建表原则: 在多的一方添加一个外键,指向一的一方的主键

  • 多对多: 老师和学生, 学生和课程

建表原则: 建立一张中间表,将多对多的关系,拆分成一对多的关系,中间表至少要有两个外键,分别指向原来的那两张表

  • 一对一: 班级和班长, 公民和身份证, 国家和国旗

建表原则:直接将两张表合并成一张表

约束

  • 主键约束: 默认就是不能为空, 唯一

外键都是指向另外一张表的主键

主键一张表只能有一个

  • 唯一约束: 列面的内容, 唯一, 不能出现重复情况, 为空

唯一约束不可以作为其它表的外键

可以有多个唯一约束

扫描二维码关注公众号,回复: 4538153 查看本文章

网上商城表实例的分析: 用户购物流程​

  • 用户表 (用户的ID,用户名,密码,手机)
create table user(
    uid int primary key auto_increment,
    username varchar(31),
    password varchar(31),
    phone  varchar(11)
);
​
insert into user values(1,'zhangsan','123','13811118888');
  • 订单表 (订单编号,总价,订单时间 ,地址,外键用户的ID)
  create table orders(
    oid int primary key auto_increment,
        sum int not null,
      otime timestamp,
        address varchar(100),
        uno int,
        foreign key(uno) references user(uid)
  );
  insert into orders values(1,200,null,'黑马前台旁边小黑屋',1);
  insert into orders values(2,250,null,'黑马后台旁边1702',1);
  • 商品表 (商品ID, 商品名称,商品价格,外键cno)
create table product(
    pid int primary key auto_increment,
    pname varchar(10),
    price double,
    cno int,
    foreign key(cno) references category(cid)
);
​
insert into product values(null,'小米mix4',998,1);
insert into product values(null,'锤子',2888,1);
insert into product values(null,'阿迪王',99,2);
insert into product values(null,'老村长',88,3);
insert into product values(null,'劲酒',35,3);
insert into product values(null,'小熊饼干',1,4);
insert into product values(null,'卫龙辣条',1,5);
insert into product values(null,'旺旺大饼',1,5);
  • 订单项: 中间表(订单ID,商品ID,商品数量,订单项总价)
create table orderitem(
    ono int,
    pno int,
    foreign key(ono) references orders(oid),
    foreign key(pno) references product(pid),
    ocount int,
    subsum double
);
--给1号订单添加商品 200块钱的商品
insert into orderitem values(1,7,100,100);
insert into orderitem values(1,8,101,100);
​
--给2号订单添加商品 250块钱的商品 ()
insert into orderitem values(2,5,1,35);
insert into orderitem values(2,3,3,99);
  • 商品分类表(分类ID,分类名称,分类描述)
create table category(
    cid int primary key auto_increment,
    cname varchar(15),
    cdesc varchar(100)
);
​
insert into category values(null,'手机数码','电子产品,黑马生产');
insert into category values(null,'鞋靴箱包','江南皮鞋厂倾情打造');
insert into category values(null,'香烟酒水','黄鹤楼,茅台,二锅头');
insert into category values(null,'酸奶饼干','娃哈哈,蒙牛酸酸乳');
insert into category values(null,'馋嘴零食','瓜子花生,八宝粥,辣条');

交叉连接查询  笛卡尔积

SELECT * FROM product;
SELECT * FROM category;

笛卡尔积 ,查出来是两张表的乘积 ,查出来的结果没有意义
SELECT * FROM product,category;

--过滤出有意义的数据
SELECT * FROM product,category WHERE cno=cid;

SELECT * FROM product AS p,category AS c WHERE p.cno=c.cid;
SELECT * FROM product p,category c WHERE p.cno=c.cid;
--数据准备
INSERT INTO product VALUES(NULL,'耐克帝',10,NULL);

内连接查询

隐式内链接
  SELECT * FROM product p,category c WHERE p.cno=c.cid;
-- 显示内链接
  SELECT * FROM product p INNER JOIN category c ON p.cno=c.cid;    
-- 区别:
    隐式内链接: 在查询出结果的基础上去做的WHERE条件过滤
    显示内链接: 带着条件去查询结果, 执行效率要高

左外连接

左外连接,会将左表中的所有数据都查询出来, 如果右表中没有对应的数据,用NULL代替

SELECT * FROM product p LEFT OUTER JOIN category c ON p.cno=c.cid;

- 准备工作
  INSERT INTO category VALUES(100,'电脑办公','电脑叉叉差');

右外连接

右外连接: 会将右表所有数据都查询出来, 如果左表没有对应数据的话, 用NULL代替
  SELECT * FROM product p RIGHT OUTER JOIN category c ON p.cno=c.cid;

 

猜你喜欢

转载自blog.csdn.net/qq_38635681/article/details/84961806
今日推荐