005-【基础知识】之-mysql 数据库篇

        最近正在整理有道云笔记内容,准备把笔记归档分类,但是发现很多笔记杂乱无章,无从下手,知识内容是重复相关的,没有形成系统的归类,所以想把相关的版块整合在一起,方便我记忆与查找。暂时将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存储引擎》-作者:姜承尧

    原文作者:晓小诗
    原文地址: https://www.jianshu.com/p/1c5c4c422e5c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