设置表的外键约束:
一对一表关系:
#设置外键约束:
ALTER TABLE husband #设置从表名称
ADD CONSTRAINT fk_husband_wife #外键约束名称
FOREIGN KEY (hid) #外键字段
REFERENCES wife(wid); #主表及关联的主键字段
#增加数据:增加丈夫表数据的时候需要先增加妻子表数据
INSERT INTO wife(wname) VALUES("刘贝");
INSERT INTO husband (hname) VALUES("张三丰");
#删除数据:如果存在关联数据,先删除丈夫表数据,再删除妻子表,如果没有关联数据则直接删除数据
DELETE FROM husband ;
DELETE FROM wife ;
#删除某一条不关联的妻子数据
DELETE FROM wife WHERE wid=1;
设置外键约束方法和一对一设置一样操作。
一对多关系
ALTER TABLE goods #设置从表名称
ADD CONSTRAINT fk_goods_sorts #外键约束名称
FOREIGN KEY (sort_id) #外键字段
REFERENCES sorts(sid); #主表及关联的主键字段
#增加数据:先增加分类数据再增加商品数据
INSERT INTO sorts(sname) VALUES("电脑");
INSERT INTO goods (gname,price,sort_id)VALUES("苹果电脑",6500,2);
#删除数据:先删除商品数据,再删除分类数据
DELETE FROM goods WHERE gid=3;
DELETE FROM sorts WHERE sid=2;
多对多关系
#设置外键关联:学生表关联
ALTER TABLE fks #设置从表名称
ADD CONSTRAINT fk_students #外键约束名称
FOREIGN KEY (student_id) #外键字段
REFERENCES students(sid); #主表及关联的主键字段
#设置外键关联:课程表关联
ALTER TABLE fks #设置从表名称
ADD CONSTRAINT fk_course #外键约束名称
FOREIGN KEY (course_id) #外键字段
REFERENCES course(cid); #主表及关联的主键字段
#测试增加:需要先增加学生和课程数据,再增加中间表外键数据
INSERT INTO students(sname,phone)VALUES("张三","13312354568");
INSERT INTO course(cname)VALUES("大数据");
INSERT INTO fks(student_id,course_id)VALUES(1,2);
#删除数据:先删除外键中间表数据,再删除学生和课程数据
DELETE FROM fks WHERE student_id=1;
DELETE FROM students WHERE sid=1;
mysql数据库中,涉及到两表或者多表关联查询的时候
通常有以下几种方式:
1.隐式内连接:where关键字使用
select * from A,B where A.外键=B.主键
2.显式内连接:inner join使用
select * from A inner join B on A.外键=B.主键
内连接查询练习
#查询所有商品和商品对应的分类信息
#隐式内连接查询:通过关联的外键和主键相等来实现
SELECT * FROM sorts ,goods
WHERE sorts.`sid`=goods.`sort_id`;
#显示内连接
SELECT * FROM sorts INNER JOIN goods
ON sorts.`sid`=goods.`sort_id`;
1.左外连接查询:
select * from A left join B on A.外键=B.主键
效果:left左边的A表数据会全部显示出来,无论是否两表有关联的数据都会显示
2.右外连接查询
select * from A right join B on A.外键=B.主键
效果:right右边的B表数据会全部显示出来,无论是否两表有关联的数据都会显示
外连接查询
#左外链接查询
SELECT * FROM sorts LEFT JOIN goods
ON sorts.`sid`=goods.`sort_id`;
#右外连接查询
SELECT * FROM goods RIGHT JOIN sorts
ON sorts.`sid`=goods.`sort_id`;
所谓自连接查询,其实查询的是一张表数据,需要在执行查询的时候,虚拟出另外一张表的操作。表中主键id会和表的其中一个字段关联
自连接查询
需要虚拟出一张表进行操作
#查询员工姓名以及员工对应的领导姓名
SELECT e.`ename` 直属领导 ,p.`ename` 员工姓名
FROM emp e,emp p
WHERE e.`empno`=p.`mgr`;