mysql 以 db 结尾_MySQL的高级部分

1. MySQL的事务

(1)存储引擎的介绍

介绍:当客户端发送一条SQL语句给服务器时,服务器端通过缓存、语法检查、校验通过之后,然后会通过调用底层的一些软件组织,去从数据库中查询数据,然后将查询到的结果集返回给客户端,而这些底层的软件组织就是存储引擎。

MySQL的存储引擎:

- MySQL的核心就是存储引擎,MySQL可以设置多种不同的存储引擎,不同的存储引擎在索引、存储、以及锁的策略上是不同的。

- Mysql5.5之前,使用的是myisam存储引擎,支持全文搜索,不支持事务。

- Mysql5.5以后,使用的是innodb存储引擎,支持事务以及行级锁

f2ea712eb4063b4604fc52d8ebe02d71.png

(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)

)

注意:设计方法:只需要在多的那个表中增加一个外键约束

多对多:

68ca6be529b317407e4836fd9a8aa67f.png

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

(3)数据库的优化:

SQL的优化

在查询时一般不使用 *,因为在查询记录时,一般使用(*),他会将*转换为列名,然后在查询(耗时)

使用 not null /null 对索引进行搜索,会导致索引失效

索引列中使用函数,也会导致索引失效

索引列中进行计算,也会导致索引失效

索引列不要使用not|!=|<>

尽量不要使用or,使用union

索引列中使用like,也会导致索引失效

exists 和 in的使用选择

exists先执行主查询:如果主查询过滤的比较多,则使用exists

in先执行子查询:如果是子查询的过滤比较多,则使用in。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VisualBasic 版 (精华区)

发信人: zkboy (小小鸟), 信区: VisualBasic 标 题: Re: 请教&#xff1a;如何在VB中实现16进制数或10进制数与2进制&#xfffd;发信站: BBS 水木清华站 (Thu Jun 15 19:39:37 2000)转一篇相关资料在编程中&#xff0c;我们经常使用二进制(binary)、八进制(octal)、十进…

Vim求生

[TOC] Vim 是从 vi 发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器。 —— 维基百科 很多接触 Vim 的程序员应该都有过这样的经历&#xff1a; 受某大 V 的…

activemq 内存_ActiveMQ:了解内存使用情况

activemq 内存正如最近的一些邮件列表电子邮件和Google返回的许多信息所表明的那样&#xff0c;ActiveMQ的SystemUsage尤其是MemoryUsage功能使一些人感到困惑。 我将尝试解释有关MemoryUsage的一些细节&#xff0c;这些细节可能有助于理解它的工作方式。 我将不介绍StoreUsage…

osg动态加载模型不显示_OSG仿真案例(8)——读取FBX格式文件并显示(无动画)...

包含的头#include #include #include #include #include #include #include #include #include using namespace std;所需要的类(结构体)struct AnimationManagerFinder : public osg::NodeVisitor{osg::ref_ptr<:basicanimationmanager> _am;AnimationManagerFinder(){o…

用微服务和容器替换旧版Java EE应用程序服务器

Lightbend最近对2000多个JVM开发人员进行了调查&#xff0c;结果刚刚发布。 开展该调查的目的是发现&#xff1a;发展趋势与IT基础设施趋势之间的相关性&#xff0c;处于数字化转型前沿的组织如何使他们的应用程序现代化以及当今对新兴开发人员技术最为关注的实际生产使用情况细…

点分治经典_动态点分治

HYSBZ_3730_震波 背景&#xff1a;这是接触的动态点分治第一题&#xff0c;开始不是很理解&#xff0c;看了很久&#xff0c;写了很久才理解了动态的动态所在。前置知识&#xff1a;静态点分治&#xff08;主要是容斥思想&#xff0c;一般看出来是点分治的话&#xff0c;想到怎…

python settings模块导入不了_无法导入设置“myproject.settings”(是否在sys.path上?):没有名为pinax的模块...

我正试图让皮纳克斯在网络派系工作&#xff0c;有这么多的问题。。。[Sun Feb 19 20:01:20 2012] [error] [client 127.0.0.1] mod_wsgi (pid22796): Exception occurred processing WSGI script /home/pawesome/webapps/qtsocial/myproject.wsgi.[Sun Feb 19 20:01:20 2012] […

VS2012 颜色配置成黑色

效果展示&#xff1a; 步骤&#xff1a; 1、工具->选项->环境->常规->颜色体验 选为深色 2、在http://studiostyl.es/schemes/son-of-obsidian中&#xff0c;下载Son of Obsidian字体设置&#xff0c;然后 工具->导入和导出设置->导入选定的环境设置->…

