传智 韩忠康 mysql 课程笔记5(吐血整理)
MySQL数据库学习教程从入门到进阶全套笔记(完整版)

MySQL数据库学习教程从⼊门到进阶全套笔记(完整版)【MySQL学习1】SQL语⾔简介及数据库简介本节⼤致介绍数据库。
【MySQL学习2】MySQL简介及安装和卸载熟练地掌握数据库的安装与卸载。
【MySQL学习3】MySQL常⽤的图形管理⼯具图形化管理⼯具是为了更好操作数据库。
【MySQL学习4】MySQL数据库基本操作(⼀)_DDLDDL(Data Definition Language),数据定义语⾔。
本节讲DDL-数据库操作。
- 对数据库的常⽤操作- 对表结构的常⽤操作- 修改表结构【MySQL学习5】MySQL数据库基本操作(⼆)_DMLDML(Data Manipulation Language),指数据操作语⾔,⽤来对数据库中表的数据记录进⾏更新。
插⼊insert、删除delete、更新update。
【MySQL学习6】MySQL约束之主键约束约束实际上就是表中数据的限制条件。
本节介绍添加单列主键、添加多列联合主键、删除主键。
表在设计的时候加⼊约束的⽬的就是为了保证表中的记录完整性和有效性,⽐如⽤户表有些列的值(⼿机号)不能为空,有些列的值(⾝份证号)不能重复。
【MySQL学习7】MySQL约束之⾃增长约束通过给字段添加 auto_increment 属性来实现主键⾃增长。
可以⾃定义起始值。
注意delete和truncate之后的⾃增长的区别。
【MySQL学习8】MySQL约束之⾮空约束与唯⼀约束⾮空约束就是必须有数据,不允许为空。
唯⼀约束就是指定的那个参数,它所在的⼀列⾥每个数据都不允许有重复。
【MySQL学习9】MySQL约束之默认约束和零填充约束默认值约束就是在不指定值的时候使⽤提前设定好的值。
零填充约束只是为了对齐,值的位数不长时在前⾯补0,了解即可。
【MySQL学习10】MySQL数据库DQL基本查询(⼀)数据库管理系统⼀个重要功能就是数据查询,数据查询不应只是简单返回数据库中存储的数据,还应该根据需要对数据进⾏筛选以及确定数据以什么样的格式显⽰。
mysql数据库武洪萍版第五章习题与答案

