我正在参加「掘金·启航计划」
介绍一下:
本文主要内容是,在 centos 系统上,安装 Mysql 数据库和数据库的基本操作,以动手实践为主要内容。
一、修改 CentOS 默认 yum 源
-
备份系统自带的 yum 源配置文件
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
-
下载阿里云的 yum 源配置文件
wget http://mirrors.aliyun.com/repo/Centos-7.repo mv Centos-7.repo /etc/yum.repos.d/CentOS-Base.repo
-
执行生成缓存命令
yum makecache
二、MySQL 安装与配置
MySQL是一个关系型数据库管理系统,本步骤指导您如何在ECS实例上安装MySQL。
-
执行如下命令,更新YUM源。
# mysql Ver 14.14 Distrib 5.7.40 rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm # mysql Ver 8.0 rpm -Uvh http://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm
-
执行如下命令,安装MySQL。
yum -y install mysql-community-server --nogpgcheck
-
执行如下命令,查看MySQL版本号。
mysql -V
返回结果如下,表示您已成功安装MySQL。
mysql Ver 14.14 Distrib 5.7.39, for Linux (x86_64) using EditLine wrapper
-
执行如下命令,启动MySQL服务。
systemctl start mysqld
-
执行如下命令,设置MySQL服务开机自启动。
systemctl enable mysqld
-
配置MySQL的root用户密码。
a. 执行如下命令,查看/var/log/mysqld.log文件,获取root用户的初始密码。
grep 'temporary password' /var/log/mysqld.log
返回结果如下所示,您可以查看到root用户的初始密码。
2022-08-17T02:23:50.713890Z 1 [Note] A temporary password is generated for root@localhost: VK*!WaxVo6114y # 初始密码 K*!WaxVo6114y
b. 执行以下命令,使用root用户登录数据库。
mysql -uroot -p
输入root用户的初始密码。(输入的密码是不会显示出来的)
c. 执行以下命令,修改 MySQL 的 root 用户的初始密码。
set global validate_password_policy=0; #修改密码安全策略为低(只校验密码长度,至少8位)。 ALTER USER 'root'@'localhost' IDENTIFIED BY '12345678';
d. 执行以下命令,授予 root 用户远程管理权限。
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '12345678';
e. 输入 exit 退出数据库。
三、MySQL 数据库基本操作
-
执行以下命令,使用root用户登录数据库。
mysql -uroot -p12345678
-
执行如下命令,创建test数据库。
create database test;
-
执行如下命令,查看当前数据库列表。此时,可以看到三个数据库:information_schema ,mysql,performance_schema,sys,test 。
show databases;
注意:进入 mysql 之后,每条命令结尾都要有分号。
-
执行命令 use mysql;,连接 mysql 数据库。然后执行命令 show tables; ,查看 mysql 数据库中的数据表。使用命令 exit ,退出 MySQL 界面。
use mysql; show tables; exit
-
返回 Linux 界面,执行如下命令,将名为 test 的数据库备份到当前目录的 test.sql。界面显示 Enter password,输入 MySQL 数据库的登录密码 12345678 。根据备份的数据库大小,等待时间长短不同。完成后,使用命令 ll 查看备份文件,界面查看到备份文件 test.sql ,完成备份。
mysqldump -uroot -p test >test.sql ll
-
返回 Linux 界面,执行如下命令,将 test.sql 导入数据库。界面显示 Enter password ,输入 MySQL 数据库的登录密码 12345678 。
说明:其中参数 -D 是指定数据库为test。
mysql -uroot -p -Dtest<test.sql
-
还有一种导入方法:输入命令:mysql -uroot -p12345678 ,进入 MySQL 数据库。输入 use test; ,连接数据库 test ,输入 source /root/test.sql; ,将 test.sql 导入数据库 test ,全部出现 Query OK ,则表示数据库导入成功。
mysql -uroot -p12345678 use test; source /root/test.sql;
四、常用 SQL 命令
本小节将主要介绍基本的 SQL 语句,数据的增删查改等。
-
若当前不是在 Mysql 数据库的命令界面,请执行命令:mysql -uroot -p12345678 ,登录到 Mysql 数据库命令行界面。否则,请忽略此操作。
然后,在Mysql中,执行命令 use test; ,连接 test 数据库。界面提示 Database changed ,表示现在使用的数据库为 test 数据库。
use test;
-
执行命令 create table test1 (id int,name char(20)); ,创建一张表,表名为 test1 。test1 表有两列:id 和 name。其中,id 的数据类型为 int,name 的数据类型为 char,且字符长度为 20。
说明:mysql 命令执行完成,页面会提示 Query OK 。
create table test1 (id int,name char(20));
语法:CREATE TABLE 表名称 (列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);
-
执行命令 insert into test1 values(1,"zhangsan"); ,插入一条数据:此条数据的第一列 id 的值为1,第二列 name 的值为zhangsan。
insert into test1 values(1,"zhangsan");
语法:INSERT INTO 表名称 VALUES (值1, 值2,....);
-
执行命令 select * from test1; ,查看 test1 表中的全部数据信息。此时,用户可以查看到新插入的一行数据: id 的值为 1 , name 的值为 zhangsan 。
select * from test1;
语法1:SELECT * FROM 表名称; //查询表中的所有列的数据信息
语法2:SELECT 列名称 FROM 表名称; //查询表中的指定列的数据信息
-
执行命令 update test1 set name = "lisi" where id =1; ,更新 test1 表中的数据,也就是,将所有 id 为 1 的 name 值均修改为 lisi 。
update test1 set name = "lisi" where id =1; select * from test1;
语法:UPDATE 表名称 SET 列名 = 值 WHERE 表名称 = 值;
-
执行命令 delete from test1 where id =1; ,删除 test1 表中,所有 id 值为 1 的数据。
delete from test1 where id =1; select * from test1;
语法:DELETE FROM 表名称 WHERE 列名称 = 值;
-
执行命令 drop table test1; 删除名为 test1 的数据表。
drop table test1; show tables;
语法:DROP TABLE 表名称
-
执行命令 drop database test; ,删除名为 test 的数据库。
drop database test; show databases;
语法:DROP DATABASE 数据库名称
五、MySQL 数据表操作
单表操作
-
创建表 webSite
CREATE TABLE IF NOT EXISTS `webSite`( `id` INT UNSIGNED AUTO_INCREMENT, `name` VARCHAR(60) NOT NULL, `url` VARCHAR(100) NOT NULL, `alexa` INT(40) NOT NULL, `country` VARCHAR(100) NOT NULL, PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
实例解析:
- 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
- AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
- PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
- ENGINE 设置存储引擎,CHARSET 设置编码。
-
查看数据表
show tables;
-
插入数据
INSERT INTO webSite (name, url, alexa, country) VALUES ('Google','https://www.google.com/','1','USA'); INSERT INTO webSite (name, url, alexa, country) VALUES ('淘宝','https://www.taobao.com/','13','CN'); INSERT INTO webSite (name, url, alexa, country) VALUES ('菜鸟教程','https://www.runoob.com/','4689','CN'); INSERT INTO webSite (name, url, alexa, country) VALUES ('微博','https://www.weibo.com/','20','CN'); INSERT INTO webSite (name, url, alexa, country) VALUES ('Facebook','https://www.facebook.com/','3','USA'); INSERT INTO webSite (name, url, alexa, country) VALUES ('百度','https://www.baidu.com/','4','CN');
-
查询数据
select * from webSite;
-
更新数据
UPDATE webSite SET alexa = 99, country = 'USA' WHERE id = 5; UPDATE webSite SET alexa = 88, country = 'USA' WHERE name = "菜鸟教程";
六、SQL 连接 JOIN
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN)。 SQL INNER JOIN 从多个表中返回满足 JOIN 条件的所有行。
-
创建日志表
CREATE TABLE IF NOT EXISTS `access_log`( `aid` INT UNSIGNED AUTO_INCREMENT, `site_id` INT(10) NOT NULL, `count` INT(10) NOT NULL, `date` VARCHAR(60) NOT NULL, PRIMARY KEY ( `aid` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
插入日志数据
INSERT INTO access_log (site_id, count, date) VALUES (1,45,'2016-05-10'); INSERT INTO access_log (site_id, count, date) VALUES (3,100,'2016-05-13'); INSERT INTO access_log (site_id, count, date) VALUES (1,230,'2016-05-15'); INSERT INTO access_log (site_id, count, date) VALUES (2,10,'2016-05-18'); INSERT INTO access_log (site_id, count, date) VALUES (5,205,'2016-05-14'); INSERT INTO access_log (site_id, count, date) VALUES (4,13,'2016-05-14'); INSERT INTO access_log (site_id, count, date) VALUES (3,220,'2016-05-13'); INSERT INTO access_log (site_id, count, date) VALUES (5,545,'2016-05-14'); INSERT INTO access_log (site_id, count, date) VALUES (3,201,'2016-05-17');
展示数据库
-
下面是选自 "webSites" 表的数据:
mysql> select * from webSite; +----+--------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+--------------+---------------------------+-------+---------+ | 1 | Google | https://www.google.com/ | 1 | USA | | 2 | 淘宝 | https://www.taobao.com/ | 13 | CN | | 3 | 菜鸟教程 | https://www.runoob.com/ | 88 | USA | | 4 | 微博 | https://www.weibo.com/ | 20 | CN | | 5 | Facebook | https://www.facebook.com/ | 99 | USA | | 6 | 百度 | https://www.baidu.com/ | 4 | CN | +----+--------------+---------------------------+-------+---------+ 6 rows in set (0.00 sec)
-
下面是 "access_log" 网站访问记录表的数据:
mysql> select * from access_log; +-----+---------+-------+------------+ | aid | site_id | count | date | +-----+---------+-------+------------+ | 1 | 1 | 45 | 2016-05-10 | | 2 | 3 | 100 | 2016-05-13 | | 3 | 1 | 230 | 2016-05-15 | | 4 | 2 | 10 | 2016-05-18 | | 5 | 5 | 205 | 2016-05-14 | | 6 | 4 | 13 | 2016-05-14 | | 7 | 3 | 220 | 2016-05-13 | | 8 | 5 | 545 | 2016-05-14 | | 9 | 3 | 201 | 2016-05-17 | +-----+---------+-------+------------+ 9 rows in set (0.00 sec)
请注意,"Websites" 表中的 "id" 列指向 "access_log" 表中的字段 "site_id"。上面这两个表是通过 "site_id" 列联系起来的。
-
然后,如果我们运行下面的 SQL 语句(包含 INNER JOIN,其中 inner 可以省略不写):
select a.name,a.alexa,b.count,b.date from webSite as a inner join access_log as b on a.id=b.site_id;
执行结果如下
mysql> select a.name,a.alexa,b.count,b.date from webSite as a inner join access_log as b on a.id=b.site_id; +--------------+-------+-------+------------+ | name | alexa | count | date | +--------------+-------+-------+------------+ | Google | 1 | 45 | 2016-05-10 | | 菜鸟教程 | 88 | 100 | 2016-05-13 | | Google | 1 | 230 | 2016-05-15 | | 淘宝 | 13 | 10 | 2016-05-18 | | Facebook | 99 | 205 | 2016-05-14 | | 微博 | 20 | 13 | 2016-05-14 | | 菜鸟教程 | 88 | 220 | 2016-05-13 | | Facebook | 99 | 545 | 2016-05-14 | | 菜鸟教程 | 88 | 201 | 2016-05-17 | +--------------+-------+-------+------------+ 9 rows in set (0.00 sec)
以上 SQL 语句等价于:下面使用的 where 子句
select a.* , b.* from webSite a ,access_log b where a.id=b.site_id;
-
不同的 SQL JOIN
在我们继续讲解实例之前,我们先列出您可以使用的不同的 SQL JOIN 类型:
- INNER JOIN:如果表中有至少一个匹配,则返回行
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN:只要其中一个表中存在匹配,则返回行