MySQL 软件安装及数据库基础 - Go语言中文社区

MySQL 软件安装及数据库基础


1. 软件安装及服务器设置

教程 http://www.runoob.com/mysql/mysql-install.html
这里要注意的几点:

  1. 必须要以管理员身份打开cmd 命令行工具;

  2. 当出现 ‘服务器无法启动’ 时,通常是端口被占用了,我的解决方法是:
    在MySQL的bin目录下 输入 msqld --remove 删除掉服务,再把安装MySQL目录下的data文件夹也删除,重新执行以下三条指令即可完成

    mysqld --initialize-insecure
    mysqld --install
    net start mysql
    

    具体可参考:https://www.cnblogs.com/jiyongjia/p/9527499.html

2. 数据库基础知识

数据库定义(database)

  • 保存有组织的数据的容器(通常是一个文件或一组文件)。最简单的办法是将数据库想象为一个文件柜。这个文件柜是一个存放数据的物理位置,不管数据是什么,也不管数据是如何组织的。
  • 而常说的XX数据库,实质上是XX数据库管理系统(DBMS)。数据库是通过 DBMS创建和操纵的容器,而数据库管理系统是一个软件,是数据库管理的程序实现。

关系型数据库

  • 关系型数据库是依据关系模型来创建的数据库。
  • 所谓关系模型就是“一对一、一对多、多对多”等关系模型,关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。
  • RDBMS(Relational Database Management System) 关系型数据库管理系统
    在这里插入图片描述
    SQL是一门结构化语言,MySQL是一种关系型数据库,MySQL通过SQL进行数据的存储以及操作管理等。具体来说就是我们在MySQL的客户端通过SQL向MySQL的服务端发送指令,完成数据的查询操作等。

二维表

  • 在关系模型中,数据结构表示为一个二维表,一个关系就是一个二维表(但不是任意一个二维表都能表示一个关系),二维表名就是关系名。表中的第一行通常称为属性名,表中的每一个元组和属性都是不可再分的,且元组的次序是无关紧要的。
  • 二维表就是由行列组成的,知道行号列号就可以确定一个表中的数据,这是二维表的特点。在关系数据库中,存放在数据库中的数据的逻辑结构以二维表为主。

行、列

  • 行:表中的一个记录。二维表中每一行称为一个记录,或称为一个元组。
  • 列:表中的一个字段。二维表中每一列称为一个字段,或称为一个属性。所有表都是由一个或多个列组成的。
  • 如果将表想象为网格,网格中垂直的列为表列,水平行为表行。例如,顾客表可以每行存储一个顾客,表中的行编号为记录的编号;每列可以分别存储顾客ID(主键)、顾客姓名、年龄、地址等。

可以这样理解:一个excel文件就好比一个数据库,数据库是数据表的集合。excel中的每一个sheet就好比一个数据表(二维表),多个集合起来就是一个数据库,而数据表是数据的集合。

主键、外键

  • 主键:一列(或一组列),其值能够唯一标识表中每一行。

所有列值的组合必须是唯一的(但单个列的值可以不唯一)。
表中的任何列都可以作为主键,只要它满足以下条件:
1)任意两行都不具有相同的主键值;
2)每一行都必须具有一个主键值(主键列不允许 NULL值);
3)主键列中的值不允许修改或更新;
4)主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)。

主键通常定义在表的一列上,也可以一起使用多个列作为主键。在使用多列作为主键时,上述条件必须应用到所有列,所有列值的组合必须是唯一的(但单个列的值可以不唯一)。

  • 外键:外键约束主要用来维护两个表之间数据的一致性。一个表的外键一定是另外某个表的主键。

先举个例子。若有两个表基本表A,信息表B,C是A的主键,而B中也有C字段,则C就是表B的外键。
在数据库中,常常不只是一个表,这些表之间也不是相互独立的,不同的表之间需要建立一种关系,才能将它们的数据相互沟通,而在这个沟通过程中,就需要表中有一个字段作为标志,不同的记录对应的字段取值不能相同,也不能是空白的,通过这个字段中不同的值可以区别各条记录。

3. 数据类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 若不加unsigned则都是默认有符号,若要修改类型可通过
alter table students modify age tinyint unsigned

tinyint(M) unsigned zerofill;

  • unsigned : 无符号;
  • M : 只有zerofill存在时才有意义;
  • zerofill : 零填充(如果某列是zerofill时就是默认unsigned)

