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 查询执行的步骤顺序

mysql 基本使用的更多相关文章

  1. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. mysql每秒最多能插入多少条数据 ? 死磕性能压测

    前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...

  3. LINUX篇,设置MYSQL远程访问实用版

    每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...

  4. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  5. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  6. 闰秒导致MySQL服务器的CPU sys过高

    今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...

  7. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

    将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...

  9. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  10. 当忘记mysql数据库密码时如何进行修改

    因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...

随机推荐

  1. ubuntuOS

    OpenStack icehource for Ubuntu OS 1,网络规划 2,Ntp apt-get install ntp 3,generate secure passwd apt-get ...

  2. uva 11524 - InCircle (二分法)

    题意:三角形ABC的内切圆把它的三边分别划分成 m1:n1,m2:n2 和 m3:n3 的比例.另外已知内切圆的半径 r ,求三角形ABC 的面积. #include<iostream> ...

  3. POJ 3311 Hie with the Pie(状压DP + Floyd)

    题目链接:http://poj.org/problem?id=3311 Description The Pizazz Pizzeria prides itself in delivering pizz ...

  4. taobao面试要点

    第一: 其中有几个点必问,JVMGC深层机制.类加载,包括Tomcat和Jboss的.线程相关的如离线锁,互斥同步,java主线程和工作线程机制,concurrent包下的锁和sync关键字一些区别, ...

  5. 后台特殊字符处理,ajax

    Dictionary<string, string> d = new Dictionary<string, string>(); d.Add("price" ...

  6. 每个人应该知道的NVelocity用法

    NVelocity是一个基于.NET的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由.NET代码定义的对象.从而使得界面设 ...

  7. html form表单提交数据并后台获取

    前台: HTML的代码:(关键是要在form里设置enctype="multipart/form-data",这样才能在提交表单时,将文件以二进制流的形式传输到服务器) <h ...

  8. SSH框架中一些技巧、处理办法

    1.使用jstree插件时,操作成功直接刷新jstree 该页面(index.jsp)本身使用iframe框架jstree在leftFrame,操作页(add_input.jsp.add_succes ...

  9. PHP中实现异步调用多线程程序代码

    本文章详细的介绍了关于PHP中实现异步调用多线程方法,下面我们以给1000个用户发送一封推荐邮件,用户输入或者导入邮件账号了提交服务器执行发送来讲述. 比如现在有一个场景,给1000个用户发送一封推荐 ...

  10. IBM developerWorks 的Ajax系列教程

    掌握 Ajax,第 1 部分: Ajax 入门简介 http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html?csrf-799150205 ...