我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL的高级部分

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL的高级部分

1. MySQL的事务

(1)存储引擎的介绍

   介绍:当客户端发送一条SQL语句给服务器时,服务器端通过缓存、语法检查、校验通过之后,然后会通过调用底层的一些软件组织,去从数据库中查询数据,然后将查询到的结果集返回给客户端,而这些底层的软件组织就是存储引擎。
   MySQL的存储引擎:
     - MySQL的核心就是存储引擎,MySQL可以设置多种不同的存储引擎,不同的存储引擎在索引、存储、以及锁的策略上是不同的。
     - Mysql5.5之前,使用的是myisam存储引擎,支持全文搜索,不支持事务。
     - Mysql5.5以后,使用的是innodb存储引擎,支持事务以及行级锁
MySQL的高级部分

(2)MySQL事务的介绍

   介绍:事务是一个操作序列,这些操作要么都做,要么都不做,是一个不能分割的工作单位。在两条或两条以上的SQL语句才能完成的业务时,才需要用事务,因为事务时同步原则,效率比较低。
   事务的ACID特性
     - 原子性:放在同一事务的一组操作时不可分割的
     - 一致性:在事务的执行前后,整体的状态是不变的
     - 隔离性:事务之间是独立存在的,两个不同事务之间互不影响
     - 持久性:事务执行之后,将会永久的影响到数据库。

#例:一个事务操作
BEGIN;
update  t_account set money=money+100 where id =1;
update  t_account set money=money-100 where id =2;
COMMIT;
#一个回滚操作
BEGIN;
update  t_account set money=money+100 where id =1;
update  t_account set money=money-100 where id =2;
COMMIT;

注意:MySQL数据库,dml操作采用的是自动提交

#查看自动提交
show variables like 'autocommit';
#修改自动提交
set autocommit=0;

(3)MySQL事务并发时产生的问题

  脏读:在一个事务的执行范围内,读到了另一事务未提交的数据。
  解决:读已提交,一个数据库只能读到另一个事务提交后的数据。(Oracle默认的事务隔离级别)
  不可重复读:一个事务,在只读范围内,被另一事务修改并提交事务,导致多次读取的数据不一致的问题。
  解决:可重复读(MySQL默认的事务隔离级别)
  虚读:一个事务的只读范围内,被另一个事务删除或者添加数据,导致多次读取的数据不一致的问题。
  解决:串行化:解决所有问题,但是速度十分缓慢,不能使用并发事务。
  注意:查看事务的隔离级别:select @@tx_isolation;

2. MySQL的存储程序

(1)MySQL的存储程序的介绍

   描述:运行与服务器端的程序。
   优点:简化开发,执行效率比较高(在服务器端以通过校验,可直接使用)
   缺点:服务器端保存这些存储程序需要占用磁盘空间;数据迁移时,需要将这些存储程序进行迁移;调试和编写程序在服务器端都不方便
   存储程序的分类:存储过程、存储函数、触发器
   注意:存储程序不能使用事务

(2)存储过程

  介绍:存储过程是在服务器端的一段可执行的代码块。

#修改结束符标志
delimiter  // 
#创建存储过程
create procedure pro_book()
begin 
#sql 
select * from book;
select * from book where bid=3;
end //
#运行
call pro_book()  
#参数的传入
delimiter //
create procedure pro_book02(num int)
begin 
select * from book where bid=num;
end ; //
--调用
call pro_book02(3)
#传出参数
delimiter //
create procedure pro_book03(num int,out v_name varchar(10))
begin 
select bname into v_name from book where bid=num;
end ; //
--调用,这里的@v_name是一个用户变量
call pro_book03(1,@v_name);
select @v_name;
#传入传出参数
delimiter //
create procedure pro_book04(num int)
begin 
select bid into num from book where bid=num;
end ; //
--调用 
set @v_id=3; --给用户变量赋值
call pro_book04(@v_id);
select @v_id;

控制流程语句

#if语句
delimiter //
create procedure if_test(score int)
begin 
-- 定义局部变量
declare myLevel varchar(20);
if score>80 then 
set myLevel='A';
elseif score >60 then 
set myLevel='B';
else 
set myLevel='C';
end if;
select myLevel;
end; //
-- 调用
call if_test(70);
#while循环
delimiter //
create procedure while_test()
begin 
declare i int ;
declare sum int ;
set i=1;
set sum =0;
while i<=100 do
set sum=sum+i;
set i=i+1;
end while ;
select sum;
end ;//
call while_test()
#loop循环
delimiter //
create procedure loop_test()
begin 
declare i int ;
declare sum int ;
set i=1;
set sum =0;
-- 起别名
lip:loop 
if i>100 then
-- 离开loop循环
leave lip ;
end if ;
set sum=sum+i;
set i=i+1;
end loop ;
select sum;
end ;//
call loop_test()
#repeat循环
delimiter //
create procedure repeat_test()
begin 
declare i int ;
declare sum int ;
set i=1;
set sum =0;
repeat 
set sum=sum+i;
set i=i+1;
-- 不要加分号
until i>100 
end repeat ;
select sum;
end ;//
call loop_test()

(3)存储函数

  存储在服务器端,有返回值,函数可以作为SQL的一部分进行调用。

**例**:
delimiter //
create function func_01(num int)
-- 返回值类型
returns varchar(20)
deterministic
begin 
declare v_name varchar(20);
select bname into v_name from book where bid =num ;
return v_name;
end ; //
set @v_name=func_01(3);
select @v_name;
-- 作为SQL的一部分调用
select * from book where bname=func_01(3);