@bzoj - 2388@ 旅行规划

目录 descriptionsolutionaccepted codedetailsdescription 请你维护一个序列&#xff0c;支持两种操作&#xff1a; &#xff08;1&#xff09;某个区间 [x, y] 内的数同时加上一个增量 k。 &#xff08;2&#xff09;询问某一个区间 [x, y] 中从 1 开始的最大前缀和。 input …

java与java ee_Java EE 7社区调查结果!

java与java ee在JSR 342下可以继续进行Java EE 7的工作。一切都在顺利进行&#xff0c;Java EE 7现在处于早期草稿审查阶段。 在11月初&#xff0c; Oracle发布了一个有关即将推出的Java EE 7功能的小型社区调查 。 昨天结果公布了。 超过1,100名开发人员参加了调查&#xff0…

浅谈C++中内存分配、函数调用和返回值问题

在谈述函数调用和返回值问题之前&#xff0c;先来看看C中内存分配的问题。 C编译器将计算机内存分为代码区和数据区&#xff0c;很显然&#xff0c;代码区就是存放程序代码&#xff0c;而数据区则是存放程序编译和执行过程出现的变量和常量。数据区又分为静态数据区、动态数据区…

dataguard从库数据库丢失恢复例子(模拟所有的控制文件)

1.退出日志应用模式[oraclelocalhost ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Production on Mon Jan 14 16:09:16 2019 Copyright (c) 1982, 2013, Oracle. All rights reserved. SQL> connect / as sysdbaConnected.SQL> alter database recover managed sta…

python教程自带数据库_python教程自带数据库 | Python学哪个数据库

python使用数据库增条数据import pymysql#返回Connection#host"localhost"con pymysql.connect(host"192.168.31.28",port3306,user"atguigu",password"atguigu",db"atguigudb",charset"utf8")#返回cursor对象cu…

Java SE 8新功能介绍:使用新的DateTime API计算时间跨度

使用Java SE 8新的DateTime API JSR 310…可以实现更清晰&#xff0c;可读且功能强大的编码。 Java SE 8&#xff0c;JSR 310 在上一篇文章“ 使用Streams API处理集合 ”中&#xff1b; 我已深入探讨和探索如何使用流遍历集合&#xff0c;如何从集合和数组创建流以及最终汇总…

使用VS2012内建的C++测试架构进行单元测试

前言 在软件开发的过程中&#xff0c;单元测试(Unit testing)是一个重要的coding步骤&#xff0c;可以让你的程序代码质量大幅提升、协助你进行良好的程序架构设计&#xff0c;单元测试是针对程序单元(软件设计的最小单位)来进行正确性检验的测试工作&#xff0c;在程序化编程中…

【博 客 文 章】

1、C#中的Explicit和Implicit转载于:https://www.cnblogs.com/kikyoqiang/p/10270416.html

sql intersect mysql_SQL INTERSECT子句

SQL INTERSECT子句/操作符用于合并两个SELECT语句&#xff0c;但只从第一个SELECT语句返回完全相同于第二个SELECT语句结果的所有行。这意味着INTERSECT是由两个SELECT语句返回相同的行(唯一)。正如使用UNION操作&#xff0c;同样的规则可使用在INTERSECT运算符。 但MySQL不支持…

vs2010下release版本调试设置

设置在Release模式下调试的方法&#xff1a; 1.工程项目上右键 -> 属性 2.c -> 常规 -〉调试信息格式 选 程序数据库(/Zi)或(/ZI), 注意&#xff1a;如果是库的话&#xff0c;只能(Zi) 3.c -> 优化 -〉优化 选 禁止&#xff08;/Od&#xff09; 4.连接…

控制反转 java_控制反转( Ioc)快速入门

2.1 什么是控制反转(IOC&#xff1a;Inverse of Control)IOC反转控制&#xff0c;实际上就是将对象的创建权交给了Spring&#xff0c;程序员无需自己手动实例化对象。可以看出来工厂的作用就是用来解耦合的&#xff0c;而在使用spring的过程中&#xff0c;spring就是充当这个工…

spring 工作流引擎_带Spring的简单工作流引擎

spring 工作流引擎几个月前&#xff0c;在处理一个公司项目时&#xff0c;我们需要开发REST服务&#xff0c;该服务用于根据客户端应用程序发送的数据发送电子邮件。 在开发此服务期间&#xff0c;我们决定创建简单的工作流引擎&#xff0c;该引擎将为发送电子邮件收费&#xf…