数据库mysql_关系型数据库 & MySQL安装

允我心安 提交于 2020-01-13 15:29:46

数据库mysql

一、 数据库简介

数据库管理系统(英语:Database Management System,简称DBMS)是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系式、XML;或依据所支持的计算机类型来作分类,例如服务器群集、移动电话;或依据所用查询语言来作分类,例如SQL、XQuery;或依据性能冲量重点来作分类,例如最大规模、最高运行速度;亦或其他的分类方式。不论使用哪种分类方式,一些DBMS能够跨类别,例如,同时支持多种查询语言。

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB。 MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL AB卖给了SUN,此后,随着SUN被甲骨文收购,MySQL的所有权也落入Oracle的手中。MariaDB名称来自Michael Widenius的女儿Maria的名字。

1.为什么需要数据库?

现代社会数据量越来越大,对于数据的记录和准确查找,成为了一个重大难题。
数据库系统解决的问题:持久化存储,优化读写,保证数据的有效性。

2.常见数据库有哪些?

计算机诞生后,数据开始在计算机中存储并计算,并设计出了数据库系统.
在这里插入图片描述

3.数据库分类

(1)关系型数据库

指采用了关系模型来组织数据的数据库。关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

主流的关系型数据库有:
Oracle(甲骨文公司)、Microsoft SQL Server、MySQL、PostgreSQL,SQLite、MariaDB(MySQL的一个分
支)Microsoft Access、SAP。

(2)非关系型数据库

指非关系型的,分布式的,以键值对存储且结构不固定,可以减少一些时间和空间的开销。非关系型数据库都是针对某些特定的应用需求,主要分为以下几类:
1). 面向海量数据访问的面向文档数据库:MongoDB、Amazon DynamoDB、Couchbase等。
2). 面向高性能并发读写的key-value数据库: Redis、 Memcached等。
3). 面向搜索数据内容的搜索引擎:Elasticsearch,Splunk,Solr,MarkLogic和Sphinx等。
4). 面向可扩展性的分布式数据库:Cassandra,HBase等。

二、 关系型数据库

1.基本概念:

(1)E-R模型

当前物理的数据库都是按照E-R模型进行设计的,
• E表示entry,实体
• R表示relationship,关系
• 一个实体转换为数据库中的一个表
关系描述两个实体之间的对应规则,包括: 一对一 ,一对多, 多对多
在这里插入图片描述

(2)范式理解

经过研究和对使用中问题的总结,对于设计数据库提出了一些规范,这些规范被称为范式
• 第一范式(1NF):列不可拆分 , 即无重复的域。
• 第二范式(2NF):唯一标识 ,即拥有实体的唯一标识(eg: 身份证、id号等)。
• 第三范式(3NF):引用主键 ,即每列数据都与主键直接相关。
说明:关系型数据库有六种范式。一般说来,数据库只需满足第三范式(3NF)就行了。

注意:三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。

(3)范式判断

是否符合第一范式?

1)
第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项。
符合第一范式的特点:有主关键字、主键不能为空、主键不能重复,字段不可以再分。
在这里插入图片描述
答案: 不符合。 键重复,而且【联系方式】字段可以再分。变更为正确的是:
在这里插入图片描述
2)
在这里插入图片描述
1NF的定义为:符合1NF的关系中的每个属性都不可再分。因此不符合1NF的要求。
RDBMS中表现表中的数据,就得设计为下表的形式:
在这里插入图片描述

是否符合第二范式?

1)
第二范式是指每个表必须有且仅有一个数据元素为主关键字(Primary key),其他数据元素与主关键字一一对应。这种关系为函数依赖。
符合第二范式的特点:满足第一范式的前提下,消除部分函数依赖。
在这里插入图片描述
答: 不符合。 班级地址部分依赖于关键字班级编号, 所以要变为两个表:
在这里插入图片描述
2)
数据冗余过大,插入异常,删除异常,修改异常的问题,如下表所示:
在这里插入图片描述
1). 每一名学生的学号、姓名、系名、系主任这些数据重复多次。每个系与对应
的系主任的数据也重复多次
数据冗余过大
2). 假如学校新建了一个系,但是暂时还没有招收任何学生,那么是无法将系名
与系主任的数据单独地添加到数据表中去的
插入异常
3). 假如将某个系中所有学生相关的记录都删除,那么所有系与系主任的数据也
就随之消失了。
删除异常
4). 假如李小明转系到法律系,那么为了保证数据库中数据的一致性,需要修改
三条记录中系与系主任的数据。
版权:西部开源-郭帆
修改异常
3)
在这里插入图片描述
函数依赖关系不正确,修改如下:
在这里插入图片描述

