大数据-搭建 MySQL 环境

62 阅读5分钟

我正在参加「掘金·启航计划」

介绍一下:

本文主要内容是,在 centos 系统上,安装 Mysql 数据库和数据库的基本操作,以动手实践为主要内容。

一、修改 CentOS 默认 yum 源

  1. 备份系统自带的 yum 源配置文件

    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    
  2. 下载阿里云的 yum 源配置文件

    wget http://mirrors.aliyun.com/repo/Centos-7.repo
    mv Centos-7.repo /etc/yum.repos.d/CentOS-Base.repo
    
  3. 执行生成缓存命令

    yum makecache
    

二、MySQL 安装与配置

MySQL是一个关系型数据库管理系统,本步骤指导您如何在ECS实例上安装MySQL。

  1. 执行如下命令,更新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
    
  2. 执行如下命令,安装MySQL。

    yum -y install mysql-community-server --nogpgcheck
    
  3. 执行如下命令,查看MySQL版本号。

    mysql -V
    

    返回结果如下,表示您已成功安装MySQL。

    mysql  Ver 14.14 Distrib 5.7.39, for Linux (x86_64) using  EditLine wrapper
    
  4. 执行如下命令,启动MySQL服务。

    systemctl start mysqld
    
  5. 执行如下命令,设置MySQL服务开机自启动。

    systemctl enable mysqld
    
  6. 配置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 数据库基本操作

  1. 执行以下命令,使用root用户登录数据库。

    mysql -uroot -p12345678
    
  2. 执行如下命令,创建test数据库。

    create database test;
    
  3. 执行如下命令,查看当前数据库列表。此时,可以看到三个数据库:information_schema ,mysql,performance_schema,sys,test 。

    show databases;
    

    注意:进入 mysql 之后,每条命令结尾都要有分号。

  4. 执行命令 use mysql;,连接 mysql 数据库。然后执行命令 show tables; ,查看 mysql 数据库中的数据表。使用命令 exit ,退出 MySQL 界面。

    use mysql;
    show tables; 
    exit
    
  5. 返回 Linux 界面,执行如下命令,将名为 test 的数据库备份到当前目录的 test.sql。界面显示 Enter password,输入 MySQL 数据库的登录密码 12345678 。根据备份的数据库大小,等待时间长短不同。完成后,使用命令 ll 查看备份文件,界面查看到备份文件 test.sql ,完成备份。

    mysqldump -uroot -p test >test.sql
    ll
    
  6. 返回 Linux 界面,执行如下命令,将 test.sql 导入数据库。界面显示 Enter password ,输入 MySQL 数据库的登录密码 12345678 。

    说明:其中参数 -D 是指定数据库为test。

    mysql -uroot -p -Dtest<test.sql
    
  7. 还有一种导入方法:输入命令: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 语句,数据的增删查改等。

  1. 若当前不是在 Mysql 数据库的命令界面,请执行命令:mysql -uroot -p12345678 ,登录到 Mysql 数据库命令行界面。否则,请忽略此操作。

    然后,在Mysql中,执行命令 use test; ,连接 test 数据库。界面提示 Database changed ,表示现在使用的数据库为 test 数据库。

    use test;
    
  2. 执行命令 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 数据类型,....);

  3. 执行命令 insert into test1 values(1,"zhangsan"); ,插入一条数据:此条数据的第一列 id 的值为1,第二列 name 的值为zhangsan。

    insert into test1 values(1,"zhangsan");
    

    语法:INSERT INTO 表名称 VALUES (值1, 值2,....);

  4. 执行命令 select * from test1; ,查看 test1 表中的全部数据信息。此时,用户可以查看到新插入的一行数据: id 的值为 1 , name 的值为 zhangsan 。

    select * from test1;
    

    语法1:SELECT * FROM 表名称; //查询表中的所有列的数据信息

    语法2:SELECT 列名称 FROM 表名称; //查询表中的指定列的数据信息

  5. 执行命令 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 表名称 = 值;

  6. 执行命令 delete from test1 where id =1; ,删除 test1 表中,所有 id 值为 1 的数据。

    delete from test1 where id =1;
    select * from test1;
    

    语法:DELETE FROM 表名称 WHERE 列名称 = 值;

  7. 执行命令 drop table test1; 删除名为 test1 的数据表。

    drop table test1;
    show tables;
    

    语法:DROP TABLE 表名称

  8. 执行命令 drop database test; ,删除名为 test 的数据库。

    drop database test;
    show databases;
    

    语法:DROP DATABASE 数据库名称

五、MySQL 数据表操作

单表操作

  1. 创建表 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 设置编码。
  2. 查看数据表

    show tables;
    
  3. 插入数据

    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');
    
  4. 查询数据

    select * from webSite;
    
  5. 更新数据

    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 条件的所有行。

  1. 创建日志表

    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;
    
  2. 插入日志数据

    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');
    

展示数据库

  1. 下面是选自 "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)
    
  2. 下面是 "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" 列联系起来的。

  1. 然后,如果我们运行下面的 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;
    
  2. 不同的 SQL JOIN

    在我们继续讲解实例之前,我们先列出您可以使用的不同的 SQL JOIN 类型:

    • INNER JOIN:如果表中有至少一个匹配,则返回行
    • LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
    • RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
    • FULL JOIN:只要其中一个表中存在匹配,则返回行