外键 主表 从表 主表的主键 从表的主键被称为外键
(1)创建主表和从表,(2)给从表添加外键(必须和主表的主键类型一致)(3)声明外键约束(即外键的指向)
- 一对多(分类和商品):在多的一方添加字段,并将多的一方的外键指向低的一方的主键
创建主表:
create table category(cid varchar(32) PRIMARY KEY,cname varchar(100));
创建从表
create table product(pid varchar(32) PRIMARY KEY,name varchar(40), price double);
添加外键字段
alter table product add column category_id varchar(32);
添加约束(即产品中包含外键)
alter table product add constraint product_fk foreign key (category_id) references category(cid);
主表:
从表
- 多对多(订单和商品)
订单表
create table orders(oid varchar(32) PRIMARY KEY,totalprice double);
订单项表
create table orderitem(oid varchar(50),pid varchar(50));
订单表和订单项表外键的主外键关系
alter table orderitem add constraint orderitem_orders_fk foreign key(oid) references orders(oid);
商品表和订单项表的主外键关系
alter table orderitem add constraint orderitem_product_fk foreign key(pid) references product(pid);
订单表
订单项表
- 多表查询
内连接inner join(显示、隐式) 外连接outer join(左外连接、右外连接)
- 隐式内连接(distinct重复名称只显示一个)
select distinct cname from category c,product p where c.cid = p.category_id
-
显式内连接(distinct重复名称只显示一个)
select distinct cname from category c inner join product p on c.cid = p.category
- 左外连接
select cname,count(category_id) from category c left outer join product p on c.cid=p.category_id group by cname;
- 子查询(一条语句查询结果作为另一条语句语法的一部分)
1 select * from product where category_id =(select cid from category where cname = '化妆品'); 2 3 select p.* from product p,category c where p.category_id=c.cid and c.cname='化妆品';
结果一样,1使用的是子查询,3使用的是隐式内连接