mysql 基本使用   SQL分类 SQL约束constraint 数据类型 MYSQL 引擎 数据表占用磁盘空间优化: 索引 EXPLAIN 详解 视图 存储过程 Declare处理程序 游标 控制语句 触发器triggers 事务和锁 SQL MODE 数据库工具 权限管理 索引优化

SQL分类

-------------------数据库------------

创建数据库  create database xxx;

查询所有的数据库 show databases;

查询当前数据库select database();

使用数据库use databaseName;

删除数据库:drop database databaseName;

显示警告:show warnings

查询表索引:show index from table_name 或者Show keys from tables

显示当前用户:select current_user();

-----------------操作表-----------------------

查询所有的表:show tables;

创建表:create table table_name(id int(4),name varchar(50));

显示表结构:desc table_name;

查询表创建的语句:show create table table_name G;

Alter table 语句

修改表名称:alter table table_name rename new_table_name

修改表字段名称:alter table table_name change 老字段名称 新字段名称 varchar(40) 类型

修改表字段类型:alter table table_name modify 字段 varchar(100);

添加表字段:alter table table_name add 字段名称 varchar(100) 类型

删除表字段:alter table table_name drop 字段名称

添加主键索引:alter table table_name add primary key(id);

添加唯一索引:alter table table_name add unqiue(name)

添加普通索引:alter table table_name add index index_name(id,name……)

添加全文索引:alter table table_name add fulltext(textName);

删除索引:alter table table_name drop index index_name;

删除主键索引:alter table table_name drop primary key

修改自增的初始值:alter table t_name auto_increment=10;

Modify和change 区别

         Modify只能修改字段类型,不能修改字段名称

Change可以修改字段名称

修改字段排列顺序:

在某个字段的后面:alter table table_name add 字段名称 varchar(10)  after 已有字段名称

把某个字段放到最前面:alter  table modify 字段名称 varchar(20) first

select y,c,p,sum(profit) from s  group by y,c,p with rollup;

with rollup 不能和order by 一起使用.分析统计函数.

SQL约束constraint

Mysql支持的约束条件:

主关键字约束:primary key

外关键字约束:foreign key

唯一约束:unique

检查约束:check

非空约束:not null

列子:create table table_name(id int(4),name varchar(20) not null default ‘信息’,sal decimal(9,2),constraint pk_id primary key(id),constraint un_name unique (name),constraint che_sal check(sal>2000 and sal<4000));

Create table xxx(id int primary key  auto_increment)自动增长

数据类型

查看数据类型:? Data types

Int:默认11位

Char和varchar 区别

Char 会删除尾部的空格,varchar保留了空格,定长字符串,varchar可变长字符串

Enum 类型 只能插入一个值

Create table enum_name(e enum (‘w’,’y’))  只能插入w和y字符,也可以插入数字类型,但是只是显示第一个w

Set类型可以插入多个值

Create table set_name(s set(‘a’,’b’,’c’)) 可以一次性插入abc

If(value,t, f) 如果value为真,返回t,否责返回f

Ifnull(value1,vlaue2) value1不为空返回value1, 否责value2

系统函数:

Database()  当前数据名称

Version() 当前数据库版本

User() 返回当前登录的用户名称

Password(str) 返回字符串加密版本

Md5() 返回字符串加密MD5值

last_insert_id() 返回最后一个插入的值

数据库管理

查询mysql 有多少个用户连接:show processlist;

杀死连接的数据库客户端:kill id-àid show processlist 的id

MYSQL 引擎

查看表默认的引擎类型:show variables like ‘table_name’;

查看数据库的引擎:show create database xxx G

查看当前数据库版本支持的引擎:show engines 或者show variables like ‘have%’;

创建表默认的引擎:create table t_name(id int(3),name varchar(20),primary key(id)) engine=myisam

修改表的引擎:alter table t_name engine=innodb;

Myisam:不支持事务,也不支持外键,其他优势就是访问速度快,对事务完整性没有要求,以查询,添加为主可以使用这个引擎来创建表,每一个myisam在磁盘上存储成3个文件,期文件名称和表名相同,*.frm(存储表定义)   *.Myd(mydata,存储数据)  *.Myi(myindex 存储索引)

