zoukankan      html  css  js  c++  java
  • mysql 拾遗提高(函数、事务、索引)

    目录

    1、tips

    2、事务(transaction)

    3、索引(index)

    4、数据库的导出和备份

    5、函数

    6、防SQL注入

    7、使用Explain分析SQL语句

    8、视图(view)

    1、tips

    1)、数据库不区分大小写;

    2)、插入新数据时忽略重复数据,可在INSERT后加关键字IGNORE即可

    3)、通过UNION操作符来连接两个以上的SELECT语句结果组合到一个结果到同一个集合中;

    格式:

    select... from... where...
    union distinct
    select...from...where...

    其中distinct是可选的,表示会删除重复项,是默认值;也可使用all来保留所有的数据;

    4)、拼音排序

    如果汉字使用的是GBK编码,则可直接对某一项进行排序;如果使用的UTF-8,还需要进行转码,

    例:select * from tablename order by convert(titlename using gbk);

    5)、在group by...后边加with rollup可使数据在分组的基础上再进行聚合函数操作;

    例:select name as 名字,sum(times) as 次数 from tablename group by name with rollup;可在对名字分组基础上再求次数的和,最后还有一个总和;

    分组后相同项此次的统计不需要使用此关键词,使用count(*)即可;

    例:select name as 名字 count(*) from tablename group by name;

    6)、正则表达式

    mysql也可以使用正则表达式来作为过虑条件

    例:select * from tablename where name REGEXP '^s';  (查询以s开头的名字)

    7)字符串的截取

    select left(string,length)           从左边开始截取string的前length个字符,left可换用right来从右边开始截取;

    select substring(string,index)      从左开始截取string从index位开始到结束的字符串(包括index位,且从1开始计数),如果index为负数则从右向左的截取;

    select substring_index(string,reg,index)     使用同上,reg表示的匹配原则;

    select CONCAT(string1,string2,...)连接字符串,但如果其中有任意一个为null,则最后结果为null;

    8)条件语句

    if(bool,value1,value2)    当bool为true时使用value1,否则value2; 例:select if(2=1,'对','错') as status; 结果为'错’;

    ifnull(value1,value2)      如果value1为null则使用value2;

    nullif(value1,value2)      如果value1和value2相同时结果为null,否则结果为value1;

    coalesce(tablecolumn1,tablecolumn2,...,'name')

    意为如果tablecolumn1为null则使用tablecolumn2,依次顺推,'name'为一个固定的默认值;

    select
        case [columnName]
        when condition1 then result1
        when condition2 then result2
        ...
        end
        as '别名'
        from tablename;

    9)、对于NULL值的处理

    NULL值不能通过=或!=来比较获得结果,查找值为null的需要使用IS NULL,反之使用IS NOT NULL;<=>符号用于比较的两个值都为NULL时返回true;                 

    10)临时表

    主要用于保存一些临时数据,临时表在当前连接可见,一旦断开mysql连接则会自动销毁;创建临时表只需要在CREATE后加一个TEMPRARY字段,其他语法与创建表格是一样的;

    11)SHOW CREATE TABLE tablename      查看表的创建语句;

    12)表格的完整复制

    CREATE TABLE newtable LIKE oldtable;    #复制表的结构,也可以使用CREATE TABLE newtable SELECT *FROM oldtable WHERE 1=2;
    INSERT INTO newtable SELECT *FROM oldtable;

    13)自增值序列重排:

    原理:先删除此列再新建自增列(但是在处理过程中如果有新增数据,可能会使表数据变乱)

    ALTER TABLE tablename DROP id;
    ALTER TABLE tablename ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,ADD PRIMARTY KEY (id);

    设置自增序号开始值:

    ALTER TABLE tablename  AUTO_INCREMENT = 50; 此命令用于已经建好的表

    或者可以在新建表的同时设置,在create table t(...)engine =innodb auto_increment=50 charset=utf8;

    14)数据类型转换(CAST,CONVERT)

    CAST()   和CONVERT()   函数可用来获取一个类型的值,并产生另一个类型的值;

    格式:CAST(expr   AS   type),   CONVERT(expr,type)   ,   CONVERT(expr   USING   transcoding_name)  

    可相互转换的类型有:BINARY,CHAR,DATE,DATETIME,DECIMAL,INTEGER,TIME

    15)表名和字段名都可以用as来设置别名,且as关键字可以省略,但通常不建议省略。

    2、事务(transaction)

    >事务主要用于处理操作量大,复杂度高的数据;只有使用了lnnodb数据库引擎的数据库才支持事务;

    >事务是用来管理insert,update,delete等修改数据库的语句的,必须满足四个条件:

           原子性:一个事务中所有操作要么全部完成,要么全部不完成;

           一致性:在事务开始前和结束后,数据库的完整性没有被破坏;

           隔离性:数据库允许多个并发事务同时进行;

           持久性;事务处理结束后,对数据库的修改就是永久的;

    格式:

    begin;
    expression;
    commit;#确认并提交执行

    事务控制语句:

        begin/start transaction   显示的开启一个事务;
        commit/commit work        提交事务;
        rollback/rollback work    回滚事务,会结束事务,并撤销正在进行的所有未提交的修改;
        savepoint identifier      创建一个保存点identifier,一个事务中可以有多个保存点;
        release savepoint identifier    删除一个保存点;
        rollback to identifier    回滚到一个保存点;
        set transaction           设置事务隔离级别,值有read uncommitted,read committed,repeatable read,serializable
        set autocommit = 0        禁止自动提交,如果为1则自动提交;

       

    3、索引(index)

    >索引可以很大的提高mysql检索速度;索引也是一张表,保存了主键与索引字段,并指向实体表的记录;会占用磁盘空间,会降低表的更新速度;

    >索引分单列索引和组合索引,一个表可以有多个单列索引;组合索引即一个索引包含表中的多个列;只对那些将应用在查询条件(一般where后)的列创建索引;

    >显示一个表的索引信息:SHOW INDEX FROM tablename; G              最后的G是可选的,用于格式化输出信息;

    >查询索引使用情况:SHOW STATUS LIKE "handler_read%";结果中的handler_read_rnd_next值越高说明效率越低;(为什么越查越大。。。)

    >创建索引:

        1)CREATE INDEX indexName ON mytable(username(length)); 如果是char,varchar类型length可小于实际长度,blob或text必须指定length。用UNIQUE INDEX来创建唯一索引(可以为空);
        2)创建表时创建;CREATE TABLE mytable(ID INT NOT NULL,username CHAR(16) NOT NULL, INDEX [indexName] (username(length)));如果唯一,则使用UNIQUE替换INDEX;
        3)ALTER TABLE tablename ADD INDEX indexName(columnName); 添加普通索引;
        4)ALTER TABLE tablename ADD UNIQUE [indexName] (username(length)); 添加唯一索引,可为NULL;
        5)ALTER TABLE tablename ADD PRIMARTY KEY (columnName);    添加主键;唯一且不为空;添加为主键前需要先确认它不为空:ALTER TABLE tablename MODIFY columnName NOT NULL;
        6)ALTER TABLE tablename ADD FULLETXT indexName (columnName);    指定索引为FULLTEXT,用于全文索引;

    >删除索引     DROP INDEX [indexname] ON mytable;

                         ALTER TABLE tablename DROP PRIMARTY KEY;      删除主键;删除索引时需要知道索引名;

    >如果like的查询条件以%开始,或者where条件没使用=号或条件给的数据类型与字段类型不一致时,不会使用索引;

    >注意:

    1)为维度度的列创建索引(列的重复值越少维度越高);

    2)为where,on,group by,order by中的条件创建索引;

    3)对较小数据列使用索引;

    4)为较长字符串使用前缀索引(即限制索引表中值的长度,只取前一部分);

    5)使用组合索引可以减少文件索引大小,速度会优于多个单列索引;

    6)只为操作频繁的列创建索引;

    4、数据库的导出和备份

    1)数据导出到文件

    SELECT ... INTO OUTFILE 'fileAddressAndName' #以下两句都是用于设置输出格式的,可选;
        FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
        LINES TERMINATED BY '
    ';

    导出文件存在于服务器主机,且文件名不能是一个已经存在的文件

    2)从文件导入到数据库(为导出的逆操作)

    LOAD DATA LOCAL INFILE 'filename' INTO TABLE tablename #默认文件结构和表结构顺序一致,如果不一致需要使用tablename(columnName1,...)的方式来指定文件列与仓库中列相对应;
    FIELDS TERMINATED BY ':'
    LINES TERMINATED BY '
    ';
    

     或者也可以使用mysqlimport语句来导入;

    3)数据库备份:mysqldump -u root -p --no-create-info --table=/foldername filename

    备份连接的所有数据库:mysqldump -u root -p --all-database > dumpname.txt 其中 --all-database也可为指定仓库名,来备份指定仓库;

    将远程主机数据备份到本地:mysqldump -h remoteHost.com -P port -u root -p databaseName > dumpname.txt;

    4)恢复备份:mysql -u root -p databaseName < dumpname.txt

     

    5、函数

    1>常用函数:

    DATE_ADD(columnName,INTERVAL time type)    向日期列添加指定的时间间隔,time为数字,type为单位,可为MICROSECOND,SECOND,MINUTE,HOUR,DAY,WEEK,MONTH,QUARTER,YEAR,SECOND_MICROSECOND,MINUTE_MICROSECOND,MINUTE_SECOND,HOUR_MICROSECOND,HOUR_SECOND,HOUR_MINUTE,DAY_MICROSECOND,DAY_SECOND,DAY_MINUTE,DAY_HOURE,YEAR_MONTH;
    DATE_SUB(columnName,INTERVAL time type)    向日期列减去指定的时间间隔;
    DATEDIFF(date1,date2)                      返回两个日期之间的天数;
    DATE_FORMAT(columnName,format)             用于定义显示日期/时间的格式,format内容为%a,%b,...等多种不同格式,具体待查;
    NOW()                    返回当前的日期和时间;
    CURDATE()                返回当前日期;
    CURTIME()                返回当前时间;
    DATE(columnName)         返回日期/时间表达式的日期部分;
    EXIRACT(type FROM columnName)              返回日期/时间表达式的指定部分,type可用所有时间type

    2>获取服务器数据:

    select version()     服务器版本信息;
    select database()    当前数据库名;
    select user()        当前用户名;
    show status          服务器状态;
    show variables       服务器配置变量;

    6、防SQL注入

    SQL注入,即通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,以欺骗服务器执行恶意SQL命令;

    1)永远不要信任用户输入,对用户输入进行校验,或使用正则表达式,限制长度,对单引号和双"-"号进行转换等;

    2)永远不要使用动态拼装sql,可以使用参数化的sql或直接使用存储过程进行数据查询存取;

    3)永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的连接数据库;

    4)不要把机密信息直接存放,加密或者hash掉密码和敏感信息;

    5)应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装;

    6)可采用辅助软件或网站平台来检测是否有SQL注入,如软件有jsky;

     

    7、使用Explain分析SQL语句

    使用方法即在正常的SQL语句前加上 EXPLAIN 关键字,会将这条SQL语句的分析结果展示出来(sql语句在执行前都会由分析器进行分析,以判断语句的可行性的)

    结果分析:

    select_type        查询类型,有简单查询、联合查询、子查询等;
    table              使用的数据表格;
    type               连接使用的类型,结果从优到差:system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>all;const表示一次就得到结果,all表示全表扫描了;好的语句要优化到rang,ref级别;
    possible_keys      显示能使用哪个索引在该表中找到结果,如果为空,则没有相关索引;
    key                执行此语句实际使用到的索引;
    key_len            最长索引宽度,越短越好;
    ref                显示哪个字段或常数与key一起被使用;
    rows               表示遍历了多少条数据;
    extra              执行状态说明;

     

    8、视图(view)

    视图是一个虚拟表,内容是由其他表的数据组成的;视图只能查看不能修改;使用视图可以隐藏一些数据,也可以简化用户操作;

    创建视图语法:

    CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED|MERGE|TEMPTABLE}]
    VIEW [db_name]view_name [(column_list)]
    AS select_statement [WITH [CASCADED|LOCAL] CHECK OPTION]

    示例:

    CREATE VIEW query_view(id,name,class) AS SELECT B.u_id,B.u_name,A.class_name
        FROM t_class AS A INNER JOIN t_name AS B ON A.u_id=b.u_id;  #创建视图
    DROP VIEW IF EXISTS query_view; 删除视图 SELECT * FROM query_view       使用一个视图查询数据 DESCRIBE query_view       查看视图结构 SHOW TABLE STATUS LIKE 'query_view';显示视图状态;
  • 相关阅读:
    维特比算法 实现中文分词 python实现
    最大匹配算法进行分词 前向 后向 python实现
    动态规划 编辑距离问题(Edit Distance Problem)
    “RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed. Specify retain_graph=True when calling backward the first time”
    PCA主成分分析 原理讲解 python代码实现
    卷积的理解 python代码实现 pytorch 多输入多输出通道的理解
    AdaBoost python代码实现
    随机森林 python实现
    Apache配置转发
    JS 由前端保存到文件
  • 原文地址:https://www.cnblogs.com/aland-1415/p/9278949.html
Copyright © 2011-2022 走看看