Skip to content

主键外键

sh
#若系统中存在数据库ems,则删除数据库ems
DROP DATABASE IF EXISTS ems;

# 创建一个名称为ems,字符集为utf8的数据库
CREATE DATABASE IF NOT EXISTS ems CHARACTER SET utf8;

# 选择数据库ems
USE ems;

# 向数据库ems中创建员工表emp
# -----------------------------------------------------------------------------------------------
# 字段	类型		主键	外键	非空	唯一	自增	字段说明
# -----------------------------------------------------------------------------------------------
# empno	INT		是	否	是	是	否	员工号
# ename	VARCHAR(20)	否	否	是	是	否	员工名
# job	VARCHAR(20)	否	否	否	否	否	岗位
# mgr	INT		否	否	否	否	否	管理者
# sal 	DECIMAL(7,2)	否	否	否	否	否	工资
# comm	DECIMAL(7,2)	否	否	否	否	否	奖金
# deptno	INT		否	否	否	否	否	部门号
# -----------------------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS emp(
  empno INT PRIMARY KEY,
  ename VARCHAR(20) NOT NULL UNIQUE,
  job VARCHAR(20),
  mgr INT ,
  sal DECIMAL(7, 2),
  comm DECIMAL(7, 2),
  deptno INT
);

DESC emp;

#/*3.1插入数据  */
#------------------------------------------------------------------------------
#empno	ename	job	mgr	sal 	comm	deptno
#------------------------------------------------------------------------------
#9369	张三	保洁	9982	900.00	NULL	20
#9499	孙七	销售	9698	2600.00	300.00	30
#9521	周八	销售	9698	2258.00	500.00	30
#9566	李四	经理	9839	3995.00	NULL	20
#9654	吴九	销售	9698	2250.00	1400.00	30
#9839	刘一	董事长	NULL	6000.00	NULL	10
#9844	郑十	销售	9698	2500.00	0.00	30
#9900	箫十一	保洁	9698	1050.00	NULL	30
#9902	赵六	分析员	9566	4000.00	NULL	20
#9982	陈二	经理	9839	3450.00	NULL	10
#9988	王五	分析员	9566	4000.00	NULL	20
#-------------------------------------------------------------------------------
#/*3.1.1一次插入单条数据  */
#用简化形式将第一条记录插入到员工表emp中
INSERT INTO emp VALUES
(9369, '张三', '保洁', 9982, 900, NULL, 20);

SELECT * FROM emp;

#用一般形式将第二条记录插入到员工表emp中
INSERT INTO emp(empno, ename, job, mgr, sal, comm, deptno)
VALUES(9499, '孙七', '销售', 9698, 2600, 300, 30);

SELECT * FROM emp;

#/*3.1.2一次插入多条数据  */
# 用一条语句将剩下的记录插入到员工表emp中
INSERT INTO emp VALUES
(9521, '周八', '销售', 9698, 2258, 500, 30),
(9566, '李四', '经理', 9839, 3995, NULL, 20),
(9654, '吴九', '销售', 9698, 2250, 1400, 30),
(9839, '刘一', '董事长', NULL, 6000, NULL, 10),
(9844, '郑十', '销售', 9698, 2500, 0, 30),
(9900, '箫十一', '保洁', 9698, 1050, NULL, 30),
(9902, '赵六', '分析员', 9566, 4000, NULL, 20),
(9982, '陈二', '经理', 9839, 3450, NULL, 10),
(9988, '王五', '分析员', 9566, 4000, NULL, 20);

SELECT * FROM emp;

#/*3.2更新数据  */
# 将员工张三的sal字段的值在原来的基础上增加200
UPDATE emp
SET sal = sal + 200
WHERE ename = '张三';

SELECT * FROM emp;

# 将职位为保洁的员工涨薪300
 UPDATE emp
 SET sal = sal + 300
 WHERE job = '保洁';

SELECT * FROM emp;

# 将所有员工涨薪500
UPDATE emp
SET sal = sal + 500;

SELECT * FROM emp;

#/*3.3删除数据  */

# 删除员工表中孙七的数据
DELETE FROM emp
WHERE ename = '孙七';

SELECT * FROM emp;

# 删除员工表中职位为分析员的数据
DELETE FROM emp
WHERE job = '分析员';

SELECT * FROM emp;
# 将员工表中的所有数据全部删除
DELETE FROM emp;

SELECT * FROM emp;

#/*多学一招:使用关键字TRUNCATE删除表中数据  */
# 创建tab_truncate表
#-----------------------------------------------------
#字段	类型		主键	自动增长
# -----------------------------------------------------
# id 	INT 		是	是
# NAME 	VARCHAR(4)	否	否
# -----------------------------------------------------
CREATE TABLE tab_truncate(
  id INT PRIMARY KEY AUTO_INCREMENT,
  `name` VARCHAR(4)
);