当遇到myisam存储引擎表损坏的情况:可以修复

Myisamchk –r  table_name //

Myisamchk –o table_name 安全的修改表

检查表:Check table table_name

修复表:Repair table table_name;

Memory:存储引擎存在内存中的内容来创建.每个memory表只实际对应一个磁盘文件.*.frm文件.访问速度快,存在内存中.默认使用hash索引.一旦服务关闭,表中数据全部丢失

Show  table status like ‘table_name’ G;

Merge:引擎是一组myisam引擎的组合,这些myisam表结构必须一致,merge表本身没有数据,对merge表可以查询,更新,删除的操作,这些实际是对myisam表的操作

对于merge类型的表插入操作,是通过insert_method子句定义插入的表,有三个不同的值

First插入操作作用在第一个表上

Last插入操作作用在最后一个表上

No对merge不能专心插入操作

磁盘上的文件有两个:.frm和mrg包含组合表信息

Create table xx(id int(3),name varchar(20)) engine=myisam;

Create table xxxx(id int(3),name varchar(20))engine=myisam;

Create table allxxxx(id int(3),name varchar(20))engine=merge union(xx,xxx) insert_method=last;

当插入xx和xxxx表的数据,那么allxxx表里面也会有xx和xxx的数据

Innodb具有提交,回滚事务和崩溃恢复能力的事务安全,效率会差一点

特点:自动增长列,指定主键,如果没有自动编号,必须要加一个索引,主键也是一个索引

指定了自动编号也可以手工的插入值

修改自增的初始值:alter table t_name auto_increment=10;

得到最后一个插入的值Select last_insert_id()

添加外键约束:在no action都是限制子表有关联的记录下父表不能更新,cascade表在更新删除时候,更新子表的记录,导入多个表的数据的时候,可以关闭外键的检查

Set foreign_key_checks=0关闭检查

数据表占用磁盘空间优化:

Insert into table_name select 0,repeat(‘信息文本信息’,10)  10个文本

当有大量数据的时候,myisam引擎的myd文件会占用大量的空间,删除表数据他的空间也不一定会释放,就会产生大量的碎片,可以optimize table table_name优化表,整理碎片,这时候磁盘上的空间就会减少.

Optimize table table_name 只对myisam和bdb还有innodb引擎有作用

索引

总结:添加索引的顺序和长度很重要.如果添加两个索引01和02按照这个两个条件查询时候,如果只有一条记录,只会用到第一个索引,第二个所以就用不到,如果还想用到第二个索引,可以把这两个索引做为联合索引,联合索引的缺点:如果一个联合索引03(name,mobile)当只使用一个索mobile查询的时候不会使用索引,使用name查询的时候会使用上索引.

索引的长度影响着查询速度的快慢.长度越小速度越快.把持住索引的长度很重要。

当表数据有5000 isindex=1的有4800多条,所以isindex不会查询索引文件

处理TEXT 或者大文本:

合成索引:精确查询,当要查询text大文本数据的时候可以在表里面添加一个字符,这个字符存储大文本text的md5加密信息或者hashcode信息,记录text的密钥,所以只要按照文本的对应的密钥查询就行了:比如;

Insert into text select 0,repeat(‘mysql hello’,1000),md5(repeat(‘mysql hello’,1000))  这样就把text文本信息加密给MD5了,查询的时候拿到text文本信息去MD5配对

Select * from text where md5(repeat(‘mysql hello’,1000));

前缀索引:当查询大文本时候,使用迷糊查询,给文本加上前缀索引,提高效率:

Create index index_qz on table_name(content(10));

Select * from text where content like ‘mysql %’

每个表至少支持16个索引。Myisam和innodb引擎默认都是btree索引.myisam支持全文索引,只限于char.varchar和text列

创建普通索引:create index index_name on table_name(name)

创建前缀索引:create index index_name on table_name(name(20)); 带上长度就是前缀索引

删除索引:drop index index_name on table_name

创建唯一索引:create unique index  index_name on table_name(name)

创建指定类型索引:create index index_name using btree on table_name(id)指定是btree索引.

