最近正在整理有道云笔记内容,准备把笔记归档分类,但是发现很多笔记杂乱无章,无从下手,知识内容是重复相关的,没有形成系统的归类,所以想把相关的版块整合在一起,方便我记忆与查找。暂时将mysql基础知识整理如下,方便自己的同时,希望也能帮助大家!
关于数据库的角色权限管理、备份与恢复、数据库优化、存储过程、函数、日志文件等都是很重要的版块,这里我只是简单的提到,后续再另起专题总结。
一、版本相关
对于一个mysql的版本号如:mysql-5.6.1-m1,这个版本号意味着什么呢?对于5.6.1的解释:第一个数字5代表了文件格式,第二个数字6代表了发行级别,第三个数字1代表了版本号。更新幅度较小时,最后的数字会增加,出现了重大特性更新时,第二个数字会增加,文件格式改变时,第一个数字会增加
二、mysql启动和使用相关
>在MYSQL命令行中使用\G参数,将输出按列显示
>mysql -uroot -p — 连接到MYSQL服务器 -u 后面为数据库用户,-p 后跟密码
>mysql -h(IP地址) -uroot -p — 连接到MYSQL服务器 -h 后面跟服务器IP地址 -u 后面为数据库用户,-p 后跟密码
>mysqladmin -uroot -p shutdown 关闭mysql数据库
>systemctl shutdown mariaDB #centos7 关闭mysql服务
>select version(); 查看版本
>system hostname 可查看host_name
>select CURRENT_USER(); 查看当前连接用户
>select now(); 返回当前日期和时间
>desc table_name<=>explain table_name<=>show columns from table_name 查看建表语句
>desc information_schema.character_sets; 查看具体系统指定表的字段结构《=》show create table information_schema.character_sets;
>use database ; 切换到指定数据库
>analyze table table_name; 定期分析表和检查表
>check table table_name; 定期检查表
>optimize table tablename ;定期优化表,对表进行碎片整理,节省磁盘空间
#du -sh tablename.* linux系统查看该表在系统占用的空间
>explain sql_statement ; 分析低效SQL执行计划
>mysqlcheck -uroot -c test 检查test表
>mysql -uroot -v — show-warnings test 显示test表的告警信息
>mysqldump -h IP地址 -P3306 -uroot -p test >test.sql 备份test数据库 -u 指定用户名,-p 指定密码, -h 指定服务器IP或域名, -P指定端口
>create table table_name2 like table_name1; 复制创建一张类似table1的table2表
>rename table tablename1 to new-tablename1 重命名表
三、获得MySQL帮助
>help ; 显示MySQL客户端(非服务器)的配置 等同于问号 ?
>help contents; 查看具体小节内容 或? contents; (账户管理,数据库管理,语句,数据定义,数据操作,数据类型,函数,元数据,语言结构,插件(plugins),存储引擎等等);show plugins;(查看mysql的存储引擎)
>help administration; 查看管理方面的内容
>help show create view; 查看如何创建视图
>? data types; 查看数据类型
>ctrl+L 清除屏幕信息
>\c 清除输入的错的语句 (clear)
>connect mysql(db_name) localhost; 重新连接MySQL
>delimiter $修改语句结束符号(操作符),默认分号 ,delimiter ;
>edit 编辑SQL语句(调用vi)
>exit 退出服务端
>nopager 或pager 查询很大的表时,控制屏幕输出结果
> pager less >pager more 分页查看结果
>nopager 禁止pager
>tee ore notee 将查询内容及结果输出到文件中去
>tee /tmp/test.txt 将屏幕输入的命令,打印到test文本文件中
>notee; 停止输出
>prompt 改变mysql prompt,prompt命令可以在mysql提示符中显示当前用户、数据库、时间等信息
>system(\!) ls; 调用系统命令 > system cat /tmp/rst.txt
>source /temp/a.sql; 执行SQL文本,并打印结果
>status; 查看状态信息(当前数据库,当前用户,SSL,当前pager,服务器版本,连接协议,字符集,unix socket 文件位置)
>use 切换数据库; >use mysql; >select database() 查看当前数据库
>charset gbk; 更改client,conn characterset 更改客户端,连接字符集 (通常server,db,client,conn字符集设置成一样)
>charset latin1;
>warnings (\W) 打印警告信息 >show warnings; >show errors;
>nowarnings; 不显示告警信息
>rehash(\#) 自动补齐
更多详情,输入mysql>help ; 查看具体帮助命令
四、show命令相关
show variables like ‘变量名’ ;
show character set; 展示字符集《=》等同于information_schema.character_sets表内容
show collation like ‘校对规则名称%’;查看校对信息《=》information_schema.collations表
show databases ; 查看数据库《=》informaion_schema.schemata表
show tables ; 查看表 《=》informaion_schema.tables表
show columns from tablename查看列<=> describe tablename 《=》informaion_schema.columns表
show index from table_name 查看表的索引《=》show keys from table_name 《=》information_schema.statistics表
show status 显示服务器状态 -等同于《=》information_schema.global_status表
show processlist; 显示所有活动进程,可用KILL查杀《=》informaion_schema.processlist表
show engines; 查看存储引擎 《=》informaion_schema.engines表
show events 查看定时器(事件)《=》informaion_schema.events 表
show triggers;查看触发器信息《=》select * from informaion_schema.triggers where trigger_name =’trigger_name’ \G;
show procedure status;查看存储过程 《=》informaion_schema.routines 表
show create database 显示创建数据库的语句
show create table 显示创建表的语句
show grants 显示授权对象,如show grants for username; 查看用户的权限
show warnings 显示告警信息
show errors 显示错误信息
show master logs; 查看binlog是否设置《=》show binary logs;
应用举例:
>show grants for admin; 查看admin权限
>show grants for z1@localhost; show grants for z1; 查看用户权限
>show create view viewname \G 查看某视图的定义
>show variables like ‘table_type’;查看当前的存储引擎 (InnoDB(支持事务,支持外键),MyISAM(默认,不支持事务,不支持外键,但访问速度快..)
>show variables like ‘have%’;
>show table status like ‘tablename|viewname’ \G ;查看表|视图的状态
>show variables like ‘character_set_server’; 查看服务器字符集(默认为latin1)
>show variables like ‘collation_server’; 查看服务器校对规则
>show session|global status(session 当前连接,global自数据库上次启动至今,若不写,默认session)
>show status like ‘innodb_rows_inserted%’;执行insert操作插入的行数
>show status like ‘Slow_queries%’;查看慢查询的次数
>show status like ‘Com_%’;常用于优化,com_xxx 表示XXX语句执行的次数,重点关注com_select, com_insert, com_update, com_delete,com_commit,com_rollback
>show processlist 查看当前MYSQL线程情况
>show status like ‘handler_read%’;查看索引使用情况
>show status like ‘table%’; 查看表级锁征用情况
>show status like ‘innodb_row_lock%’; 分析系统行锁争夺情况
>show variables like ‘%query_cache%’ 使用查询缓存
>show status like ‘%Qcache%’ 监视查询缓存的使用情况
五、set 命令相关
1、SQL MODE 模式(定义了数据校验,SQL语法,保证数据完整性,有利于数据迁移到其它库)
>set session sql_mode=’mode_name’;
>select @@sql_mode; 查看数据库有哪些SQL模式
>set session sql_mode=’NO_TABLE_OPTION’; 数据迁移时设置该模式,将去掉show create table 中的engine关键字,获得通用的建表脚本
2、innodb迁移数据时,设置以下俩项,便于导入数据loading the data (load data infile ‘/home/mysql/test.txt’ into table tb_name;)
>set UNIQUE_CHECKS=0 关闭唯一性校验,可以提高innodb数据导入效率
>set AUTOCOMMIT=0 关闭自动提交
六、DDL语句
1、select查询
select * from table where col=? ; 查询
组合使用顺序(重要):select … from tb_name where … group by (with rollup)…having …order by (asc|desc) …limit(n,m) …
(注意with rollup 不能与order by 同时使用,limit在rollup后使用)
select常用语句举例:
>select distinct column from table ; 对column列值去重
>select count(1) from emp; 返回emp表行数
>select sum(sal),max(sal),min(sal) from emp; 与函数结合使用
>select * from table limit 5; 返回不多于5行 –limit n1,n2 返回从n1开始的n2行
>select * from table where col1 like ‘%value’; –模糊匹配 %匹配多个或0个字符 _ 匹配一个字符
>select * from emp where depno in (select depno from dept); 连接子查询
>select emp.* from emp dept where emp.depno=dept.depno; –mysql 4.1前不支持子查询
分组排序:
>select col1,count(col2) from table group by col1 ;
分组 group by (必须使用select的相同表达式,不能使用别名,出现在where 语句之后,order by 语句之前)
>select deptno,count(1) from emp group by deptno with rollup having deptno=2; 对分组后的结果汇总运算
>select deptno,count(1) from emp group by deptno having count(1)>1;
注意:where 过滤行,而having 过滤分组,与group by 配合使用,where 是分组前进行过滤,而having是分组后进行过滤
>select col1,col2 from table order by col1 desc,col2 asc; order by 一定要位于where 语句之后
加锁
>select * from tb_name where … lock in share mode; 给记录集加共享锁
>select * from tb_name where … for update; 加排他锁
连接查询相关
>select a.col1,b.col2 from a left outer join b on a.col3=b.col3; 左外连接
>select a.col1,b.col2 from a right outer join b on a.col3=b.col3; 右外连接
>select a.col1,b.col2 from a inner join b on a.col3=b.col3; 内连接
>select col1,col2 from table where col1=? union |union all select col1,col2 from table where col2=? 组合查询,各子查询之间必须是相同的列,表达式和数据类型,函数
组合查询UNION默认去掉重复行 ,UNION ALL 则不取消重复行,返回所有行;组合查询只能使用一条order by 语句,且必须置于最后一个查询之后,来排序返回所有结果
2、insert插入数据
insert into tablename() values();
>insert into table1 select * from table2 — 注意table1、table2 含有相同的表结构
3、update更新数据
update tablenem set col=value,… where …
>update t1,t2,t3 set t1.col=?,t2.col=?,t3.col=? where … 多表更新
4、delete删除数据
delete from table where col=? 只删除行(delete不会删除索引及数据文件)
truncate table 删除整个表,并删除索引和数据文件,删除速度更快(若删除全表,一般采用truncate)
>delete t1,t2,t3 from t1,t2,t3 where …;
>delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=’5′;#若from后面表名用别名,则delete后面也要用相应别名
七、DML语句
1、create创建表
create table tablename (col1 int not null auto increment, –每个表只允许一个auto increment列,且该列必须被索引,可设置为主键
col2 char(20) null default ? , –默认值?
…
primary key (col1),
)ENGINE=InnoDB; –默认引擎为MYISAM 支持全文本搜索,但不支持事务处理,InnoDB支持事务处理,不支持全文本搜索
create table table_name2 like table_name1; 复制创建一张类似table1的table2表
2、alter更新表
>alter table tablename add/drop column ? ; 对表增加或删除列
>alter table tablename add column column_definition; 增加列,并定义列
>alter table tablename modify column column_definition; 修改列的定义
>alter table tablename change column old_col_name column_definition; 修改列的定义
>alter table tablename drop column col_name; 删除某具体列
>alter table tablename rename to new_tablename; 更改表名
举例:
>alter table emp add birthdate after ename; 对表emp增加add_birthdate列,并位于after_name列后
>alter table emp modify age int(3) first; –将age列指定为int(3)类型
>alter table emp rename to emp1; 更改表名为emp1
>alter table t1 modify id2 int(5) zerofill; –zerofill 数值前用0 填充剩余宽度,若一个列指定zerofill,则mysql自动为该列添加UNSIGNED属性
3、删除表
drop table tablename;
重命名表:
rename table tablename1 to new-tablename1,tablename2 to new-tablename2;
注意:创建、更新、删除视图VIEW的语法结构,与表一致。
八、用户权限相关
create user username identified by ‘password’; –创建用户
rename user username to new-username; 重命名用户
drop user username; 删除用户
show grants for username; 查看用户的权限
grant select,insert on database.* to username; –授权
revoke select on database.* to username; 撤销权限
set password for username=password(‘?’); –更改密码口令
set password=password(‘?’); 更新当前用户的密码口令
flush privileges; 刷新权限设置
举例:
>grant select,insert on sakila.* to ‘z1’@’localhost’ identified by ‘123’; 创建一个数据库用户Z1 ,给sakila数据库中所有表赋予select,insert权限
>mysql -uz1 -p123
>use sakila
>revoke insert on sakila.* from ‘z1’@’localhost’ ; 回收z1的insert权限
>grant all privileges on *.* to z1@localhost with grant option; 创建用户z1,权限为可以在所有数据库上执行所有权限,只能从本地进行连接。with grant option #Z1用户可以进行授权
>grant all privileges on *.* to z1@localhost identified by ‘123’ with grant option; 加密
>grant select,insert,update,delete on test1.* to ‘z2’@’%’ indentified by ‘123’;创建新用户Z2,可以从任何IP连接,权限为对test1数据库所有表进行
>flush privileges;
九、索引相关
1、索引分类
BTREE索引(unique,index,primary key ,fulltext等索引时默认选择BTREE,可使用like,>,<,between等关键字)
HASH索引(只能使用=,<=>操作,全表扫描,存储引擎为MEMORY时,注意可能默认为Hash索引),
空间列类型索引使用RTREE索引。
2、语法
create index index_name on table_name(column_name); 创建索引
drop index index_name on table_name; 删除索引
show index from table_name –查看该表的索引=》 show keys from table_name 查看表的索引
举例:
>create index cityname on city(city(10));
>drop index cityname on city;
十、视图相关
视图是一种虚拟的表,用于简化复杂的SQL操作,视图主要用于数据检索,而不是数据更新,其本身不包含数据,更新的是源表中的数据,视图不能索引
1、语法
create view viewname ;创建视图
create or replace view ;创建或更新视图,注意与create view 的区别。create view 只创建,若已存在视图,则会报错,而create or replace view ,若已存在视图,则会更新视图
create view viewname as select_statement with cascaded|local check option; ( cascaded满足所有争对该视图的所有视图条件才能更新,local满足本视图的条件即可更新)
alter view viewname as select_statement with cascaded|local check option; 更新视图
drop view viewname; 删除视图
举例:
>create view viewname as select col1 ,col2 from table where col=?
>show table status like ‘tablename|viewname’ \G 查看视图
>show create view viewname \G 查看某视图的定义
>select * from information_schema.views where table_name=’viewname’ \G
十一、存储过程和函数
存储过程和函数是事先经过编译后存储在数据库中的一段SQL语句集合,存储过程参数可使用IN,OUT,INOUT类型,而函数只能使用IN类型,且必须有返回值。创建存储过程和函数需要CREATE ROUTING权限,修改或删除需要ALTER ROUTING权限,执行需要EXECUTE权限。
1、语法
create procedure/function sp_name … 创建存储过程
alter procedure/function sp_name … 修改存储过程
drop procedure/function sp_name … 删除存储过程
call sp_name(parameter…) 调用存储过程或函数
show create procedure|function sp_name \G 查看存储过程的创建内容
show procedure|function status like ‘sp_name’ \G 查看存储过程的信息(由谁创建、在哪儿创建、什么时间创建、字符集设置)
show procedure status;查看存储过程《=》select * from information_schema.routines where routine_name=’name’ \G 查看定义
举例:
创建存储过程sp
create procedure sp()
BEGIN
select AVG(pro_price) as priceaverage from products;
END;
执行存储过程:
call sp();
call sp(@pricelow,@pricehigh,@priceaverage); –mysql变量都必须以@开始
删除存储过程 :
drop procedure sp; 注意sp后面不加()
drop procedure sp if exists; 若不存在存储过程,会报错,所以可加上if exists检查存储过程
创建存储过程中的变量定义方法:
declare var_name type ; eg:>declare last_month_start DATE; 定义变量,变量只能在BEGIN。。。AND块中
set var_name=expr… ; eg>set last_month_start= DATE_SUB(CURRENT_DATE(),INTERVAL 1 MONTH); 变量赋值
select col_name … into var_name … table expr 变量赋值
十二、游标
游标cursor是一个存储在MYSQL服务器上的数据库查询,不是一条SELECT语句,而是查询的结果集。MYSQL中,游标只能用于存储过程和函数
1、语法
创建游标:declare cursorname curor;
打开游标:open cursorname;
关闭游标:close cursorname;
十三、触发器
触发器是与表有关的数据库对象,在满足定义条件时自动触发,并执行触发器定义的语句集合 ( mysql 5.0.2之后支持),注意(MYSQL只支持对DELETE,INSERT,UPDATE语句的响应)触发器名必唯一。
创建触发器:
create trigger triggername after insert on table_name for each row
create trigger trigger_name trigger_time trigger_event on tb1_name for each row trigger _stmt (触发器只能创建在永久表上,不能创建在临时表上)
删除触发器:
drop trigger triggername;
>show triggers \G ;查看触发器信息《=》select * from informaion_schema.triggers where trigger_name =’trigger_name’ \G;
>desc triggers; 查看触发器表结构定义
十四、事务与锁
事务控制和锁定语句 (5.0.3 后支持分布事务,当前分布式事务只支持innoDB引擎)
1、事务
事务:transaction是指一组SQL语句,事务用以处理insert、update,delete操作,不能回退select,create,drop操作。注意 InnoDB 支持事务处理。
开启事务:start transaction;
事务提交:commit ;
事务回退:rollback ,rollback to savepoint 回退到保留点(占位符)。
保留点(占位符):savepoint delete1; rollback to delete1;
set autocommit=0 ;事务不自动提交、set autocommit=1 ;事务自动提交
2、锁定语句
lock tables table_name read/write; 锁定当前线程的表
>unlock tables; 打开锁
十五、正则表达式
REGEXP 后接正则表达式语句,参见正则表达式语法
select * from table where col REGEXP ‘.000’ 返回col中含000的行 注意与LIKE区别
select * from table where col REGEXP ‘1000|2000’;–|相当于OR,同时返回1000或2000的数据,REGEXP BINARY 区分文本中字符的大小写
select * from table where col REGEXP ‘\\.’ ; –\\(转义字符) 匹配特殊字符. 若不加\\ .将返回所有字符
常用通配符
* 0个或多个匹配
+ 1个或多个匹配 =〉{1,}
? 0个或1一个匹配=〉{0,1}
^ 文本的开始 $ 文本的结尾
十六、函数相关
1、函数类型
文本处理函数: RTrim() Upper()–转化为大写 soundex()找出发音类似的值
日期和时间处理函数
数值处理函数
聚集函数
select now() 返回当前日期和时间
select Trim(‘ abc’) — 返回abc 去除空格,Rtrim 删除数据右侧多余的空格 LTrim 左边
十七、文本搜索
全文本搜索 :FULLTEXT
create table a ( note_text text null, fulltext(note_text)); #note_text为字段名
select note_text from a where match(note_text) against (‘搜索字符串’ with query expansion);
布尔文本搜索
select note_text from a where match(note_text) against (‘搜索字符串 -rope*’ in boolean mode);
#-rope*表示mysql排除包含rope*(任何以rope开始的词)的行,-排除一个词、*截断操作符
总结下来,发现内容好多,工作中可能有些知识用得少,但并不代表这些知识就没有用处,总有一天,遇到问题了,回想起曾经学到的知识,会发出感叹,原来是这么个理儿。所以,学习的路还很长,经常不使用练习,大脑便会选择性的进行遗忘,所谓好记性不如烂笔头,记录下来总结思考,时常练习实践才是硬道理!
本文中的笔记多来自于平时工作中总结、网友回答和《深入浅出:MySQL数据库开发、优化与管理维护》一书,适合入门学习,推荐大家去阅读。如果想要深入学习mysql,推荐大家去阅读几本经典书籍:
1、《MySQL技术内幕》-作者:[美]保罗·迪布瓦(PaulDuBois)
2、《高性能mysql》-作者:【美】施瓦茨(Schwartz,B.)【美】扎伊采夫(Zaitsev)
3、《MySQL技术内幕InnoDB存储引擎》-作者:姜承尧