Przeglądaj źródła

更新了数据库部分的相关文档

jackfrued 6 lat temu
rodzic
commit
5f5ebe4b79
1 zmienionych plików z 163 dodań i 28 usunięć
  1. 163 28
      Day36-40/关系型数据库MySQL.md

+ 163 - 28
Day36-40/关系型数据库MySQL.md

@@ -31,10 +31,142 @@
 
 
 ### MySQL简介
 ### MySQL简介
 
 
-1. 安装和配置(以Linux环境为例)。
+1. 安装和配置(以CentOS Linux环境为例)。
+
+   - Linux下有一个MySQL的分支版本,名为MariaDB,它由MySQL的一些原始开发者开发,有商业支持,旨在继续保持MySQL数据库在[GNU GPL](https://zh.wikipedia.org/wiki/GNU%E9%80%9A%E7%94%A8%E5%85%AC%E5%85%B1%E8%AE%B8%E5%8F%AF%E8%AF%81)下开源(因为大家担心MySQL被甲骨文收购后会不再开源)。如果决定要直接使用MariaDB作为MySQL的替代品,可以使用下面的命令进行安装。
+
+     ```Shell
+     yum install mariadb mariadb-server
+     ```
+
+   - 如果要安装官方版本的MySQL,可以在[MySQL官方网站](<https://www.mysql.com/>)下载安装文件。首先在下载页面中选择平台和版本,然后找到对应的下载链接。下面以MySQL 5.7.26版本和Red Hat Enterprise Linux为例,直接下载包含所有安装文件的归档文件,解归档之后通过包管理工具进行安装。
+
+     ```Shell
+     wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
+     tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
+     ```
+
+     如果系统上有MariaDB相关的文件,需要先移除MariaDB相关的文件。
+
+     ```Shell
+     yum list installed | grep mariadb | awk '{print $1}' | xargs yum erase -y
+     ```
+
+     接下来可以按照如下所示的顺序用RPM(Redhat Package Manager)工具安装MySQL。
+
+     ```Shell
+     rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
+     rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
+     rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
+     rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
+     ```
+
+     可以使用下面的命令查看已经安装的MySQL相关的包。
+
+     ```Shell
+     rpm -qa | grep mysql
+     ```
+
+   - 启动MySQL服务。
+
+     先修改MySQL的配置文件(`/etc/my.cnf`)添加一行`skip-grant-tables`,可以设置不进行身份验证即可连接MySQL服务器,然后就可以以超级管理员(root)身份登录。
+
+     ```Shell
+     vim /etc/my.cnf
+     ```
+
+     ```INI
+     [mysqld]
+     skip-grant-tables
+     
+     datadir=/var/lib/mysql
+     socket=/var/lib/mysql/mysql.sock
+     
+     symbolic-links=0
+     
+     log-error=/var/log/mysqld.log
+     pid-file=/var/run/mysqld/mysqld.pid
+     ```
+
+     接下来可以使用下面的命令来启动MySQL。
+
+     ```Shell
+     service mysqld start
+     ```
+
+     在CentOS 7中建议使用下面的命令来启动MySQL。
+
+     ```Shell
+     systemctl start mysqld
+     ```
+
+   - 使用MySQL客户端工具连接服务器。
+
+     命令行工具:
+
+     ```Shell
+     mysql -u root
+     ```
+
+     修改超级管理员(root)的访问口令为hello_world_123。
+
+     ```SQL
+     use mysql;
+     update user set authentication_string=password('i_LOVE_macos_123') where user='root';
+     flush privileges;
+     ```
+
+     将MySQL配置文件中的`skip-grant-tables`去掉,然后重启服务器,重新登录。这一次需要提供用户名和口令才能连接MySQL服务器。
+
+     ```Shell
+     systemctl restart mysqld
+     mysql -u root -p
+     ```
+
+     也可以选择图形化的客户端工具来连接MySQL服务器,可以选择下列工具之一:
+
+     - MySQL Workbench(官方提供的工具)
+     - Navicat for MySQL(界面简单优雅,功能直观强大)
+     - SQLyog for MySQL(强大的MySQL数据库管理员工具)
 
 
 2. 常用命令。
 2. 常用命令。
 
 
+   - 查看服务器版本。
+
+     ```SQL
+     select version();
+     ```
+
+   - 查看所有数据库。
+
+     ```SQL
+     show databases;
+     ```
+
+   - 切换到指定数据库。
+
+     ```SQL
+     use mysql;
+     ```
+
+   - 查看数据库下所有表。
+
+     ```Shell
+     show tables;
+     ```
+
+   - 获取帮助。
+
+     ```SQL
+     ? contents;
+     ? functions;
+     ? numeric functions;
+     ? round;
+     
+     ? data types;
+     ? longblob;
+     ```
+
 
 
 ### SQL详解
 ### SQL详解
 
 
@@ -142,7 +274,7 @@
    delete from tb_student where stuid=4040;
    delete from tb_student where stuid=4040;
    
    
    -- 更新学生数据
    -- 更新学生数据
-   update tb_student set stuname='周芷若', stuaddr='湖南长沙' where stuid=1378;
+   update tb_student set stuname='杨过', stuaddr='湖南长沙' where stuid=1001;
    
    
    -- 插入老师数据
    -- 插入老师数据
    insert into tb_teacher (teaid, teaname, teatitle, collid) values 
    insert into tb_teacher (teaid, teaname, teatitle, collid) values 
@@ -196,6 +328,7 @@
    select couname, coucredit from tb_course;
    select couname, coucredit from tb_course;
    select couname as 课程名称, coucredit as 学分 from tb_course;
    select couname as 课程名称, coucredit as 学分 from tb_course;
    
    
+   -- 查询所有学生的姓名和性别(条件运算)
    select stuname as 姓名, case stusex when 1 then '男' else '女' end as 性别 from tb_student;
    select stuname as 姓名, case stusex when 1 then '男' else '女' end as 性别 from tb_student;
    select stuname as 姓名, if(stusex, '男', '女') as 性别 from tb_student;
    select stuname as 姓名, if(stusex, '男', '女') as 性别 from tb_student;
    
    
@@ -231,8 +364,7 @@
    select distinct stuaddr from tb_student where stuaddr is not null;
    select distinct stuaddr from tb_student where stuaddr is not null;
    
    
    -- 查询男学生的姓名和生日按年龄从大到小排列(排序)
    -- 查询男学生的姓名和生日按年龄从大到小排列(排序)
-   -- asc - ascending - 升序(从小到大)
-   -- desc - descending - 降序(从大到小)
+   -- asc (ascending) - 升序(从小到大)/ desc (descending) - 降序(从大到小)
    select stuname as 姓名, year(now())-year(stubirth) as 年龄 from tb_student where stusex=1 order by 年龄 desc;
    select stuname as 姓名, year(now())-year(stubirth) as 年龄 from tb_student where stusex=1 order by 年龄 desc;
    
    
    -- 聚合函数:max / min / count / sum / avg
    -- 聚合函数:max / min / count / sum / avg
@@ -243,15 +375,10 @@
    select max(stubirth) from tb_student;
    select max(stubirth) from tb_student;
    
    
    -- 查询男女学生的人数(分组和聚合函数)
    -- 查询男女学生的人数(分组和聚合函数)
-   select count(stuid) from tb_student;
    select stusex, count(*) from tb_student group by stusex;
    select stusex, count(*) from tb_student group by stusex;
-   select stusex, min(stubirth) from tb_student group by stusex;
    
    
    -- 查询课程编号为1111的课程的平均成绩(筛选和聚合函数)
    -- 查询课程编号为1111的课程的平均成绩(筛选和聚合函数)
    select avg(scmark) from tb_score where couid=1111;
    select avg(scmark) from tb_score where couid=1111;
-   select min(scmark) from tb_score where couid=1111;
-   select count(scid) from tb_score where couid=1111;
-   select count(scmark) from tb_score where couid=1111;
    
    
    -- 查询学号为1001的学生所有课程的平均分(筛选和聚合函数)
    -- 查询学号为1001的学生所有课程的平均分(筛选和聚合函数)
    select avg(scmark) from tb_score where stuid=1001;
    select avg(scmark) from tb_score where stuid=1001;
@@ -260,8 +387,7 @@
    select stuid as 学号, avg(scmark) as 平均分 from tb_score group by stuid;
    select stuid as 学号, avg(scmark) as 平均分 from tb_score group by stuid;
    
    
    -- 查询平均成绩大于等于90分的学生的学号和平均成绩
    -- 查询平均成绩大于等于90分的学生的学号和平均成绩
-   -- 分组以前的筛选使用where子句
-   -- 分组以后的筛选使用having子句
+   -- 分组以前的筛选使用where子句 / 分组以后的筛选使用having子句
    select stuid as 学号, avg(scmark) as 平均分 from tb_score group by stuid having 平均分>=90;
    select stuid as 学号, avg(scmark) as 平均分 from tb_score group by stuid having 平均分>=90;
    
    
    -- 查询年龄最大的学生的姓名(子查询/嵌套的查询)
    -- 查询年龄最大的学生的姓名(子查询/嵌套的查询)
@@ -282,7 +408,7 @@
    -- 查询学生姓名、课程名称以及成绩(连接查询)
    -- 查询学生姓名、课程名称以及成绩(连接查询)
    select stuname, couname, scmark from tb_student t1, tb_course t2, tb_score t3 where t1.stuid=t3.stuid and t2.couid=t3.couid and scmark is not null;
    select stuname, couname, scmark from tb_student t1, tb_course t2, tb_score t3 where t1.stuid=t3.stuid and t2.couid=t3.couid and scmark is not null;
    
    
-   -- 内连接和分页查询
+   -- 查询学生姓名、课程名称以及成绩按成绩从高到低查询第11-15条记录(内连接+分页)
    select stuname, couname, scmark from tb_student t1 inner join tb_score t3 on t1.stuid=t3.stuid inner join tb_course t2 on t2.couid=t3.couid where scmark is not null order by scmark desc limit 5 offset 10;
    select stuname, couname, scmark from tb_student t1 inner join tb_score t3 on t1.stuid=t3.stuid inner join tb_course t2 on t2.couid=t3.couid where scmark is not null order by scmark desc limit 5 offset 10;
    
    
    select stuname, couname, scmark from tb_student t1 inner join tb_score t3 on t1.stuid=t3.stuid inner join tb_course t2 on t2.couid=t3.couid where scmark is not null order by scmark desc limit 10, 5;
    select stuname, couname, scmark from tb_student t1 inner join tb_score t3 on t1.stuid=t3.stuid inner join tb_course t2 on t2.couid=t3.couid where scmark is not null order by scmark desc limit 10, 5;
@@ -293,9 +419,8 @@
    select stuname, avgmark from tb_student t1 inner join 
    select stuname, avgmark from tb_student t1 inner join 
    (select stuid, avg(scmark) as avgmark from tb_score group by stuid) t2 on t1.stuid=t2.stuid;
    (select stuid, avg(scmark) as avgmark from tb_score group by stuid) t2 on t1.stuid=t2.stuid;
    
    
-   -- 内连接(inner join):只有满足连接条件的记录才会被查出来
-   -- 外连接(outer join):左外连接 / 右外连接 / 全外连接
-   -- left outer join / right outer join / full outer join
+   -- 内连接(inner join)- 只有满足连接条件的记录才会被查出来
+   -- 外连接(outer join)- 左外连接(left outer join) / 右外连接(right outer join) / 全外连接
    -- 查询每个学生的姓名和选课数量(左外连接和子查询)
    -- 查询每个学生的姓名和选课数量(左外连接和子查询)
    select stuname, ifnull(total, 0) from tb_student t1 left outer join (select stuid, count(stuid) as total from tb_score group by stuid) t2 on t1.stuid=t2.stuid;
    select stuname, ifnull(total, 0) from tb_student t1 left outer join (select stuid, count(stuid) as total from tb_score group by stuid) t2 on t1.stuid=t2.stuid;
    ```
    ```
@@ -306,32 +431,42 @@
    -- 创建名为hellokitty的用户
    -- 创建名为hellokitty的用户
    create user 'hellokitty'@'%' identified by '123123';
    create user 'hellokitty'@'%' identified by '123123';
    
    
-   -- 将对SRS数据库所有对象的所有操作权限授予hellokitty
+   -- 将对school数据库所有对象的所有操作权限授予hellokitty
    grant all privileges on school.* to 'hellokitty'@'%';
    grant all privileges on school.* to 'hellokitty'@'%';
    
    
-   -- 召回hellokitty对SRS数据库所有对象的insert/delete/update权限
+   -- 召回hellokitty对school数据库所有对象的insert/delete/update权限
    revoke insert, delete, update on school.* from 'hellokitty'@'%';
    revoke insert, delete, update on school.* from 'hellokitty'@'%';
    ```
    ```
 
 
 ###  相关知识
 ###  相关知识
 
 
-#### 范式理论
+#### 范式理论 - 设计二维表的指导思想
 
 
-1. 第一范式
-2. 第二范式
-3. 第三范式
+1. 第一范式:数据表的每个列的值域都是由原子值组成的,不能够再分割。
+2. 第二范式:数据表里的所有数据都要和该数据表的键(主键与候选键)有完全依赖关系。
+3. 第三范式:所有非键属性都只和候选键有相关性,也就是说非键属性之间应该是独立无关的。
 
 
 #### 数据完整性
 #### 数据完整性
 
 
 1. 实体完整性 - 每个实体都是独一无二的
 1. 实体完整性 - 每个实体都是独一无二的
-   - 主键 / 唯一约束 / 唯一索引
-2. 引用完整性(参照完整性)
-   - 外键
+   - 主键(primary key) / 唯一约束 / 唯一索引(unique)
+2. 引用完整性(参照完整性)- 关系中不允许引用不存在的实体
+   - 外键(foreign key)
 3. 域完整性 - 数据是有效的
 3. 域完整性 - 数据是有效的
-   - 数据类型
-   - 非空约束
-   - 默认值约束
-   - 检查约束
+   - 数据类型及长度
+   - 非空约束(not null)
+   - 默认值约束(default)
+   - 检查约束(check)
+
+#### 数据一致性
+
+1. 事务:一系列对数据库进行读/写的操作。
+
+2. 事务的ACID特性
+   - 原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行
+   - 一致性:事务应确保数据库的状态从一个一致状态转变为另一个一致状态
+   - 隔离性:多个事务并发执行时,一个事务的执行不应影响其他事务的执行
+   - 持久性:已被提交的事务对数据库的修改应该永久保存在数据库中
 
 
 ### Python数据库编程
 ### Python数据库编程