Mysql多表操作

多表之间的关系如何来维护:

外键约束:foreign key

              1.   给product中的这个cno添加一个外键约束

                    alter table product add foreign key(cno) references category(cid);

               2.   从分类表中,删除分类为5信息

                    首先得去product表,删除所有分类ID5 商品

多表之间的建表原则:

1.一对多:商品和分类

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

2.多对多:老师和学生,学生和课程

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

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

       建表原则:

                1.将一对一的情况,当作是一对多情况处理,在任意一张表添加一个外键,并且这个外键要唯一,指向另外一张表

                2.直接将两张表合并成一张表

                3.将两张表的主键建立起连接,让两张表里面主键相等

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

1.用户表(用户的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');

2.订单表(订单编号,总价,订单时间,地址,外键用户的ID)

create table orders(
    oid int primary key auto_increment,
    sum int,
    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,'后台',1);

3.商品表(商品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);

4.订单项:中间表(订单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);

5.商品分类表(分类ID,分类名称,分类描述)

create table category(
    cid int primary key auto_increment,
    cname varchar(15),
    cdesc varchar(100)
); 
insert into category values(null,'手机数码','电子产品');

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

         1.外键是指向另外一张表的主键

         2.主键一张表只能有一个

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

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

         2.可以有多个唯一约束

使用商城表完成对商品信息的多表查询

多表查询:

1.交叉连接查询 笛卡尔积 

   笛卡尔积,查出来的是两张表的乘积,查出来的结果没有意义

--过滤出有意义的数据

SELECT * FROM product,category WHERE cno=cid;

 

2.内连接查询

--隐式内连接

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条件过滤

             显示内连接:带着条件去查询结果,执行效率高一些

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

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

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

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

分页查询:

每页数据数据3,起始索引从0,第1页:0,第2页:3,起始索引:index代表显示第几页,页数从1开始,每页显示3条数据,startindex=(index-1)*3;

limit:

select * from product limit 0,10;

子查询:

查询出(商品名称,商品分类名称)信息

--子查询
SELECT pname,(SELECT cname FROM category c WHERE p.cno = c.cid) AS 商品分类名称 FROM product p;

--左连接
SELECT p.pname,c.cname FROM product p LEFT OUTER JOIN category c ON p.cno = c.cid;

查询分类名称为手机数码的所有商品:

SELECT * FROM product WHERE cno = (SELECT cid FROM category WHERE cname='手机数码'); 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值