处理浮点数和定点数:

Double float(9,2) 或者real来表示浮点数:插入的值超过精度会四舍五入,会出现误差

Decimal(9,2) 表是定点数:实际是以字符串形式存储,可以完整的保留精度

UTF-8:对应3个字节

EXPLAIN 详解

Id: MySQL Query Optimizer 选定的执行计划中查询的序列号。表示查询中执行 select 子句或操作表的顺序,id 值越大优先级越高,越先被执行。id 相同,执行顺序由上至下。

select_type 查询类型:

SIMPLE: 简单的 select 查询,不使用 union 及子查询

 PRIMARY:最外层的 select 查询

UNION: UNION 中的第二个或随后的 select 查询,不 依赖于外部查询的结果集

DEPENDENT UNION:UNION 中的第二个或随后的 select 查询,依 赖于外部查询的结果集

SUBQUERY: 子查询中的第一个 select 查询,不依赖于外 部查询的结果集

DEPENDENT SUBQUERY: 子查询中的第一个 select 查询,依赖于外部 查询的结果集

DERIVED: 用于 from 子句里有子查询的情况。 MySQL 会 递归执行这些子查询, 把结果放在临时表里

UNCACHEABLE SUBQUERY:结果集不能被缓存的子查询,必须重新为外 层查询的每一行进行评估

UNCACHEABLE UNION: UNION 中的第二个或随后的 select 查询,属 于不可缓存的子查询

type显示连接使用的类型,按最 优到最差的类型排序

system:表仅有一行(=系统表)。这是 const 连接类型的一个特例。

Const: const 用于用常数值比较 PRIMARY KEY 时。当 查询的表仅有一行时,使用 System。

eq_ref:const 用于用常数值比较 PRIMARY KEY 时。当 查询的表仅有一行时,使用 System

ref: 连接不能基于关键字选择单个行,可能查找 到多个符合条件的行。 叫做 ref 是因为索引要 跟某个参考值相比较。这个参考值或者是一 个常数,或者是来自一个表里的多表查询的 结果值, 这个值表示所有具有匹配的索引值的行都被用到

ref_or_null:如同 ref, 但是 MySQL 必须在初次查找的结果 里找出 null 条目,然后进行二次查找

index_merge: 说明索引合并优化被使用了

unique_subquery:在某些 IN 查询中使用此种类型,而不是常规的 ref:value IN (SELECT primary_key FROM single_table WHERE some_expr)

index_subquery: 在 某 些 IN 查 询 中 使 用 此 种 类 型 , 与 unique_subquery 类似,但是查询的是非唯一 性索引: value IN (SELECT key_column FROM single_table WHERE some_expr)

range:只检索给定范围的行,使用一个索引来选择 行。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可 以使用 range。

Index: 全表扫描,只是扫描表的时候按照索引次序 进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。

All:最坏的情况,从头到尾全表扫描

possible_keys:  能在该表中使用哪些索引有助于 查询。如果为空,说明没有可用的索引。

Key:MySQL 实际从 possible_key 选择使用的索引。 如果为 NULL,则没有使用索引。很少的情况 下,MYSQL 会选择优化不足的索引。这种情 况下,可以在 SELECT 语句中使用 USE INDEX (indexname)来强制使用一个索引或者用 IGNORE INDEX(indexname)来强制 MYSQL 忽略索引

key_len: 使用的索引的长度。在不损失精确性的情况 下,长度越短越好

ref:显示索引的哪一列被使用了

rows:MYSQL 认为必须检查的用来返回请求数据的行数

extra 中出现以下 2 项意味着 MYSQL 根本不能使用索引,效率会受到重大影响。应尽可能对此进行优化

Using filesort: 表示 MySQL 会对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容。可能在内存或者磁盘上进行排序。MySQL 中无法利用索引完成的排序操作称为“文件排序”

Using temporary:表示 MySQL 在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by

视图

视图主要简化复杂查询SQL,不能提高查询速度.可以嵌套视图

限制:select 语句不能包含from子句的子查询不能使用*

Select 语句不能引用系统或者用户变量

Select语句不能引用预处理语句参数

