java-五十二天---mysql面试、存储引擎、三大范式、锁

 

1   数据库三大范式与反三范式

2  查询左表独有的数据

3  全连接查询UNION

4  表的级联操作

什么是级联操作

    在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作 ON UPDATE CASCADE -- 级联更新,主键

发生更新时,外键也会更新 ON DELETE CASCADE -- 级联删除,主键发生删除时,从表关联的全部数据都会被直接删 除。

    具体操作:

删除employee

重新创建employee表,添加级联更新和级联删除

CREATE TABLE employee (

扫描二维码关注公众号,回复: 8970511 查看本文章

id INT PRIMARY KEY AUTO_INCREMENT,

NAME VARCHAR(30),

age INT,

dep_id INT,

-- 添加外键约束,并且添加级联更新和级联删除

CONSTRAINT employee_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE

CASCADE ON DELETE CASCADE

);

加了级联操作之后,处理一张表的数据,另外一张表也会变化。
不加级联操作,你修改一张表的情况,不让你修改,因为一旦你修改一张表,另一张表也会发生变动,

5 存储引擎

存储引擎的概念

6  存储引擎的创建和修改

7    常见存储引擎的区别

8 InnoDB与MyISAM

9  存储引擎的适用环境(MyISAM和InnoDB)

 

10  存储过程

举例 2   统计表users,student的行数量和student表中英语最高分,数学最高分的注册时间。

错误

DELIMITER $$
 CREATE PROCEDURE stats_users_students5() 
BEGIN
    BEGIN
         DECLARE users_sum INT DEFAULT 0; 
         DECLARE students_sum INT DEFAULT 0; 
         SELECT COUNT(*) INTO users_sum FROM users;
         SELECT COUNT(*) INTO students_sum FROM student;
         SELECT users_sum,students_sum;
    END; 
   
    BEGIN
         DECLARE max_math INT; 
         DECLARE max_english INT;
         SELECT MAX(math),MAX(english) INTO max_math,max_english FROM student ; 
         SELECT users_sum,students_sum,max_math,max_english; 
    END; 
END; 

$$

CALL stats_users_students5();


这里会显示错误,因为users_sum和students_sum定义在第一个BEGIN和END里面
第二个BEGIN和END取不到users_sum和student_sum ,所以执行会显示错误
DELIMITER $$
 CREATE PROCEDURE stats_users_students5() 
BEGIN
     DECLARE users_sum INT DEFAULT 0;      //把这两个变量定义在全局里就可以全都访问了
     DECLARE students_sum INT DEFAULT 0;    //把这两个变量定义在全局里就可以全都访问了

    BEGIN
         SELECT COUNT(*) INTO users_sum FROM users;
         SELECT COUNT(*) INTO students_sum FROM student;
         SELECT users_sum,students_sum;
    END; 
   
    BEGIN
         DECLARE max_math INT; 
         DECLARE max_english INT;
         SELECT MAX(math),MAX(english) INTO max_math,max_english FROM student ; 
         SELECT users_sum,students_sum,max_math,max_english; 
    END; 
END; 

$$

CALL stats_users_students5();

11 存储过程传参

12  光标的使用

举例  需求:编写存储过程,使用光标,把id为偶数的记录逐一更新用户名。

DELIMITER $$ CREATE PROCEDURE testcursor() 
BEGIN 
DECLARE stopflag INT DEFAULT 0;  // 起初系统stopflag=0
DECLARE my_uname VARCHAR(20);    //定义my_uname变量
DECLARE uname_cur CURSOR FOR SELECT NAME FROM student WHERE id%2=0 ; //中心句
DECLARE CONTINUE HANDLER FOR NOT FOUND SET stopflag=1; //自动生成,当stopflag=1时,自动停止
OPEN uname_cur;         -- 打开游标 
FETCH uname_cur INTO my_uname;            -- 游标向前走一步,取出一条记录放到变量my_uname中。 
    WHILE( stopflag=0 )                     DO -- 如果游标还没有到结尾,就继续 
    BEGIN
        UPDATE student SET NAME=CONCAT(my_uname,'_cur') WHERE NAME=my_uname; //拼接字符串
        FETCH uname_cur INTO my_uname;     -- 游标向前走一步,取出一条记录放到变量my_uname中
    END ; 
END WHILE; 
CLOSE uname_cur;  //关闭光标
END; 
$$
DELIMITER ; 
注意:变量,条件,处理程序,光标,都是通过DECLARE定义的,
它们之间是有先后顺序要求的,变量和条件必须在最 前面声明,然后才能是光标的申明,
最后才可以是处理程序的申明。

13   函数

14   事件

事件调度器是MySQL中提供的可做定时操作处理,或者周期操作处理的一个对象。

15  锁(重要)

16  表锁

偏向MyISAM存储引擎,开销小, 加锁快, 无死锁,锁定粒度大, 发生锁冲突的概率最高, 并发最底,整张表就只能一个人使

解释:加锁快是因为相对简单,只要锁住整张表就可以了,无死锁是因为谁先来就先占住整张表,不让其他人碰,发生锁冲突的概率最高是你一个人占住整张表,其他人等着用,所以会出冲突的概率最高。

17 表锁中读锁对操作和性能的影响

 

18  表锁中写锁对操作和性能的影响

19  行锁

20  锁住一行数据(重要,面试会问

21  悲观锁,乐观锁

22  悲观锁与乐观锁的使用背景

23  悲观锁的实现方式

正常的读锁,写锁都是悲观锁,所谓悲观锁就是处理数据就上锁

 

24   乐观锁的实现方式1

 

25   乐观锁的实现方式2

26  数据库的优化

 

 

一般优化步骤和慢查询定位

27   数据库优化  常用的SQL优化-索引优化

发布了78 篇原创文章 · 获赞 83 · 访问量 9264

猜你喜欢

转载自blog.csdn.net/weixin_41847891/article/details/93176404
今日推荐