在讲多表之前,先讲解一下外键的相关知识:
alter table 从表名 add [constraint] [外键名称] foreign key(从表中的外键字段名) references 主表(主表的主键);
外键名称的作用:
用于删除外键约束,一般建议以“_fk”结尾。
外键的解除方法:
alter table 从表名 drop foreign key 外键名称;
具体使用,见下面案例。
【建表原则】:在从表(多方)中创建一个字段,该字段作为外键指向主表(一方)的主键。
【建表原则】:需要创建第三张表(作为中间表),中间表至少两个字段(两个外键),这两个字段分别作为外键指向各自多方的主键。
原理:将一个多对多拆分成两个一对多(两张表都是中间表的主表)。
【建表原则】:
第一种:唯一外键对应,即在任意一方表中创建另一张表的外键指向另一张表的主键。
第二种:主键对应,即任意一个表的主键作为另一张表的外键直接指向另一张表的主键。
1.分类表
create table category(
cid varchar(32) primary key,
cname varchar(100)
);
插入数据:
insert into category(cid,cname) values('c001','家电');
insert into category(cid,cname) values('c002','服饰');
insert into category(cid,cname) values('c003','化妆品');
由于数据中含有中文,如果没有设置编码,可能出现以下错误:
查表:
2.商品表
create table product(
pid varchar(32) primary key,
pname varchar(40),
price double
);
插入数据:
insert into product(pid,pname,price,category_id) values('p001','联想','5000','c001');
insert into product(pid,pname,price,category_id) values('p002','海尔','5000','c001');
insert into product(pid,pname,price,category_id) values('p003','雷神','5000','c001');
insert into product(pid,pname,price,category_id) values('p004','JACK JONES','800','c002');
insert into product(pid,pname,price,category_id) values('p005','真维斯','200','c002');
insert into product(pid,pname,price,category_id) values('p006','花花公子','440','c002');
insert into product(pid,pname,price,category_id) values('p007','劲霸','2000','c002');
insert into product(pid,pname,price,category_id) values('p008','香奈儿','800','c003');
insert into product(pid,pname,price,category_id) values('p009','相宜本草','200','c003');
3.添加外键列
alter table product add category_id varchar(32);
查表:
4.添加约束
alter table product add constraint product_fk foreign key(category_id) references category(cid);
1.订单表
create table orders(
oid varchar(32) primary key,
totalprice double
);
2.订单项表
create table orderitem(
oid varchar(50),
pid varchar(50)
);
3.联合主键
alter table orderitem add primary key(oid,pid);
4.订单表和订单项表的主外键关系
alter table orderitem add constraint orderitem_orders_fk foreign key(oid) references orders(oid);
5.商品表和订单项表的主外键关系
alter table orderitem add constraint orderitem_product_fk foreign key(pid) references product(pid);
语法:
select * from A,B;
例:
select * from category,product;
语法:
select * from A,B where 条件;
例:
select * from category c,product p where c.cid=p.category_id;
语法:
select * from A inner join B on 条件;
例:
select * from category c inner join product p on c.cid=p.category_id;
语法:
select * from A left outer join B on 条件;
例1:
select * from category c left outer join product p on c.cid=p.category_id;
例2:查询所有分类上架商品的个数
select cname,count(category_id) from category c left outer join product p on c.cid=p.category_id group by cname;
语法:
select * from A right outer join B on 条件;
例:
select * from category c right outer join product p on c.cid=p.category_id;
【总结】:左右外连接的区别
子查询:一条select语句结果作为另一条select语法的一部分。
例:查询“化妆品”分类上架商品详情(以子查询为例,也可用其他方法)
select * from product where category_id=(select cid from category where cname='化妆品');
注意事项:
从表外键中不能添加主表中不存在的记录。
主表中不能删除从表中已经引用的记录。
如果要删除,请参考:
http://blog.csdn.net/hu1010037197/article/details/77587841