MySQL高级教程笔记

发布 2020-01-02 09:59:28 阅读 8259

mysql-高级。

1 标题1 错误!未定义书签。

1.1 标题2 错误!未定义书签。

1.1.1 标题3 错误!未定义书签。

mysql中的sql编程的话题。

触发器, 存储函数, 存储过程。

以上的是三个名词, 在sql编程中, 地位是: 程序的载体, 程序的结果。

编程所涉及的要素:

变量, 数据类型, 流程控制, 函数, 运算符, 表达式。

mysql自动提供的函数!

例如: database(),now(),md5()

用户定义定义的, 存储在mysql中的函数。

适用语法:来创建函数。

drop function [if exists] function-name;

程序处理数据。

数据在程序中的容器, 就是变量。

强类型。函数外定义的变量。

变量不需要声明, 直接去设置即可!

ps, 内置的变量: set autocommit = off, 不以 @开头。

函数内定义的变量。

使用declare来声明。

不需要使用@, 表示是用户自定义变量。

强类型, 定义的局部变量, 必须定义为某种类型, 类型的表述与字段的类型一致!

局部内, 可访问到全局变量。

ps: 与js保持一致1

当需要为变量赋值的数据, **于sql中select语句的查询结果时, 可以使用select into完成变量的赋值。

一次性, 赋值多个变量:

函数内, 也可以使用。

循环和分支。

测试。结果。

不是分支, 是典型的三元运算, 的函数封装语法。

mysql不支持三元运算符 ?

测试。结果。

条件满足, 则循环继续。

其中标签, 用于在循环终止时, 一次性的终止多层循环! 类似于js的语法。

例如:终止当前循环:(continue), iterate

终止全部:(break), le**e

终止, 都需要配合循环语句的标签使用!

ierate:

le**e:

如果需要终止多层:

需要在后边跟随不同的标签即可。

与函数类似, 都是一段功能**的集合,称之为过程。

与函数不一样的是, 函数由于完成某个特定的操作点,例如, md5(),获取md5摘要信息, 不是用来实现某中也无路基操作, 而是就是实现特定的操作。过程是, 某个特定的业务逻辑。

当我们需要使用sql完成某件事时候, 使用过程, 而在过程的完成中, 需要一些特殊的操作, 就是函数。

例如: 需要插入, 1000条记录到某测试表中, 此时就应该创建过程。

而在插入的时候, 需要随机的获取学生的姓名, 就可以定义一个函数, 完成获取随机的学生姓名工作。

映射到php程序:

浏览器所请求的一个url, 对应的php**, 就是一段过程。 (例如, 商品添加, 用户注册), 就是过程。

而在完成这个过程中, 需要将用户的密码做md5处理, md5就是函数。

因此, 函数在意的是处理结果,函数具有返回值。而过程是一段执行, 不具有返回值。

语法。注意: 没有返回值参数有输入方式之分。

过程内的写法, 与函数是一致的。

过程的调用不能出现在表达式中, 需要使用独立的语法进行独立调用。

/ 表达式中。

max(class_id) +10;

需要用 call

in, out, inout, 表示, 过程的参数的数据的传递方向。

in: 由外向内传递。

out: 由内向外传递。

inout: 双向传递, 即可内向外, 也可外向内。

内, 外, 指的是, 过程外和过程内。

创建过程外的三个变量:

以三个变量作为实参, 调用过程:

在获取过程外三个变量的值:

inout双向传递, 类似于 php中的引用传递!

由于过程没有返回值, 需要在过程处理后, 得到过程的处理结果数据, 就因该, 使用带有out类型的参数。

一个数据时被多个过程连续处理, 典型的需要 inout类型的参数。

一个纯粹的mysql管理员需要完成某些操作, 需要使用过程, mysql自带的编程方式。

例如, 需要创建大量的测试数据, 可以过程完成:

确定测试表的结构。

确定需要插入的数据格式。

要求: 学号要从1开始递增。

班级id, 从1-100 随机。

姓名, 随机得来。

说明: 任意。

编程实现:编写, 需要的函数:

获取班级id

生成名字:生成信息。

生成学号。从1开始递增。

it-0000001

it-0000002

取得已有的最大学号。

调用过程即可:

测试数据。事件驱动程序: 监听元素某些事件, 当事件被触发时, 事件处理器被调用。

ps: 类似于js的事件驱动)

触发器的事件:

insert, delete, update

扩展开共六种:

before insert, after insert

before delete, after delete

before update, after update

事件都是记录对象的事件, row的before insert, row after insert.

语法。绑定事件处理器, 到 row元素上。

测试, 在学生表的添加事件上增加触发器程序:

一旦学生表添加, 则在学生日志表中, 加入一条记录。

检测学生日志表:

触发程序被自动调用。

触发器, 只是调用方式不同于存储过程而已, 都是功能的集合。

预定义的变量, 表示触发该事件的行对象。

就是事件源记录。

使用 new, old 来引用这个事件源记录。

new 和 old的区别:

new, 新纪录。

old, 旧记录。

只有在update事件时, 才会出现新旧记录同时存在的情况。

更新: 将旧记录更改成新纪录。

在 insert事件中, 只有new可用。 before insert, after insert , 都可以使用new.

在delete事件中, 只有 old可用。 before delete after delete 都可以使用 old

无论是 before还是insert都一样。

可能会出现执行一条语句 , 触发多个事件的情况。

有些语句, 带有逻辑判定功能:

replace into, 尝试插入, 如果冲突, 则替换(删除旧的,插入新的)

类似的: insert into on duplicate key update

冲突时更新。

一个表, 的一个事件, 仅仅可以绑定一个事件处理器。

一个表最多可以有6个触发器。

读写分离, 负载均衡。

设计:56.101, mysql 充当写服务器。

再添加2台linux充当读服务器:

初始化mac地址。

完全复制。复制后, 启动复制的服务器:

删除, 之前所保留的虚拟化网卡的文件, 使新生成的网卡生效。

修改 eth0的配置文件:

修改mac地址参数:

修改为, virtualbox生成的mac地址:

保持一致。init 6 重启。

在主服务器上开一个复制账号, 从服务器利用这个复制账号, 从主服务器进行复制。

配置过程如下:

保证唯一即可!

需要重启 mysqld

可以与步骤一一起完成)

登录主mysql, 增加账号, 刷新权限。

show master status

mysqld重启。

从服务器的mysql中执行:

使用 change master 来指定;

此时已经建立的主从复制联系。

在从服务器上执行:

start sl**e

MySql经典笔记

好久没有整理东西,感觉自己越来越懒,正好近期有个mysql的项目 一个oracle的应用迁移到mysql 以前没有接触过mysql,但是也知道mysql数据库目前广泛的应用在各种个人 商务系统中,各种技术都比较成熟。把自己学习的一些过程总结一下,该文章设计到的内容都没有做太详细的阐述,只是一个简单的...

MySql高级查询

高级查询。1.连接查询 对列的扩展 第一种形式。select from info,nation 会形成笛卡尔积。select from info,nation where 加入筛选条件。select from info,nation where 查询指定列。select as 代号 as 姓名 se...

MySQL学习笔记整理

数据库系统。databaxxxxsesystem 计算机系统中一种专门管理数据资源的系统。数据库里面的东西就是存储的一组经过处理后的数据。管理数据库的软件成为数据库管理系统。数据库 存数据的仓库。数据库管理系统 仓管员。dba databaxxxxseadministrator 数据库的分类。关系型...