mysql-04

级联:

当修改主表的数据后从表随之变化
语法:
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:串行话  级别最高,安全性最高,效率低!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值