MySQL 外键约束

-- 外键约束
-- 先建 主表再建副表
CREATE TABLE dept( -- 主表
did INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(10),
mgr VARCHAR(10)
);
CREATE TABLE emp1( -- 副表
eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(10),
did INT, -- 外键字段
CONSTRAINT fk_dept_emp1 FOREIGN KEY(did)REFERENCES dept(did) -- references(依赖)
);
-- 添加数据:先添加主表,再添加副表
INSERT INTO dept(dname,mgr) VALUES('开发部','tom');
INSERT INTO dept (dname,mgr) VALUES('产品部','jerry');
INSERT INTO dept(dname,mgr) VALUES('运维部','tony');
SELECT * FROM dept;

INSERT INTO emp1(ename,did) VALUES('熊大',1);
INSERT INTO emp1(ename,did) VALUES('熊二',1);
INSERT INTO emp1(ename,did) VALUES('光头强',2);
INSERT INTO emp1(ename,did) VALUES('吉吉国王',3);
SELECT * FROM emp1;
-- 修改或删除 先改副表
DELETE FROM dept WHERE did=3; -- 不可以先修改主表,被外键约束限制。
DELETE FROM emp1 WHERE did=3; -- 先修改副表,再修改主表。
-- 如果要彻底删除副表,先把主表关联数据删除,被约束得表叫副表,约束别人得表叫主表,外键设置在副表上。
-- 连接查询(多表查询)
-- 交叉连接(笛卡尔积) 语法:from 表1 join 表2
SELECT * FROM emp1 JOIN dept;
-- 内连接 语法:from 表1 join 表2 on 表1字段=表2字段(因为名字相同所以在前面加表名)。
SELECT * FROM emp1 JOIN dept ON emp1.`did`=dept.`did`;
-- 查询熊大所属的部门名称
SELECT dname FROM emp1 JOIN dept ON emp1.`did`=dept.`did` WHERE ename='熊大';
-- 查询开发部的所有人姓名
SELECT ename FROM emp1 JOIN dept ON emp1.`did`=dept.`did` WHERE dname='开发部';
-- 查询光头强的部分经理名称
SELECT mgr FROM emp1 JOIN dept ON emp1.`did`=dept.`did` WHERE ename='光头强';
-- 多张表连接
-- select * from 表1 join 表2 on 表1.字段=表2.字段 join 表3 on 表2.字段=表3.字段;
-- --
-- 外连接
-- 左外连接(已左表为主表):from 表1 left join 表2 on 连接条件 (内连接查询结果+左边不满足连接条件数据)
SELECT * FROM dept LEFT JOIN emp1 ON emp1.`did`=dept.`did`;
-- 右外连接(已右表为主表):from 表1 right join 表2 on 连接条件 (内连接查询结果+右边不满足连接条件数据)
SELECT * FROM emp1 RIGHT JOIN dept ON emp1.`did`=dept.`did`;

posted @ 2022-04-12 10:49  猫java猫  阅读(111)  评论(0)    收藏  举报