mysql基础

mysql基础

数据库模型概述

第一类概念模型(conceptual model),也称信息模型,她是按用户的观点来对数据和信息建模, 主要用于数据库设计。
第二类中的逻辑模型主要包括层次模型(hierarchical model)、网状模型(network model)、关系模型(relational model)、面向对象数据模型(object oriented data model)和对象关系数据模型(object relational data model)、半结构化数据模型(semistructured data model)等。它是按计算机系统的观点对数据建模,主要用数据库管理系统的实现。
第二类中的物理模型是对数据最底层的抽象,它描述数据在系统内部的表示方式和存取方法,或在磁盘或磁带上的存储方式和存取方法,是面向计算机系统的。物理模型的具体实现是数据库管理系统的任务,数据库设计人员要了解和选择物理模型,最终用户则不必考虑物理级的细节。
数据模型是数据库系统的核心和基础。各种机器上实现的数据库管理系统软件都是基于某种数据模型或者说是支持某种数据模型的。

常用的数据模型

层次模型(hierarchical model)

网状模型(network model)

关系模型(relational model )

面向对象数据模型(object oriented data model)

对象关系数据模型(object relational data model)

半结构化数据模型(semistructure data model)

其中层次模型和网状模型统称为格式化模型。

关系模型是最重要的一种数据模型。关系数据库系统采用关系模型作为数据的组织方式。

1.关系模型的数据结构

关系模型与以往的模型不同,它是建立在严格的数学概念的基础上的。从用户观点看,关系模型由一组关系组成。每个关系的数据结构是一张规范化的二维表。

关系(relation):一个关系对应通常说的一张表。

元组(tuple):表中的一行即为一个元组。

属性(attribute):表中的一列即为一个属性,给每一个属性起一个名称即属性名。

码( key):也称为码键。表中的某个属性组,它可以唯一确定一个元组, 如学号可以唯一确定一个学生,也就成为本关系的码。

域(domain):域是一组具有相同数据类型的值的集合。属性的取值范围来自某个域 。如人的年龄一般在1~120岁之间,大学生年龄属性的域是(15~45岁),性别的域是(男, 女),系名的域是一个学校所有系名的集合。

分量:元组中的一个属性值。

关系模式:对关系的描述,一般表示为

关系名(属性1,属性2,……,属性n)

关系术语 一般表格术语
关系名 表名
关系模式 表头(表格的描述)
关系 (一张)二维表
元组 记录或行
属性
属性名 列名
属性值 列值
分量 一条记录中的一个列值
非规范关系 表中有表(大表中嵌有小表)

关系数据库

关系模型的数据结构非常简单,只包含单一的数据结构 —- 关系。在用户看来,关系模型中数据的逻辑结构是一张扁平的二维表。

关系模型的数据结构虽然简单却能够表达丰富的语义,描述出现实世界的实体以及实体间的各种联系。也就是说,在关系模型中,现实世界的实体以及实体间的各种联系均用单一的结构类型,即关系来表示。

关系数据库

在关系模型中,实体以及实体间的联系都是用关系来表示的。例如导师实体、研究生实体、导师与研究生之间的一对多联系都可以分别用一个关系来表示。在一个给定的应用领域中,所有关系的集合构成一个关系数据库。

关系数据库也有型和值之分。关系数据库的型也称为关系数据库模式,是对关系数据库的描述。 关系数据库模式包括若干域的定义,以及在这些域上定义的若干关系模式。
关系数据库的值是这些关系模式在某一时刻对应的关系的集合, 通常就称为关系数据库。

在关系数据模型中实体及实体间的联系都用表来表示,但表是关系数据的逻辑模型。在关系数据库的物理组织中,有的关系数据库管理系统中一个表对应一个操作系统文件,将物理数据组织交给操作系统完成;有的关系数据库管理系统从操作系统那里申请若干个大的文件,自己划分文件空间,组织表、索引等存储结构,并进行存储管理。

关系操作

关系模型给出了关系操作的能力的说明,但不对关系数据库管理系统语言给出具体的语法要求,也就是说不同的关系数据库管理系统可以定义和开发不同的语言来实现这些操作。

基本的关系操作

关系模型中常用的关系操作包括查询(quey)操作和插入(insert)、 删除(delete)、修改(update)操作两大部分。

关系的查询表达能力很强,是关系操作中最主要的部分。查询操作又可以分为选择(select)、投影(project)、连接(join)、除( divide)、并(union)、差(except)、交(intersection)、笛卡儿积等。其中选择、投影、并、差、笛卡儿积是5种基本操作,其他操作可以用基本操作来定义和导出,就像乘法可以用加法来定义和导出一样。

关系操作的特点是集合操作方式,即操作的对象和结果都是集合。 这种操作方式也称为一次一集合(set-at-a-time)的方式。相应地,非关系数据模型的数据操作方式则为一次一记录(record-at-a-time)的方式。

关系数据库标准语言SQL

结构化查询语言(Structured Query Language,SQL)是关系数据库的标准语言,也是一个通用的、功能极强的关系数据库语言。其功能不仅仅是查询,而且包括数据库模式创建、数据库数据的插入与修改、数据库安全性完整性定义与控制等一系列功能。