tinyint(5) unsigned zerofill 若插入值为9,则00009

  1. 还可以申明默认值,推荐申请默认值

Not null Default 0 例如 name varchar(10) not null default ‘’
则在新建一个字段时就默认填充0。

  1. float(M,D) / decimal(M,D)
    decimal更精确,推荐。
    M : 精度(总位数,不包含点)
    D : 标度(小数位)
    float(6,2)范围在-9999.99到+9999.99之间。当然float(6,2) unsigned,则0到+9999.99。
    若插入82.896则最后显示是82.90

  2. char 和 varchar

char : 定长字符串,char(M),M代表宽度,0<=M<=255,即可容纳的字符数(不是字节,例如一个汉字占3个字节,但一样可以插入8个汉字)
varchar : 变长,varchar(M),M代表宽度,0<=M<=65535,即可容纳的字符数
区别:
char定长:M个字符,若存的小于M个字符,设N个字符,还是实占M个字符,利用率N/M<=100%;不够则用空格补齐,往回取的时候把后面的空格去掉,但是呢你存入的值尾部本来就有空格,往回取的时候后面的空格就丢失了,例如:存’list ‘,取回来是’list’;
varchar变长:存的小于M个字节,设N个字节,N<=M,实占N个,但是总得有一个信息标记着你存了多少个字节,所以这个信息占1-2个字节,所以最大可以存到65535个字节(转换到utf8大概可以从22000个字符左右),利用率N/(N+1-2)<100%。
所以:1. M不同;2. 实占空间不同,空间利用率不同;3. 存入时尾部的空格会丢失与否;4. 速度不同,char速度更快。
选择原则:1. 空间利用率 如:四字成语表 char(4),个人简介 varchar(140);2. 速度 如:用户名:char 本来用户名也就那么短,优先考虑速度

这里还有一个枚举类型:enum()
但是这和关系型数据库的设计理念有悖。数据表中存储的数据是原子型,即不可再分割,而枚举类型,例如gender enum(‘男’,‘女’),这里存储的是一种结构,里面可以再分割;如果要符合原子型,可以gender tinyint(1),并注释1代表男,0代表女。

  1. 时间类型
  • Year类型:1个字节 表示1901-2155,[0000,表示错误时选择]
    如果输入两位,00-69,则表示2000-2069;70-99则表示1970-1999;推荐直接输入四位。
  • Date类型:典型 1992-08-12
    日期类型:范围‘1000-01-01’->‘9999-12-31’
  • time类型:典型格式:hh:mm:ss
    时间类型,范围:-839:59:59到839:59:59,因为还可以表示两个时间差
  • Datetime类型 典型格式:‘1989-05-06 14:32:08’
    日期时间类型 范围’1000-01-01 00:00:00’ - ‘9999-12-31 23:59:59’
  • 时间戳:是1970-01-01 到 当前时间的秒数,以秒为单位,用int来存储。
    因为在开发中不用datetime类型去存储精确到秒的列,计算不方便,所以通常用时间戳。计算方便,如果要显示则格式化就可以了。

4. 视图

  • 视图(View)是从一个或多个表(或视图)导出的虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
  • 从数据库系统内部来看,视图是由一张或多张表中的数据组成的,由SELECT语句组成的查询定义的虚拟表;从数据库系统外部来看,视图就如同一张表一样,对表能够进行的一般操作都可以应用于视图,例如查询,插入,修改,删除操作等,但是对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。
    在这里插入图片描述
#语法:
create view 视图名 as select 语句

为什么要用视图?

  1. 可以简化查询。当需要频繁用到子查询时(频繁用到另一张表),可以先创建一个由特定查询语句组成的视图;
  2. 可以进行权限控制。例如信用卡中心有一些数据不能给管理人员看,把表的权限封闭,但是开放相应的视图权限,视图里只开放部分数据,达到保护数据的作用;
  3. 大数据分表时可以用到。比如表的行数超过200万行。可以把一张表的数据拆成4张表存放。
    Newsid 1 2 3 4 拆成 News1 News2 News3 News4
    把一张表的数据分散到4张表里,分散方法很多,最常用的是id取模
    id%4 + 1 = [1,2,3,4],
    可以用视图将4张表形成一张视图
    create view news as select * from new1 union select * from news2 union …

视图的algorithm:
Algorithm = merge/ temptable/ undefined
Merge: 当引用视图时,引用视图的语句与定义视图的语句合并
Temptable: 当引用视图时,根据视图的创建语句建立一个临时表
Undefined: 未定义,让系统自动帮你选

Merge,意味着视图只是一个规则,语句规则,当查询视图时,把查询试图的语句(例如where,order by等)与创建视图的语句where子句合并,形成一条select,最终从表中进行查询
如:
创建视图的语句:create view g as select goods_id,shop_price from goods order by goods_id,shop_price desc;
查询试图的语句:select * from g group by goods_id;
最终相当于变成:select goods_id,shop_price from goods group by goods_id order by goods_id,shop_price desc;
就相当于将两句话分析合并成一句话在基表中查询。

而temptable是根据创建语句的瞬间创建一张临时表,然后查询视图的语句从该临时表查数据。
创建视图:create algorithm = temptable view g as select goods_id,shop_price from goods order by goods_id,shop_price desc;
查询视图:select * from g group by goods_id;
最终执行2句话,从goods取数据创视图放在临时表,然后在该临时表中查询。

5. 字符集与校对集

申明表为utf8:
在这里插入图片描述
在这里插入图片描述

  1. set character_set_client = gbk; #告诉服务器,客服端给你发送的是gbk编码;
  2. set character_set_connection=gbk; #告诉转换器,转换成gbk编码,其实不用转了;这里还有一步就是转换器到服务器,但是在内部完成。我们看不见,也不用设置,以utf8形式存储在表中;
  3. set character_set_results=gbk; #查询的结果还是gbk编码;若是utf8编码,则会乱码。
  • 什么时候会乱码?
  1. client声明与事实不符;
  2. results与客户端页面不符;
  • 什么时候将会丢失数据?
    connection和服务器的字符集比client小时。

校对集就是字符集内部的排序规则,一个字符集有一种或多种校对集(就是有很多排序规则,看你怎么排)。以Utf8为例,我们默认使用utf8_general_ci规则,也可以指定使用utf8_bin(二进制)。
声明校对集 :create table (…) Charset utf8 collate utf8_bin;

6. 触发器trigger

在这里插入图片描述
用触发器,可以监视某表的变化,当发生某种变化时,触发某个操作。
能监视:增 删 改
能触发:增 删 改

在这里插入图片描述

delimiter $      #这句话的意思是不再以 ; 作为一条语句结束标志,改成$

Create trigger triggerName
After/before insert/update/date/ on 表名   #在监视某张表 发生了某种操作 之后或之前
For each row  #这句话是固定的
Begin
Sql语句;    #触发操作
End$

因为在begin 和 end之间的SQL语句最后要加上;  并且有可能不止一条,每一条有;隔开,所以指定结束标志不能再是; 改成$

如何在触发器引用行的值
对于insert而言,新增的行用new来表示,行中每一列的值,用 new. 列名 来表示。
对于delete而言,删除的行用old来表示,行中每一列的值,用 old. 列名 来表示。
对于update而言,被修改的行:
修改前的数据用old来表示,行中每一列的值,用 old. 列名 来表示;
修改后的数据用new来表示,行中每一列的值,用 new. 列名 来表示。
在这里插入图片描述
对于INSERT:
在这里插入图片描述
在这里插入图片描述
对于update:
在这里插入图片描述
如果不是更改数量,而是更改id:
在这里插入图片描述

before与after:
After 是先完成数据的增删改再触发,触发中的语句晚于增删改,无法影响前面的增删改动作。

Before是先完成触发,再增删改,触发的语句先于监视的增删改发生,我们有机会判断、修改即将发生的操作。例如本来这个操作本来就不合理,那么需要before来审查。

例题:若购买数量大于5被认为是恶意订单,强制将购买数量变成5.
在这里插入图片描述
在这里插入图片描述

7. 存储引擎与事务

7.1 存储引擎

存储引擎:数据库对同样的数据,有着不同的存储方式和管理方式。在mysql中,称为存储引擎。
在这里插入图片描述
Myisam:批量插入速度快,不支持事务,锁表;
Innodb:批量插入速度慢,支持事务,锁行;

