01-初识MySQL数据库
一、数据库概述
1、什么是数据
描述事物特征的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字、图片,图像、声音、语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机。如:
name = "michael" age = 18 gender = "male" ...
2、什么是记录
抽取事物一系列典型的特征,组成一条记录。在计算机中描述一个事物,就相当于文件里的一行内容,如:
1 michael,male,18,1999,湖北,计算机,oldboy
单纯的一条记录并没有任何意义,如果我们按逗号作为分隔,依次定义各个字段的意思,相当于定义一张表一样,如:
id | name | gender | age | birthday | province | discipline | school |
---|---|---|---|---|---|---|---|
1 | michael | male | 18 | 1999 | 湖北 | 计算机 | oldboy |
这样我们就可以了解michael,性别为男,年龄18岁,出生于1999年,来自于湖北,计算机专业等相关信息。
3、什么是数据表
表就如同上图的表格一样,下面还可以继续写入其他人的相关信息。最终保存为一个文件的形式。我们可以通俗的理解为数据表,就是一个文件。 大家想一下,当文件特别多时,我们平时都怎么管理的? 是不是得建一个文件夹啊,那这就引出了数据库的概念。
4、什么是数据库
数据库(DataBase,简称DB),顾名思义即为存放数据的仓库(我们可以通俗的理解为文件夹),只不过这个仓库是存储在计算机设备上,而且数据是按一定的格式存放的。 数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。
5、什么是数据库管理系统
数据库管理系统(DataBase Management System 简称DBMS),在了解了Data与DB的概念后,如何科学地组织和存储数据,如何高效获取和维护数据成了关键,这就用到了一个系统软件---数据库管理系统。如:MySQL、Oracle、SQLite、Access、SQL Server等。 mysql主要用于大型门户,例如搜狗、新浪等,它主要的优势就是开放源代码,因为开放源代码这个数据库是免费的,他现在是甲骨文公司的产品。 oracle主要用于银行、铁路、飞机场等。该数据库功能强大,软件费用高。也是甲骨文公司的产品。 sql server是微软公司的产品,主要应用于大中型企业,如联想、方正等。
6、什么是数据库服务器
数据库服务器,就是运行数据库管理软件的计算机。这个后期大家学习项目部署的时候,就能有个很直观的感受。 注意:**数据库服务器、数据管理系统、数据库、表与记录的关系(重点理解!!!)** 总结: 数据库服务器:运行数据库管理软件 数据库管理软件:管理数据库软件 数据库:即文件夹,用来组织文件/表 表:即文件,用来存放多行内容/多条记录
二、MySQL介绍
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是什么? mysql就是一个基于socket编写的C/S架构的软件 客户端软件 mysql自带:如mysql命令,mysqldump命令等 python模块:如pymysql
数据库管理软件分类:
分两大类:
关系型:如sqllite,db2,oracle,access,sql server,MySQL,注意:sql语句通用
非关系型:mongodb,redis,memcache
可以简单的理解为:
关系型数据库需要有表结构
非关系型数据库是key-value存储的,没有表结构
三、登录设置密码
1、设置密码
初始状态下,管理员root,密码为空,默认只允许从本机登录localhost。
# mysqladmin -uroot -p password "123" 设置密码为123,由于初始没有密码,so -p后为空。 # mysqladmin -uroot -p123 password "456" 设置密码为456,-p后跟原来的密码。
2、忘记root密码,如何破解(Windows版本)
# 第一步关闭MySQL服务 net stop mysql # 第二步跳过授权表启动MySQL mysqld --skip-grant-tables # 第三步登录root管理用户,不需要输入密码 mysql -uroot -p 直接回车,即可进入MySQL命令行。 # 第四步设置新密码 update mysql.user set authentication_string=password("root!23456") where user = 'root' and host="localhost"; # 第五步刷新授权表 flush privileges; # 第六步获取当前MySQL服务进程号 tasklist |findstr mysql 获取进程号 # 第七步干掉该进程 taskkill /F /PID XXX(上步获取的进程号) # 第八步正常启动MySQL服务(服务启动后,正常连接MySQL即可,此时就可以输入新改的密码进行登录了) net start mysql
3、忘记root密码,如何破解(Linux版本)
# 1、修改配置文件 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf # 见下图在[mysqld]下加上skip-grant-tables # 2、重启MySQL服务 systemctl restart mysql # 3、登录root管理用户,不需要输入密码 mysql -uroot -p 直接回车,即可进入MySQL命令 # 4、设置新密码 mysql> update mysql.user set authentication_string=password('root123') where user='root' and host='localhost'; # 5、刷新授权表 mysql> flush privileges; # 6、进入MySQL的配置文件,删除掉先加入的内容,保存退出,重启MySQL服务。 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf systemctl restart mysql # 7、此时就需要用新改的密码进行登录了。
四、统一字符编码
1、Linux版本:
# 1、修改MySQL的配置文件 # 修改mysqld的配置文件 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf #加上如下代码(见图4.1.1) [mysqld] character-set-server=utf8 collation-server=utf8_general_ci # 修改mysql客户端的配置文件 sudo vim /etc/mysql/conf.d/mysql.cnf #加上如下代码(见图4.1.2) [mysql] default-character-set=utf8 [client] default-character-set=utf8 # 2、重启MySQL服务 systemctl restart mysql # 3、查看一下,如图4.1.3 show variables like "%character%";
图4.1.1:
图4.1.2:
图4.1.3:
2、Windows版本:
Windows10 cmd执行命令 show variables like "%character%"; 默认的字符编码,如图所示。
或者在命令行键入 \s,查看默认的字符编码,如图所示。
统一字符编码配置:
a、在mysql的解压目录下(与bin目录同级),新建my.ini文件,然后配置如下:
强调:配置文件中的注释可以有中文,但是配置项中不能出现中文。
# 1. 在执行mysqld命令时,下列配置会生效,即mysql服务启动时生效 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci # 2. 针对客户端命令的全局配置,当mysql客户端命令执行时,下列配置生效 [client] default-character-set=utf8 # 3. 只针对mysql这个客户端的配置,2中的是全局配置,而此处的则是只针对mysql这个命令的局部配置 [mysql] default-character-set=utf8 #!!!如果没有[mysql],则用户在执行mysql命令时的配置以[client]为准。
b、重启服务
# 关闭MySQL服务 net stop mysql # 启动MySQL服务 net start mysql
c、查看修改结果:
\s 或者 show variables like '%character%';
五、初识SQL语句
有了mysql这个数据库软件,就可以将程序员从对数据的管理中解脱出来,专注于对程序逻辑的编写。
mysql服务端软件即mysqld帮我们管理好文件夹以及文件,前提是作为使用者的我们,需要下载mysql的客户端,或者其他模块来连接到mysqld,然后使用mysql软件规定的语法格式去提交自己命令,实现对文件夹或文件的管理。该语法即sql(Structured Query Language 即结构化查询语言)。
SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。
SQL语言分为3种类型:
1. DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER;
2. DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT;
3. DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE。
1、操作文件夹(数据库) 增:create database db1 default charset utf8; 查:show create database db1; # 查看刚刚新建的数据库 show databases; # 查看所有数据库 改:alter database db1 charset gbk; 删:drop database db1; 2、操作文件(数据表) 切换文件夹:use db1; 查看当前文件夹:select database(); 增:create table t1(id int, name char); 查:show create table t1; show tables; desc t1; 改:alter table t1 modify name char(6); # 修改字段类型和约束 alter table t1 change name Name char(7); # 修改字段名及字段类型和约束 删:drop table t1; 3、操作文件内容(记录) 增:insert into t1(id,name) values(1,"alex"),(2,"egon"),(3,"jack"); 查:select id,name from t1; select * from t1; 改:update t1 set name = "alexdsb"; # 会将表内的所有记录更新 update t1 set name = "alexdsb" where id = 1; # 指定修改id为1的name值 删:delete from t1; # 删除所有记录 delete from t1 where id = 1; # 指定删除id为1的记录
六、存储引擎相关(了解)
1、什么是存储引擎
mysql中建立的库===>文件夹
库中建立的表===>文件
现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等。 数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。
存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。
在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。
SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每个数据库中都存在,但不是每 个数据库都有这么多存储引擎。MySQL 的插件式存储引擎可以让存储引擎层的开发人员设 计他们希望的存储层,例如,有的应用需要满足事务的要求,有的应用则不需要对事务有这 么强的要求 ;有的希望数据能持久存储,有的只希望放在内存中,临时并快速地提供对数据 的查询。
2、MySQL支持的存储引擎
mysql> show engines\G #查看所有支持的存储引擎 mysql> show variables like '%storage_engine%'; #查看正在使用的存储引擎
a、InnoDB 存储引擎
支持事务,其设计目标主要面向联机事务处理(OLTP)的应用。其特点是行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。 从 MySQL 5.5.8 版本开始是默认的存储引擎。
InnoDB 存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由InnoDB 存储引擎自身来管理。从 MySQL 4.1(包括 4.1)版本开始,可以将每个 InnoDB 存储引擎的 表单独存放到一个独立的 ibd 文件中。此外,InnoDB 存储引擎支持将裸设备(row disk)用 于建立其表空间。
InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准 的 4 种隔离级别,默认为 REPEATABLE 级别,同时使用一种称为 netx-key locking 的策略来 避免幻读(phantom)现象的产生。除此之外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高性能和高可用的功能。
对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,每张表都是按 主键的顺序进行存储的,如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此作为主键。
InnoDB 存储引擎是 MySQL 数据库最为常用的一种引擎,Facebook、Google、Yahoo 等 公司的成功应用已经证明了 InnoDB 存储引擎具备高可用性、高性能以及高可扩展性。对其 底层实现的掌握和理解也需要时间和技术的积累。如果想深入了解 InnoDB 存储引擎的工作 原理、实现和应用,可以参考《MySQL 技术内幕:InnoDB 存储引擎》一书。
b、MyISAM 存储引擎
不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不同在于对事务的支持,MyISAM 存储引擎是不支持事务的。究其根 本,这也并不难理解。用户在所有的应用中是否都需要事务呢?在数据仓库中,如果没有 ETL 这些操作,只是简单地通过报表查询还需要事务的支持吗?此外,MyISAM 存储引擎的 另一个与众不同的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同。
c、NDB 存储引擎
MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数 据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且能够在线添加 NDB 数据存储节点(data node)以便线性地提高数据库性能。由此可见,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。
d、Memory 存储引擎
正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。
e、Infobright 存储引擎
第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上面有不少成功的数据 仓库案例可供分析。
f、NTSE 存储引擎
网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。
g、BLACKHOLE
黑洞存储引擎,可以应用于主备复制中的分发主库。 MySQL 数据库还有很多其他存储引擎,上述只是列举了最为常用的一些引擎。如果 你喜欢,完全可以编写专属于自己的引擎,这就是开源赋予我们的能力,也是开源的魅力所在。