自SQL成为国际标准语言以后,各个数据库厂家纷纷推出各自的SQL软件或与SQL的接口软件。这就使大多数数据库均用SQL作为共同的数据存取语言和标准接口,使不同数据库系统之间的互操作有了共同的基础。SQL已成为数据库领域中的主流语言,其意义十分重大。有人把确立SQL为关系数据库语言标准及其后的发展称为是一场革命。

语言简洁、易学易用

SQL功能极强,但由于设计巧妙,语言十分简洁,完成核心功能只用了9个动词,如下表所示:

SQL功能 动词
数据查询 SELECT
数据定义 CREATE,DROP,ALTER
数据操纵 INSERT,UPDATE,DELETE
数据控制 GRANT,REVOKE

数据定义

关系数据库系统支持三级模式结构,其模式、外模式和内模式中的基本对象有模式、表、视图和索引等。因此SQL的数据定义功能包括模式定义、表定义、视图和索引的定义, 如下表所示。

操作对象 操作方式
创建 删除 修改
模式 CREATE SCHEMA DROP SCHEMA
CREATE TABLE DROP TABLE ALTER TABLE
视图 CREATE VIEW DROP VIEW
索引 CREATE INDEX DROP INDEX ALTER INDEX

SQL标准不提供修改模式定义和修改视图定义的操作。 用户如果想修改这些对象,只能先将它们删除然后再重建。SQL标准也没有提供索引相关的语句,但为了提高查询效率, 商用关系数据库管理系统通常都提供了索引机制和相关的语旬。

在早期的数据库系统中,所有数据库对象都属于一个数据库,也就是说只有一个命名空间。现代的关系数据库管理系统提供了一个层次化的数据库对象命名机制,一个关系数据库管理系统的实例(instance)中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象

MySQL

