您的位置:首页 > 数据库 > MySQL

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

2017-08-27 01:34 633 查看

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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: