iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL的高级部分
  • 640
分享到

MySQL的高级部分

2024-04-02 19:04:59 640人浏览 安东尼
摘要

1. Mysql的事务 (1)存储引擎的介绍    介绍:当客户端发送一条sql语句给服务器时,服务器端通过缓存、语法检查、校验通过之后,然后会通过调用底层的一些软件组织,去从数据库中查

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。
您可能感兴趣的文档:

--结束END--

本文标题: MySQL的高级部分

本文链接: https://www.lsjlt.com/news/44167.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Laravel Eloquent ORM高级部分解析
    目录查询作用域全局作用域本地作用域事件使用场景序列化转换模型/集合为数组 - toArray()转换模型为json - toJson()隐藏属性为json追加值MutatorsAcc...
    99+
    2022-11-13
    Laravel Eloquent ORM解析 Laravel Eloquent ORM
  • MySQL高级查询语法分析
    目录一、排序二、分页查询三、聚合函数四、分组查询五、连接查询1. 内连接查询2. 左连接查询3. 右连接查询4. 自连接查询六、子查询一、排序 排序查询语法: select...
    99+
    2024-04-02
  • 大数据线程高级部分内容有哪些
    本篇内容介绍了“大数据线程高级部分内容有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先讲一下线程的生命周期> 对于一个线程, ...
    99+
    2023-06-02
  • MySQL——MySQL的基础操作部分
    使用命令行登录 mysql -u root -p 直接敲击回车后输入密码即可: 当看到出现“mysql>“的符号之后,就表示已经进入到了MySQL系统中,就可以输入MySQL的命令对数据库进行操作了。 查看数据库 使用命令查看所有的数据库...
    99+
    2023-09-08
    mysql pycharm
  • MySQL表的高级增删改查
    文章目录 一、聚合查询二、分组查询三、联合查询内连接外连接自连接 四、合并查询五、子查询 一、聚合查询 聚合查询是针对行与行之间的计算,常见的聚合函数有: 函数作用COUNT(exp...
    99+
    2023-09-08
    mysql java 数据库
  • 怎么协助MySQL实现Oracle高级分析函数
    小编给大家分享一下怎么协助MySQL实现Oracle高级分析函数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Oracle 支持一些独特的语法和函数,在移植到 M...
    99+
    2023-06-01
  • 分享git高级用法
    这篇文章主要讲解了“分享git高级用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分享git高级用法”吧!导航 &mdash;&mdash...
    99+
    2024-04-02
  • 《MySQL高级篇》十三、锁
    文章目录 1. 概述2. MySQL并发事务访问相同记录2.1 读-读情况2.2 写-写情况2.3 读-写或写-读情况2.4 并发问题的解决方案 3. 锁的不同角度分类3.1从数据操作的...
    99+
    2023-09-01
    mysql
  • CSS高级语法的示例分析
    这篇文章主要介绍CSS高级语法的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 选择器的分组 你可以对选择器进行分组,这样,被分组的选择器就可以分享相同的声明。 用逗号...
    99+
    2024-04-02
  • Vim的高级使用实例分析
    这篇“Vim的高级使用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vim的高级使用实例分析”文章吧。1. 准备工作...
    99+
    2023-06-27
  • Redis高级应用的示例分析
    小编给大家分享一下Redis高级应用的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Redis高级实用特性分6部分:1、...
    99+
    2024-04-02
  • Oracle高级队列的示例分析
    小编给大家分享一下Oracle高级队列的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Oracle高级队列(Advanc...
    99+
    2024-04-02
  • 详解高性能mysql之MySQL高级特性总结
    MySQL是一款广泛使用的关系型数据库管理系统,具有高性能和高可靠性的特点。在高性能MySQL中,有一些高级特性可以帮助提升数据库的...
    99+
    2023-09-22
    MySQL
  • Mysql my.cnf部分参数分析
    本篇内容介绍了“Mysql my.cnf部分参数分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Msyq...
    99+
    2024-04-02
  • 【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】
    文章目录 分析慢SQL的步骤慢查询日志(定位慢sql)基本介绍慢查询日志是什么?特别说明 查看慢查询日志是否开以及如何开启设置慢SQL的时间阈值查看阈值设置阈值 查询慢查询日志文件...
    99+
    2023-09-18
    mysql sql adb
  • MySQL数据表高级操作
    一、克隆/复制数据表二、清空表,删除表内的所有数据删除小结 三、创建临时表四、MySQL中6种常见的约束1、外键的定义2、创建外键约束作用3、创建主表test44、创建从表test55、为主表test4添加一个主键约束。主键...
    99+
    2023-08-17
    mysql android 数据库
  • MySQL高级篇——索引简介
    🙌作者简介:数学与计算机科学学院学生、分享学习经验、生活、 努力成为像代码一样有逻辑的人 🌙个人主页:阿芒的主页 文章目录 👩‍🔧索引是什么👩‍&...
    99+
    2023-08-16
    mysql 数据库 java
  • 【MySQL】细谈SQL高级查询
    文章目录 一、前言 & 准备工作二、简易高级查询⚙ 准备工作1、查询每一门课程及其先修课程2、查询和“刘涛”在一个班级的学生的信息3、查询选修了‘计算机基础’课的学生的学号、姓名③ 连接方式④ 子查询嵌套方式 4、查询没有...
    99+
    2023-12-23
    mysql sql 数据库
  • MySQL都需要哪些高级的技能
    这篇文章将为大家详细讲解有关MySQL都需要哪些高级的技能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。MySQL 存储引擎存储引擎概述数据库最核心的一点就是用来存储数据...
    99+
    2024-04-02
  • MySQL高级特性都有哪些
    今天就跟大家聊聊有关MySQL高级特性都有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。概述闲来无事,看了下高性能mysql这本书,其中的一些M...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作