7.2 事务:

  1. 4个特性:
    通俗说的事务,就是一组操作,要么全部执行,要么全部不执行 ---- 原子性(就是这组操作不能被分割了)
    在所有的操作没有执行完毕之前,其他事务不能看见中间改变的过程(该事务下还是能看见的) ---- 隔离性 (先扣汇款人的钱,再加被汇款人的钱,必须都执行完成才能看到汇款人或者被汇款人金额的变化)
    事务发生前和发生后,数据的总额依然匹配 ---- 一致性 (汇款人少了100,那被汇款人必须多100 ,不考虑手续费)
    事务产生的影响不能撤销 ---- 持久性

  2. 开启事务
    关于事务的引擎:选用InnoDB

开启事务:start transaction
SQL…
SQL…
commit 提交/rollback 回滚
注意:当一个事务commit或rollback时,该事务就结束了。
再注意:有些语句会造成事务的隐式提交,例如start transaction; SQL; start transaction; 前一个事务就隐式提交了。

8. 备份与恢复

系统运行中,增量备份与整体备份。
例:每周日整体备份一次,周一到周六备份当天。若周五出问题了,可以使用上周日的整体备份+周一到周四来恢复。

8.1 备份

备份工具:系统默认是mysqldump,可以导出库和表。

  1. 导出某个库下的表
    mysqldump -u 用户名 -p 密码 库名 表1 表2 表3 > 地址/备份文件名称 (D:/mysql.sql)
  2. 导出一个库下的所有表
    mysqldump -u 用户名 -p 密码 库名 > 地址/备份文件名称
  3. 导出库
    mysqldump -u 用户名 -p 密码 -B 库1 库2 库3 > 地址/备份文件名称
  4. 导出所有库
    mysqldump -u 用户名 -p 密码 -A > 地址/备份文件名称

8.2 恢复

  1. 登陆到mysql命令行
    对于库级的备份文件
    mysql>source 备份文件地址

对于表级的备份文件
mysql>use 库名
mysql>source 备份文件地址

  1. 不登陆到mysql命令行
    针对库级
    mysql -u 用户名 -p 密码 < 库级备份文件地址

针对表级备份
mysql -u 用户名 -p 密码 库名< 表级备份文件地址

9. 索引

索引:是针对数据所建立的目录
作用:加快查询速度
负面影响:降低增删改速度

案例:
设有表15列,10列上有索引,共500w行数据,如何快速导入?

  1. 把空表索引全部删除
  2. 导入数据
  3. 统一建立索引

索引创建原则
4. 不过度索引
5. 在where条件最频繁的列上加(查询最频繁的列)
6. 尽量索引散列值,过于集中的值加索引意义不大

索引类型
普通索引:index 仅仅是加快查询速度
唯一索引:unique index 行上的值不能重复
主键索引:primary key 不能重复
主键必唯一,但是唯一索引不一定是主键索引;一张表只有一个主键索引,但是可以有一个或多个唯一索引
全文索引:fulltext index

查看一张表的所有索引
show index from 表名

建立索引
alter table 表名 add index / unique / fulltext [索引名] (列名)
alter table 表名 add primary key (列名) //不要加索引名,因为主键只有一个

删除索引
删除非主键索引:alter table 表名 drop index 索引名;
删除主键索引:alter table 表名 drop primary key;

关于全文索引的使用
Match (全文索引名) against (‘keyword’);

关于全文索引的停止词
全文索引不针对非常频繁的词做索引
如this, is, you, my…

全文索引在mysql的默认情况下,对于中文意义不大
因为英文有空格,标点符号来拆成单词,进而对单词进行索引
而对于中文,没有空格来隔开单词,mysql无法识别每个中文词。

10. 存储过程

  • 通俗地讲,存储过程就像是其他的编程语言的方法一样。竟然他是方法那么他就有类似的方法名,方法要传递的变量和返回结果,所以存储过程有存储过程名,有存储过程参数,可以没有返回值但是可以有返回结果集。
  • 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集。存储在数据库中,经过第一次编译后调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

查看现有存储过程
show procedure status

删除存储过程
Drop procedure 存储过程的名字

调用存储过程
Call 存储过程名字

#创建存储过程
create procedure p1(n int,j char(1))
begin
	if j = 'h'
		select * from g where num > n ;  #返回结果
	else 
		select * from g where num <= n ;
	end if;
end$
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Cool_Pepsi/article/details/88929506
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