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
相关文章推荐
- MySQL学习图文笔记整理(一):库操作、单表操作
- MySQL语法常用大全_自己整理的学习笔记
- MySQL学习笔记2:数据库的基本操作(创建删除查看)
- MySQL学习笔记2:数据库的基本操作
- MySQL学习笔记2:数据库的基本操作
- SQL 学习笔记<四> MySQL嵌套查询,集合操作
- MySQL语法大全_自己整理的学习笔记
- MySQL 5.6学习笔记(数据库基本操作,查看和修改表的存储引擎)
- 【MYSQL数据库】MYSQL学习笔记-mysql分区基本操作
- 【MYSQL数据库】MYSQL学习笔记-mysql分区基本操作
- MySQL学习笔记(四)表的操作
- MySQL学习笔记 2 - 基本操作
- linux下c语言学习笔记——操作mysql
- MySQL 5.6学习笔记(数据表基本操作)
- Java学习笔记——JDBC之与数据库MySQL的连接以及增删改查等操作
- Linux下C语言学习笔记—操作MySQL
- 韩顺平_PHP程序员玩转算法公开课(第一季)12_双向链表crud操作之_水浒英雄排行_学习笔记_源代码图解_PPT文档整理
- MySQL语法大全_自己整理的学习笔记
- MYSQL数据库 - 学习笔记2 - C语言操作MYSQL
- MySQL服务器学习笔记!(二) ——数据库各项操作