是否符合第三范式?

符合第三范式的特点:不存在非主属性对码的传递性依赖以及部分性依赖 。
在这里插入图片描述
答: 不符合。 完全满足了第二范式,但是奖金等级和奖学金存在传递依赖,更改为:
在这里插入图片描述

2.个人博客数据库设计

新浪博客、搜狐、网易博客开通账号直接在上面写博客。不过,如今随着网络的发展,越来越多的高手会开源分享自己撰写的程序。如今我们需要做网站基本上都可以找到免费的程序。比如如果我们需要做个人博客网站的时候,有很多的开源博客程序可以选择,比如WORDPRESS、ZBLOG等等。

个人博客系统主要完成以下几方面的功能,你如何设计数据库表?
• 用户管理:用户的注册和登录,发表博文和评论。
• 博文管理:用户可以在网站中发表和设置博文。
• 评论管理:用户可以评论博文和回复其他用户的评论。
• 分类管理:添加和删除分类,给文章设置分类。
• 标签管理:添加和删除标签,给文章设置标签。
在这里插入图片描述

三、 MySQL简介与安装(linux)

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle (甲骨文,java)旗下产品。MySQL 是最流行的关系型数据库管理系统之一。
在这里插入图片描述

1.MySQL常用存储引擎分析

数据库存储引擎是数据库底层软件组织,进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能, MySQL的核心就是存储引擎。
MySQL查询存储引擎SQL语句:SHOW ENGINES
在这里插入图片描述
在这里插入图片描述

2.MySQL安装

(1)部署数据库

yum search mariadb #查找与mariadb有关的软件包
yum install mariadb-server.x86_64 -y #安装mariadb的server软件和client软件

在这里插入图片描述
在这里插入图片描述
(2)

systemctl start mariadb.service #启动服务
systemctl sttus mariadb.service  #查看服务状态
systemctl enable mariadb.service	#开机自启动

在这里插入图片描述
(3)初始化

mysql_secure_installation #初始化设置
#没有设置root密码按回车会设置新密码,博主密码westos,根据提示输入Y
mysql -uroot -pwestos #进入mariaDB

在这里插入图片描述
在这里插入图片描述
(4)
在这里插入图片描述
(5)
ctrl +d退出mariadb
在这里插入图片描述

3.允许远程连接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试:
服务端:172.25.254.37
客户端:172.25.254.18

(1)查看当前允许连接的id
在这里插入图片描述
(2)在服务端设置:
允许id=172.25.254.18,id=172.25.254.12,以密码 daliu 远程连接
在这里插入图片描述
查看可连接的id:
在这里插入图片描述
(3)id=172.25.254.18 登陆成功

(4)当172.25.254.37为客户端时,远程连接172.25.254.12
在这里插入图片描述

四、 数据库操作

1.数据库操作

在这里插入图片描述
root用户进入
在这里插入图片描述
创建 daliu 数据库,并设置编码方式,否则不能识别中文
查询当前有哪些数据库
注意: 数据库中 语句结尾要加分号
在这里插入图片描述
切换到 daliu 数据库
查看当前选择的数据库
删除 daliu 数据库 后,查看当前有哪些数据库

在这里插入图片描述

2.数据库表操作

