之前我们主要分享MySQL中的常识和用法。这里主要分享MySQL中的高层用法,主要包括:函数、存储过程和存储引擎。1函数函数可以返回任何类型的值,也可以接收那些类型的参数。字符函数可以嵌套。%(百分号):代表任意数量的字符。_(下划线):代表任意字符。#删除前导'?'符号SELECTTRIM(LEADING'?'FROM'??MySQL???');#删除后面的'?'符号SELECTTRIM(TRAILING'?'FROM'??MySQL???');#Delete'?'前后符号SELECTTRIM(BOTH'?'FROM'??My??SQL???');#更换'?'带有“!”的符号symbolSELECTREPLACE('??My??SQL???','?','!');#从'MySQL'的第一个截取2个字符SELECTSUBSTRING('MySQL',1,2);#截取***来自“MySQL”的1个字符SELECTSUBSTRING('MySQL',-1);#从'MySQL'的第二个开始,截取到最后SELECTSUBSTRING('MySQL',2);数值运算符函数比较运算符函数日期时间函数#时间增加1年SELECTDATE_ADD('2016-05-28',INTERVAL365DAY);#时间减少1年SELECTDATE_ADD('2016-05-28',INTERVAL-365DAY);#时间增加3周SELECTDATE_ADD('2016-05-28',INTERVAL3WEEK);#日期格式SELECTDATE_FORMAT('2016-05-28','%m/%d/%Y');#更多时间格式可以去MySQL官网查看手册信息函数函数聚合函数加密函数自定义函数用户自定义函数(user-definedfunction,UDF)是MySQL的一种扩展方式,其用法是与内置函数相同。UDF是一种扩展MySQL的方法。必要条件参数:可以有零个或多个返回值:参数只能有一个,返回值没有必然联系。创建自定义函数CREATEFUNCTIONfunction_nameRETURNS{STRING|INTEGER|REAL|DECIMAL}routine_body函数体(routine_body)函数体由合法的SQL语句组成;函数体可以是简单的SELECT或INSERT语句;如果函数体是复合结构,则使用BEGIN...END语句;复合结构可以包含声明、循环、控制结构。示例#withoutparameterCREATEFUNCTIONf1()RETURNSVARCHAR(30)RETURNDATE_FORMAT(NOW(),'%Y-%m-%d%H:%i:%s');#withparameterCREATEFUNCTIONf2(num1SMALLINTUNSIGNED,num2SMALLINTUNSIGNED)RETURNSFLOAT(10,2)无符号返回(num1+num2)/2;#带复合结构函数体#可能需要用DELIMITER命令修改分隔符CREATEFUNCTIONf3(usernameVARCHAR(20))RETURNSINTUNSIGNEDBEGININSERTtest(username)VALUES(username);RETURNLAST_INSERT_ID();END2存储过程存储过程是SQL的预编译集合语句和控制语句,以名称存储并作为一个单元处理。它可以被用户调用和执行,允许用户声明变量和进行过程控制。存储过程可以接收输入类型和输出类型的参数,并且可以有多个返回值。执行效率高于单条SQL语句。优点增强SQL语句的功能和灵活性。控制语句可以写成存储过程,灵活性强,可以完成复杂的判断和复杂的操作。实现更快的执行速度如果一个操作包含大量的SQL语句,这些SQL语句会被MySQL引擎解析、编译、执行,效率比较低。存储过程是预编译的。当客户端第一次调用存储过程时,MySQL引擎会对其进行语法分析、编译等操作,然后将编译后的结果存储在内存中,所以***使用时效率和之前一样第一次。但是以后客户端再次调用这个存储过程时,会直接从内存中执行,所以效率比较高,速度也比较快。减少网络流量如果客户端将每条SQL语句单独发送给服务器端执行,那么通过http协议提交的数据量是比较大的。创建CREATE[DEFINER={user|CURRENT_USER}]PROCEDUREsp_name([proc_parameter[,...]])[characteristic...]routine_bodyproc_parameter:[IN|出|INOUT]param_name类型参数:IN,表示调用存储过程时必须指定参数的值。OUT表示参数值可以被存储过程改变,可以返回。INOUT,表示该参数是在调用时指定的,可以更改和返回。特点:COMMENTCommentCONTAINSSQL包含SQL语句,但不包含读写数据的语句。NOSQL不包含SQL语句。READSSQLDATA包含用于读取和写入数据的语句。MODIFIESSQLDATA包含写入数据的语句。SQL安全{DEFINER|INVOKER}指定谁有执行权限。流程体流程体由合法的SQL语句组成;流程体可以是任意SQL语句;不能通过存储过程创建数据表和数据库。可以对数据进行增删改查,通过存储过程进行多表连接操作。如果过程体是复合结构,使用BEGIN...END语句;复合结构可以包含声明、循环和控制结构。CALLsp_name([parameter[,...]])CALLsp_name[()]DELETEDROPPROCEDURE[IFEXISTS]sp_nameMODIFYALTERPROCEDUREsp_name[特征...]COMMENT'string'|{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}|SQLSECURITY{DEFINER|INVOKER}存储过程和自定义函数的区别存储过程实现的功能更复杂,而函数的针对性更强。存储过程可以返回多个值,函数只能有一个返回值。存储过程一般是独立执行的,函数可以作为其他SQL语句的组件来实现。Example:#CreateastoredprocedurewithoutparametersCREATEPROCEDUREsp1()SELECTVERSION();#CreateastoredprocedurewithINtypeparameters(usersisthedatatablename)#ThenameoftheparametercannotbethesameastherecordnameinthedatatableCREATEPROCEDUREremoveUserById(INp_idINTUNSIGNED)BEGINDELETEFROMusersWHEREid=p_id;END#CreateastoredprocedurewithINandOUTtypeparameters(usersisthedatatablename)CREATEPROCEDUREremoveUserAndReturnUserNumsById(INp_idINTUNSIGNED,OUTuserNumsINTUNSIGNED)BEGINDELETEFROMusersWHEREid=p_id;SELECTCOUNT(id)FROMusersINTOuserNums#Createmultipletypeswithmultipletypes参数的存储过程(users为数据表名)CREATEPROCEDUREremoveUserAndReturnInfosByAge(INp_ageSMALLINTUNSIGNED,OUTdelUserSMALLINTUNSIGNED,OUTuserNumsSMALLINTUNSIGNED)BEGINDELETEFROMusersWHEREage=p_age;SELECTROW_COUNTINTOdelUser;SELECTCOUNT(id)FROMusersINTOuserNums;END3存储引擎MySQL可以将数据以不同的技术存储在文件(内存)中,Thistechnologyiscalledastorageengine.Eachstorageengineusesdifferentstoragemechanisms,indexingtechniques,lockinglevels,andultimatelyprovidesawiderangeofdifferentcapabilities.Locksharedlock(readlock):Duringthesameperiodoftime,multipleuserscanreadthesameresource,andthedatawillnotchangeduringthereadingprocess.Exclusivelock(writelock):Onlyoneusercanwritetotheresourceatanytime,andotherreadlockorwritelockoperationswillbeblockedwhenthewritelockisperformed.Lockgranulartablelock:Itisalockstrategywiththeleastoverhead.Rowlock:Itisalockingstrategywiththelowestcost.Concurrencycontrolensuresdataconsistencyandintegritywhenmultipleconnectionrecordsaremodified.TransactionsTransactionsareusedtoguaranteetheintegrityofthedatabase.示例:用户银行转账用户A转账200元。用户B执行步骤:1)从当前账户中扣除200元(账户余额大于等于200元)。2)在对方账户中充值200元。事务特性:1)原子性(atomicity)2)一致性(consistency)3)隔离(isolation)4)持久性(durability)外键是一种保证数据一致性的策略。索引是一种对数据表中一个或多个列的值进行排序的结构。类型MySQL主要支持以下引擎类型:MyISAMInnoDBMemoryCSVArchive各种存储引擎特性CSV:其实是逗号分隔的数据引擎,为数据库子目录下的每个表创建一个.csv文件,这是一个普通的文本文件,每个数据line占据一个文本行。不支持索引。BlackHole:黑洞引擎,写入的数据会消失,一般用于数据复制中继。MyISAM:适用于事务不多的情况。InnoDB:适用于事务比较多,需要外键支持的情况。索引分类:普通索引、唯一索引、全文索引、btree索引、hash索引...修改存储引擎通过修改mysql配置文件default-storage-engine=engine_name实现CREATETABLEtable_name(...)ENGINE=engine_name通过修改命令创建数据表数据表命令实现ALTERTABLEtable_nameENGINE[=]engine_name4管理工具phpMyAdmin需要PHP环境NavicatMySQLWorkbench