DESC tab_truncate;

# 向tab_truncate表中添加5条数据
# ------------------------
# id	NAME
# ------------------------
# 1	A
# 2	B
# 3	C
# 4	D
# 5	E
# ------------------------
INSERT INTO tab_truncate(`name`) VALUES
('A'),
('B'),
('C'),
('D'),
('E');

SELECT * FROM tab_truncate;

# 使用TRUNCATE语句删除tab_truncate表中的所有数据
TRUNCATE TABLE tab_truncate;

SELECT * FROM tab_truncate;

# 在表tab_truncate 中,重新添加5条数据
# ------------------------
# id	NAME
# ------------------------
# 1	F
# 2	G
# 3	H
# 4	I
# 5	J
# ------------------------
INSERT INTO tab_truncate(`name`) VALUES
('F'),
('G'),
('H'),
('I'),
('J');

SELECT *
FROM tab_truncate;

# 使用DELETE语句删除tab_truncate表中的所有数据
DELETE FROM tab_truncate;

# 向tab_truncate数据表中添加一条新数据
 INSERT INTO tab_truncate(NAME) VALUES('K');

 SELECT * FROM tab_truncate;

#-----------------------------------第五章第三节----------------------------------------------
#若数据库ems存在,则删除数据库ems
DROP DATABASE IF EXISTS ems;

# 创建一个名称为ems,字符集为utf8的数据库
CREATE DATABASE IF NOT EXISTS ems CHARACTER SET utf8;

# 选择数据库ems
USE ems;

#向数据库ems中创建部门表dept
#-----------------------------------------------------------------------------------------------
#字段	类型		主键	外键	非空	唯一	自增	字段说明
#-----------------------------------------------------------------------------------------------
#deptno	INT		是	否	是	是	否	部门号
#dname 	VARCHAR(20)	否	否	是	是	否	部门名
#------------------------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS dept(
  deptno INT PRIMARY KEY,
  dname VARCHAR(20) NOT NULL UNIQUE
);

DESC dept;

#向部门表中插入数据
#-------------------------
#deptno	dname
#-------------------------
# 10	总裁办
# 20	研究院
# 30	销售部
# 40	运营部
#-------------------------
INSERT INTO dept VALUES
(10, '总裁办'),
(20, '研究院'),
(30, '销售部'),
(40, '运营部');

SELECT * FROM dept;

# 向数据库ems中创建员工表emp
#-----------------------------------------------------------------------------------------------
#字段	类型		主键	外键	非空	唯一	自增	字段说明
#-----------------------------------------------------------------------------------------------
# empno	INT		是	否	是	是	否	员工号
# ename	VARCHAR(20)	否	否	是	是	否	员工名
# job	VARCHAR(20)	否	否	否	否	否	岗位
# mgr	INT		否	否	否	否	否	管理者
# sal 	DECIMAL(7,2)	否	否	否	否	否	工资
# comm	DECIMAL(7,2)	否	否	否	否	否	奖金
# deptno	INT		否	是	否	否	否	部门号
#-----------------------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS emp(
  empno INT PRIMARY KEY,
  ename VARCHAR(20) NOT NULL UNIQUE,
  job VARCHAR(20),
  mgr INT,
  sal DECIMAL(7, 2),
  comm DECIMAL(7, 2),
  deptno INT,
  CONSTRAINT FOREIGN KEY(deptno) REFERENCES dept(deptno)
);

DESC emp;

#/*向员工表插入数据  */
#------------------------------------------------------------------------------
empno	ename	job	mgr	sal 	comm	deptno
#------------------------------------------------------------------------------
# 9369	张三	保洁	9982	900.00	NULL	20
# 9499	孙七	销售	9698	2600.00	300.00	30
# 9521	周八	销售	9698	2258.00	500.00	30
# 9566	李四	经理	9839	3995.00	NULL	20
# 9654	吴九	销售	9698	2250.00	1400.00	30
# 9839	刘一	董事长	NULL	6000.00	NULL	10
# 9844	郑十	销售	9698	2500.00	0.00	30
# 9900	箫十一	保洁	9698	1050.00	NULL	30
# 9902	赵六	分析员	9566	4000.00	NULL	20
# 9982	陈二	经理	9839	3450.00	NULL	10
# 9988	王五	分析员	9566	4000.00	NULL	20
#-------------------------------------------------------------------------------
INSERT INTO emp VALUES
(9369, '张三', '保洁', 9982, 900, NULL, 20),
(9499, '孙七', '销售', 9698, 2600, 300, 30),
(9521, '周八', '销售', 9698, 2258, 500, 30),
(9566, '李四', '经理', 9839, 3995, NULL, 20),
(9654, '吴九', '销售', 9698, 2250, 1400, 30),
(9839, '刘一', '董事长', NULL, 6000, NULL, 10),
(9844, '郑十', '销售', 9698, 2500, 0, 30),
(9900, '箫十一', '保洁', 9698, 1050, NULL, 30),
(9902, '赵六', '分析员', 9566, 4000, NULL, 20),
(9982, '陈二', '经理', 9839, 3450, NULL, 10),
(9988, '王五', '分析员', 9566, 4000, NULL, 20);