MySQL是最流行的开 SQL数据库管理系统,由Oracle Corporation开发,分发和支持。MySQL网站(http://www.mysql.com/)提供了有关MySQL软件的最新信息。

MySQL是一个数据库管理系统。数据库是结构化的数据集合。从简单的购物清单到图片库,或者企业网络中的大量信息,它都可以是任何东西。要添加,访问和处理存储在计算机数据库中的数据,您需要一个数据库管理系统,例如MySQL Server。由于计算机非常擅长处理大量数据,因此数据库管理系统作为独立的实用程序或其他应用程序的一部分,在计算中起着核心作用。

MySQL数据库是关系数据库。关系数据库将数据存储在单独的表中,而不是将所有数据放在一个大的仓库中。数据库结构被组织成针对速度进行了优化的物理文件。具有对象(例如数据库,表,视图,行和列)的逻辑模型提供了灵活的编程环境。您可以设置规则来控制不同数据字段之间的关系,例如一对一,一对多,唯一,必需或可选以及不同表之间的“指针”。数据库强制执行这些规则,因此,在设计良好的数据库中,您的应用程序永远不会看到不一致,重复,孤立,孤立,过期或丢失的数据。“ MySQL”的SQL部分代表“ 结构化查询语言 ”。SQL是用于访问数据库的最常见的标准化语言。根据您的编程环境,MySQL的主要功能您可以直接输入SQL(例如,生成报告),将SQL语句嵌入用另一种语言编写的代码中,或者使用特定于语言的API来隐藏SQL语法。SQL由ANSI / ISO SQLStandard定义。SQL标准自1986年以来一直在发展,并且存在多个版本。在本手册中,“ SQL-92”是指1992年发布的标准,“ SQL:1999”是指1999年发布的标准,“ SQL:2003”是指标准的当前版本。我们使用“ SQL标准”这一短语来随时表示SQL标准的当前版本

MySQL软件是开源的。

开源意味着任何人都可以使用和修改该软件。任何人都可以从互联网上下载MySQL软件并使用它而无需支付任何费用。如果愿意,您可以学习源代码并进行更改以适合您的需求。MySQL软件使用http://www.fsf.org/licenses/的GPL(GNU通用公共许可证) 来定义您在不同情况下可以使用或不可以使用的软件。如果您对GPL不满意,或者需要将MySQL代码嵌入到商业应用程序中,可以从我们这里购买商业许可的版本。有关更多信息,请参见“ MySQL许可概述”(http://www.mysql.com/company/legal/licensing/)

数据库排名

MySQL数据库服务器非常快速,可靠,可扩展且易于使用。

如果这是您想要的,请尝试一下。MySQL Server可以与其他应用程序,Web服务器等一起轻松地在台式机或笔记本电脑上运行,几乎不需要或根本不需要注意。如果将整台计算机专用于MySQL,则可以调整设置以利用所有可用的内存,CPU能力和I / O容量。MySQL还可以扩展到一起联网的机器集群。

MySQL Server最初是为处理大型数据库而开发,其处理速度比现有解决方案要快得多,并且已经在苛刻的生产环境中成功使用了数年。尽管经过不断的发展,MySQL Server如今提供了丰富而有用的功能。它的连接性,速度和安全性使MySQLServer非常适合访问Internet上的数据库。

MySQL Server在客户端/服务器或嵌入式系统中运行。

MySQL数据库软件是一个客户端/服务器系统,由支持不同后端的多线程SQL Server,几个不同的客户端程序和库,管理工具以及广泛的应用程序编程接口(API)组成。

我们还提供MySQL Server作为嵌入式多线程库,您可以将其链接到应用程序中,以获取更小,更快,更易于管理的独立产品。

提供了大量的MySQL贡献软件。

MySQL Server具有与我们的用户密切合作开发的一组实用功能。您最喜欢的应用程序或语言很可能支持MySQL数据库服务器。

发音“ MySQL”的官方方法是“ My Ess Que Ell”(不是“ my sequel”),但是我们不介意将其发音为“ my sequel”还是其他本地化方式。

MySQL的前世今生

2001年MySQL数据库中加入了另一个存储引擎InnoDB。InnoDB支持事务,支持行级锁定,对于高并发的用户来说,可谓及时雨。至此,MySQL中的MyISAM和InnoDB两大主力引擎均已就位,而互联网大潮也早就鼓舞起来,MySQL也开始有了自己的市场。所以在2001年发布的3.23 版本的时候,该版本已经支持大多数的基本的SQL 操作,而且还集成了MyISAM和InnoDB 存储引擎。MySQL与InnoDB的正式结合版本是4.0。

2005年,MySQL5.0版本发布,这是个非常重要的版本,提供了众多特性,比如说:存储过程、触发器、视图、游标、分布式事务等,它也越来越像是一个企业级的数据库,具备了较为全面的技术指标。

正当一切看起来很顺利的时候,InnoDB存储引擎的版权商Innobase被Oracle收购。同年Oracle又收购了Sleepcat公司,该公司为MySQL提供了支持事务的BDB存储引擎。很明显MySQL被Oracle盯上了。

2007年MySQL的年总收入已经达到了7500万美元,照此下去2008年非常有希望达到1个亿的目标。然而,事实难料,SUN公司出价10亿美元,收购MySQL公司,及其拥有的MySQL产品、商标及版本。

后来由于种种原因MySQL创始人:Michael Widenius、Allan Larssion先后向SUN公司提交了辞呈,离开了他们一手创立的企业。

2009年Oracle公司出价74亿美元收购SUN公司,通过收购SUN公司,Oracle终于将MySQL收入囊中

MySQL版本

官方版本介绍
英文版
中文版

要安装哪个MySQL版本和发行版首先,确定是安装开发版本还是通用版本(GA)。开发版本具有最新功能,但不建议用于生产环境。GA 版本,也称为生产版本或稳定版本,旨在用于生产用途。我们建议使用最新的GA版本。MySQL 8.0中的命名方案使用的发行版名称由三个数字和一个可选的后缀组成(例如,mysql-8.0.1-dmr)。发行名称中的数字解释如下:• 第一个数字(8)是主版本号。•

第二个数字(0)是次要版本号。总而言之,主要和次要数字构成发行版本号。序列号描述了稳定的功能集。• 第三个数字(1)是发行系列中的版本号。对于每个新的错误修正版本,此值均递增。在大多数情况下,系列中的最新版本是最佳选择。版本名称也可以包含一个后缀,以指示版本的稳定性。一系列发行中的发布会通过一组后缀来指示稳定性水平如何提高。可能的后缀为:• dmr指示开发里程碑版本(DMR)。MySQL开发使用里程碑模型,其中每个里程碑都引入了一小部分经过全面测试的功能。从一个里程碑到下一个里程碑,基于尝试这些正常发布的社区成员提供的反馈,功能界面可能会更改,甚至功能可能会被删除。里程碑版本中的功能可能被视为具有预生产质量。• rc表示发布候选(RC)。通过MySQL的所有内部测试后,发布候选版本被认为是稳定的。RC版本中可能仍会引入新功能,但是重点将转移到修复错误上,以稳定本系列中较早引入的功能。

缺少后缀表示一般可用性(GA)或生产版本。GA版本稳定,已成功通过了较早的发布阶段,并且被认为是可靠的,没有严重的错误并且适合在生产系统中使用。系列开发工作从DMR版本开始,随后是RC版本,最后达到GA状态版本。

mysql版本及操作系统支持表

1
https://www.mysql.com/support/supportedplatforms/database.html

aarAds.png

可以发现,mysql5.6和5.7和8.0 都支持linux centos7或centos6的x86_64架构的

但是ARM 64架构的只有mysql8.0才支持。

windows 10 只支持 mysql5.7和mysql8.0

windows server 2012 和server 2016 mysql5.6、5.7 和 8.0都支持

macOS 10.14版本只支持5.7和8.0版本。

在Windows 10 上安装 MySQL 8.0.19

重要提示:MySQL 8.0 Server 在Windows 平台上安装需要安装“Microsoft Visual C++ 2015 Redistributable Package” 如果是Debug版本,还需要安装“Visual Studio 2015”, 另外MySQL 8.0 只能运行在 64 位的平台上。

安装方法一:使用安装文件直接安装

1.首先下载安装文件 MySQL Installer 8.0.19

这里分两种文件:

一种是在线安装包:mysql-installer-web-community-8.0.19.0.msi(没有绑定任何应用程序)

一种是离线安装包:mysql-installer-community-8.0.19.0.msi(绑定了相关的应用程序)

安装后文件目录结构:

安装目录:C:\Program Files\MySQL

Server目录:C:\Program Files\MySQL\MySQL Server 8.0

bin:该目录包含 mysqld server,客户端工具及可执行文件

docs:版本发行信息

etc:示例 include: (C/C++)头文件

lib:库文件

share:存放一些字符集,语言文件等信息 数据目录:C:\ProgramData\MySQL\MySQL Server 8.0

Data:存放日志和数据库文件

my.ini:配置文件

安装方法二:使用压缩包文件安装

安装包下载:

1.通用版下载 mysql-8.0.19-winx64.zip

2.Debug版本 mysql-8.0.19-winx64-debug-test.zip

步骤:

1.解压缩

2.新建my.ini文件,放在 basedir 目录下(即与 bin 目录同级)

1
2
3
4
5
[mysqld]
# set basedir to your installation path
basedir=D:/MySQLDir
# set datadir to the location of your data directory
datadir=D:\\MySQLDir\\data

3.配置环境变量:

1)新建MySQL_HOME变量,并配置 D:/MySQLDir