第五章一.选择题1.下列关于SQL语言索引(Index)的叙述中,哪一条是不正确的(C)。
A.索引是外模式B.一个基本表上可以创建多个索引C.索引可以加快查询的执行速度D.系统在存取数据时会自动选择合适的索引作为存取路径2.为了提高特定查询的速度,对SC(S#,C#,DEGREE)关系创建唯一性索引,应该创建在哪一个属性(组)上?(A)A.(S#,C#)B. (S#,DEGREE)C. (C#,DEGREE)D. DEGREE3.设S_AVG(SNO,AVG_GRADE)是一个基于关系SC 定义的学号和他的平均成绩的视图。
下面对该视图的操作语句中,(A)是不能正确执行的。
Ⅰ. UODATE S_AVG SET AVG_GRADE=90 WHERE SNO=’2004010601’Ⅱ. SELECT SNO,AVG_GRADE FROM S_AVG WHERE SNO=’2004010601’A . 仅Ⅰ B. 仅Ⅱ C. 都能 D.都不能4.在视图上不能完成的操作是(C)。
A.更新视图B. 查询C. 在视图上定义新的基本表D. 在视图上定义新视图5.在SQL语言中,删除一个视图的命令是(B)。
A.DELECTB. DROPC. CLEARD. UNION6.为了使索引建的值在基本表中唯一,在创建索引的语句中应使用保留字()。
A.UNIQUEB. COUNTC. DISTINCTD.UNION7.创建索引是为了(A)。
A.提高存取速度B. 减少I/OC. 节约空间D. 减少缓冲区个数8.在关系数据库中,视图(View )是三级模式结构中的(D)。
A.内模式B. 模式C. 存取模式D. 外模式9.视图是一个“虚表”,视图的构造基于(A)。
Ⅰ.基本表Ⅱ. 视图Ⅲ. 索引10.已知关系:STUDENT(Sno,Sname,Grade),以下关于命令”CREATE INDEX S index ON STUDENT(Grade)”的描述中,正确的是(B)。
MySQL实战45讲学习笔记:第一讲

MySQL实战45讲学习笔记:第⼀讲⼀、MySQL逻架构图⼆、连接器⼯作原理刨析1、连接器⼯作原理图2、原理图说明1、连接命令mysql -h$ip -P$port -u$user -p2、查询链接状态3、长连接端连接1、什么是长链接?数据库⾥⾯,长连接是连接成功后,如果客户端持续有请求,则⼀直使⽤同⼀个链接。
2、什么是短连接?短连接则是指每次执⾏完很少的⼏次查询就断开连接,下次查询重新建⽴⼀个3、尽量使⽤长链接建⽴连接的过程通常是⽐较复杂的,所以我建议你在使⽤中尽量减少建⽴的动作,也就是使⽤长连接三、使⽤长链接困惑及解决⽅案1、为什么MySQL占⽤内存涨得特别快但是全部是⽤长连接后,你可能会发现,有些时候MySQL占⽤内存涨得特别快,这是因为MySQL在执⾏过程中临时使⽤的内存管理在连接对象⾥⾯的,这些资源会在连接断开的时候才释放,所以如果长链接积累下来,可能导致内存占⽤⼤,被系统强⾏杀掉,从现象看就是MySQL异常重启了2、如何解决MySQL占⽤内存涨得特别快1、定期断开长链接,使⽤⼀段时间,或者程序⾥⾯判断执⾏过⼀个占⽤内存的⼤查询后,断开连接,之后要查询再连接2、如果你⽤的是MySQL5.7或更新版本,可以在每次执⾏⼀个⽐较⼤的操作后,通过执⾏mysql_reset_connection来重新初始化连接资源,这个过程不需要重连或重新做权限验证,但是会将连接回复到刚刚创建完时的状态四、查询缓存1、⼯作流程刨析图解1. MySQL拿到⼀个查询请求后,会先到查询缓存看看,之前是不是执⾏过这条语句,如果有,就直接返回给客户端2. 如果语句不在查询缓存中,就会继续后⾯的执⾏阶段。
3. 执⾏完成后,执⾏结果会被存⼊查询缓存中,4. 如果查询命中缓存MySQL不需要执⾏后⾯的复杂操作,就可以直接返回结果,这个效率会很⾼2、为什么⼤多数情况下⽐建议使⽤查询缓存?1、查询缓存的失效⾮常频繁,只要有⼀个表更新,这个表上所有的查询缓存都被清空2、对于更新压⼒⼤的数据库来说,查询缓存的命中率会⾮常低,3、除⾮你的业务就是有⼀张静态表,很长时间才会更新⼀次(⽐如⼀个系统配置表)1、默认语句不实⽤查询缓存MySQL提供的按需使⽤的⽅式query_cache_type 设置成 DEMAND2、确定需要查询缓存的语句mysql> select SQL_CACHE * from T where ID=10;MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻底没有这个功能了。
《快速念咒:MySQL入门指南与进阶实战》笔记

《快速念咒:MySQL入门指南与进阶实战》阅读记录1. 第一章数据库基础在开始学习MySQL之前,了解一些数据库的基础知识是非常重要的。
数据库是一个用于存储和管理数据的计算机软件系统,它允许用户通过关键字或特定的查询语言来检索、更新和管理数据。
在数据库中,数据是以表格的形式进行组织的,每个表格都包含了一组相关的数据项,这些数据项被称为记录。
表(Table):表是数据库中存储数据的基本单位。
每个表都有一个唯一的名称,并由行(Row)和列(Column)组成。
每一行代表一个数据记录,每一列代表一个特定的数据属性。
字段(Field):字段是表中的一列,代表了数据的一种属性。
每个字段都有一个唯一的名称和一个数据类型,用于定义该字段可以存储的数据种类。
主键(Primary Key):主键是表中的一个特殊字段,用于唯一标识表中的每一行记录。
主键的值必须是唯一的,且不能为NULL。
外键(Foreign Key):外键是一个表中的字段,它的值引用了另一个表的主键值。
外键用于建立两个表之间的联系,确保引用完整性。
索引(Index):索引是一种数据库优化技术,用于提高查询性能。
通过创建索引,数据库可以更快地定位到表中的特定记录,而不必扫描整个表。
SQL(Structured Query Language):SQL是用于与数据库进行交互的编程语言。
它包括用于数据查询、插入、更新和删除的操作符和语法结构。
理解这些基本概念是学习MySQL的前提。
通过掌握SQL语言的基本语法和操作,你将能够有效地管理和操作数据库中的数据。
在接下来的章节中,我们将深入探讨MySQL的具体应用,包括如何创建和管理数据库、表、以及如何执行复杂的查询操作。
2. 第二章数据库设计《快速念咒:MySQL入门指南与进阶实战》是一本全面介绍MySQL 数据库的书籍,其中第二章详细阐述了数据库设计的基础知识和实践技巧。
在这一章节中,作者首先介绍了数据库设计的基本概念和目标,包括数据模型、实体关系模型(ER模型)等,并解释了如何通过这些模型来描述现实世界中的数据和业务逻辑。
mysql笔记-第6天

第六天一,回顾1.外键: 关联关系(表与表之间: 表中字段指向另外一张表的主键)外键条件: 字段类型必须一致, 存储引擎必须为innodb外键约束:子表约束: 不能插入父表不存在的记录父表约束: 三种约束模式(district, cascade,set null), on delete set null on update cascade2.联合查询: union, 多表合并和单表不同查询条件联合查询使用order by: select语句必须使用括号; 还必须配合limit3.子查询: 查询语句中有查询语句分类: 按位置(from,where和exists), 按返回结果(用途):标量, 列,行和表4.视图: view节省SQL语句; 安全性控制视图本质: 虚拟表, 有结构无数据视图数据操作: 多表只能改, 单表可以增删改(增删有条件限制)视图算法: undefined未定义, temptable临时表和merge合并5.文件备份与还原文件备份: 存储引擎(myisam适用)单表数据备份: 只能备份数据SQL备份: 备份的是SQL指令(mysqldump.exe客户端备份)增量备份: 备份系统日志文件需求: 有一张银行账户表, 有A用户给B用户转账: A账户先减少, B账户增加. 但是A操作完之后断电了.解决方案: A减少钱, 但是不要立即修改数据表, B收到钱之后, 同时修改数据表.二,事务安全事务: transaction, 一系列要发生的连续的操作事务安全: 一种保护连续操作同时满足(实现)的一种机制事务安全的意义: 保证数据操作的完整性(存储引擎必须为innodb ,另一个可以用事务的是BDB但它收费)(事务操作只针对数据进行操作,若在事务内进行删表创表创数据库等操作,会先commit然后执行)1.事务操作事务操作分为两种: 自动事务(默认的), 手动事务①手动事务: 操作流程(data目录下的ib_logfile文件是日志文件)a.开启事务: 告诉系统以下所有的操作(写)不要直接写入到数据表, 先存放到事务日志Start transaction;(试:已经开启事务了,中途再Start transaction; ,相当于先commit再开启)(试:开启事务后,执行的查询语句,返回的是start transaction那一刻的数据经过日志内存的写操作语句加工后的结果,这时候提交事务后再查询的真实结果不一定就是这个)(试:某人开启事务的时候,对其他人的操作没有影响,其他人也可以操作数据库; 这个人开启事务的作用只是把开启事务后的写操作写入日志文件,相当于把日志内的所有操作数据的语句绑到一起再用commit提交或用rollback清空而已,把有可能不连续的操作连续起来而已)b.进行事务操作: 一系列操作李四账户减少张三账户增加c.关闭事务: 选择性的将日志文件中操作的结果保存到数据表(同步)或者直接清空事务日志(原来操作全部清空) ( 试:这两个命令都会退出事务,但commit会提交日志rollback会取消日志)1>提交事务: 同步数据表(操作成功): commit;2>回滚事务: 直接清空日志表(操作失败): rollback;2.事务原理事务操作原理: 事务开启之后, 所有的操作都会临时保存到事务日志, 事务日志只有在得到commit命令才会同步到数据表,其他任何情况都会清空(rollback, 断电, 断开连接)3.回滚点回滚点: 在某个成功的操作完成之后, 后续的操作有可能成功有可能失败, 但是不管成功还是失败,前面操作都已经成功: 可以在当前成功的位置, 设置一个点: 可以供后续失败操作返回到该位置, 而不是返回所有操作, 这个点称之为回滚点.设置回滚点语法: savepoint 回滚点名字;回到回滚点语法: rollback to 回滚点名字; (rollback to不会退出事务,但rollback会退出事务)2.自动事务处理(事务操作只针对数据进行操作,若关闭自动事务处理,再内进行删表创表创数据库等操作,会先commit再执行,帮你提交之前的操作;但之后的数据操作还是要commit 才能生效)在mysql中: 默认的都是自动事务处理, 用户操作完会立即同步到数据表中.自动事务: 系统通过autocommit变量控制Show variables like ‘autocommit’;关闭自动提交: set autocommit = off/0;再次直接写操作自动关闭之后,需要手动来选择处理: commit提交, rollback回滚注意: 通常都会使用自动事务4.事务特性事务有四大特性: ACIDA: Atomic原子性, 事务的整个操作是一个整体, 不可分割,要么全部成功,要么全部失败;C: Consistency, 一致性, 事务操作的前后, 数据表中的数据没有变化I: Isolation, 隔离性, 多方事务操作是相互隔离不受影响的.D: Durability, 持久性, 数据一旦提交, 不可改变,永久的改变数据表数据5.锁机制: innodb默认是行锁, 但是如果在事务操作的过程中, 没有使用到索引,那么系统会自动全表检索数据, 自动升级为表锁(事务内用索引定位的作写操作的时候,它会通过索引自动定位到那一条;但不用索引的话,他会全表搜索,查找所有记录;若行被锁住,别人用非索引定位没被锁住的行的话,会全表搜索会卡主,但别人用索引定位没被锁住的行时,不会被锁住)行锁: 只有当前行被锁住, 别的用户不能操作表锁: 整张表被锁住, 别的用户都不能操作三,变量变量分为两种: 系统变量和自定义变量1.系统变量系统定义好的变量: 大部分的时候用户根本不需要使用系统变量: 系统变量是用来控制服务器的表现的: 如autocommit, auto_increment_increment等①查看系统变量Show variables; -- 查看所有系统变量②查看具体变量值: 任何一个有数据返回的内容都是由select查看(试: 用select和show都可以查看变量值,只不过show查看列出的是所有变量,需要用like筛选;select查看是直接跟变量名,查看系统变量需要加两个@)Select @@变量名;③修改系统变量修改系统变量分为两种方式: 会话级别和全局级别a.会话级别: 临时修改, 当前客户端当次连接有效Set 变量名= 值;/Set @@变量名= 值;b.全局级别: 一次修改,永久生效(对所有客户端都生效,但必须重启会话才能生效)如果对方(其他)客户端当前已经连上服务器,那么当次修改无效,要退出重新登录才会生效Set global 变量名= 值; (这里不能加@@,加了报错)2.自定义变量①定义变量:系统为了区分系统变量, 规定用户自定义变量必须使用一个@符号Set @变量名= 值;②查看自定义变量:也是类似系统变量查看Select @变量名; (试:以上所有用set修改变量的方法和用select查看变量的方法,都可跟多个变量,用逗号隔开)3.在mysql中, “=”会默认的当做比较符号处理(很多地方), mysql为了区分比较和赋值的概念: 重新定义了一个新的的赋值符号: :=4.Mysql允许从数据表中获取数据,然后赋值给变量: 两种方式①方案1: 边赋值,变查看结果Select @变量名:= 字段名from 数据源; -- 从字段中取值赋值给变量名, 如果使用=会变成比较(若不用:=而用=,会把=号当比较符号, 把@变量名=字段名当成一个字段,下面的数据是他们比较的值,0或1 ; 若用:=,会每到一列就赋值一次然后显示.显示完了之后该变量的值为最后一行的那个字段的值)②方案2: 只有赋值不看结果: 要求很严格: 数据记录最多只允许获取一条: mysql不支持数组Select 字段列表from 表名into 变量列表; (字段列表和变量列表数量必须一致,记录只允许一条)所有自定义的变量都是会话级别: 当前客户端当次连接有效所有自定义变量不区分数据库(用户级别)四,触发器触发器: trigger, 事先为某张表绑定好一段代码,当表中的某些内容发生改变的时候(增删改)系统会自动触发代码,执行.触发器: 事件类型, 触发时间, 触发对象事件类型: 增删改, 三种类型insert,delete和update(试:在一个表上做3个触发器,分别为after的增删改,若你用一条insert或delete或update语句插入或删除或改动了多条数据,动了几条,他们就会触发对应的触发器几次,没成功不触发; 若没有唯一键或主键冲突的时候,replace和insert的作用一样,触发器行为也一样)(试:有主键冲突情况下Replace的触发行为,完全等价于先delete再insert,哪怕replace的新数据与原表中需要替换的旧数据一模一样,也相当于先删旧的再添新的;一条sql语句replace多条记录,等价于把该条sql语句拆分成多条sql语句运行的效果!!!)(replace操作在唯一键或主键冲突时永远相当于先删再添,如果表中有多个字段都有唯一键,你要插入的一条数据跟表中的多条记录都冲突了,那么会先把那多条记录删掉,再把新数据添进表中,完成后delete触发器触发多次,inset触发器触发一次!)(用insert into…on duplecate key update…: 在主键和唯一键冲突时,运行了更新操作的话,就会update触发器触发一次;没冲突运行了插入操作就会insert触发器触发一次)(若某条增删改语句加了触发器,当你运行增删改的时候,本身的增删改是没问题的,但他即将触发的事件因为某种原因(如超范围或唯一键约束等)运行不了,那么那个增删改也不能运行,触发事件也不会发生,可以这么理解,触发导火线和将触发的事件,要不就都发生要不就都不发生)触发时间: 前后: before和after (和上面3种的组合方式一共有6种)触发对象: 表中的每一条记录(针对行)一张表中只能拥有一种触发时间的一种类型的触发器: 最多一张表能有6个触发器1.创建触发器在mysql高级结构中: 没有大括号, 都是用对应的字符符号代替触发器基本语法:①-- 临时修改语句结束符(试:这是会话级别)Delimiter 自定义符号-- 后续代码中只有碰到自定义符号才算结束(这条语句没有结束符)②--创建触发器(试: 把触发器装在某个表上,触发后的执行语句不能对这个表进行操作,因为此表触发了触发器,触发器内容没执行完的时候就被锁住了)(试:触发器触发后的执行语句不能是查询操作,因为触发触发后不允许有返回值,触发器触发后的执行语句也不能是删表操作)Create trigger 触发器名字触发时间事件类型on 表名for each rowBegin -- 代表左大括号: 开始……-- 里面就是触发器的内容: 每行内容都必须使用语句结束符: 分号End -- 代表右带括号: 结束自定义符号-- 语句结束符③-- 将临时修改修正过来Delimiter ;2.查看触发器查看所有触发器或者模糊匹配Show triggers [like ‘pattern’];可以查看触发器创建语句Show create trigger 触发器名字; (试:这只能查看当前数据库的索引触发器)所有的触发器都会保存一张表中: Information_schema.triggers3.使用触发器触发器: 不需要手动调用, 而是当某种情况发生时会自动触发.(订单里面插入记录之后)4.修改触发器&删除触发器触发器不能修改,只能先删除,后新增.Drop trigger 触发器名字;5.触发器记录触发器记录: 不管触发器是否触发了,只要当某种操作准备执行, 系统就会将当前要操作的记录的当前状态和即将执行之后新的状态给分别保留下来, 供触发器使用: 其中, 要操作的当前状态保存到old中, 操作之后的可能形态保存给new.Old代表的是旧记录,new代表的是新记录删除的时候是没有new的; 插入的时候是没有oldOld和new都是代表记录本身: 任何一条记录除了有数据, 还有字段名字.使用方式: old.字段名/ new.字段名(new代表的是假设发生之后的结果)查看触发器的效果如果触发器内部只有一条要执行的SQL指令, 可以省略大括号(begin和end)Create trigger 触发器名字触发时间事件类型on 表名for each rowSQL指令;触发器: 可以很好的协调表内部的数据处理顺序和关系. 但是从PHP角度出发, 触发器会增加数据库维护的难度, 所以较少使用触发器.五,代码执行结构(if-then-else和while好像都只能在procedure或是function里用??)代码执行结构有三种: 顺序结构, 分支结构和循环结构1.分支结构分支结构: 事先准备多个代码块, 按照条件选择性执行某段代码.在mysql中只有if分支基本语法If 条件判断then……;-- 满足条件要执行的代码;[Else……; ] -- 不满足条件要执行的代码;End if;触发器结合if分支: 判断商品库存是否足够,不够不能生成订单. mysql内没有专门的语句的阻止某条sql语句的发生,所以可以在不希望某条语句发生的触发器内if后面跟一条语法错误的语句,暴力终止,触发器内的语句执行不了了,那么原来触发触发器的语句也就执行不了了.(试:下例其实也可以直接把库存的类型改成int signed,就不需要加这种验证了)效果2.循环结构循环结构: 某段代码在指定条件执行重复执行. While循环(没有for循环) (还有个循环叫loop,跟while是一样的,所以只讲一个)①语法结构:While 条件判断do……;-- 满足条件要执行的代码……;-- 变更循环条件End while;②循环控制: 在循环内部进行循环判断和控制Mysql中没有对应continue和break. 但是有替代品.Iterate: 迭代, 类似continue, 后面的代码不执行, 循环重新来过Leave: 离开, 类似break,整个循环接收使用方式: Itrate/leave 循环名字;③定义循环名字:循环名字:while 条件do……; -- 循环体……;-- 循环控制Leave/iterate 循环名字;End while;六,函数函数: 将一段代码块封装到一个结构中, 在需要执行代码块的时候, 调用结构执行即可.(代码复用) 函数分为两类: 系统函数和自定义函数1.系统函数系统定义好的函数, 直接调用即可.任何函数都有返回值, 因此函数的调用是通过select调用.Mysql中,字符串的基本操作单位(最常见的是字符)怎么查看操作手册:打开操作手册在左边的目录里选中要查询的大类,再点击一下右边的正文处ctrl+f输入查询内容查询常用系统函数:Substring: 字符串截取(字符为单位)char_length: 字符长度Length: 字节长度Instr: 判断字符串是否在某个具体的字符串中存在, 存在返回位置,不存在返回0;(位置都是从1开始)Lpad: 左填充, 将字符串按照某个指定的填充方式,填充到指定长度(字符)(填就从左边开始填; 不够原始长度也是从左边开始读,读到指定长度为止)(Rpad:右填充) (填也是从左边开始填,不够原始长度也是读从左边开始读到指定长度)Insert: 替换,找到目标位置,指定长度的字符串,替换成目标字符串Strcmp: compare,字符串比较(区不区分大小写跟校对集有关,默认的校对集不区分大小写) (类似java中String的compareTo方法,但小返回-1,大返回1,等于返回0)2.自定义函数(试: 只对当前数据库有效,只要不删永久有效,非会话级别) (试:函数体内写select查询语句输出会报错,但用于赋值不会报错)(试:函数内不能增删表,不然报错;函数可以对某表内的数据进行写操作;但函数内不能有查询后的输出语句,可以有查询后的赋值语句!!)(试:函数不能什么都不加,直接调用,如: Function(); )(调用函数的时候中途报错退出函数的话,报错之前的代码有效!!!)函数要素: 函数名, 参数列表(形参和实参), 返回值, 函数体(作用域)①创建函数:创建语法: (这里也是,如果函数里只有一条语句,则begin和end可以省略不写) (自定义函数必须有返回值)Delimiter 结束符Create function 函数名([形参列表]) returns 数据类型-- 规定要返回的数据类型Begin……;-- 函数体……;-- 返回值: return 类型(指定数据类型);End结束符Delimiter ;定义函数自定义函数与系统函数的调用方式是一样: select 函数名([实参列表]);②查看函数查看所有函数: show function status [like ‘pattern’];查看函数的创建语句: show create function 函数名;③修改函数&删除函数函数只能先删除后新增,不能修改.Drop function 函数名;④函数参数参数分为两种: 定义时的参数叫形参, 调用时的参数叫实参(实参可以是数值也可以是变量)形参: 要求必须指定数据类型Function 函数名(形参名字字段类型) returns 数据类型在函数内部使用@定义的变量在函数外部也可以访问,在函数外部@定义的全局变量函数内也能使用,但类型不兼容的全局变量赋值给局部变量,在函数调用的时候会报错④作用域Mysql中的作用域与js中的作用域完全一样(任何变量只要你要修改,就要用set关键字)全局变量可以在任何地方使用; 局部变量只能在函数内部使用.全局变量: 使用set关键字定义, 使用@符号标志(跨数据库也能使用)局部变量: 使用declare关键字声明, 没有@符号: 所有的局部变量的声明,必须在函数体开始之前七,存储过程存储过程简称过程,procedure, 是一种用来处理数据的方式.存储过程是一种没有返回值的函数.(存储过程与函数不同,他里面可以放查询语句,里面也可以增删表,也可以增删数据库) (存储过程只对当前数据库有效,非会话级别)(调用存储过程,执行的中途报错退出了的话.错误之前的代码有效!!!)1.创建过程Delimiter 结束符Create procedure 过程名字([参数列表])Begin……; -- 过程体End结束符Delimiter ;2.查看过程函数的查看方式完全适用于过程: 关键字换成procedure 查看所有过程: show procedure status [like ‘pattern’];查看过程创建语句: show create procedure 过程名;3.调用过程过程没有返回值: select是不能访问的.过程有一个专门的调用关键字: call4.修改过程&删除过程过程只能先删除,后新增Drop procedure 过程名;5.过程参数函数的参数需要数据类型指定, 过程比函数更严格.过程还有自己的类型限定: 三种类型In: 数据只是从外部传入给内部使用(值传递): 可以是数值也可以是变量Out: 只允许过程内部使用(不用外部数据), 给外部使用的.(引用传递: 外部的数据会被先清空才会进入到内部): 只能是变量Inout: 外部可以在内部使用,内部修改也可以给外部使用: 典型的引用传递: 只能传变量①基本使用Create procedure 过程名(in 形参名字数据类型, out 形参名字数据类型, inout 形参名字数据类型)调用: out和inout类型的参数必须传入变量,而不能是数值正确调用: 传入变量存储过程对于变量的操作(返回)是滞后的: 是在存储过程调用结束的时候,才会重新将内部修改的值赋值给外部传入的全局变量.测试: 传入数据1,2,3: 说明局部变量与全局变量无关最后: 在存储过程调用结束之后, 系统会将局部变量重复返回给全局变量(out和inout)。
Mysql笔记(附Mysql基础书pdf版)

Mysql笔记(附Mysql基础书pdf版)资料数据库篇SHOW DATABASES; //显⽰数据库系统中已经存在的数据库CREATE DATABASE 数据库名; //创建数据库DROP DATABASE 数据库名; //删除数据库表篇注:在使⽤操作表语句前,⾸先要使⽤USE语句选择数据库。
选择数据库语句的基本格式为“USE 数据库名”。
否则会报错,1046;CREATE TABLE 表名 ( 属性名数据类型 [完整性约束条件],属性名数据类型 [完整性约束条件],属性名数据类型);表名不能为SQL语句的关键字,⼀个表可以有多个属性。
定义时,字母⼤⼩写均可,各属性之间⽤逗号隔开,最后⼀个属性不需要加逗号。
主键主键有唯⼀值单字段主键属性名数据类型 primary key //创建主键,写在属性名数据类型后⾯;多字段主键primary key(属性名 1,属性名2,属性名n)两者的组合可以确定唯⼀的⼀条记录;外键外键不⼀定必须为⽗表的主键,但必须是唯⼀性索引,主键约束和唯⼀性约束都是唯⼀性索引;外键可以为空值;设置外键的基本语法规则如下:CONSTRAINT 外键别名 FOREIGN KEY(属性 1.1,属性1.2,属性1.n)REFERENCES 表名(属性2.1,属性2.2,属性2.n)其中,“外键别名”参数是为外键的代号;“属性1”参数列表是⼦表中设置的外键;“表名”参数是指⽗表的名称;“属性2”参数列表是⽗表的主键。
设置表的⾮空约束设置表的唯⼀性约束设置表的属性值⾃动增加查看表结构DESCRIBE 表名; // 查看表基本结构语句,可缩写为desc 表名SHOW CREATE TABLE 表名; //查看表详细结构语句(包含存储引擎、字符编码)删除表DROP TABLE 表名;//删除没有被关联的普通表删除⽗表需要先将外键删除,然后才能去删除⽗表。
字段篇//通过ALTER TABLE语句ALTER TABLE 旧表名 RENAME [TO] 新表名;//修改表名 TO参数是可选参数,是否在语句中出现不会影响语句的执⾏。
10分钟梳理MySQL核心知识点

10分钟梳理MySQL核⼼知识点今天我们⽤10分钟,重点梳理⼀遍以下⼏⽅⾯:数据库知识点汇总;数据库事务特性和隔离级别;详解关系型数据库、索引与锁机制;数据库调优与最佳实践;⾯试考察点及加分项。
⼀、数据库的不同类型1.常⽤的关系型数据库Oracle:功能强⼤,主要缺点就是贵MySQL:互联⽹⾏业中最流⾏的数据库,这不仅仅是因为MySQL的免费。
可以说关系数据库场景中你需要的功能,MySQL都能很好的满⾜,后⾯详解部分会详细介绍MySQL的⼀些知识点MariaDB:是MySQL的分⽀,由开源社区维护,MariaDB虽然被看作MySQL的替代品,但它在扩展功能、存储引擎上都有⾮常好的改进PostgreSQL:也叫PGSQL,PGSQL类似于Oracle的多进程框架,可以⽀持⾼并发的应⽤场景,PG⼏乎⽀持所有的SQL标准,⽀持类型相当丰富。
PG更加适合严格的企业应⽤场景,⽽MySQL更适合业务逻辑相对简单、数据可靠性要求较低的互联⽹场景。
2.NoSQL数据库(⾮关系型数据库)Redis:提供了持久化能⼒,⽀持多种数据类型。
Redis适⽤于数据变化快且数据⼤⼩可预测的场景。
MongoDB:⼀个基于分布式⽂件存储的数据库,将数据存储为⼀个⽂档,数据结构由键值对组成。
MongoDB⽐较适合表结构不明确,且数据结构可能不断变化的场景,不适合有事务和复杂查询的场景。
HBase:建⽴在HDFS,也就是Hadoop⽂件系统之上的分布式⾯向列的数据库。
类似于⾕歌的⼤表设计,HBase可以提供快速随机访问海量结构化数据。
在表中它由⾏排序,⼀个表有多个列族以及每⼀个列族可以有任意数量的列。
HBase依赖HDFS可以实现海量数据的可靠存储,适⽤于数据量⼤,写多读少,不需要复杂查询的场景。
Cassandra:⼀个⾼可靠的⼤规模分布式存储系统。
⽀持分布式的结构化Key-value存储,以⾼可⽤性为主要⽬标。
适合写多的场景,适合做⼀些简单查询,不适合⽤来做数据分析统计。
MQL5关键知识点总结(五)

MQ15关键知识点总结(五)薛辉原创知识点颜色说明:01、不同字体表示一般级别的知识点。
02、加黑字条表示中等版别的知识点。
03、红色字体表示高级别知识点。
红色加黑字条表示极其堂要、易出锋知识点。
0801>参数TrUe-只是市场报价中的交易品种0802、如果一选择参量是true,函数返回字符的数量就在市场窗口中选择。
0803、如果值是fa1se,返回所有交易品种的数量。
0804>stringSymbo1Name(intpos, //列表中的数字boo1se1ected //true-只是市场报价中的交易品种);0805、返回交易品种名称。
0806、se1ected[in]请求方式,如果值是true,该交易品种从其在市场观测的选择中找出。
0807>如果值是fa1se,交易品种从总目录中找出。
0808、函数返回:包含交易品种名称的字符串的值。
0809、这里的字符串是包含所有品种名称的字符而不是〃OSO11〃这样的东西。
0810>boo1Symbo1Se1ect(stringname z//交易品种名称boo1se1ect//添加或者移除);0811>在市场观测中选择一个交易品种或者从窗口中移动一个交易品种。
0812、第二个参数决定是添加还是移除。
0813、如果值是fa1se,交易品种从市场观测中删除。
0814、然后在窗口中选择一个交易品种。
0815、如果该品种有开仓则不能关闭这个窗口。
0816boo1Symbo11sSynchronized(stringname,//交易品种名称);0817、该函数检验在客户端中选出来的交易品种数据与交易服务器中的数据是否同步。
0818、如果数据是同步的,返回true,否则返回fa1seβ0819、doub1eSymbo11nfoDoub1e(stringname,//交易品种intpropjd//属性标识符);0820、上述用法快速返回规定值。
0821、boo1Symbo11nfoDoub1e(stringname,//交易品种intpropjd,//属性标识符doub1e&doub1e_var//这里假设属性值);0822、返回真值或失败值取决于函数操作是否成功。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
昨天作业2013年4月20日星期六09:56class as h on m.host_id =h.id left joinselect2013年4月20日星期六10:06生成的文件格式:默认的,采用行来区分记录,而采用制表符,来区分字段。
为了满足某种特别的需求,会采用不同的分割方式。
支持,在导出数据时,设置记录,与字段的分割符。
通过如下的选项:fields:设置字段选项Lines: 设置行选项(记录选项)先看默认值:字段:fields terminated by '\t' enclosed by '' escaped by '\\‘记录:lines terminated by '\n' starting by ''可以自己设定:select * into outfile 'e:/amp/three'fields terminated by ','lines terminated by '\n' starting by 'start:'from teacher_class where t_name = '韩信';字段包裹select * into outfile 'e:/amp/four'fields terminated by '\t' enclosed by 'x'lines terminated by '\n' starting by 'start:'from teacher_class where t_name = '韩信';注意:常规的,所有的记录,应该通过行来显示例外是保存二进制数据:Blob binary使用into dumpfileselect * into dumpfile 'e:/amp/six' from teacher_class where t_name = '韩信' limit 1;新增数据Insert&replace&load data2013年4月20日星期六10:37Insert 插入Insert into tbl_name (字段列表)values (值列表)可以不将所有的字段都插入数据。
如果说需要完成部分字段的插入,需要必须存在字段列表,没有插入的字段,使用默认值:如果是插入部分字段,可以使用下面的set语句:用value的值列表语法,可以一次性插入多条数据:每条数据采用记录构造符括号完成即可:插入数据时,如果主键冲突会如何?默认有主键约束,不会插入成功但是可以在insert语法内,控制在主键冲突时,改成执行更新操作内部业务逻辑:注:Update 后不跟set。
插入的数据源:除了使用自定义数据外,还可以是使用select 语句查询到数据,作为插入的数据源。
数据可以来源于其他数据表,要求字段数量和类型一致即可:insert into teacher_class (t_name, c_name) select t_name, class_name from teacher; 通过强制使用default关键字,或者default()函数,使用默认值;Replace主键或唯一索引冲突,则替换;否则插入。
Load data infile "file" into table tbl_name;导入 select * into outfile 'file'命令导出的内容上面两个命令互补。
注意:导入时,涉及到数据增加,需要考虑,是否冲突的情况。
通常,可以在导出时,将主键导出成null。
利用自动增长的特性。
可以形成新的主键:同样:在导入数据时,需要同样指定数据的分割,起止符号等。
保证导出数据的格式与导入数据需要的格式是一致的即可删除数据2013年4月20日星期六11:41Delete允许使用条件(删除符合条件的数据)允许使用limit :限制删除的记录数。
limit N;常见的是limit 配合order by来使用:先将结果排序,再删除固定数量的记录。
允许连接删除:清空表:Truncate类似:delete from table;Truncate:1,不会返回删除的记录数。
2,重建自动增长的主键。
Delete:逐行删除。
truncate:删除表,再新建表。
更新数据2013年4月20日星期六12:05replace,insert on duplicate key update Update支持where、order by、limit备份还原2013年4月20日星期六14:04方案1:适用于mysiam表直接将tbl_name.frm、Tbl_name.myd、Tbl_name.myi三个文件,压缩另保存一个备份即可。
需要的时候,直接解压到移动到相应的数据库目录内即可注意,如果是同样的方法,处理的innodb表结构的文件,则使用show tables时,也可以看到,但是不能使用的。
所以本方案不适合innodb表!方案2:通用的方案思路是:将建表结构,与插入数据的sql语句生成并保存,下次如果需要该结构和数据直接将数据语句执行即可。
利用mysql提供的工具完成的,不是sql语言的一部分。
不需要在mysql命令行客户端执行,直接运行即可。
备份php_one数据库:将备份的数据库还原:就是将刚刚生成的sql语句,在mysql客户端执行即可。
如何执行保存在文件内的sql语句:使用source 指令,可以指定需要执行sql语句的源代码文件:常用的备份操作:1,备份整个数据内的表:mysql dump -uroot -p db_name > bak.sql2,备份数据库内的某张表:mysqldump -uroot -p php_one teacher_class > e:/php_one_teacher_class.sqlmysqldump -uroot -p php_one teacher_class tbl_name1 tbl_name2 tbl_name3 >e:/php_one_teacher_class.sql视图2013年4月20日星期六14:37创建视图:Create view view_name as select_statement;视图就是一个存在与数据库中的虚拟表了,对这个虚拟表的操作会内部同步到真实表上:注:视图,本身没有数据,只是通过执行相应的select语句完成获得相应的数据,相当于执行以下操作注:视图,主要是针对查询操作为生的。
视图管理删除视图:Drop view [if exists] view_name;修改视图:Alter view view_name as select_statement;修改视图内所使用的字段的名称:视图名称后面,使用(字段列表即可)缩减业务逻辑:通过视图还可以使复杂的业务逻辑简单的完成,先使用视图完成一定的逻辑,在在视图的基础上,完成另外的逻辑。
通常,视图完成的逻辑,都是相对来说比较基础的逻辑。
create view join_info as select tc.id as tc_id, t_name, c_name, days from join_teacher_class as tc left join join_teacher as t on tc.t_id=t.id left join join_class as c on tc.c_id=c.id;select * from join_info;视图的执行过程/算法:存在两种执行算法:1,merge2,temptable指的是一个视图是在什么时候执行,依据哪些方式执行:merge:合并的执行方式,每当执行的时候,现将我们视图的sql语句与外部查询视图的sql 语句,混合在一起,最终执行Temptable:临时表模式,每当查询的时候,将视图所使用select语句生成一个结果的临时表,再在当前的临时表内进行查询。
当用户创建视图时,mysql默认使用一种undefine的处理算法:就是会自动在合并和临时表内进行选择。
事务2013年4月20日星期六16:05一组sql语句操作单元。
组内所有sql语句完成一个业务。
如果整组成功:意味着全部sql都实现.如果其中任何一个失败,意味着整个操作都失败。
失败,意味着整个过程都是没有意义的。
应该是数据库回到操作前的初始状态。
上面的特性,就是事务。
如何处理?1,失败后,可以回到开始位置2,没都成功之前,别的用户(进程,会话)是不能看到操作内的数据修改的。
思路:就是在一组操作之间,设计一个记号,备份点。
实现:利用innodb存储引擎的,事务日志功能:执行语句:自动提交存在一个系统的变量,auto commit 可以对自动提交进行配置关闭自动提交:set autocommit=0;关闭后,再次执行相应的更新语句:发现,在其他连接中,查看数据,没有发生变化,因为结果没有提交。
提交或回滚在此基础上,执行完所有的sql语句。
判断是否都成功(出现错误,包括语法错误,和逻辑错误服务器错误)。
成:将结果提交。
利用commit;败:回到开始位置。
利用Rollback;常见的事务的指令:开启事务/关闭自动提交Start transaction; 可以使用begin。
如果事务结束(敲击了commit或rollback)了,成或败,都会将自动将提交机制回到初始时的状态。
初始状态一般是开启了自动提交/关闭事务。
限定:在innodb、DBD下生效事务的特点:ACID1,原子性。
Atomicity 2,一致性。
Consistency 3,隔离性。
Isolation 4,持久性。
Durability触发器2013年4月20日星期六18:24注意:1,触发器不能同名。
2,目前mysql只支持一类事件设置一个触发器。
管理触发器:删除:Drop trigger trigger_name;查看:Show create trigger trigger_name;在触发器内,获得触发该触发程序时的数据:利用触发程序内的new 和old来完成;Old:监听事件所在表上的数据,在事件发生之前时的数据。
旧的数据。
New:监听表上,事件发生之后,新处理完毕的数据。
数据,就是触发该事件的记录。
事件是insert呢?不能使用old 事件是delete呢?不能使用newPHP操作数据库准备工作2013年4月26日星期五17:27解决的问题:1,mysql服务器,开放接口,允许其他语言操作。