MySQL学习图文笔记整理(二):多表操作

MySQL学习图文笔记整理(二):多表操作

在讲多表之前,先讲解一下外键的相关知识:

一、外键约束语法

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);

四、多表查询(笛卡尔、内连接、外链接、子查询)

1.笛卡尔积(交叉连接查询):得到的是两个表的乘积。

语法:

select * from A,B;

例:

select * from category,product;

2.内连接查询

  • 隐式内连接:

语法:

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; 

3.外连接

  • 左外连接:

语法:

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;

【总结】:左右外连接的区别

4.子查询

子查询:一条select语句结果作为另一条select语法的一部分。

例:查询“化妆品”分类上架商品详情(以子查询为例,也可用其他方法)

select * from product where category_id=(select cid from category where cname='化妆品');

五、总结

注意事项:

  • 从表外键中不能添加主表中不存在的记录。

  • 主表中不能删除从表中已经引用的记录。

如果要删除,请参考:

http://blog.csdn.net/hu1010037197/article/details/77587841

你可能感兴趣的:(MySQL,mysql)