在存储子程序内,定义不能引用子程序参数或者局部变量

创建视图:create or replace view view_name as select ….

删除视图:drop view view_name;

查询所有视图:DESC  INFORMATION_SCHEMA.VIEWS;

查询视图表:select * from INFORMATION_SCHEMA.VIEWS where table_name=’view_name’

详细信息:show create view view_name G

视图约束:比如创建视图v1,create or replace view v1 as select * from table_name where a<2

With check option

在创建其他视图,都是v1视图上做查询

Create or replace view v2 as select * from v1 where a>0  with local check option;

在创建一个视图v3:也在v1的基础上创建

Create or replace view v3 as select * from v1 where a>0 with cascade check option

使用insert into v1 select 2 插入视图数据会报错因为a要小于2

其他的也一样..一般都在试图上做添加操作

存储过程

存储过程可以有3个参数:in(输入) out(输出) inout(输入和输出)

打开delimiter @@ 把;换成@@

Create procedure pro_name(in id int,out outIds int)

[Reads sql data] 只读,

[modify sql data]只写

[contains sql]默认不读也不写

Begin

         Select  id from table_name where num=id;

Select found_rows() into outids;

end@@

call pro_name(1111,@a) ;调用

select @a; 查询变量a

创建函数的方式:create function constr(str varchar(50))  returns char(50)

Return concat(‘xxx’,’!’);

删除存储过程和函数:drop procedure if exists pro_name;

查看存储过程和函数的状态:Show procedure|function status like ‘pattern’

查看过程和函数的详细信息:show create procedure pro_name G

变量的使用:

声明变量:Declare varName varchar(10) default ‘mysql’

设置变量值:Set varName =’java’

Select name into varName from table_name where id=11;

Select varName;

Declare处理程序

Declare可以定义变量:declare name varchar(30) default ‘java’;

游标

声明游标—打开游标—使用游标—关闭游标

控制语句

If 条件 then …

Elseif 条件 then ….

Else ….

End if

Case xxx

When xxx then …

When yyy then ..

End

Case

When 1 then ….

When 2 then …

….

End;

Leave hqj:退出循环

触发器triggers

Mysql支持的行级的触发,不支持表的触发

定义dept表和emp表 插入emp表的deptname的时候触发dept表的行

New.deptname 调出新插入的值

删除触发器:drop trigger trigger_name;

查看所有的触发器: show triggers G;

查看触发器详情: show create trigger trigger_test G

查看数据库所有的触发器名称select trigger_name from information_schema.triggers

触发器中不能控制事务,和存储过程

事务和锁

锁定表:lock table table_name read;只能读不能写,write只能写不能读

解除锁定表:unlock tables;

设置自动提交:set autocommit=1 自动提交设置为0的时候自动不提交,默认自动提交(1)

提交:commit 后会使用默认的事务

提交开启新的事务:commit and chain

提交链接:commit and release

事务:

比如两个session其中一个session设置事务:

开始事务:start transaction; 后做插入和更新操作,在本session中不提交,可以看的到新插入和修改的数据,不在同一个session中就不会有更新或者插入的数据,除非本session1 commit;了

SQL MODE

解决数据库迁移问题:和数据合法性的校验

查看SQL MODE:select @@SQL_MODE;

设置SQL 模式 set session sql_mode=’ANSI’ 设置sql_mode为ANSI 标准模式

在标准的mode中,比如create table t(name varchar(5))

插入超过5个字符的数据,insert into t values(‘1111111111’)不会报错,只是会截取,给个警告而已,当设置严格的mode插入超过5个字符的数据就报错了.

设置严格的模式:Set session sql_mode=’ STRICT_TRANS_TABLES’

数据库工具

。。。。以后再看

权限管理

Use mysql 数据库系统

查看user表 desc user

查看db :desc db

查看表的权限:desc table_priv

查询user表select_priv 是否有查询的权限

select user,host,select_priv from user where user='root' and host='localhost';

grant :授权

grant select on db.table_table to user_name@localhost; 授查询权限

grant all privileges on *.* to  ‘root@localhost’ identified by ‘password’;

索引优化

 

SQL 查询执行的步骤顺序