数据库
着认知能力和创造能力的提升,数据量越来越大,对于数据的记录和准确查找,成为了一个重大难题,
计算机诞生后,数据开始在计算机中存储并计算,并设计出了数据库系统
数据库系统解决的问题:持久化存储,优化读写,保证数据的有效性
分类
- 文档型,如sqlite,就是一个文件,通过对文件的复制完成数据库的复制
- 服务型,如mysql、postgre,数据存储在一个物理文件中,但是需要使用终端以tcp/ip协议连接,进行数据库的读写操作
E-R模型
当前物理的数据库都是按照E-R模型设计
E,entry,实体,类比于python的对象,一个实体转换为数据库中的一个表
R,relationship,关系,关系描述两个实体的对应规则,一对一,一对多,多对多
关系转换为数据库中的一个列,在关系型数据库中一行就是一个对象
三范式
对设计数据库提出的一些规范
- 第一范式(1NF):列不可拆分
- 第二范式(2NF):唯一标识
- 第三范式(3NF):引用主键
MySQL的安装
包括Windows、Ubuntu和Navicat数据库管理工具的安装包压缩版 链接:https://pan.baidu.com/s/1PpzA31xxfdMCJU_5pX6Tdg 密码:xeqi
如何让虚拟机中的乌班图也能跟Windows共享文件呢?采用VMware tools工具。详情见链接VMware Tools安装方法和共享文件夹设置方法
安装好,用Navicat测试
图形界面操作
新建连接
连接右击→新建数据库→字符集和排序规则按下图选好
表操作
想改表操作→表→设计表 一般会预留几个栏位
数据操作
命令行操作
使用命令连接
打开终端,运行命令
# 使用命令连接
mysql -uroot -p
回车后输入密码
# 退出
quit
cmd控制台:
进入mysql所在的bin目录
mysqldump -u root -p 数据库 [表名1 表名2..] > 文件路径.sql
备份文件恢复我们的数据
cmd控制台
mysql -uroot -p py31 < 文件路径.sql
# 备份与恢复
# 数据备份
# 进入超级管理员
sudo -s
# 进入mysql库目录
cd /var/lib/mysql
# 运行 mysqldump命令
mysqldump -uroot -p 数据库名 > ~/Desktop/备份文件.sql
根据提示输入mysql的密码
# 数据恢复
# 连接mysqk,创建数据库
# 退出连接,执行下面命令
mysql -uroot -p 数据库名 < ~/Desktop/备份文件.sql
根据提示输入mysql的密码
# 创建数据库
create database 数据库名 charset=utf8;
# 删除数据库
drop database 数据库名;
# 切换数据库
use 数据库名;
#查看当前选择的数据库
select database();
# 表操作
# 查看当前数据库中所有表
show tables;
# 创建表 auto_increment自动增长
create table 表名(列及类型);
create table students(id int auto_increment primary key, sname varchar(10) not null);
# 修改表
alter table 表名 add|change|drop 列名 类型;
alter table students add birthday datatime;
# 删除表
drop table 表名;
# 查看表结构
desc 表名; describe
# 更改表名称
rename table 原表名 to 新表名;
# 查看表的创建语句
show create table '表名';
# 数据操作
# 查询
select * from 表名;
#增加 只要插入就会多一行
全列插入: insert into 表名 values(...);
eg: insert into students values(0,'郭靖','1991-1-1',0);
缺省插入: insert into 表名(列1,...) values(值1,...);
insert into students(name) values('黄蓉'); 其余部分有默认值,不用再给值
insert into students(gender,name) values(0,'小龙女');
同时插入多条数据: insert into 表名 values(...),(...)...;
或insert into 表名(列1,...) values(值1,...),(值1,...)...;
eg: insert into students(name) values('杨过'),('雕'),('郭襄');
# 主键列是自动增长,但在全列插入时需要站位,通常用0,插入成功后以实际数据为准
# 修改 针对已有的行修改内容
update 表名 set 列1=值1,... where 条件;
# 删除
delete from 表名 where 条件;
# 逻辑删除,本质是修改操作update
alter table students add isdelete bit default 0;
# 如果需要删除
update students isdelete=1 where ...;
查询
select * from 表名;
select * from 表名 where 条件;
from关键字后面写表名,表示数据来源于是这张表
select后面写表中的列名,如果是*表示在结果中显示表中所有列
在select后面的列名部分,可以使用as为列起别名,这个别名出现在结果集中
如果要查询多个列,之间使用逗号分隔
消除重复行
select distinct gender from students
比较运算符
等于=
大于>
大于等于>=
小于<
小于等于<=
不等于!=或<>
查询编号大于3的学生
select * from students where id>3;
查询编号不大于4的科目
select * from subjects where id<=4;
查询姓名不是“黄蓉”的学生
select * from students where sname!='黄蓉';
查询没被删除的学生
select * from students where isdelete=0;
逻辑运算符
and
or
not
查询编号大于3的女同学
select * from students where id>3 and gender=0;
查询编号小于4或没被删除的学生
select * from students where id<4 or isdelete=0;
模糊查询
like
%表示任意多个任意字符
_表示一个任意字符
查询姓黄的学生
select * from students where sname like '黄%';
查询姓黄并且名字是一个字的学生
select * from students where sname like '黄_';
查询姓黄或叫靖的学生
select * from students where sname like '黄%' or sname like '%靖%';
范围查询
in表示在一个非连续的范围内
查询编号是1或3或8的学生
select * from students where id in(1,3,8);
between ... and ...表示在一个连续的范围内
查询学生是3至8的学生
select * from students where id between 3 and 8;
查询学生是3至8的男生
select * from students where id between 3 and 8 and gender=1;
空判断
注意:null与''是不同的
判空is null
查询没有填写地址的学生
select * from students where hometown is null;
判非空is not null
查询填写了地址的学生
select * from students where hometown is not null;
查询填写了地址的女生
select * from students where hometown is not null and gender=0;
优先级
小括号,not,比较运算符,逻辑运算符
and比or先运算,如果同时出现并希望先算or,需要结合()使用
分组
按照字段分组,表示此字段相同的数据会被放到一个组中
分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中
可以对分组后的数据进行统计,做聚合运算
语法:
select 列1,列2,聚合... from 表名 group by 列1,列2,列3...
查询男女生总数
select gender as 性别,count(*) from students group by gender;
查询各城市人数
select hometown as 家乡,count(*) from students group by hometown;
分组后的数据筛选
语法:
select 列1,列2,聚合... from 表名 group by 列1,列2,列3... having 列1,...聚合...
having后面的条件运算符与where的相同
查询男生总人数
方案一
select count(*) from students where gender=1;
-----------------------------------
方案二:
select gender as 性别,count(*) from students group by gender having gender=1;
对比where与having
where是对from后面指定的表进行数据筛选,属于对原始数据的筛选
having是对group by的结果进行筛选
排序
为了方便查看数据,可以对数据进行排序
语法:
select * from 表名 order by 列1 asc|desc,列2 asc|desc,...
将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
默认按照列值从小到大排列
asc从小到大排列,即升序
desc从大到小排序,即降序
查询未删除男生学生信息,按学号降序
select * from students where gender=1 and isdelete=0 order by id desc;
查询未删除科目信息,按名称升序
select * from subject where isdelete=0 order by stitle;
获取部分行
当数据量过大时,在一页中查看数据是一件非常麻烦的事情
语法
select * from 表名
limit start,count
从start开始,获取count条数据
start索引从0开始
示例:分页
已知:每页显示m条数据,当前显示第n页
求总页数:此段逻辑后面会在python中实现
查询总条数p1
使用p1除以m得到p2
如果整除则p2为总数页
如果不整除则p2+1为总页数
求第n页的数据
select * from students where isdelete=0 limit (n-1)*m,m
完整的select语句
select distinct *
from 表名
where ....
group by ... having ...
order by ...
limit star,count
执行顺序为:
from 表名
where ....
group by ...
select distinct *
having ...
order by ...
limit star,count
实际使用中,只是语句中某些部分的组合,而不是全部
windows下对mysql进行数据备份和恢复 见mysql在Windows下使用mysqldump命令手动备份数据库和自动备份数据库