多表之间的关系如何来维护:
外键约束: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='手机数码');