一、数据操作数据库-- 登录mysql-u root-p-- 查看所有数据库showdatabases;-- 创建数据库createdatabaseifnotexists数据库名;-- 删除数据库dropdatabaseifexists数据库名;-- 进入数据库use数据库名;表table-- 查看数据表showtables;-- 创建表createtable表名(列1名intprimarykey,列2名varchar(255)unique);-- 删除表droptableifexists表名;-- 修改表altertable表名renameto新表名;-- 修改表名altertable表名add列名 列类型;-- 添加altertable表名dropcolumn列名;-- 删除altertable表名modify列名 列类型;-- 修改列类型-- 修改约束条件altertable表名add约束条件在建表时constraint数据完整性验证主键约束外键约束唯一约束检查约束非空约束。在约束的开头使用。-- 1.主键在定义列时候定义在末尾定义student_idINTPRIMARYKEYAUTO_INCREMENT,-- 2.外键FOREIGNKEY(class_id)REFERENCESclasses(class_id),-- 3.检查约束有无constrainCONSTRAINTchk_ageCHECK(age0ANDage150),ageINTCHECK(age0ANDage150),-- 4.非空约束nameVARCHAR(50)NOTNULL,-- 5.唯一值约束emailVARCHAR(100)UNIQUE,-- 6.默认值约束ageINTDEFAULT18,表内数据-- 插入insertinto表名(列1,列2)values(val1,val2),(val3,val4);-- 更新update表名set列1val1,列2val2where筛选条件;-- 删除数据deletefrom表名where约束条件;-- 清空表truncatetable表名;-- 查询不重复的列值selectdistinct列名from表名;-- 条件查询select*from表名where列1like张%;-- %是0_是1select*from表名where列1in(val1,val2);-- 值等于select*from表名where列1betweenval1andval2;-- 值≥≤select*from表名where列1isnull;-- 非空-- 排序select*from表名orderby列1asc,列2desc;-- 列1升序asc默认-- 分组类似学生表中按照班级分类并统计每班人数selectcol,count(*)from表名groupby列1havingcount(*)1;-- 限制输出指定行select*from表名limit10;-- 输出前10行select*from表名limit5offset10;-- 输出5-10行-- 连接查询select*from表1innerjoin表2表2别名on表1.id表2.id;-- 内连接重复行select*from表1leftjoin表2表2别名on表1.id表2.id;-- 左连接左表1所有行函数不能用在where中可用在having中。避免在索引列中使用count(), sum(), avg(), max(), min(),data_format(变量1,‘%Y年%m月%d日’)left(‘hellow’,3)输出hel二、索引、视图索引适合所有的列where常用join关联order by和group by的列唯一值高的索引失效!、、、or连接多个条件、like、not in、not exists、有运算和函数操作-- 创建索引create[unique]index索引名on表名(列1,列2);createindex索引名on表名(name(10));-- 前缀索引设置name列前10个字符作为索引createfulltextindex索引名on表名(列1);-- 全文索引用于文本快速搜索-- 使用索引会自动使用索引select*from表名where筛选条件;-- 自动使用√ 视图-- 创建视图createview视图名asselects.列1,s.列2,c.列3,…fromstudent sleftjoinclasses cons.cidc.cidwhere筛选条件;-- 带检查项的视图createview视图名asselect*fromstudentswherescore90withcheckoption;-- 使用视图select*from视图名where筛选条件;-- 更新视图update视图名set列名值where筛选条件;三、事务、存储函数、存储过程事务事务是把一组sql操作作为一个不可分割的工作单元要么全部成功要么全部失败。-- 1.开启事务starttransaction;-- 2.执行sql操作insertintostudents(name,sid)values(zhangsan,2001);updateclasssetcountcount1whereclassid1;-- 3.判断 并 提交/回滚if(selectcount(*)fromstudentswheresid2001)1then-- 判断第一步执行成功commit;select操作成功;-- 提交事务elserollback;select操作失败;-- 回滚事务endif;隔离级别 并发问题隔离级别并发问题脏读读到别人未保存数据不可重复读同一事务两次读取结果不同幻读同一查询两次结果行数不同存储函数存储函数计算并返回一个值select 函数名()调用可像内置函数使用只能查询不含事务控制存储过程执行业务逻辑、处理数据call 过程名()调用不能在select中使用能修改包含事务控制参数只有输入参数没有输出参数有返回值参数只读在函数内无法修改参数有作用域。-- 1.定义函数delimiter// -- 定义结束字符createfunction函数名(ageint)-- 函数名(参数名 参数类型,……)returnsint-- 返回值类型deterministic-- 【可省】确定性函数即相同的输入总是有相同的输出readssqldata-- 【可省】读取数据begindeclareageint;-- 声明变量setage……-- 设置变量的值每次修改都需要加setreturnif(age0,0,age);-- 返回值意思如果age小于0则输出0end// -- 结束函数delimiter;-- 定义结束字符-- 2.使用函数selectname,函数名(参数)from表名;流程控制语句函数内-- ififage50thensettypesolder;elseifage20thensettypesyounger;elsesettypeskid;endif;-- casecaseclasswhen1thensetteacherzhang;when2thensetteacherli;elsesetteacherwang;endcase;-- 循环whileage10dosetageage-1;-- 语句块endwhile;游标cursor用于逐行处理查询结果的数据库对象条件处理数据转换-- 1.定义游标结束标志done变量名也需要提前申请declaredoneintdefault0;-- 2.声明游标declare游标名cursorforselect语句;-- 3.声明处理程序declarecontinuehandlerfornotfoundset结束标志done1;-- 4.打开游标open游标名;-- 5.循环读取循环标签:loop-- 定义循环标签的名字fetch游标名into变量1,变量2,…;-- 循环读取一行if结束标志1then-- 检查是否结束leave循环标签;endif;setage40;-- 处理数据本行数据endloop循环标签;-- 6.关闭游标close游标名;存储过程是存储数据库中“可重用SQL程序”用于封装复杂业务逻辑。-- 创建存储过程delimiter$$createprocedure过程名(inageint,-- 输入参数outnamevarchar(50),-- 输出参数inoutsexvarchar(2)-- 输入输出参数)begin-- SQL语句变量声明流程控制end$$delimiter;-- 使用存储过程call过程名(参数1,参数2);四、其他存储引擎 engine是数据库的底层存储机制决定了数据的存储、索引、事务等行为。可选引擎InnoDB(默认)MyISAMMEMORY-- 查看支持的引擎showengines;-- 查看students表的引擎showtablestatuslike表名students;-- 定义引擎createtable表名(列1数据类型)engineInnoDB;-- 指定为InnoDB类型触发器触发器是自动执行的存储过程在“指定表”发生insert /update/ delete时自动触发触发时机before 操作执行前after操作执行后。-- 创建触发器下单后自动扣库存delimiter$$createtrigger触发器名afterinserton表名for each row-- after操作后触发begin-- 触发的操作update、insert、deleteupdate表名setstockstock-NEW.quantity-- 参数NEW 代表插入的新行数据whereproduct_idNEW.product_id;end$$delimiter;用户权限%从任何IP地址连接MySQL。*所有。创建用户-- 创建用户createuserzhanglocalhostidentifiedbypassword123;createroleread_write;-- 创建角色-- 删除用户dropuserzhanglocalhost;-- 修改密码alteruserzhanglocalhostidentifiedbynewpassword;为用户授权-- 授权语法grant权限列表on数据库名.表名to用户主机;grantallprivilegesonschools.*toadminlocalhost;-- 给admin在schools数据库中所有权限grantselect,insertonschools.classtoteacher%;-- 给教师select和insert权限grantexecuteonprocedure数据库名.表名touserlocalhost;-- 为角色授权grantselect,insertonschools.*toread_write;-- 查看用户权限语法showgrantforadminlocalhost;-- 撤掉权限语法revoke权限列表on数据库.表from用户主机;-- 刷新权限语法flushprivileges;创建角色为角色赋权-- 将角色授予用户grantread_writeto用户主机;-- 激活角色setdefaultroleread_writeto用户主机;