#5.3.0 删除员工表的外键约束
#查看外键约束名 show create table emp;
ALTER TABLE emp DROP FOREIGN KEY emp_ibfk_1;

#查看表中所有索引show index from emp;
ALTER TABLE emp DROP INDEX deptno;

DESC emp;

# /*5.3.1添加外键约束 */
# 给员工表emp的deptno字段添加外键约束,关联部门表dept的deptno字段,约束名fk_deptno
ALTER TABLE emp ADD CONSTRAINT fk_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno);

DESC emp;

#/*5.3.2操作关联表 */
## 主表dept添加数据
#-------------------------
#deptno	dname
#-------------------------
#50	人力资源部
#-------------------------
INSERT INTO dept VALUES
(50, '人力资源部');

SELECT * FROM dept;

# 在往员工表emp中添加数据
#------------------------------------------------------------------------------
#empno	ename	job		mgr	sal 	comm	deptno
#------------------------------------------------------------------------------
#9966	八戒	运营专员	9839	3000.00	2000	40
#9999	悟空	人事专员	9982	3000.00	NULL	50
#-------------------------------------------------------------------------------
INSERT INTO emp VALUES
(9966, '八戒', '运营专员', 9839, 3000, 2000, 40),
(9999, '悟空', '人事专员', 9982, 3000, NULL, 50);

SELECT * FROM emp;

# 查询人力资源部有哪些员工
SELECT *
FROM emp
WHERE deptno = (
    SELECT deptno
    FROM dept
    WHERE dname = '人力资源部'
);

# 删除从表emp中属于人力资源部的员工信息
DELETE FROM emp
WHERE deptno = (
    SELECT deptno
    FROM dept
    WHERE dname = '人力资源部'
);

SELECT * FROM emp;

# 查询属于人力资源部的员工信息
SELECT *
FROM emp
WHERE deptno = (
    SELECT deptno
    FROM dept
    WHERE dname = '人力资源部'
);

# 删除主表dept中人力资源部的数据
DELETE FROM dept
WHERE dname = '人力资源部';

SELECT * FROM dept;

# /*5.3.3删除外键约束 */
# 将员工表emp中的外键约束删除
ALTER TABLE emp DROP FOREIGN KEY fk_deptno;

#查看表中所有索引show index from emp;

ALTER TABLE emp DROP INDEX fk_deptno;

DESC emp;

#删除数据库ems
DROP DATABASE ems;
sh
#若数据库ems存在,则删除数据库ems

DROP DATABASE IF EXISTS ems;

# 创建一个名称为ems,字符集为utf8的数据库
CREATE DATABASE ems CHARACTER SET utf8;

# 选择数据库ems
USE ems;

#向数据库ems中创建部门表dept
# -----------------------------------------------------------------------------------------------
# 字段	类型		主键	外键	非空	唯一	自增	字段说明
# -----------------------------------------------------------------------------------------------
# deptno	INT		是	否	是	是	否	部门号
# dname 	VARCHAR(20)	否	否	是	是	否	部门名
# ------------------------------------------------------------------------------------------------

CREATE TABLE dept(
  deptno INT PRIMARY KEY,
  dname VARCHAR(20) NOT NULL UNIQUE
);



#向部门表中插入数据
# -------------------------
# deptno	dname
# -------------------------
# 10	总裁办
# 20	研究院
# 30	销售部
# 40	运营部
# -------------------------

INSERT INTO dept VALUES
(10, '总裁办'),
(20, '研究院'),
(30, '销售部'),
(40, '运营部');

# 向数据库ems中创建员工表emp
# -----------------------------------------------------------------------------------------------
# 字段	类型		主键	外键	非空	唯一	自增	字段说明
# -----------------------------------------------------------------------------------------------
# empno	INT		是	否	是	是	否	员工号
# ename	VARCHAR(20)	否	否	是	是	否	员工名
# job	VARCHAR(20)	否	否	否	否	否	岗位
# mgr	INT		否	否	否	否	否	管理者
# sal 	DECIMAL(7,2)	否	否	否	否	否	工资
# comm	DECIMAL(7,2)	否	否	否	否	否	奖金
# deptno	INT		否	是	否	否	否	部门号
# -----------------------------------------------------------------------------------------------

