目录

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 '\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 拾遗提高(函数、事务、索引)的更多相关文章

  1. mysql 视图 触发器 存储过程 函数事务 索引

    mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...

  2. 第七章 mysql 事务索引以及触发器,视图等等,很重要又难一点点的部分

    [索引] 帮助快速查询 MyISAM ,InnoDB支持btree索引 Memory 支持 btree和hash索引 存储引擎支持 每个表至少16个索引   总索引长度至少256字节   创建索引的优 ...

  3. mysql学习【第5篇】:事务索引备份视图

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! mysql学习[第5篇]:事务索引备份视图 MySQL事务 事务就是将一组SQL语句放在同一批次 ...

  4. Mysql数据库的数据类型、索引、锁、事务和视图

    Mysql数据库的数据类型.索引.锁.事务和视图 数据的类型 1)数据类型: 数据长什么样? 数据需要多少空间来存放? 系统内置数据类型和用户定义数据类型 2)MySql 支持多种列类型: 数值类型 ...

  5. Mysql 视图,触发器,存储过程,函数,事务

    视图 视图虚拟表,是一个我们真实查询结果表,我们希望将某次查询出来的结果作为单独的一个表,就叫视图,无法对图字段内容进行增删改. --格式: CREATE VIEW 视图名字 AS 操作; --比如: ...

  6. 一、MySQL中的索引 二、MySQL中的函数 三、MySQL数据库的备份和恢复 四、数据库设计和优化(重点)

    一.MySQL中的索引###<1>索引的概念 索引就是一种数据结构(高效获取数据),在mysql中以文件的方式存在.存储建立了索引列的地址或者指向. 文件 :(以某种数据 结构存放) 存放 ...

  7. 面试题: mysql数据库 已看1 索引和事务 没用

    mysql数据库面试总结 2017年09月04日 00:11:40 阅读数:151 结合网上大神还有自己面试经历,收集的总结Mysql面试题,方便自己准备面试: mysql一个永远都复习不完,尽量总结 ...

  8. mysql基础教程(四)-----事务、视图、存储过程和函数、流程控制

    事务 概念 事务由单独单元的一个或多个SQL语句组成,在这 个单元中,每个MySQL语句是相互依赖的.而整个单独单 元作为一个不可分割的整体,如果单元中某条SQL语句一 旦执行失败或产生错误,整个单元 ...

  9. 使用Oracle的instr函数与索引配合提高模糊查询的效率

    使用Oracle的instr函数与索引配合提高模糊查询的效率 一般来说,在Oracle数据库中,我们对tb表的name字段进行模糊查询会采用下面两种方式:1.select * from tb wher ...

随机推荐

  1. JS动态更新微信浏览器中的title

    问题: 最近在做一个微信中分享的宣传页,分不同的场景,切换不同的场景时需要设置不同的title,实现的方案很简单,当用户切换场景的时候,修改document对象的title属性,可是在实际测试中,io ...

  2. Java并发编程原理与实战十八:读写锁

    ReadWriteLock也是一个接口,提供了readLock和writeLock两种锁的操作机制,一个资源可以被多个线程同时读,或者被一个线程写,但是不能同时存在读和写线程. 基本规则: 读读不互斥 ...

  3. MongoDB - MongoDB CRUD Operations, Bulk Write Operations

    Overview MongoDB provides clients the ability to perform write operations in bulk. Bulk write operat ...

  4. 打包python脚本为exe的坎坷经历, by pyinstaller方法

    打包python脚本为exe的坎坷经历, by pyinstaller方法 又应验了那句歌词. 不经历风雨, 怎么见得了彩虹. 安装过程略去不提, 仅提示: pip install pyinstall ...

  5. C#: Delegate and Event

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. Nginx+tomcat 负载均衡

      一.系统版本 Nginx使用版本.tomcat使用版本: Nginx:nginx-1.10.2.tar.gz Java :Java version: 1.8.0_60, vendor: Oracl ...

  7. 20155336 2016-2017-2《JAVA程序设计》第七周学习总结

    20155336 2016-2017-2<JAVA程序设计>第七周学习总结 教材学习内容总结 第十三章 认识时间与日期 格林威治标准时间:简称GMT时间,参考格林威治皇家天文台的标准太阳时 ...

  8. 2016.5.24——Intersection of Two Linked Lists

    Intersection of Two Linked Lists 本题收获: 1.链表的输入输出 2.交叉链表:这个链表可以有交叉点,只要前一个节点的的->next相同即可. 题目:Inters ...

  9. ASM配置OGG

    两种方法:http://blog.sina.com.cn/s/blog_aa84cfe40101lsks.html 使用ACFS配置OGG:http://ylw6006.blog.51cto.com/ ...

  10. qt 零星笔记

    1.qt中堆栈对象的销毁 名字不对,我不知道该取个什么名字,暂且这样吧 在linux c编程中谈到过进程的内存映像,一个进程在内存中的映像如下