表创建: 数据完整性
• 一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中
• 在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为
表添加一些强制性的验证, 包括数据字段的类型、约束,如下:
字段类型
在mysql中包含的数据类型很多,这里主要列出来常用的几种:
• 数字:int,decimal, float
• 字符串:varchar,text
• 日期:datetime
• 布尔:bool
约束
• 主键 primary key
• 非空 not null
• 惟一 unique
• 默认 default
• 外键 foreign key
• 自动增长 auto_increment
在这里插入图片描述
在 blog 数据库中的表操作如下:
创建blog数据库
切换到blog数据库下
创建数据库表 user(
id:表头 ,int:整形 ,primary key:逐主键 ,auto_increment:自动增长
username:表头,varchar:字符串不超过20字节 ,唯一的,不为空
password:表头,varchar:字符串不超过20字节 ,不为空

查看表user结构
查看表user内容 为空
在user表中插入值 :(id username password)对应插入值
在这里插入图片描述
在user表中插入一组值 :(id username password)对应插入值
在user表中插入username:id设置的自动增加,password设置默认为000000
查看user表内容
在这里插入图片描述
重置user表中 username=‘aiai’ 的 password=‘6666’
查看username=‘aiai’ 的信息
删除username=‘lili’ 的信息
查看user表的信息
在这里插入图片描述

查询操作*

查询的基本语法

select * from 表名;
• from关键字后面写表名,表示数据来源于是这张表
• select后面写表中的列名,如果是*表示在结果中显示表中所有列
• 在select后面的列名部分,可以使用as为列起别名,这个别名出现在结果集中
• 如果要查询多个列,之间使用逗号分隔

消除重复行

在select后面列前使用distinct可以消除重复的行
select distinct gender from students;

条件

使用where子句对表中的数据筛选,结果为true的行会出现在结果集中
select * from 表名 where 条件;
优先级
•小括号,not,比较运算符,逻辑运算符
•and比or先运算,如果同时出现并希望先算or,需要结合()使用

分组

• 按照字段分组,表示此字段相同的数据会被放到一个组中
• 分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中
• 可以对分组后的数据进行统计,做聚合运算
select 列1,列2,聚合… from 表名 group by 列1,列2,列3…

对比where与having

• where是对from后面指定的表进行数据筛选,属于对原始数据的筛选
• having是对group by的结果进行筛选

排序

为了方便查看数据,可以对数据进行排序:
• 将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
• 默认按照列值从小到大排列
• asc从小到大排列,即升序, desc从大到小排序,即降序

获取部分行

当数据量过大时,在一页中查看数据是一件非常麻烦的事情:
• 从start开始,获取count条数据
• start索引从0开始

注意: 实际使用中,只是语句中某些部分的组合,而不是全部

执行顺序为:

  1. from 表名
  2. where …
  3. group by …
  4. select distinct *
  5. having …
  6. order by …
  7. limit star,count

五、 pymysql数据库编程

PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,

Python2中则使用MySQLdb。

1.9
05 12题下一个:输出 选了一门以上课程的同学在这些课程中最低分的那一门课

pip install pymysql

"""
File: 01_python数据库编程基本操作.py
Author: lvah
Date: 2020-01-09 
Connect: 976131979@qq.com
Description: 

"""
import pymysql

# 1). 创建数据库连接, autocommit是否自动提交修改到数据库中.
conn = pymysql.connect(host='localhost', user='root', password='westos',
                db='Blog', port=3306, autocommit=True, charset='utf8')
# 2). 创建游标(用来执行sql语句的)
cur = conn.cursor()

# 3). 执行sql语句
insert_sql = 'insert into users(username) values ("user6");'
cur.execute(insert_sql)

print("插入数据成功.......")
# 4). 关闭游标
cur.close()
# 5).关闭连接
conn.close()




"""
File: 01_python数据库编程基本操作.py
Author: lvah
Date: 2020-01-09 
Connect: 976131979@qq.com
Description: 

class Connection(object):
  def __enter__(self):
        Context manager that returns a Cursor
        warnings.warn(
            "Context manager API of Connection object is deprecated; Use conn.begin()",
            DeprecationWarning)
        return self.cursor()

    def __exit__(self, exc, value, traceback):
        On successful exit, commit. On exception, rollback(回滚)
        if exc:
            self.rollback()
        else:
            self.commit()
"""
import pymysql

# 使用with语句是, pymysql.connect返回的是数据库游标。(具体的内容查看源代码)
with pymysql.connect(host='localhost', user='root', password='westos',
                db='Blog', port=3306, autocommit=True, charset='utf8') as cur:
    # 3). 执行sql语句(增删改)
    insert_sql = 'insert into users(username) values ("user7");'
    cur.execute(insert_sql)
    print("插入数据成功.......")


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!