• mysql学习笔记


    /**创建数据库**/
    create database testdata;
    /**
    返回query OK; 则表示创建成功.
    **/

    /**删除数据库**/
    drop database testdata;
    /**
    返回query OK; 表示创建成功
    **/

    /**展示mysql所支持的引擎**/
    show engines;
    /**
    如果列数太多用;结尾 不是太过美观,所以可以用G结尾.
    support为default表示数据库默认是innodb引擎.
    **/

    /**查看默认的引擎**/
    show variables like 'storage_engine%';
    /**
    要修改默认引擎,则在配置文件里修改default-storage-engine为你想要的引擎名字即可
    **/


    /**
    myisam默认支持表锁
    innodb默认支持行锁,但是有时候会锁表
    **/

    /**
    浮点存储注意的地方:
    float double存储的是近似值,比如123131309307461630.010 用float double 存储 值为123131309307461630.000
    decimal 内部存储的是字符串,所以精度高 123131309307461630.010 存储值为123131309307461630.010
    **/


    /**
    char varchar nvarchar

    char
    char是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值。当你输入的字符大于指定的数时,它会截取超出的字符。

    nvarchar(n)
    包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零。

    varchar[(n)]
    长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。

    varchar 适合存一些数字和字母 nvarchar 适合存汉子
    **/


    /**创建mysql数据表语句**/
    create TABLE test (
    id INT(11) AUTO_INCREMENT,
    name varchar(55),
    year char(4)
    ) engine='myisam' default CHARSET=utf8;

    /**
    字段类型后面可以增加约束:
    NOT NULL 字段不能为空
    DETAULT 默认值 给字段设置默认值
    **/

    describe table_name;/**查看表单位结构,可简化为desc table_name**/
    show create table test;/**查看创建表时的sql语句**/
    drop table test;/**删除数据表**/
    alter table old_tablename rename new_tablename;/**修改表的名字**/
    alter table test1 add age char(4);/**增加字段,如果想字段在第一个,末尾加上first关键字 如果要在制定字段后面加,可以在末尾加上after 字段名 即可**/

    alter table test1 drop 字段名;/**删除指定字段**/
    alter table test1 modify age int(2);/**修改指定字段 可以用first或者after调整字段顺序**/
    alter table test1 change agf address char(4);/**修改字段的名字 char(4)是旧字段的数据类型 如果改变成varchar(4) 那么新字段的数据类型就变为后者 可以用first或者after调整字段顺序**/

    /**
    注:
    CHANGE 对列进行重命名或更改列的类型,需给定旧的列名称和新的列名称、当前的类型
    MODIFY 可以改变列的类型,此时不需要重命名(不需给定新的列名称) 还可以修改列的顺序
    **/


    /**索引笔记 test4为表名**/
    innodb myisam 引擎都支持btree 索引,memory 支持hash存储

    /**索引操作**/
    alter table test1 add primary key (id);/**添加主键索引 括号里可为多列**/
    alter table test1 drop primary key;/**删除主键索引**/
    alter table test1 add '索引类型' '索引名' (字段) /*添加非主键索引,字段可以为多个,用逗号隔开*/
    alter table test1 drop index '索引名';/*删除非主键索引,索引名为创建时指定的名字*/
    show index from 表名;/*查看索引*/

    /**
    查看语句是否用到索引
    EXPLAIN sql语句 如果possible_key不为空,则说明使用到了索引
    **/

    /*普通索引开始*/
    /**创建表时创建普通索引**/
    create table test4 (
    id int(11) primary key auto_increment,
    name varchar(55) NOT NULL DEFAULT '',
    index 索引名 (属性名)
    );

    /**给已存在的表创建普通索引**/
    create index 索引名 on test4 (属性名);
    /**alter语句创建普通索引**/
    alter table test4 add index 索引名 (属性名);
    /**alter语句删除普通索引**/
    alert table test4 drop index 索引名;
    /*普通索引结束*/


    /**唯一索引开始**/
    /**创建表时创建唯一索引**/
    create table test4 (
    id int(11) primary key auto_increment,
    name varchar(55) NOT NULL DEFAULT '',
    UNIQUE INDEX 索引名 (属性名);
    );
    /**给已存在的表创建唯一索引**/
    create unique index 索引名 on test4 (属性名)
    /**alter语句创建普通索引**/
    alter table test4 add unique index 索引名 (属性名);
    /**删除方法同普通索引**/
    /**唯一索引结束**/


    /**全文索引 把唯一索引里的unique换成fulltext就是全文索引的创建方法**/

    /**删除索引开始**/
    /**删除索引的语法形式**/
    drop index 索引名 on test4;/*删除索引*/
    /**alter语句删除普通索引**/
    alert table test4 drop index 索引名;
    /**删除主键 因为主键只会有一个,所以不用指定名字**/
    alert table test4 drop primary key;
    /**删除索引结束**/


    /**视图**/
    /**创建视图语法 sql语句规范中,视图命名前缀一般为view_xxx or v_xxx来命名**/
    create view 视图名 as sql语句;

    /**使用视图**/
    select * from 视图名
    /**查看创建视图时候的语句**/
    show create view 试图名;
    /**查看视图结构**/
    desc 视图名

    /**删除视图**/
    drop view 视图名1,视图名2

    /**修改视图**/
    create or replace view 视图名 as sql语句

    /**alter创修改视图方法**/
    alter view 视图名 as sql语句;

    /**
    视图算是一张虚拟表,通过指定sql查出表里的字段和值 放入视图虚表,视图和基本表是互相影响的,相当于基本表内容的快照 如果视图来自多个基本表,则添加删除不起效
    **/


    /*触发器*/
    /*
    能够使用触发器的三个操作:
    insert
    delete
    update
    */


    /*创建触发器语法*/
    -- create trigger insert1 before insert on user for each row insert into nickname (name) values ('rocky');

    -- 基本语法:create trigger 触发器名字 触发时间(after/before) 触发事件(insert/delete/update) on 触发事件的表名 for each row 触发时候执行的语句;
    /*
    对于insert 只有new
    对于delete 只有old
    对于update old new都通用
    */
    /*delimiter &&
    create trigger insert2 after insert
    on user for each row
    begin
    insert into nickname (nickname) values (new.uid);
    insert into nickname (nickname) values (new.uid);
    end
    && delimiter;*/

    -- 这里的new.uid 是插入后所生成的主键
    /*触发器多条语句 delimiter 结束符号 修改结束符号*/

    /*查看触发器多个*/
    show triggers;

    /*查看创建触发器时的语句*/
    show create trigger insert2;

    /*删除触发器*/
    drop trigger 触发器名;


    /*操作数据*/

    /*新增数据*/
    /*插入完整数据*/
    insert into table_name (field1,field2,field3,field4) values (value1,value2,value3,value4);
    -- 自增字段可以不用指定值 有默认值的字段也可以不用新增 但是没有默认值 却没指定插入的话 mysql会报错

    /*第二种语法*/
    insert into table_name values (value1,value2,value3,value4);
    -- 上面这种语法是默认插入所有字段包括自增字段 而且value顺序要和数据库一致


    /*插入多条数据*/
    insert into table_name (field1,field2,field3,field4) values (value1,value2,value3,value4),(value1,value2,value3,value4),(value1,value2,value3,value4);
    -- 同上 也可以不用指定field

    /*插入查询结果 可以把查询出来的值插入表中,前提是数据类型要一致*/
    insert into table_name (field1,field2,field3,field4) select (field1,field2,field3,field4) from table_name2 where ...

    /*更新数据*/
    -- 修改数据
    update table_name set field1=value1,field2=value2,field3=value3 where condition;

    /*删除数据*/
    delete from table_name where condition;

    /*查询数据*/
    select field1,field2,field3,field4 from table_name;
    -- 可以把所有的field换成*, 查询多有字段,但是*对性能有影响并且只能按照数据库的字段顺序查询

    -- 避免重复查询 distinct必须放在开头 如果有多个字段 会过滤掉多个字段相同的记录
    select distinct field1,field2,field3,field4 from table_name;
    -- 关键字distinct 会把每个字段

    -- 按指定格式返回数据
    select concat(field1,'---',field2) as name from table_name;

    -- 条件查询

    -- 基本的逻辑运算符
    /*
    >大于 <小于 =等于 !=(<>)不等于 >=大于等于 <= 小于等于
    AND 逻辑与 OR 逻辑或 XOR 逻辑异或 NOT逻辑非
    */

    -- between and 判断值是否在指定范围内
    -- select * from table_name where field between minvalue and maxvalue;

    -- not between and 不在指定范围内
    -- select * from table_name where field not between minvalue and maxvalue;

    -- is null 查询字段为null的记录
    -- select * from table_name where field is null;

    -- is not null 查询字段不为为null的记录
    -- select * from table_name where field is not null;

    -- in 集合查询
    -- select * from table_name where field in (value1,value2,value3);

    -- not in不在集合中查询
    -- select * from table_name where field not in (value1,value2,value3);

    /*
    查询网上资料所知:
    in 和 or效率问题
    如果in 和 or所查询的字段有索引或者主键的时候,性能差不多,但是没有索引或者主键的时候,or的查询速度和in相去甚远


    in 的集合里有null并不影响查询,not in里有null则查询记录为空
    */

    -- like 模糊查询 %在末尾则查询以value1开头的记录 %在开头则查询以value2结尾的记录 如果是包含此value2的记录,则前后都要加上% 通配符为_
    -- select * from table_name where field like 'value1%';

    -- not like 查找不匹配的记录
    -- select * from table_name where field not like 'value1%';
    /*
    注:%在开头会用到索引,在末尾是不会用到索引的
    */


    -- 查询排序 desc倒序/asc正序 不指定的话默认是正序,没有order by则以主键排序
    -- 单字段
    -- select * from table_name order by desc/asc;

    -- 多字段 field1相等时候按field2正序排
    -- select * from table_name order by field1 desc,field2 asc;


    -- 限制查询数量 offset_start 起始索引 row_count查询条数 一般查询单条数据时候带上limit 1 对性能有优化
    -- select * from table_name limit offset_start,row_count;

    -- 不指定起始位置 则offset_start为0
    -- select * from table_name limit row_count;


    /*
    如果 limit条数大于查询的记录条数,则以记录条数为准.
    如果 limit条数小于或者等于查询的记录条数,则以limit为准
    */


    /*
    统计函数:
    count() 统计记录条数
    avg() 计算字段的平均值
    sum() 计算字段的总和
    max() 求出查询字段的最大值
    min() 求出查询字段的最小值
    */

    /*分组查询*/

    -- group by
    -- select * from table group by field;

    -- group_concat 可以把每组数据返回,delimiter是字段的分隔符,而分组中每一行的数据会用逗号隔开

    -- 单字段 查询分组数据 单字段定义分隔符格式为group_concat(field1 separator delimiter)
    -- select group_concat(field1) from table where condition group by field desc/asc;

    -- 多字段 group_concat( [DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator '分隔符'] )每组下的信息按field字段排序
    -- select group_concat(distinct field order by field desc/asc separator ---) from table where conditon group by field desc/asc;

    -- having 对查询结果集过滤 而where是对查询过滤
    -- select group_concat(field) from table where condition group by field having condition;

    /*
    注:group by 要确保性能,首先要保证列全部在索引中,并且列的属性不能为空.
    用松散索引扫描最佳 select field的顺序要和group by的字段顺序一致 并且字段添加了索引或者多列索引 如果是多列索引 顺序还要保持一致
    这里有个问题 索引超出规定长度 则不会使用索引
    */


    /*多表查询*/

    -- 并操作 union 合并两个查询结果集

    -- 笛卡尔乘积 cross join 两张表记录相乘 大数据下会很慢

    -- 内链接

    -- 自然连接natural join
    -- 先根据相同名称的字段自动进行记录匹配,然后去掉重复字段

    -- 等值连接
    -- 跟自然连接的区别在于 不会去掉重复的字段,可以建两个相同结构的表,然后用natural join 和inner join分别试试

    -- 外连接

    -- 左外连接和右外连接
    -- 同上,不会去除重复字段,并且会返回右表/左表中未匹配的数据


    -- join语法:
    -- 内外联结的区别是内联结将去除所有不符合条件的记录,而外联结则保留其中部分。外左联结与外右联结的区别在于如果用A左联结B则A中所有记录都会保留在结果中,此时B中只有符合联结条件的记录,而右联结相反,这样也就不会混淆了。

    /*
    注:工作中一直没注意left join不会去除重复字段的原因,基于php关联数组,相同字段的已被覆盖,显示的只有一个值,所以现在才知道left join不会去除重复字段
    */


    -- 内链接查询

    -- 自连接
    -- select * from table_name as a inner join table_name as b on a.field = b.field

    -- 等值连接
    -- select * from table_name1 as a inner join table_name2 as b on a.field = b.field (如果还要连第三张表则继续inner join table_name3 on 匹配条件)

    -- 不等连接 后面可以加上除了匹配条件之外 的过滤条件
    -- select * from table_name1 as a inner join table_name2 as b on a.field1 = b.field1 AND a.field2 (>|>=|<|<=|!=)b.field2;

    -- 合并 union union all 前者会去除重复数据的行,后者不会
    -- (select field from table_name1 order by field) union (select field from table_name2 order by field)
    /*
    注:这里的table_name1和table_name2里面如果相应顺序的字段有不同的地方,则查询结果集里 table_name2里字段的值以table_name1为字段
    */

    -- 子查询

    /*
    子查询可以写在查询语句的任何位置,但是常用的情况如下:
    where子句后:该位置处的子查询一般返回单行单列,多行单列,单行多列
    from子句后:该位置处的子查询一般返回多行多列的数据数据,可以当做临时表
    */

    -- 单行单列子查询 这里的子查询返回的是table_name2里field=n的那行数据的id
    -- select * from table_name1 where field>(select id from table_name2 where field = n)

    -- 单行多列子查询 这里返回的是table_name2里field=n的那行数据的field1 field2值
    -- select * from table_name1 where (field1,field2) = (select field1,field2 from table_name2 where field = n)

    -- 多行单列子查询 这里返回的是table_name2里field=n的数据的field1数据集合

    -- 带IN的子查询
    -- select * from table_name1 where field IN (select field1 from table_name2 where field = n);

    -- 带ANY的子查询 any会返回子查询结果集中的任意一条数据 ALL则是所有记录
    -- select * from table_name1 where field (=|>=|<=) ANY (select field1 from table_name2 where field = n);
    -- select * from table_name1 where field (=|>=|<=) ALL (select field1 from table_name2 where field = n);

    -- 带EXISTS 和 NOT EXISTS的子查询 并且子查询会一个个遍历
    -- 前者会判断子查询结果集是否存在 后者则判断为空
    -- select * from table_name1 where field (=|>=|<=) EXISTS|NOT EXISTS (select field1 from table_name2 where field = n)
    -- 如果子查询有记录返回,则这条语句返回记录 反之亦然.


    -- 多行多列 这里子查询会返回table_name1里的数据,相当于一张临时表
    -- select * from (select * from table_name1);

    -- mysql常用函数
    -- 因为本着尽量让mysql来做最简单的增删改查 不参与运算,所以只列几个主要的函数

    -- 比较字符串 strcmp();
    -- 返回字符串位置find_in_set();

    /*
    注:如果每次查询的语句如果里面需要运算的函数(如rand now),那么它不会用到查询缓存.所以这些函数最好是由程序产生
    */


    /*
    下面函数了解即可:
    version() 当前版本
    database() 当前使用的数据库
    user() 当前用户
    last_insert_id() 最近生成的id


    if(value,t f) value为真 返回t 否则返回f
    ifnull(value1,value2) 如果value1不为空返回value1,否则返回value2

    CASE WHEN [value1] THEN [result1] WHEN [value2] THEN [result2] ELSE [default] END //如果value1为真,则返回result1....

    CASE VAR WHEN [value1] THEN [result1] WHEN [value2] THEN [result2] ELSE [default] END //如果var等于value1,则返回result1

    PASSWORD()对字符串进行加密 mysql的user表密码就是此函数生成
    FORMAT(x,y)将数字x格式化,保留y位小数
    INET_ATON() 将IP地址转为数字
    INET_NTOA() 将数字转为IP地址
    */

    -- 存储过程
    -- 创建存储过程语法
    /**
    * procedure_name 存储过程名字 建议命名规则为pro_xxx
    * procedure_parameter 存储过程的参数
    * characteristic 存储过程的特性
    * routine_body 存储过程的sql代码 用BEGIN END标识sql语句的开始与结束
    */

    /**
    procedure_parameter 每个参数语法如下:[IN|OUT|INOUT] parameter_name type
    INT表示输入类型
    OUT表示输出类型
    INOUT输入/输出类型

    1.如果仅仅想把数据传给MySQL存储过程,那就用in类型参数;
    2.如果仅仅从MySQL存储过程返回值,那就用out类型参数;
    3.如果需要把数据传给MySQL存储过程经过计算再传回给我们,那就用inout类型参数。

    parameter_name 参数名
    type 参数类型
    */

    /**
    characteristic 取值如下:
    LANGUAGE SQL 表示存储过程的routine_body有sql语言的语句组成
    |[NOT] DETERMIISTIC 默认值为DETERMIISTIC 简单点说就是设置为DETERMIISTIC 每次相同参数得到的输出是一样的,加上not 相同的参数得到的输出可能会不一样
    |{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA} 默认为CONTAINS SQL 可以包含语句,NO SQL 不包含语句 READS SQL DATA包含读数据的语句 MODIFIES SQL DATA 包含写数据的语句
    | SQL SECURITY {DEFINER|INVOKER} 权限 DEFINER 创建存储过程的用户才能执行 第二个是调用者可以执行 默认为为前者
    | COMMENT 'string' 注释语句
    */
    -- create procedure procedure_name([procedure_parameter[,...]]) [characteristic...] routine_body
    /*
    创建一个基本的存储过程:
    DELIMITER $$
    CREATE PROCEDURE pro_test()
    BEGIN
    select * from table_name;
    END$$
    delimiter ;
    调用存储过程:
    call aaa(); aaa()前面可以加上数据库的名称

    查看存储过程:
    show procedure status;
    删除存储过程
    drop procedure dbname.存储过程名;前面也可以加上数据库的名字
    */

    /*
    创建一个基本的函数
    create function function_name([function_parameter[,...]]) [characteristic...] routine_body

    除了function_name是函数名 function_parameter是函数参数 并且没有输入输出那种概念以外 其他与存储过程同理
    function_name后面要定义函数返回值

    调用函数:
    select bbb();

    查看函数
    show function status;
    删除函数
    drop function bbb;
    */


    -- 操作变量

    -- 1.声明变量 declare var_name,var_name1,var_name2 [type(len)] [default value] 如declare no varchar(20);
    -- 2.赋值变量 set var_name = expr; 如set no='101010',title='hello';

    /*
    定义与使用变量时需要注意以下几点:

    DECLARE语句必须用在DEGIN…END语句块中,并且必须出现在DEGIN…END语句块的最前面,即出现在其他语句之前。

    DECLARE定义的变量的作用范围仅限于DECLARE语句所在的DEGIN…END块内及嵌套在该块内的其他DEGIN…END块。

    存储过程中的变量名不区分大小写。
    */

    -- 查询语句赋值select field_name,field_name1,field_name2 into var,var1,var2 from table_name where condition;

    -- 游标

    -- 声明游标 declare cursor_name CURSOR FOR SELECT语句
    -- 打开游标 open cursor_name
    -- 使用游标fetch cursor_name into var_name,
    -- 关闭游标close cursor_name


    -- 流程控制
    -- if
    /*
    if condition then statement_list;
    elseif condition statement_list;
    else statement_list
    endif;
    */
    -- 注:每个statement_list后面要用分号结尾 结尾用end if; 代表这个流程结束

    -- case when then
    /*
    case case_value
    when when_value then statement_list
    when when_value then statement_list
    else statement_list
    end case
    */
    -- 注:每个statement_list后面要用分号结尾 结尾用end case; 代表这个流程结束

    -- 查看存储过程信息
    -- show procedure status;

    -- 查看函数信息
    -- show function status;

    -- 查看创建存储过程时的定义
    -- show create procedure 存储过程名
    -- 查看创建存储函数时的定义
    -- show create function 函数名

    -- 事务
    -- 开启事务begin | start transaction 两种语句都行
    -- commit 提交对数据的修改
    -- rollback回滚
    -- 修改开启|禁用自动提交 SET AUTOCOMMIT = {0|1} 当set autocommit为=0的时候 后面所有的sql都作为事务处理,直到用commit或者rollback结束; 推荐用第一种方法.
    /*
    事务有4个特性:
    1.原子性:事务中所有的操作视为一个原子单元,即对于事务所进行的数据修改等操作只能是完全提交或者完全回滚.
    2.一致性:事务在完成时,必须使所有的数据从一种一致性状态变更为另外一种一致性状态,所有的变更都必须应用于事务的修改,以确保数据的完整性
    3.隔离性:一个事务中的操作语句所做的修改必须与其他事务所做的修改相隔离.在进行事务查看数据时数据所处的状态,要么是被另一并发事务修改之前的状态,要么是被另一并发事务修改之后的状态,即当前事务不会查看由另一个并发事务正在修改的数据,这种特性通过锁机制实现.
    4.持久性:事务完成之后,所做的修改对数据的影响是永久的,即使系统重启或者出现系统故障数据仍可以恢复.
    */

    -- innodb所支持的日志类型:redo日志(提交时的处理) undo(回滚时的处理);

    -- 事务隔离级别设置

    -- 查看当前设置级别语句: show variables like 'tx_isolation'G
    #未提交读
    SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

    #提交读
    SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

    #可重复读
    SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;

    #可串行化
    SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;


    #未提交读
    -- 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.因为其性能也不比其他级别高很多,因此此隔离级别实际应用中一般很少使用,读取未提交的数据被称为脏读.
    -- 示例:首先开启a和b两个事务,a做查询 b做修改,b修改了但是未提交后,a会把b修改后的数据查询出来,b最终回滚,则a查出来的记录其实是无意义的(脏读);

    #提交读
    -- 一个事务从开始到提交前所做的任何改变都是不可见的,事务只能看见已经提交事务所做的改变,这种隔离级别也支持所谓的不可重复读,因为同一事务的其他实例在该实例处理期间可能会有新的数据提交导致数据改变,所以同一查询可能返回不同结果.
    -- 示例:首先开启a和b两个事务,a做查询 b做修改,在b事务更新兵提交后,a事务读取到了更新后的数据,此时处于同一a事务中的查询出现了不同的查询结果.

    #可重读
    -- 这是mysql的默认事务级别,能确保同一事务中的多个实例在并发读取数据时,会看到同样的数据行.理论上会导致一个问题(幻读)
    -- 示例:第一个事务对表中的数据进行修改,这种修改设计表中的全部数据行.同时,第二个事务也修改了这张表中的数据,是向表中插入一行新数据,那么以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行.

    #可串行化
    -- 最高的隔离级别,强制事务排序,使之不可能冲突,是在每个读的数据行加上共享锁,在这个级别,会有大量的超时现象和锁竞争,一般不推荐使用

    -- innodb锁机制

    -- 锁的类型

    /*
    共享锁:代号S,如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。
    排他锁:代号X,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
    */

    #锁粒度
    -- myisam是表锁 innodb是行锁


    -- mysql安全机制

    #用户表 mysql.user 主要字段Host(ip),User(账号),Password(密码,用password函数加密过),后缀为priv的表示用户的权限
    # max_questions 每小时的最大查询次数 max_updates 每小时的最大更新次数 max_connections 每小时可以建立的最大连接数 max_user_connections 单个用户可以同时建立的连接数
    # 以上默认值为0 表示无限制

    #系统表 mysql.db 是检查用户对某个表的权限,mysql.host同理只是很少用到.

    -- mysql工具命令
    #登录命令 mysql -h hostname|ip -u username -P port -p databasename

    /*
    -h mysql服务器的地址
    -u 用户
    -P 端口号 默认3306 大写
    -p 提示输密码 也可以用-p密码 中间不能有空格 后面紧跟的就是登录后的数据
    */

    #创建普通用户
    -- create user 'username'@'localhost' identified by 'password'; --create user 语句
    -- insert into user (Host,User,Password) values ('hostname','username',PASSWORD('password'));--insert into语句
    -- grant priv_type on databasename.tablename to 'username'@'localhost identified by 'password';--grant语句 priv_type是权限类型给所有权限可以用all,databasename和tablename都可以用*来表示通配


    #修改密码
    -- mysqladmin -u username -p password 'new_password'; --mysqladmin命令
    -- set password = PASSWORD('password'); --set命令修改
    -- update mysql.user set Password=PASSWORD('password') WHERE User='username' and Host = 'localhost';-- update修改密码

    #删除用户
    -- drop user 'username'@'localhost' --drop 语法
    -- delect from user where condintion -- delete语法


    #对用户进行授权
    -- grant priv_type [(column_list)] on database.table to 'username'@'localhost' identified by 'password' with [with_option];
    /*
    column_list 可操作的字段
    with_option 可以设置为以下5个值:
    grant option 被授权的用户可以将权限授给其他人
    priv_type 权限类型,可用all代替全部权限
    */

    -- 查看权限show grants for 'username'@'localhost'

    #回收权限
    -- revoke prive_type [(column_list)] on database.table from user1 identified by 'password',user2 identified by 'password'; -- 回收相应权限
    -- revoke all privileges,grant option from user1 [identified by 'password'] --回收全部权限

    #刷新权限flush privileges


    -- mysql日志管理
    -- 日志类型
    #二进制日志 该日志会以二进制形式记录数据库的各种操作,但是却不记录查询语句.
    #错误日志 该日志会记录mysql服务器启动 关闭 运行时的出错信息
    #通过查询日志 该日志记录mysql服务器的启动和关闭信息,客户端的连接信息,更新数据记录sql语句和查询数据记录sql语句
    #慢查询语句日志 记录执行时间超过指定时间的各种操作,通过工具分析慢查询日志可以定位mysql服务器性能瓶颈所在.

    -- 启动日志后,虽然可以实现对mysql服务器来进行维护,但是执行速度会变慢,所以是否启动需要衡量实际情况.


    -- 二进制日志
    #启动二进制日志 在配置文件添加如下内容:log-bin=[dir/filename] 实际日志名称是定制的filename和偏移量数字组成 每次重启都会生成
    #查看二进制日志 mysqlbinlog 日志地址
    #停止二进制日志 set sql_log_bin=0
    #恢复二进制日志 set sql_log_bin=1
    #删除二进制日志 reset master 可以删除所有二进制文件 purge master logs to filename.number 删除小于number的日志 purge master logs before 'yyyy-mm-dd hh:MM:ss'删除指定时间之前的所有二进制日志


    -- 错误日志
    #启动错误日志 在配置文件添加如下内容 error-bin=[dir/filename]
    #查看错误日志 因为是文本 所以直接编辑器打开
    #删除错误日志 mysqladmin -u root -p flush-logs


    -- 通用查询日志
    #启动通用查询日志 log :set global general_log=on
    #关闭通用查询日志 log :set global general_log=off
    #设置通用查询日志输出方式:set global log_output=file;
    #设置日志路径:set global general_log_file='';
    #查看通用查询日志 mysqladmin -u root -p flush-logs


    -- 慢查询日志

    #开启慢查询 set global slow_query_log = on
    #设置超时时间(默认为10s) set global long_query_time = n
    #关闭慢查询 set global slow_query_log = off


    -- mysql数据备份与管理
    #备份一个数据库 mysqldump -u username -p dbname > backupname.sql
    #备份多个数据库 mysqldump -u username -p --databases db1 db2 db3 > backupname.sql
    #备份所有数据库 mysqldump -u username -p --all -databases > backupname.sql


    #导入sql mysql -u username -p dbname < backupname.sql

  • 相关阅读:
    Mac旧机「焕」新机过程记录
    Swift3.0-字符串和字符
    Swift3.0-基本运算符
    【规范建议】服务端接口返回字段类型与iOS端的解析
    【已解决】iOS11使用MJRefresh上拉加载结束tableView闪动、跳动的问题
    標準メッセージクラス
    BAPI:会計管理(FI&CO)
    BAPI:販売管理(SD)
    BAPI:生産管理(PP)
    BAPI:購買管理(MM)
  • 原文地址:https://www.cnblogs.com/tudou1223/p/5158223.html
Copyright © 2020-2023  润新知