2)编辑path系统变量 Path:%MySQL_HOME%\bin

4.初始化:d:\MySQLDir\bin>mysqld –initialize –console

注意默认的初始化密码

如果不指定 –console 初始化的相关信息会保存在这个路径下的err文件中:D:\MySQLDir\data\JeeStudy-PC.err 这里不建议使用:–initialize-insecure ,尤其是在生成环境中,绝对不要使用,因为他不产生随机密码!!!

通过初始化会产生默认用户root,即 ‘root’@’localhost’

5.启动:mysqld –console

6.登录:mysql -u root -p

7.修改密码:

1
2
3
mysql> alter user 'root'@'localhost'  identified by '123';
mysql> alter user session_user() identified by '123';
mysql> alter user user() identified by '123';

8.安装服务:

mysqld –install mysql819 (删除服务:sc delete mysql819 或者:mysqld –remove mysql819)

9.启动服务:

net start mysql819 (停止服务:net stop mysql819)

10.测试:
查看数据库:mysqlshow.exe -u root -p
查看mysql数据库中的表:mysqlshow.exe mysql -u root -p
执行一个sql语句:mysql -e “select user,host,plugin from mysql.user” mysql -u root -p

11.登录后,查看数据库 show databases;

12.再次初始化:

1
2
3
4
5
6
7
mysqld --initialize --console

2020-03-27T02:58:20.717236Z 0 [System] [MY-013169] [Server] D:\MySQLDir\bin\mysqld.exe (mysqld 8.0.19) initializing of server in progress as process 7492
2020-03-27T02:58:20.868250Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
2020-03-27T02:58:20.868291Z 0 [ERROR] [MY-013236] [Server] The designated data directory D:\MySQLDir\data\ is unusable. You can remove all files that the server added to it.
2020-03-27T02:58:20.908326Z 0 [ERROR] [MY-010119] [Server] Aborting
2020-03-27T02:58:20.949898Z 0 [System] [MY-010910] [Server] D:\MySQLDir\bin\mysqld.exe: Shutdown complete (mysqld 8.0.19) MySQL Community Server - GPL.

13.创建用户:

1
create user 'yichen'@localhost identified by '321';

14.数据库测试:

1
mysql test -u root -p 123

15.查看字符集:

1
2
mysql> show variables like '%character%';
mysql> show charset;

16.注意:
1)用这种方法安装,要注意防火墙,需要把MySQL相关的端口添加到防火墙允许策略,否则不让连接。

2)修改mysql.user 中的Host,因为默认是localhost,只能本机连接(这也是一种安全策略) Host is not allowed to connect to this MySQL server。

解决方案:UPDATE mysql.user SET Host='%' WHERE User='root'; (这里我们以root为例)
如果不重启服务器,还需要执行: flush privileges;

3)Authentication plugin ‘caching_sha2_password’ cannot be loaded: 找不到指定的模块。这是因为MySQL 8中使用的加密策略是 caching_sha2_password ,如果使用不支持这个加密方式的客户端时会报出这个错误。MySQL 8 之前的版本中加密规则是 mysql_native_password,所以想要连接最新版本的MySQL数据库,需要最新版支持 caching_sha2_password 加密方式的客户端(像:MySQL的CE、Navicat150都是支持的)

1
2
3
4
5
6
7
8
[mysqld]
# set basedir to your installation path
basedir=D:/MySQLDir
# set datadir to the location of your data directory
datadir=D:\\MySQLDir\\data

# 默认使用“mysql_native_password”插件认证 -- 不推荐使用
default_authentication_plugin=mysql_native_password #这是旧的加密方式。

在Linux下 MySQL 8.0 下载安装详解

安装环境

1
2
3
4
5
6
7
8
9
yum install -y redhat-lsb

lsb_release -a

LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.8.2003 (Core)
Release: 7.8.2003
Codename: Core

如果遇到这个问题,解决方案如下:
问题:centos8 市场 Cannot update read-only repo
解决方法:
1、dnf install -y centos-release-stream
2、dnf update
3、重启CentOS 8

安装方法一:在线傻瓜式安装

1
dnf install @mysql

选择Y会继续执行。再次输入Y后安装完成。

2.启动服务,并设置开机启动

1
systemctl enable --now mysqld

3.验证 mysqld 是否正在运行

1
systemctl status mysqld

结果:Active: active (running) since Mon 2020-03-30 19:11:12 CST; 39s ago

到此 安装MySQL 8.0成功!!!

安装方法二:在线傻瓜式安装
1.获取yum地址或rpm包

官方地址:

1
https://dev.mysql.com/downloads/repo/yum/