CREATE TABLE emp(
  empno INT PRIMARY KEY,
  ename VARCHAR(20) NOT NULL UNIQUE,
  job VARCHAR(20),
  mgr INT,
  sal DECIMAL(7, 2),
  comm DECIMAL(7, 2),
  deptno INT,
  FOREIGN KEY(deptno) REFERENCES dept(deptno)
);

DESC emp;

# /*向员工表插入数据  */
# ------------------------------------------------------------------------------
# empno	ename	job	mgr	sal 	comm	deptno
# ------------------------------------------------------------------------------
# 9369	张三	保洁	9982	900.00	NULL	20
# 9499	孙七	销售	9698	2600.00	300.00	30
# 9521	周八	销售	9698	2258.00	500.00	30
# 9566	李四	经理	9839	3995.00	NULL	20
# 9654	吴九	销售	9698	2250.00	1400.00	30
# 9839	刘一	董事长	NULL	6000.00	NULL	10
# 9844	郑十	销售	9698	2500.00	0.00	30
# 9900	箫十一	保洁	9698	1050.00	NULL	30
# 9902	赵六	分析员	9566	4000.00	NULL	20
# 9982	陈二	经理	9839	3450.00	NULL	10
# 9988	王五	分析员	9566	4000.00	NULL	20
# -------------------------------------------------------------------------------

INSERT INTO emp VALUES
(9369, '张三', '保洁', 9982, 900, NULL, 20),
(9499, '孙七', '销售', 9698, 2600, 300, 30),
(9521, '周八', '销售', 9698, 2258, 500, 30),
(9566, '李四', '经理', 9839, 3995, NULL, 20),
(9654, '吴九', '销售', 9698, 2250, 1400, 30),
(9839, '刘一', '董事长', NULL, 6000, NULL, 10),
(9844, '郑十', '销售', 9698, 2500, 0, 30),
(9900, '箫十一', '保洁', 9698, 1050, NULL, 30),
(9902, '赵六', '分析员', 9566, 4000, NULL, 20),
(9982, '陈二', '经理', 9839, 3450, NULL, 10),
(9988, '王五', '分析员', 9566, 4000, NULL, 20);

SELECT * FROM emp;

#5.3.0 删除员工表的外键约束

ALTER TABLE emp DROP FOREIGN KEY emp_ibfk_1;
ALTER TABLE emp DROP INDEX deptno;

# /*5.3.1添加外键约束 */
# 给员工表emp的deptno字段添加外键约束,关联部门表dept的deptno字段,约束名fk_deptno
ALTER TABLE emp ADD CONSTRAINT fk_deptno  FOREIGN KEY(deptno) REFERENCES dept(deptno);

#/*5.3.2操作关联表 */
# 主表dept添加数据
# -------------------------
# deptno	dname
# -------------------------
# 50	人力资源部
# -------------------------

INSERT INTO dept VALUES
(50, '人力资源部');

SELECT * FROM dept;

# 在往员工表emp中添加数据
# ------------------------------------------------------------------------------
# empno	ename	job	mgr	sal 	comm	deptno
# ------------------------------------------------------------------------------
# 9966	八戒	运营专员	9839	3000.00	2000	40
# 9999	悟空	人事专员	9982	3000.00	NULL	50
# -------------------------------------------------------------------------------

INSERT INTO emp VALUES
(9966, '八戒', '运营专员', 9839, 3000, 2000, 40),
(9999, '悟空', '人事专员', 9982, 3000, NULL, 50);

SELECT * FROM emp;

# 查询人力资源部有哪些员工
SELECT *
FROM emp
#where deptno = (人力资源的部门号);
WHERE deptno = (
    SELECT deptno
    FROM dept
    WHERE dname = '人力资源部'
);

# 删除从表emp中属于人力资源部的员工信息

DELETE FROM emp
#where deptno = (人力资源的部门号)
WHERE deptno = (
    SELECT deptno
    FROM dept
    WHERE dname = '人力资源部'
);

# 查询属于人力资源部的员工信息
SELECT *
FROM emp
WHERE deptno = (
    SELECT deptno
    FROM dept
    WHERE dname = '人力资源部'
);

# 删除主表dept中人力资源部的数据
DELETE FROM dept
WHERE dname = '人力资源部';

SELECT * FROM dept;

/*5.3.3删除外键约束 */
# 将员工表emp中的外键约束删除
ALTER TABLE emp DROP FOREIGN KEY fk_deptno;

ALTER TABLE emp DROP INDEX fk_deptno;