From 5f5ebe4b795fca1d37714eff611bf548ee3a84e5 Mon Sep 17 00:00:00 2001 From: jackfrued Date: Sat, 27 Apr 2019 15:19:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E9=83=A8=E5=88=86=E7=9A=84=E7=9B=B8=E5=85=B3=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\225\260\346\215\256\345\272\223MySQL.md" | 191 +++++++++++++++--- 1 file changed, 163 insertions(+), 28 deletions(-) diff --git "a/Day36-40/\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223MySQL.md" "b/Day36-40/\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223MySQL.md" index d250a00..0e985f2 100644 --- "a/Day36-40/\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223MySQL.md" +++ "b/Day36-40/\345\205\263\347\263\273\345\236\213\346\225\260\346\215\256\345\272\223MySQL.md" @@ -31,10 +31,142 @@ ### 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官方网站]()下载安装文件。首先在下载页面中选择平台和版本,然后找到对应的下载链接。下面以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. 常用命令。 + - 查看服务器版本。 + + ```SQL + select version(); + ``` + + - 查看所有数据库。 + + ```SQL + show databases; + ``` + + - 切换到指定数据库。 + + ```SQL + use mysql; + ``` + + - 查看数据库下所有表。 + + ```Shell + show tables; + ``` + + - 获取帮助。 + + ```SQL + ? contents; + ? functions; + ? numeric functions; + ? round; + + ? data types; + ? longblob; + ``` + ### SQL详解 @@ -142,7 +274,7 @@ 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 @@ -196,6 +328,7 @@ select couname, coucredit 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 姓名, if(stusex, '男', '女') as 性别 from tb_student; @@ -231,8 +364,7 @@ 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; -- 聚合函数:max / min / count / sum / avg @@ -243,15 +375,10 @@ select max(stubirth) from tb_student; -- 查询男女学生的人数(分组和聚合函数) - select count(stuid) from tb_student; select stusex, count(*) from tb_student group by stusex; - select stusex, min(stubirth) from tb_student group by stusex; -- 查询课程编号为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的学生所有课程的平均分(筛选和聚合函数) 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; -- 查询平均成绩大于等于90分的学生的学号和平均成绩 - -- 分组以前的筛选使用where子句 - -- 分组以后的筛选使用having子句 + -- 分组以前的筛选使用where子句 / 分组以后的筛选使用having子句 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; - -- 内连接和分页查询 + -- 查询学生姓名、课程名称以及成绩按成绩从高到低查询第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 10, 5; @@ -293,9 +419,8 @@ 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; - -- 内连接(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; ``` @@ -306,32 +431,42 @@ -- 创建名为hellokitty的用户 create user 'hellokitty'@'%' identified by '123123'; - -- 将对SRS数据库所有对象的所有操作权限授予hellokitty + -- 将对school数据库所有对象的所有操作权限授予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'@'%'; ``` ### 相关知识 -#### 范式理论 +#### 范式理论 - 设计二维表的指导思想 -1. 第一范式 -2. 第二范式 -3. 第三范式 +1. 第一范式:数据表的每个列的值域都是由原子值组成的,不能够再分割。 +2. 第二范式:数据表里的所有数据都要和该数据表的键(主键与候选键)有完全依赖关系。 +3. 第三范式:所有非键属性都只和候选键有相关性,也就是说非键属性之间应该是独立无关的。 #### 数据完整性 1. 实体完整性 - 每个实体都是独一无二的 - - 主键 / 唯一约束 / 唯一索引 -2. 引用完整性(参照完整性) - - 外键 + - 主键(primary key) / 唯一约束 / 唯一索引(unique) +2. 引用完整性(参照完整性)- 关系中不允许引用不存在的实体 + - 外键(foreign key) 3. 域完整性 - 数据是有效的 - - 数据类型 - - 非空约束 - - 默认值约束 - - 检查约束 + - 数据类型及长度 + - 非空约束(not null) + - 默认值约束(default) + - 检查约束(check) + +#### 数据一致性 + +1. 事务:一系列对数据库进行读/写的操作。 + +2. 事务的ACID特性 + - 原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行 + - 一致性:事务应确保数据库的状态从一个一致状态转变为另一个一致状态 + - 隔离性:多个事务并发执行时,一个事务的执行不应影响其他事务的执行 + - 持久性:已被提交的事务对数据库的修改应该永久保存在数据库中 ### Python数据库编程 -- GitLab