MySQL 是当前最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
在本教程中,会让大家快速掌握 MySQL 的基本知识,并轻松使用 MySQL 数据库。
一、概念和定义
什么是数据库?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。
我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:
- 数据以表格的形式出现
- 每行为各种记录名称
- 每列为记录名称所对应的数据域
- 许多的行和列组成一张表单
- 若干的表单组成database
RDBMS 术语
在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:
- 数据库: 数据库是一些关联表的集合。
- 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
- 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
- 行:一行(元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
- 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键:外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
- 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
- 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:
- 表头(header): 每一列的名称;
- 列(col): 具有相同数据类型的数据的集合;
- 行(row): 每一行用来描述某条记录的具体信息;
- 值(value): 行的具体信息, 每个值必须与该列的数据类型相同;
- 键(key): 键的值在当前列中具有唯一性。
MySQL数据库
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
- MySQL 是开源的,目前隶属于 Oracle 旗下产品。
- MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
- MySQL 使用标准的 SQL 数据语言形式。
- MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
- MySQL 对 PHP 有很好的支持,PHP 是很适合用于 Web 程序开发。
- MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
- MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。
二、安装与配置
所有平台的 MySQL 下载地址为: MySQL 下载 。 挑选你需要的 MySQL Community Server 版本及对应的平台。
注意:安装过程我们需要通过开启管理员权限来安装,否则会由于权限不足导致无法安装。
Linux/UNIX 上安装 MySQL
Linux平台上推荐使用RPM包来安装Mysql,MySQL AB提供了以下RPM包的下载地址:
- MySQL - MySQL服务器。你需要该选项,除非你只想连接运行在另一台机器上的MySQL服务器。
- MySQL-client - MySQL 客户端程序,用于连接并操作Mysql服务器。
- MySQL-devel - 库和包含文件,如果你想要编译其它MySQL客户端,例如Perl模块,则需要安装该RPM包。
- MySQL-shared - 该软件包包含某些语言和应用程序需要动态装载的共享库(libmysqlclient.so*),使用MySQL。
- MySQL-bench - MySQL数据库服务器的基准和性能测试工具。
安装前,我们可以检测系统是否自带安装 MySQL:
rpm -qa | grep mysql
如果你系统有安装,那可以选择进行卸载:
rpm -e mysql // 普通删除模式 rpm -e --nodeps mysql // 强力删除模式,如果使用上面命令删除时,提示有依赖的其它文件,则用该命令可以对其进行强力删除
安装 MySQL:
接下来我们在 Centos7 系统下使用 yum 命令安装 MySQL,需要注意的是 CentOS 7 版本中 MySQL数据库已从默认的程序列表中移除,所以在安装前我们需要先去官网下载 Yum 资源包,下载地址为:MySQL :: Download MySQL Yum Repository
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum update yum install mysql-server
权限设置:
chown -R mysql:mysql /var/lib/mysql/
初始化 MySQL:
mysqld --initialize
启动 MySQL:
systemctl start mysqld
查看 MySQL 运行状态:
systemctl status mysqld
注意:如果我们是第一次启动 mysql 服务,mysql 服务器首先会进行初始化的配置。
此外,你也可以使用 MariaDB 代替,MariaDB 数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可。开发这个分支的原因之一是:甲骨文公司收购了 MySQL 后,有将 MySQL 闭源的潜在风险,因此社区采用分支的方式来避开这个风险。
MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。
yum install mariadb-server mariadbmariadb数据库的相关命令是:
systemctl start mariadb #启动MariaDB systemctl stop mariadb #停止MariaDB systemctl restart mariadb #重启MariaDB systemctl enable mariadb #设置开机启动
验证 MySQL 安装
在成功安装 MySQL 后,一些基础表会表初始化,在服务器启动后,你可以通过简单的测试来验证 MySQL 是否工作正常。
使用 mysqladmin 工具来获取服务器状态:
使用 mysqladmin 命令来检查服务器的版本, 在 linux 上该二进制文件位于 /usr/bin 目录,在 Windows 上该二进制文件位于C:\mysql\bin 。
[root@host]# mysqladmin --version
linux上该命令将输出以下结果,该结果基于你的系统信息:
mysqladmin Ver 8.23 Distrib 5.0.9-0, for redhat-linux-gnu on i386
如果以上命令执行后未输出任何信息,说明你的Mysql未安装成功。
使用 MySQL Client(Mysql客户端) 执行简单的SQL命令
你可以在 MySQL Client(Mysql客户端) 使用 mysql 命令连接到 MySQL 服务器上,默认情况下 MySQL 服务器的登录密码为空,所以本实例不需要输入密码。
命令如下:
[root@host]# mysql
以上命令执行后会输出 mysql>提示符,这说明你已经成功连接到Mysql服务器上,你可以在 mysql> 提示符执行SQL命令:
mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql | | test | +----------+ 2 rows in set (0.13 sec)
Mysql安装后需要做的
Mysql安装成功后,默认的root用户密码为空,你可以使用以下命令来创建root用户的密码:
[root@host]# mysqladmin -u root password "new_password";
现在你可以通过以下命令来连接到Mysql服务器:
[root@host]# mysql -u root -p Enter password:*******
注意:在输入密码时,密码是不会显示了,你正确输入即可。
Windows 上安装 MySQL
Windows 上安装 MySQL 相对来说会较为简单,最新版本可以在 MySQL 下载 中下载中查看(更详细安装:Windows 上安装 MySQL)。
点击 Download 按钮进入下载页面,点击下图中的 No thanks, just start my download. 就可立即下载:
下载完后,我们将 zip 包解压到相应的目录,这里我将解压后的文件夹放在 C:\web\mysql-8.0.11 下。
接下来我们需要配置下 MySQL 的配置文件
打开刚刚解压的文件夹 C:\web\mysql-8.0.11 ,在该文件夹下创建 my.ini 配置文件,编辑 my.ini 配置以下基本信息:
[client] # 设置mysql客户端默认字符集 default-character-set=utf8[mysqld] # 设置3306端口 port=3306 # 设置mysql的安装目录 basedir=C:\\web\\mysql-8.0.11 # 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错 # datadir=C:\\web\\sqldata # 允许最大连接数 max_connections=20 # 服务端使用的字符集默认为8比特编码的latin1字符集 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB
接下来我们来启动下 MySQL 数据库:
以管理员身份打开 cmd 命令行工具,切换目录:
cd C:\web\mysql-8.0.11\bin
初始化数据库:
mysqld --initialize --console
执行完成后,会输出 root 用户的初始默认密码,如:
... 2018-04-20T02:35:05.464644Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: APWCY5ws&hjQ ...
APWCY5ws&hjQ 就是初始密码,后续登录需要用到,你也可以在登陆后修改密码。
输入以下安装命令:
mysqld install
启动输入以下命令即可:
net start mysql
注意: 在 5.7 需要初始化 data 目录:
cd C:\web\mysql-8.0.11\bin mysqld --initialize-insecure初始化后再运行 net start mysql 即可启动 mysql。
登录 MySQL
当 MySQL 服务已经运行时, 我们可以通过 MySQL 自带的客户端工具登录到 MySQL 数据库中, 首先打开命令提示符, 输入以下格式的命名:
mysql -h 主机名 -u 用户名 -p
参数说明:
- -h : 指定客户端所要登录的 MySQL 主机名, 登录本机(localhost 或 127.0.0.1)该参数可以省略;
- -u : 登录的用户名;
- -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。
如果我们要登录本机的 MySQL 数据库,只需要输入以下命令即可:
mysql -u root -p
按回车确认, 如果安装正确且 MySQL 正在运行, 会得到以下响应:
Enter password:
若密码存在, 输入密码登录, 不存在则直接按回车登录。登录成功后你将会看到 Welcome to the MySQL monitor... 的提示语。
然后命令提示符会一直以 mysql> 加一个闪烁的光标等待命令的输入, 输入 exit 或 quit 退出登录。
三、MySQL 管理
启动及关闭 MySQL 服务器
Windows 系统下
启动 MySQL 服务器:
1、通过 "服务" 管理工具: 打开"运行"对话框(Win + R),输入 services.msc,找到"MySQL"服务,右击选择"启动"。
2、通过命令提示符: 打开命令提示符(以管理员身份),输入以下命令:
net start mysql
关闭MySQL服务器:
1、通过 "服务" 管理工具:同样打开"运行"对话框,输入 services.msc,找到 "MySQL" 服务,右击选择"停止"。
2、通过命令提示符: 打开命令提示符(以管理员身份),输入以下命令:
net stop mysql
Linux 系统下
1、启动 MySQL 服务:
使用 systemd命令(适用于大多数现代 Linux 发行版,如 Ubuntu、CentOS 等):
sudo systemctl start mysql
使用 service 命令(在一些较旧的发行版中):
sudo service mysql start
2、关闭 MySQL 服务:
使用 systemd:
sudo systemctl stop mysql
使用 service 命令:
sudo service mysql stop
3、重启 MySQL 服务:
使用 systemd:
sudo systemctl restart mysql
使用 service 命令:
sudo service mysql restart
4、检查 MySQL 服务状态:
使用 systemd命令:
sudo systemctl status mysql
使用 service 命令:
sudo service mysql status
Mac OS 系统
启动 MySQL 服务:
使用命令行:
sudo /usr/local/mysql/support-files/mysql.server start
关闭 MySQL 服务:
使用命令行:
sudo /usr/local/mysql/support-files/mysql.server stop
重启 MySQL 服务:
使用命令行:
sudo /usr/local/mysql/support-files/mysql.server restart
检查 MySQL 服务状态:
使用命令行:
sudo /usr/local/mysql/support-files/mysql.server status
以上命令中,mysql 可能会因为安装路径或版本的不同而有所变化。
在 Mac OS 中,MySQL 的安装路径通常是 /usr/local/mysql/,因此启动和关闭 MySQL 服务需要使用这个路径下的 mysql.server 脚本。
MySQL 用户设置
在 MySQL 中,用户设置包括创建用户、设置权限、管理用户等操作。以下是一些常用的 MySQL 用户设置操作,包括创建用户、设置权限、查看和删除用户等。
创建用户
要创建一个新用户,你可以使用以下 SQL 命令:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
username
:用户名。host
:指定用户可以从哪些主机连接。例如,localhost
仅允许本地连接,%
允许从任何主机连接。password
:用户的密码。
例如:CREATE USER 'john'@'localhost' IDENTIFIED BY 'password123';
授权权限
创建用户后,你需要授予他们访问权限,使用 GRANT 命令来授予权限:
GRANT privileges ON database_name.* TO 'username'@'host';
privileges
:所需的权限,如ALL PRIVILEGES
、SELECT
、INSERT
、UPDATE
、DELETE
等。database_name.*
:表示对某个数据库或表授予权限。database_name.*
表示对整个数据库的所有表授予权限,database_name.table_name
表示对指定的表授予权限。TO 'username'@'host'
:指定授予权限的用户和主机。
例如:GRANT ALL PRIVILEGES ON test_db.* TO 'john'@'localhost';
刷新权限
授予或撤销权限后,需要刷新权限使更改生效:
FLUSH PRIVILEGES;
查看用户权限
要查看特定用户的权限,可以使用以下命令:
SHOW GRANTS FOR 'username'@'host';
例如:SHOW GRANTS FOR 'john'@'localhost';
撤销权限
要撤销用户的权限,使用 REVOKE 命令:
REVOKE privileges ON database_name.* FROM 'username'@'host';
例如:REVOKE ALL PRIVILEGES ON test_db.* FROM 'john'@'localhost';
删除用户
如果需要删除用户,可以使用以下命令:
DROP USER 'username'@'host';
例如:DROP USER 'john'@'localhost';
修改用户密码
要修改用户的密码,可以使用 ALTER USER 命令:
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';
例如:ALTER USER 'john'@'localhost' IDENTIFIED BY 'newpassword456';
修改用户主机
要更改用户的主机(即允许从哪些主机连接),可以先删除用户,再重新创建一个新的用户。
例如:-- 删除旧用户
DROP USER 'john'@'localhost';
-- 重新创建用户并指定新的主机
CREATE USER 'john'@'%' IDENTIFIED BY 'password123';
创建用户时指定权限
在创建用户时,也可以同时授予权限(在 MySQL 8.0.16 及更高版本):
例如:CREATE USER 'john'@'localhost' IDENTIFIED BY 'password123' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON test_db.* TO 'john'@'localhost';
/etc/my.cnf 文件配置
/etc/my.cnf 文件是 MySQL 配置文件,用于配置 MySQL 服务器的各种参数和选项。
一般情况下,你不需要修改该配置文件,该文件默认配置如下:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock[mysql.server] user=mysql basedir=/var/lib[safe_mysqld] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
在配置文件中,你可以指定不同的错误日志文件存放的目录,一般你不需要改动这些配置。
/etc/my.cnf 文件在不同的系统和 MySQL 版本中可能有所不同,但是一般包含以下几个部分:
1. 基本设置
basedir
: MySQL 服务器的基本安装目录。datadir
: 存储 MySQL 数据文件的位置。socket
: MySQL 服务器的 Unix 套接字文件路径。pid-file
: 存储当前运行的 MySQL 服务器进程 ID 的文件路径。port
: MySQL 服务器监听的端口号,默认是 3306。
2. 服务器选项
bind-address
: 指定 MySQL 服务器监听的 IP 地址,可以是 IP 地址或主机名。server-id
: 在复制配置中,为每个 MySQL 服务器设置一个唯一的标识符。default-storage-engine
: 默认的存储引擎,例如 InnoDB 或 MyISAM。max_connections
: 服务器可以同时维持的最大连接数。thread_cache_size
: 线程缓存的大小,用于提高新连接的启动速度。query_cache_size
: 查询缓存的大小,用于提高相同查询的效率。default-character-set
: 默认的字符集。collation-server
: 服务器的默认排序规则。
3. 性能调优
innodb_buffer_pool_size
: InnoDB 存储引擎的缓冲池大小,这是 InnoDB 性能调优中最重要的参数之一。key_buffer_size
: MyISAM 存储引擎的键缓冲区大小。table_open_cache
: 可以同时打开的表的缓存数量。thread_concurrency
: 允许同时运行的线程数。
4. 安全设置
skip-networking
: 禁止 MySQL 服务器监听网络连接,仅允许本地连接。skip-grant-tables
: 以无需密码的方式启动 MySQL 服务器,通常用于恢复忘记的 root 密码,但这是一个安全风险。auth_native_password=1
: 启用 MySQL 5.7 及以上版本的原生密码认证。
5. 日志设置
log_error
: 错误日志文件的路径。general_log
: 记录所有客户端连接和查询的日志。slow_query_log
: 记录执行时间超过特定阈值的慢查询。log_queries_not_using_indexes
: 记录未使用索引的查询。
6. 复制设置
master_host
和master_user
: 主服务器的地址和复制用户。master_password
: 复制用户的密码。master_log_file
和master_log_pos
: 用于复制的日志文件和位置。
管理MySQL的命令
以下列出了使用Mysql数据库过程中常用的命令:
-
USE 数据库名 :
选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。mysql> use RUNOOB; Database changed
-
SHOW DATABASES:
列出 MySQL 数据库管理系统的数据库列表。mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | RUNOOB | | cdcol | | mysql | | onethink | | performance_schema | | phpmyadmin | | test | | wecenter | | wordpress | +--------------------+ 10 rows in set (0.02 sec)
-
SHOW TABLES:
显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。mysql> use RUNOOB; Database changed mysql> SHOW TABLES; +------------------+ | Tables_in_runoob | +------------------+ | employee_tbl | | runoob_tbl | | tcount_tbl | +------------------+ 3 rows in set (0.00 sec)
-
SHOW COLUMNS FROM 数据表:
显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。mysql> SHOW COLUMNS FROM runoob_tbl; +-----------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+--------------+------+-----+---------+-------+ | runoob_id | int(11) | NO | PRI | NULL | | | runoob_title | varchar(255) | YES | | NULL | | | runoob_author | varchar(255) | YES | | NULL | | | submission_date | date | YES | | NULL | | +-----------------+--------------+------+-----+---------+-------+ 4 rows in set (0.01 sec)
-
SHOW INDEX FROM 数据表:
显示数据表的详细索引信息,包括PRIMARY KEY(主键)。mysql> SHOW INDEX FROM runoob_tbl; +------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | runoob_tbl | 0 | PRIMARY | 1 | runoob_id | A | 2 | NULL | NULL | | BTREE | | | +------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 1 row in set (0.00 sec)
-
SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern'] \G:
该命令将输出Mysql数据库管理系统的性能及统计信息。mysql> SHOW TABLE STATUS FROM RUNOOB; # 显示数据库 RUNOOB 中所有表的信息mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'; # 表名以runoob开头的表的信息 mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'\G; # 加上 \G,查询结果按列打印
四、MySQL 连接
使用 MySQL 二进制方式连接
您可以使用 MySQL 二进制方式进入到 mysql 命令提示符下来连接 MySQL 数据库,格式如下:
mysql -u your_username -p
参数说明:
-u
参数用于指定用户名。-p
参数表示需要输入密码。
实例
以下是从命令行中连接 mysql 服务器的简单实例:
[root@host]# mysql -u root -p Enter password:******
按照提示输入密码,并按下 Enter 键。
在登录成功后会出现 mysql> 命令提示窗口,你可以在上面执行任何 SQL 语句。
以上命令执行后,登录成功输出结果如下:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2854760 to server version: 5.0.9Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
在以上实例中,我们使用了 root 用户登录到 MySQL 服务器,当然你也可以使用其他 MySQL 用户登录。
如果用户权限足够,任何用户都可以在 MySQL 的命令提示窗口中进行 SQL 操作。
成功连接到 MySQL 后,你可以在命令行中直接执行 SQL 查询。
列出所有可用的数据库:
SHOW DATABASES;
选择要使用的数据库:
USE your_database;
列出所选数据库中的所有表:
SHOW TABLES;
退出 mysql> 命令提示窗口可以使用 exit 命令,如下所示:
mysql> EXIT; Bye
或者使用:
mysql> QUIT;
或者按下 Ctrl + D(在 Unix/Linux 系统中)。