根据OS版本,选择Download,在新的页面 “**No thanks, just start my download.**”右键选择“复制链接地址”这样就可以把地址复制下来了,当然也可以直接点击,把rpm包下载下来后进行安装(直接进入第3步)。

2.根据第一步获取下载链接后可以在命令行中直接下载:

1
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

3.安装MySQL的yum源:

1
rpm -ivh mysql80-community-release-el7-3.noarch.rpm

4.安装mysql服务:

1
yum install mysql-server

5.启动mysql

1
2
systemctl enable mysqld.service
systemctl start mysqld.service

查看零时密码

1
2
3
grep  password /var/log/mysqld.log

2020-07-16T09:23:00.016493Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: huuleKe,u3su

安全性

1
mysql_secure_installation

运行mysql_secure_installation脚本,该脚本执行一些与安全性相关的操作并设置MySQL root 密码(移除匿名用户、禁用root远程登录、删除test数据库、重新加载权限表)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Enter password for user root: 
#输入临时密码
The existing password for the user account root has expired. Please set a new password.
New password:
#输入新密码 密码设置不能太简单,需要包含大小写或特殊符号
Re-enter new password:
#再次输入新密码
The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.
Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n
#这里表示密码已经更改完成,是否需要继续更改。n就是不更改。 y就是继续更改。

Remove anonymous users? (Press y|Y for Yes, any other key for No) : n
#删除匿名用户

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : n
通常,仅应允许root连接
'本地主机'。 这确保了某人无法猜测
来自网络的根密码。

