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 悲观锁的实现方式
正常的读锁,写锁都是悲观锁,所谓悲观锁就是处理数据就上锁