级联:
当修改主表的数据后从表随之变化
语法:
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT, -- 员工编号
NAME VARCHAR(10), -- 员工姓名
gender VARCHAR(3), -- 员工性别
dept_id INT, -- 员工的部门id
CONSTRAINT -- 声明
dept_emp_fk -- 外键名称
FOREIGN KEY -- 外键作用在
(dept_id) -- 从表的dept_id字段
REFERENCES -- 关联
dept(id) -- 主表的主键id
ON UPDATE CASCADE -- 级联修改
ON DELETE CASCADE -- 级联删除
) ;
--修改主表的数据 (级联修改)
UPDATE dept SET id = 3 WHERE id = 1;
-- 删除主表的数据,从表数据随之删除...(级联删除)
DELETE FROM dept WHERE id = 2 ;
--删除外链
ALTER TABLE emp DROP FOREIGN KEY dept_emp_fk;
--添加级联和外链
ALTER TABLE emp ADD
CONSTRAINT dept_emp_fk
FOREIGN KEY (dept_id)
REFERENCES dept(id)
ON UPDATE CASCADE
ON DELETE CASCADE ;
注意:添加时,从表字段不能出现主表以外的数据;
数据库的三大范式:
1NF:数据库表中的每一列为不可再拆分的原子数据项,必须独立的列; 2NF:在1NF基础上,数据库表中非主键字段必须完全依赖于主键字段,完全依赖是指不能存在仅依赖主键一部分的列。 3NF:在2NF基础上,任何非主列不得传递依赖于主键。
多表查询:
eg: select * from 表一,表二; 说明:如果使用这种语法会出现"笛卡尔乘积",即: 表一的记录数 *B表的记录数 = 总记录数 原因:两张表是有关联关系.
内连接:
隐士内连接: eg: select e.`id` '员工编号', e.`name` '员工姓名', e.`salary` '工资', e.`join_date` '入职日期', d.`id` '部门编号', d.`name` '部门名称' from emp e, dept d where e.`dept_id` = d.`id` ; 显示内连接: inner join 关键字 :inner可以省略 eg: SELECT e.*, d.* FROM emp e INNER JOIN dept d ON e.`dept_id` = d.`id` ;
外连接:
左外连接:将左边表数据以及满足两种表条件的数据全部展示; 语法:select 字段列表 from 表名1 left outer join 表名2 on 连接条件; (outer可以省略) 右外连接:将右边表数据以及满足两种表条件的数据全部展示; 语法:select 字段列表 from 表名1 right outer join 表名2 on 连接条件; (outer可以省略)
子查询:
select语句 嵌套 select语句
eg1:
SELECT
*
FROM
emp
WHERE
salary = (SELECT MAX(salary) FROM emp );
eg2:
SELECT
*
FROM
emp
WHERE
emp.`dept_id` IN
(SELECT
id
FROM
dept
WHERE
NAME = '市场部' OR NAME = '财务部') ;
eg3:
SELECT
t.*,
d.name '部门名称'
FROM
(SELECT
*
FROM
emp
WHERE
join_date > '2020-01-14')
t
LEFT OUTER JOIN
dept d
ON
t.dept_id = d.id ;
数据库的事务
事务:就是当前整个业务操作同时要执行多个sql或者多张表的sql的时候,使用事务将业务整体管理起来,要么这个多个sql同时执行成功,要么同时执行失败; 关系型数据库事务的特点(重点):ACID 原子性:使用事务管理的业务操作(执行多个sql),要么同时执行成功,要么同时失败 一致性:在事务管理的业务操作过程中,执行之前和执行之后它的数量总量不变 隔离性:业务和业务之间是独立,业务又需要被事务管理,事务和事务之间是独立的,相互之间不影响,分离开来! 持久性:针对增删改操作,只要提交事务,即使关机了,数据永久保存! 事务的隔离级别四种:分别从小到大,安全性(从低到高),执行效率(从高到低): read uncommitted:读未提交,会导致最严重的问题 "脏读"(一个事务读到另一个没有提交事务) read committed:读已提交,可以有效防止脏读,但是会现在一个问题"不可重复读"(在提交事务之前和事务,数据不一致!) repeatable read:可重复读(mysql默认隔离级别),可以有效防止脏读以及不可重复读,会出现"幻读" serializable:串行话 级别最高,安全性最高,效率低!