码迷,mamicode.com
首页 > 数据库 > 详细

mysql 拾遗提高(函数、事务、索引)

时间:2018-07-08 01:06:50      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:数据库连接   .class   xpl   包装   date()   fine   指定   管理   l命令   

目录

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;

 

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 \n;

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

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

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

 或者也可以使用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;显示视图状态;

 

mysql 拾遗提高(函数、事务、索引)

标签:数据库连接   .class   xpl   包装   date()   fine   指定   管理   l命令   

原文地址:https://www.cnblogs.com/aland-1415/p/9278949.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!