数据库管理系统(英语: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的名字。
现代社会数据量越来越大,对于数据的记录和准确查找
,成为了一个重大难题。
数据库系统解决的问题:持久化存储,优化读写,保证数据的有效性。
计算机诞生后,数据开始在计算机中存储并计算,并设计出了数据库系统.
指采用了关系模型来组织数据的数据库。关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
主流的关系型数据库有:
Oracle(甲骨文公司)、Microsoft SQL Server、MySQL、PostgreSQL,SQLite、MariaDB(MySQL的一个分
支)Microsoft Access、SAP。
指非关系型的,分布式的,以键值对存储且结构不固定,可以减少一些时间和空间的开销。非关系型数据库都是针对某些特定的应用需求,主要分为以下几类:
1). 面向海量数据访问的面向文档数据库:MongoDB、Amazon DynamoDB、Couchbase等。
2). 面向高性能并发读写的key-value数据库: Redis、 Memcached等。
3). 面向搜索数据内容的搜索引擎:Elasticsearch,Splunk,Solr,MarkLogic和Sphinx等。
4). 面向可扩展性的分布式数据库:Cassandra,HBase等。
当前物理的数据库都是按照E-R模型进行设计的,
• E表示entry,实体
• R表示relationship,关系
• 一个实体转换为数据库中的一个表
关系描述两个实体之间的对应规则,包括: 一对一 ,一对多, 多对多
经过研究和对使用中问题的总结,对于设计数据库提出了一些规范,这些规范被称为范式
• 第一范式(1NF):列不可拆分 , 即无重复的域。
• 第二范式(2NF):唯一标识 ,即拥有实体的唯一标识(eg: 身份证、id号等)。
• 第三范式(3NF):引用主键 ,即每列数据都与主键直接相关。
说明:关系型数据库有六种范式。一般说来,数据库只需满足第三范式(3NF)
就行了。
注意:三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。
1)
第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项。
符合第一范式的特点
:有主关键字、主键不能为空、主键不能重复,字段不可以再分。
答案: 不符合。 键重复,而且【联系方式】字段可以再分。变更为正确的是:
2)
1NF的定义为:符合1NF的关系中的每个属性都不可再分。因此不符合1NF的要求。
RDBMS中表现表中的数据,就得设计为下表的形式:
1)
第二范式是指每个表必须有且仅有一个数据元素为主关键字(Primary key),其他数据元素与主关键字一一对应。这种关系为函数依赖。
符合第二范式的特点
:满足第一范式的前提下,消除部分函数依赖。
答: 不符合。 班级地址部分依赖于关键字班级编号, 所以要变为两个表:
2)
数据冗余过大,插入异常,删除异常,修改异常的问题,如下表所示:
1). 每一名学生的学号、姓名、系名、系主任这些数据重复多次。每个系与对应
的系主任的数据也重复多次
数据冗余过大
2). 假如学校新建了一个系,但是暂时还没有招收任何学生,那么是无法将系名
与系主任的数据单独地添加到数据表中去的
插入异常
3). 假如将某个系中所有学生相关的记录都删除,那么所有系与系主任的数据也
就随之消失了。
删除异常
4). 假如李小明转系到法律系,那么为了保证数据库中数据的一致性,需要修改
三条记录中系与系主任的数据。
版权:西部开源-郭帆
修改异常
3)
函数依赖关系不正确,修改如下:
符合第三范式的特点
:不存在非主属性对码的传递性依赖以及部分性依赖 。
答: 不符合。 完全满足了第二范式,但是奖金等级和奖学金存在传递依赖,更改为:
新浪博客、搜狐、网易博客开通账号直接在上面写博客。不过,如今随着网络的发展,越来越多的高手会开源分享自己撰写的程序。如今我们需要做网站基本上都可以找到免费的程序。比如如果我们需要做个人博客网站的时候,有很多的开源博客程序可以选择,比如WORDPRESS、ZBLOG等等。
个人博客系统主要完成以下几方面的功能,你如何设计数据库表?
• 用户管理:用户的注册和登录,发表博文和评论。
• 博文管理:用户可以在网站中发表和设置博文。
• 评论管理:用户可以评论博文和回复其他用户的评论。
• 分类管理:添加和删除分类,给文章设置分类。
• 标签管理:添加和删除标签,给文章设置标签。
超详细:
https://myhub.blog.csdn.net/article/details/103532734
root:123lh
daliu123
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle (甲骨文,java)旗下产品。MySQL 是最流行的关系型数据库管理系统之一。
数据库存储引擎是数据库底层软件组织,进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能, MySQL的核心就是存储引擎。
MySQL查询存储引擎SQL语句:SHOW ENGINES
(1)部署数据库
yum search mariadb #查找与mariadb有关的软件包
yum install mariadb-server.x86_64 -y #安装mariadb的server软件和client软件
systemctl start mariadb.service #启动服务
systemctl sttus mariadb.service #查看服务状态
systemctl enable mariadb.service #开机自启动
mysql_secure_installation #初始化设置
#没有设置root密码按回车会设置新密码,博主密码westos,根据提示输入Y
mysql -uroot -pwestos #进入mariaDB
测试:
服务端: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
root用户进入
创建 daliu 数据库,并设置编码方式,否则不能识别中文
查询当前有哪些数据库
注意: 数据库中 语句结尾要加分号
切换到 daliu 数据库
查看当前选择的数据库
删除 daliu 数据库 后,查看当前有哪些数据库
表创建: 数据完整性
• 一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中
• 在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为
表添加一些强制性的验证, 包括数据字段的类型、约束,如下:
字段类型
在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)对应插入值
(1)全列插入
insert into 表名称 values(每列对应要添加的数值)
(2)缺省插入
insert into 表名称(某列) values()
(3)同时插入多条
insert into 表名称values()()…Insert into 表名称(列…) values()()
在user表中插入一组值 :(id username password)对应插入值
在user表中插入username:id设置的自动增加,password设置默认为000000
查看user表内容
update 表名称 set 某列=某值 … where 条件
delete from 表名称 where 条件
重置user表中 username=‘aiai’ 的 password=‘6666’
查看username=‘aiai’ 的信息
删除username=‘lili’ 的信息
查看user表的信息
将文件备份到students.sql中
查看students.sql文件的大小并启用mysql
创建数据库
退出
将文件student.sql回复到新建的数据库里
select * from 表名;
• from关键字后面写表名,表示数据来源于是这张表
• select后面写表中的列名,如果是*表示在结果中显示表中所有列
• 在select后面的列名部分,可以使用as为列起别名,这个别名出现在结果集中
• 如果要查询多个列,之间使用逗号分隔
(1)查询部分:
select 列名1,列名2… from 表名称
(2)查询并起别名
select 列名 as 新的名称 from 表名称
(3)消除重复行
select distinct 列名 from 表名称
(4)根据条件查询
select * from 表名 where 条件
(5)分组
select 列1,列2,聚合... from 表名 group by 列1,列2,列3...
• 按照字段分组,表示此字段相同的数据会被放到一个组中
• 分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中
• 可以对分组后的数据进行统计,做聚合运算
分组后数据筛选
对比where与having
• where是对from后面指定的表进行数据筛选,属于对原始数据的筛选
• having是对group by的结果进行筛选
(6)排序
为了方便查看数据,可以对数据进行排序:
• 将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
• 默认按照列值从小到大
排列
• asc从小到大排列,即升序, desc从大到小排序,即降序
(7)获取部分行
select * from 表名 limit start , count
当数据量过大时,在一页中查看数据是一件非常麻烦的事情:
• 从start开始,获取count条数据
• start索引从0开始
(8)多表查询
左拼接 :表1 left join 表2
以表1为准拼接,缺少的置空,多余的删除
右拼接 :表1 right join 表2
以表2的为准拼接,缺少的置空,多余的删除
等值拼接:表1 inner 表2
拼接相同的内容,多余的删掉
注意: 实际使用中,只是语句中某些部分的组合,而不是全部
执行顺序为:
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库
Python2中则使用MySQLdb。
安装pymasql库
在pycharm中设置添加mysql数据库
设置要连接的数据库等
import pymysql
#(1)创建数据库连接
conn = pymysql.connect(host='主机名', user='用户名', password='密码',
db='数据库名',port=3306, autocommit=True, charset='utf8')
#(2)创建游标(用来执行sql语句)
cur = conn.cursor()
#(3)执行sql语句
insert_sql = 'insert into users(username) values ('user1');' # 在users表中插入user1
cur.execute(insert_sql)
# conn.commit() #把操作提交到数据库中,因为创建连接时写了 autocommit=True 自动提交,所以这里不用再写
print("插入数据成功")
#(4)关闭游标
cur.close()
#(5)关闭连接
conn.close()
查看connrct 函数的源代码,发现 有__ enter __ 和 __exit __函数,是个上下文管理器,所以可以用with打开、
看源代码发现 connect最后返回的是一个游标
所以起名字就 with … as cur
然后直接开始执行sql语句
import pymysql
# 使用with语句时, pymysql.connect返回的是数据库游标
with pymysql.connect(host='主机名', user='用户名', password='密码',
db='数据库名', port=3306, autocommit=True, charset='utf8') as cur:
# 3). 执行sql语句(增删改)
insert_sql = 'insert into users(username) values ("user2");'
cur.execute(insert_sql)
print("插入数据成功")
## 数据库批量操作
import pymysql
users = [('redhat' + str(i), 'passwd'+str(i)) for i in range(100)]
# users = [('redhat1', 'passwd1'), ('redhat2', 'passwd2'), .......]
# 使用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, password) values (%s, %s);'
# execute: 执行一条sql语句。
# executemany: 执行多条sql语句。
# 'insert into users(username, password) values (%s, %s);' %users[0]
# 'insert into users(username, password) values (%s, %s);' %('redhat1', 'passwd1')
# 'insert into users(username, password) values (%s, %s);' %users[1]
# 'insert into users(username, password) values (%s, %s);' %users[2]
cur.executemany(insert_sql, users)
print("插入数据成功.......")
显示一条:
cur.fetchone()
显示多条:
cur.fetchmany(显示的数据条数)
全部显示:
cur.fetchall()
import pymysql
with pymysql.connect(host = '主机名', user = '用户名', password = '密码',
db = '数据库名', port = 3306, autocommit = True, charset = 'utf8') as cur:
query_sql = 'select * from users where username like "westos%";'
result = cur.execute(query_sql) # 返回的是影响的数据条数
print("符合条件的记录数:", result)
# #如果要显示出来信息
# print(cur.fetchone())
# print(cur.fetchmany(2)) 接着上一次显示
users_info = cur.fetchall()
# 以表格方式打印
from prettytable import PrettyTable
table = PrettyTable(field_names=['编号', '用户名', '密码'])
for user in users_info:
table.add_row(user)
print(table)
SQLite是内嵌在Python中的轻量级、基于磁盘文件袋额数据库管理系统(就是一个文件),不需要安装和配置服务,支持使用SQL语句来访问数据库。该数据库使用C语言开发,支持大多数SQL91标准,支持原子的、一致的、独立的和持久的事务,不支持外键限制;通过数据库级的独占性和共享性锁定来实现独立事务,当多个线程同时访问同一个数据库并试图写入数据时,每一时刻只有一个线程可以写入数据。
SQLite支持最大140TB大小的单个数据库,每个数据库完全存储在单个磁盘文件中,以B+树数据结构的形式存储,一个数据库就是一个文件,通过直接复制数据库文件就可以实现数据库的备份。如果需要使用可视化管理工具,可以下载并使用SQLiteManager、SQLite Database Browser 或其他类似工具。
import sqlite3
# 1). 创建连接
conn = sqlite3.connect(database='users.sqlite')
# 2). 创建游标
cur = conn.cursor()
# 3). 操作
# if not exists如果数据库标不存在时创建表,否则不做操作。
create_sql = 'create table if not exists userinfo1 (id int auto_increment primary key , name varchar(10) unique, passwd varchar(10) default "123");'
cur.execute(create_sql)
insert_sql = 'insert into userinfo1(name) values("user2");'
cur.execute(insert_sql)
# 数据操作(增删改)一定需要提交。
conn.commit()
select_sql = 'select * from userinfo1'
cur.execute(select_sql)
print("查询结果: ", cur.fetchall())
cur.close()
conn.close()