函数和存储过程的区别
   - 存储过程有三种参数模式(in、out、inout)实现数据的输入输出,而函数是通过返回值进行数据传递。
   - 关键字不同
   - 存储过程可以作为独立个体执行,函数只能作为SQL的一部分执行。

(4)触发器

   触发器,存储在服务器端,由事件调用,不能传参。
   事件类型:增、删、改
   语法:

create trigger 触发器名
触发时机(after|before) event(update|delete|insert)
on 需要设置触发器的表名 for each row (设置为行级触发器)
begin
一组sql
end;

例:

delimiter //;
-- 创建一个触发器
create trigger tri_test
after delete 
-- 设置为行级别的触发器
on book for each row
begin
insert into book values(old.id,'悲惨数据','zzy');
end;//
注意:在触发器中有两个对象:old、new,old表示删除数据时那条原数据记录,
new表示修改和插入数据时,那条新数据记录。

3. MySQL的表的设计

(1)数据库的三大范式:

   - 1NF:所有字段都是原子性的,不可分割的。
   - 2NF:非主键字段必须与主键相关(每一张表只描述一类事物),而不能与主键部分相关(在联合主键时有效)
   - 3NF:非主键字段必须与主键相关(每一张表只描述一类事物),而不能与主键部分相关(在联合主键时有效)

(2)表的关系:

一一对应

#以人和×××为例
人表:
CREATE TABLE `t_people` (
  `id` int(11) NOT NULL,
  `name` varchar(50) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
)
×××表:
create table t_idcard(
card_number varchar(18) primary key,
create_date date,
p_id int unique,
foreign key (p_id) REFERENCES t_people(id)
)
注意:设计方法:想办法让外键字段同时拥有唯一约束,外键字段在任意的表中都可以

一对多

以部门和员工表为例:
create table t_emp(
eid int PRIMARY KEY,
ename varchar(50) not null,
job varchar(50),
deptno int , 
foreign key (deptno) REFERENCES t_dept(deptno)
)
部门表:
create table t_dept(
deptno int primary key,
deptname varchar(50)
)
注意:设计方法:只需要在多的那个表中增加一个外键约束

多对多
MySQL的高级部分
设计方法:需要找一张中间表,转化成两个一对多的关系

(3)数据库的优化:

  • SQL的优化
    • 在查询时一般不使用 *,因为在查询记录时,一般使用(*),他会将*转换为列名,然后在查询(耗时)
    • 使用 not null /null 对索引进行搜索,会导致索引失效
    • 索引列中使用函数,也会导致索引失效
    • 索引列中进行计算,也会导致索引失效
    • 索引列不要使用not|!=|<>
    • 尽量不要使用or,使用union
    • 索引列中使用like,也会导致索引失效
  • exists 和 in的使用选择
    • exists先执行主查询:如果主查询过滤的比较多,则使用exists
    • in先执行子查询:如果是子查询的过滤比较多,则使用in。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL的高级部分

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Laravel Eloquent ORM高级部分解析

这篇文章主要为大家介绍了Laravel Eloquent ORM高级部分解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

MYSQL 高级

SQL查询流程: 1. 通过客户端/服务器通信协议与 MySQL 建立连接2. 查询缓存,这是 MySQL 的一个可优化查询的地方,如果开启了 Query Cache 且在查询缓存过程中查 询到完全相同的 SQL 语句,则将查询结果直接返回给客户端;如果没有开
MYSQL 高级
2018-06-04

MYSQL高级

相关术语介绍多版本并发控制MySQL InnoDB存储引擎,实现的是基于多版本的并发控制协议——MVCC (Multi-Version ConcurrencyControl)(注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrenc
MYSQL高级
2017-10-03

大数据线程高级部分内容有哪些

本篇内容介绍了“大数据线程高级部分内容有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先讲一下线程的生命周期> 对于一个线程, 在被创
2023-06-02

学习二级ACCESS的窗体部分

  计算机二级Access考试功能强大,操作简单,且可以与其他的Office组件实现数据共享和协同工作。现已成为最流行的桌面数据库管理系统。今天小编会为大家认识二级ACCESS的窗体部分。  知识点一:假如说窗体Form1里面,有一个名字叫做Cmd1的命令按钮,那么窗体以及命令按钮的Click事件过程名分别就是Form
学习二级ACCESS的窗体部分
2024-04-17

软考高级多少分及格?2023软考高级分数线为45分

  软考高级多少分及格?软考高级分数线是45分吗?2023软考高级分数线实行相对固定合格标准,各科目分数线为试卷满分的60%,软考高级各科目满分75分,即2023软考高级45分算通过。  针对软考高级多少分及格?软考高级分数线是45分吗?的问题,编程学习网小编将2023软考高级分数线的相关资讯整理如下:  一、软考高级分数
软考高级多少分及格?2023软考高级分数线为45分
2024-04-19

三、mysql高级操作

二、分库 三、分表
三、mysql高级操作
2016-03-05

MySQL 的主从复制(高级篇)

首先要明白为什么要用 mysql 的主从复制:1–在从服务器可以执行查询工作 (即我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)2–在从主服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全)3–当主服务器出现问题时,可以切换到从服务器
MySQL 的主从复制(高级篇)
2016-04-17

2025年软考高级考试的综合知识部分主要考什么

软考高级考试的综合知识部分主要考察考生对信息系统领域基础知识的掌握程度,内容涵盖计算机科学、软件工程、项目管理等多个方面。2025年软考高级考试的综合知识部分主要考什么?具体请见下文。

编程热搜

目录