禁止远程root登录? 选择n不禁用。
Remove test database and access to it? (Press y|Y for Yes, any other key for No): n
是否删除测试库。
Reload privilege tables now? (Press y|y
让上面的操作生效

密码加密方式:
由于CentOS 8中的某些客户端工具和库与caching_sha2_password方法不兼容,因此CentOS 8存储库中包含的MySQL 8.0服务器设置为使用旧的mysql_native_password身份验证插件,该方法在上游MySQL 8.0发行版中设置为默认。对于大多数设置,mysql_native_password方法应该没问题,但是,如果你想将默认身份验证插件更改为caching_sha2_password,这样可以更快并提供更好的安全性,请打开以下配置文件:

1
vim  /etc/my.cnf.d/mysql-default-authentication-plugin.cnf

将default_authentication_plugin的值更改为caching_sha2_password:

1
2
[mysqld]
default_authentication_plugin=caching_sha2_password

关闭并保存文件,然后重新启动MySQL服务器以使更改生效:

1
systemctl restart mysqld

方法三:tar包安装(推荐)

aar1eJ.png

如果以前使用操作系统本机软件包管理系统(例如Yum或APT)安装了MySQL,则在使用本机二进制文件安装时可能会遇到问题。确保以前的MySQL安装已完全删除(使用程序包管理系统),并且所有其他文件(例如数据文件的旧版本)也已删除。您还应该检查配置文件(例如/etc/my.cnf/etc/mysql目录)并删除它们

MySQL对libaio 库有依赖性。如果未在本地安装此库,则数据目录初始化和随后的服务器启动步骤将失败。如有必要,请使用适当的程序包管理器进行安装

1
2

yum install libaio -y

1.下载tar文件

1
2

https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz

2.通过rz命令上传到指定的文件夹/usr/local(rz如果没有可以安装一下:yum install -y lrzsz)

为什么选择 /usr/local 这个路径安装呢?是因为MySQL默认安装路径是这个,选用这个路径是,使用它的默认属性安装,

3.解压

1
tar -xf mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz -C /usr/local/

4.重命名解压后的文件夹:

1
mv /usr/local/mysql-8.0.21-linux-glibc2.12-x86_64  /usr/local/mysql

5.增加用户及用户组

1
2
3
4
groupadd mysql
useradd -r -g mysql -s /bin/false mysql

#-s(不允许登录) -g(加入mysql组)

注意:可以用命令查看一下是否存在mysql用户:cat /etc/passwd |grep mysql另外,强烈建议使用:-s /bin/false ,这个可以用来防止该用户登录。

6.建立存放数据库数据的目录 data(名字随便命名)

1
mkdir /usr/local/mysql/data

7.把新建立的data目录指定给mysql组及mysql用户。

1
chown mysql:mysql /usr/local/mysql/data/  -R

8.改变data权限

1
chmod 750 /usr/local/mysql/data/ -R

增加配置文件

1
2
3
4
5
6
7
8
9
10
11
vim /etc/my.cnf

[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
pid-file=/usr/local/mysql/data/mysql.pid
socket=/usr/local/mysql/data/mysql.sock
log-error=/var/log/mysqld.log

[client]
socket= /usr/local/mysql/data/mysql.sock

创建myqld.log日志文件

1
2
3
touch /var/log/mysqld.log

chown mysql:mysql /var/log/mysqld.log

9.初始化数据库

1
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
1
2
3
grep password /var/log/mysqld.log

2020-07-16T11:45:47.844368Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: hXKenqkj:78j

注意:初始化后会生成密码

10.启用SSL协议(默认也是启用的)

1
/usr/local/mysql/bin/mysql_ssl_rsa_setup

SSL介绍
SSL(Secure Socket Layer:安全套接字层)利用数据加密、身份验证和消息完整性验证机制,为基于TCP等可靠连接的应用层协议提供安全性保证。
SSL协议提供的功能主要有:
1、数据传输的机密性:利用对称密钥算法对传输的数据进行加密。

2.、身份验证机制:基于证书利用数字签名方法对服务器和客户端进行身份验证,其中客户端的身份验证是可选的。

3、消息完整性验证:消息传输过程中使用MAC算法来检验消息的完整性。

如果用户的传输不是通过SSL的方式,那么其在网络中数据都是以明文进行传输的,而这给别有用心的人带来了可乘之机。所以,现在很多大型网站都开启了SSL功能。同样地,在我们数据库方面,如果客户端连接服务器获取数据不是使用SSL连接,那么在传输过程中,数据就有可能被窃取。

提示:
可以用命令查看当前数据库是否启用了SSL协议

1
show variables like 'have_ssl';

11.守护进程 启动 mysql 服务

1
/usr/local/mysql/bin/mysqld_safe --user=mysql &

12.推荐启动(停止)命令

1
2
3
4
5
6
cd /usr/local/mysql/
在该目录下有一个文件夹:support-files,把该文件夹下的文件 mysql.server 拷贝到 /etc/init.d/ 这目录

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

systemctl daemon-reload

启动

1
2
3
4

/etc/init.d/mysqld start

说明:查看底层脚本,会发现在启动时调用的是:$bindir/mysqld_safe

停止

1
/etc/init.d/mysqld stop

重启

1
/etc/init.d/mysqld restart

查看状态

1
/etc/init.d/mysqld status

重新加载(强制动态启动)

1
2
3
4
/etc/init.d/mysqld reload 
或者
/etc/init.d/mysqld force-reload
说明:如果想要更改配置而不需停止并重新启动服务,则使用该命令。在对配置文件作必要的更改后,发出该命令以动态更新服务配置。

或者

1
2
3
4
systemctl restart mysqld
systemctl start mysqld
systemctl status mysqld
systemctl reload mysqld

13.设置环境变量

1
2
3
4
5
6
vim /etc/profile

export PATH=$PATH:/usr/local/mysql/bin

#执行下
source /etc/profile

非常规安装:
1.改变数据目录:改变之前先停掉MySQL服务相关进程
需要在下面路径中建立my.cnf 文件

/etc/my.cnf
添加下面内容:

1
2
[mysqld]
datadir=/MySQLDir/dataDir

2.改变MySQL程序目录:
需要在上面的文件中添加如下配置:

1
basedir=/soft/mysql

还需要修改/etc/init.d/mysqld 文件的数据目录路径

配置用户和密码

官方文档

1
https://dev.mysql.com/doc/refman/8.0/en/set-password.html
1
2
3
mysql> alter user user() identified by "123.Shui!!#@";

#user() 函数表示当前登录用户,

注意

帐户更改(包括分配密码)的首选语句 不是使用SET PASSWORD 分配密码,而是使用ALTER USER该语句。例如:

1
ALTER USER user() IDENTIFIED BY '123.Shui!!';

创建可以远程登录的用户:

1
2
3
4
5
create user 'root'@'%' identified with mysql_native_password by '123.Shui!!#@';

grant all privileges on *.* to root@'%' with grant option;

flush privileges;

删除权限

1
REVOKE all privileges ON *.* FROM 'test1'@'%';

后期修改密码

1
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123.Shui!!#@';

忘记密码修改。

1
2
3
4
vim /etc/my.cnf   (在[mysqld]参数组下添加)
skip-grant-tables #跳过授权表

重启mysql

登录 把user变里的authentication_string字段的内容清空。

1
2
3
4
5
mysql -u root 

select user,host,authentication_string from mysql.user; #查看表的内容信息

update mysql.user set authentication_string='' where user='root' and host='%';

然后退出

退出,把Skip-grant-table语句删除,重新启动数据库

1
2
3
4
5
6
7
8
9
alter user'root'@'%' IDENTIFIED BY '123.Shui!!#@';  
#默认的模式。之前旧模式,修改后就是旧模式,之前是新模式就是新模式。最好就是每次修改自己指定

修改密码为mysql_native_password身份验证模式。
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123.Shui!!#@@';

修改密码为caching_sha2_password身份验证模式。
ALTER USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY '123.Shui!!#@';
新的身份验证模式。

再使用新的密码登录

mysql基础语句操作

一,mysql基础命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1、启动服务
说明: 以管理员身份运行cmd
格式: net start 服务名称
示例: net start mysql5

2、停止服务
说明: 以管理员身份运行cmd
格式: net stop 服务名称
示例: net stop mysql5.7

3、连接数据库
格式:mysql -u 用户名 -P 端口号 -p
示例:mysql -u root -P 3308 -p
输入密码(安装时设置的)

4、退出登录(断开连接)
quit或exit \c
决定不想执行正在输入的查询,请输入\ c取消查询

5、 查看版本(连接后执行)
示例: select version();

6、 显示当前时间(连接后执行)
示例: select now();

7、 远程连接
格式: mysql -h ip地址 -u 用户名 -P 端口号 -p
输入对方密码
示例: mysql -h 192.168.224.11 -u root -P 3306 -p

二、数据库操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1、创建数据库
格式: create database 数据库名 charset=utf8;
示例: create database yichen charset=utf8;

2、删除数据库
格式: drop database 数据库名;
示例: drop database yichen;

3、切换数据库
格式: use 数据库名 ;
示例: use yichen;

4、查看当前选择的数据库
格式: select database();
示例: select database();

三、表操作(DDL) 对表操作的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1、查看当前数据库中所有表
show tables;

2、创建表
格式:create table 表名(列及类型);
说明: auto_increment 表明自增长 primary key 主键 not nell 表示不为空
示例:create table student(id int auto_increment primary key,name varchar(20) not null, age int not null, gender bit default 1, address varchar(20),isDelete bit default 0);

3、删除表
格式: drop table 表名;
示例: drop table student;

4、 查看表结构
格式:desc 表名;
示例: desc student;

5、查看建表语句
格式:show create table 表名;
示例:show create table student;

6、 重命名表名
格式:rename table 原表名 to 新表名
示例:rename table car to newCar;

7、修改表
格式:alter table 表名 add|change|drop 列名 类型;
示例: alter table newcar add isDelete bit default 0;

四、数据操作(DML) 对表内容操作

1、增

1
2
3
4
5
6
7
8
9
10
11
12
1、全列插入
格式:insert into 表名 values(...)
说明:主键列是自动增长,但是在全列插入时需要站位,通常使用0,插入成功以后以实际数据为准,
示例:insert into student values(0,"tom",19, 1,"北京", 0);
2、缺省插入
格式:insert into 表名(列1,列2,....) values(值1,值2,....);

示例:insert into student(name,age,address) values ("linei",19,"上海");

3、同时插入多条数据
格式: insert into 表名 values(.....),(.....),(....);
示例: insert into student values(0,"韩梅梅",19, 0,"北京", 0),(0,"poi",19, 0,"海南", 0),(0,"liwei",20, 0,"北京", 0);

2、 删

1
2
3
格式: delete from 表名 where 条件;
示例: delete from student where id = 4;
注意: 没有条件是全部删除,慎用! delete from student;

3、改

1
2
3
4
5
格式:update 表名 set 列1=值1,列2=值2,...... where 条件 ;
示例1:update student set age=16 where id = 7;
示例2: update student set age=16,name="yichen" where id = 8;
示列3: update user set host="%" where user="root";
注意: 没有条件是全部列都修改,慎用!

数据查询(DQL)

1
2
3
 查询表中的全部数据
格式: select * from 表名;
示例: select * from student;

1、基本语法

1
2
3
4
5
6
7
8
9
10
11
格式:select * from 表名:
说明:
a、from 关键字后面是表名,表示数据来源于这张表
b、select 后面写表中的列名,如果是* 表示在结果的集中显示表中的所有列
c、在select后面的列名部分,可以使用as为列名起别名,这个别名显示在结果集中
d、 如果要查询多个列,之间使用逗号分隔

示列:
select * from student;
select name, age from student;
select name as a, age from student;

2、消除重复行

1
2
3
4
在select 后面列前面使用distinct可以消除重复的行
示列:
select gender from student;
select distinct gender from student;

3、条件查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
1、语法
格式:select * from 表名 where 条件

2、比较运算符
等于 =
大于 >
小于 <
大于等于 >=
小于等于 <=
不等于 != 或<>
需求:查询id值大于8的所有数据
示例: select * from student where id>8;

3、逻辑运算符
and 并且
or 或者
not 非
需求: 查询id值大于7的女同学
示例: select * from student where id>7 and gender=0;

4、模糊查询
insert into student values(0,"刘德华",50, 1,"香港", 0);
insert into student values(0,"刘阳",52, 1,"北京", 0);
like
%表示任意多个字符
_表示一个任意字符

需求:查询姓刘的同学
示例:select * from student where name like "刘%";
select * from student where name like "刘_";
5、范围查询
in 表示在一个非连续的范围内
between ...and.. 表示在一个连续的范围内
需求: 查询编号为8、10、12的学生
示例: select * from student where id in (8,10,12);
需求: 查询编号为6到8的学生
示例: select * from student where id between 6 and 8;

6、空判断
insert into student(name,age) values ("特朗普",72);
注意: null与""是不同
判断空: is null
判断非空: is not null

需求:查询没有地址的同学
示例: select * from student where address is null;
需求: 查询有地址的同学
示例: select * from student where address is not null;
7、优先级
小括号, not 比较运算符, 逻辑运算符
and比or 优先级高,如果同时出现并希望先选or,需要结合()来使用

4、聚合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
为了快速的统计数据,提供了5个聚合函数
1、count(*) 表示计算总行数,括号中的可以写*和列名
2、max(列) 表示求此列的最大值
3、min(列) 表示求此列的最小值
4、sum(列) 表示求此列的和
5、avg(列) 表示求此列的平均值

需求: 查询学生的总数
示例: select count(*) from student; 或 select count(name) from student;

需求: 查询女生的编号最大值
示例: select max(id) from student where gender =0;

需求: 查询女生的年龄最大值
示例: select max(age) from student where gender =0;

需求: 查询女生的编号最小值
示例: select min(id) from student where gender =0;

需求: 查询所有学生的年龄和
示例: select sum(age) from student;

需求: 查询所有学生的年龄的平均值
示例: select avg(age) from student;

5、分组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
按照字段分组,表示此字段相同的数据会被放到一个集合中。
分组后,只能查询出相同的数据列,对于有差异的数据列无法显示在结果中
可以对分组后的数据进行统计,做聚合运算

语法:select 列1,列2,聚合.....from 表名 group by 列1,列2,列3,.....
需求: 查询男女生的总数
示例: select gender,count(*) from student group by gender;

select name,gender,count(*) from student group by gender,age;

分组后的数据筛选:select 列1,列2,聚合.....from 表名 group by 列1,列2,列3,..... having 列1,列2,..聚合....
示例: select gender,count(*) from student group by gender having gender;

where与having的区别:
where是对from后面指定的表进行筛选,属于对原始数据筛选。
having是对group by 的结果进行筛选。

6、排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
语法:select * from 表名 order by 列1 asc|desc, 列2 asc|desc, .....;
说明:
1、将数据按照列1进行排序,如果某些列1的值相同,则按照列2进行排序,
2、默认按照从小到大的顺序排序
3、asc升序
4、desc降序

需求:按年龄排序
示列: select * from student order by age;
需求:将没有被删除的数据按年龄降序
示例: select * from student where isDelete =0 order by age desc;

需求:将数据年龄和id都降序
示例: select * from student where isDelete =0 order by age desc,id desc;

7、分页

1
2
3
4
5
6
7
8
语法: select * from 表名 limit start ,count;  
说明: start索引从0开始。
需求: 从0行开始看,每页看3行
示例: select * from student limit 0,3;
需求: 从3行开始看,每页看3行
示例: select * from student limit 3,3;
需求: 只看女生,从0行开始,每页看3行
示例: select * from student where gender=0 limit 0,3;

五,数据控制语言(DCL) grant 授权

官方文档

1
https://dev.mysql.com/doc/refman/8.0/en/grant.html

创建用户

文档

1
https://dev.mysql.com/doc/refman/8.0/en/create-user.html

帐户名的主机名部分(如果省略)默认为'%'

1
create user 'test1' identified by '123.yichen';    #这种没有指定为旧的密码身份验证,有些客户端连不上。不支持,
1
2
3
4
5
6
创建用户,使用mysql_native_password的身份验证插件。
create user 'test2'@'%' identified with mysql_native_password by 'Mysql138#$';
这样远程可以连接了,但是还没有数据库访问权限,需要授权。

创建用户,使用caching_sha2_password的身份验证插件。#默认也是这种的。
CREATE USER 'test3'@'%' IDENTIFIED WITH caching_sha2_password BY 'Mysql138#$';

授权(grant)

1
2
3
4
5
6
7
8
9
10
所有权限:
GRANT ALL ON *.* TO 'test1'@'%'; #这样就可以访问数据库权限了。
flush privileges;

使副本能够从源读取二进制日志事件,复制,配置主从使用的
grant super,replication slave on *.* to 'test1'@'%';
flush privileges;

查询和插入权限:
GRANT SELECT, INSERT ON *.* TO 'test2'@'test2';

要将GRANT OPTION 特权授予帐户而不更改其特权,请执行以下操作:

1
GRANT USAGE ON *.* TO 'someuser'@'somehost' WITH GRANT OPTION;

请谨慎对待授予谁GRANT OPTION特权,因为具有不同特权的两个用户可能可以组合特权!

您不能授予其他用户您自己没有的特权;该GRANT OPTION 特权使您只能分配自己拥有的那些特权。

请注意,当您向用户授予 GRANT OPTION特定特权级别的特权时,该用户在该级别拥有(或将来可能会授予)的任何特权也可以由该用户授予其他用户。假设您授予用户INSERT对数据库的特权。然后,如果您授予 SELECT数据库特权并指定WITH GRANT OPTION,则该用户不仅可以将SELECT特权授予其他用户,还可以将特权 授予其他用户 INSERT。如果你再授予 UPDATE权限的数据库用户,用户可以授予 INSERTSELECTUPDATE

对于非管理用户,不应在ALTER全局或mysql系统架构上授予 特权。如果这样做,用户可以尝试通过重命名表来破坏特权系统!

权限回收(revoke)

1
2
3
4
5
6

回收插入权限:
REVOKE INSERT ON *.* FROM 'test1'@'%';

回收world库下面的查询权限
REVOKE SELECT ON world.* FROM 'test1';

六、关联

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
建表语句:
1、create table class(id int auto_increment primary key, name varchar(20) not null,stuNum int not null );
2、create table students(id int auto_increment primary key ,name varchar(20) not null, gender bit default 1, classid int not null,foreign key(classid)references class(id));

插入一些数据:
insert into class values(0,"python01",55),(0,"python02",50),(0,"python03",60),(0,"python04",80);

insert into students values(0,"tom",1,1);
insert into students values(0,"lilei",1,10);
insert into students values(0,"jack",1,2);

关联查询:
select students.name,class.name from class inner join students on class.id=students.classid;
select students.name,class.name from class left join students on class.id=students.classid;

分类:
1、表 inner join 表B
表A与表B匹配的行会出现在结果集中
2、表A left join 表B;
表A与表B匹配的行会出现在结果集中,外加表A中独有的数据,未对应的数据使用null填充
3、表A right join 表B
表A与表B匹配的行会出现在结果集中,外加表A中独有的数据,未对应的数据使用null填充
select students.name,class.name from class right join students on class.id=students.classid;

评论


:D 一言句子获取中...

加载中,最新评论有1分钟缓存...