数据库的概念和作用
特殊格式数据文件的集合就是数据库
我们网页看到的数据展示,其实在数据库里存储如上面的显示
数据库特点简介
数据库分类及特点
数据库某年排行榜,可以看到几种数据库的排名,关系型数据库排前
关系型数据库
通过二维表的方式存储数据
常见如上的关系型数据库,我们学习MySQL数据库,免费(商业版低收费),而ORACLE全套部署近百万(安全性高),SQLite是移动端,嵌入式设备数据库,可以不联网运行,最后微软的SQL Server是收费的而且只能跑在微软的windows服务器上。MySQL体积小,速度快,成本低,很多中小型企业都在使用。
非关系型数据库
使用Key-value方式存储,也成NoSQL,常见mongoDB,redis
数据库管理系统
DBMS数据库管理系统分3部分,数据库文件集合,服务端,客户端,每个功能如上,关系图如下
客户端给服务端发送语句,必须是其听得懂的SQL语句
SQL结构化查询语言,几乎适用于所有关系型数据库,但是某系细节有差异
SQL语句主要分如上5类,DQL数据查询,DML数据操作,TPL事务处理,DCL数据控制,DDL数据定义,我们学习重点是DQL,DML,DDL
上图又简介了几种关系型数据库,简单了解下
关系型数据库,由多张数据表构成,数据表由多个数据行构成(数据行也叫一条数据记录)。按列来看,把每个元素成为属性或者字段(每列数据类型一致)
MYSQL环境搭建
linux安装,终端sudo apt-get install mysql-server
启动MySQL,终端sudo server mysql start(如果是重启,关闭start分别换成restart,stop)
查看进程是否有mysql, 终端ps ajx|grep mysql (利用管道过滤,常常查看是否启动成功)
配置环境
配置文件可以在/etc/mysql/mysql.conf.d下找到文件mysqld.cnf,可以用cat等命令查看
默认配置如上,暂时不用修改,默认端口3306,ip默认本机ip127.0.0.1
注意啦!以下出现了中坑,本人经查询解决
坑1
视频提出安装mysql-server,其实mysql-client也需要一起安装,
于是我们需要sudo apt-get install mysql-client给虚拟机安装上客户端。
于是我们兴冲冲的使用mysql -uroot -p然后输入密码,哎?怎么不是视频中的密码,也不是网上有人说的为空。
/etc/mysql/debian.cnf.我们可以使用cat查看这个文件,找到password的内容,然后复制,是个很长很恶心的密码,然后用mysql -uroot -p后粘贴这个密码,登录成功后,在mysql shell下,执行如下命令
> use mysql;
>update mysql.user set authentication_string=password('123456') where user='root'
比如想修改密码为123456,可以使用如上,或者替换字符串'123456'
最后退出,使用sudo service mysql restart就可以使用自定义的简单代码登录了。
坑2
视频告诉我们可以按照可视化客户端navicat,这个浏览器搜索安装就行了,我分别给虚拟机和windows都安装了一个,先说虚拟机问题吧。选择下载64位Linux版本安装,
切换到压缩文件目录cd xxx
使用tar -zxvf xxx.gz把文件解压,然后切换到解压目录,使用./start_navicat运行安装,记得要点2次取消,然后出现试用界面,视频说会出现乱码,然后就真的出现了,点开菜单栏倒数第3个的最后一个项目,这个就是选项,将字体设置为AR PL UKai ZN,同时也要把字体调大点,关闭,再进入就没乱码了。
坑3
我给笔记本和台式都安装了navicat客户端,然后连接虚拟机的mysql,密码明明是对的,却发现无法连接,之前的虚拟机上的navicat却可以连接。
我们进入虚拟机终端客户端mysql -uroot -p
->GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; (123456根据你的密码对应上)
->FLUSH PRIVILEGES; (刷新防火墙)
quit或exit退出
打开/etc/mysql/mysql.conf.d/mysqld.cnf,将bind-address=127.0.0.1改为bind-address=0.0.0.0保存
重启mysql sudo service mysql restart
然后navicat客户端就可以连上mysql了
数据库完整性(了解)
为了保证数据的正确性,要求数据的约束条件
记录识别唯一,主键不为空
域完整性,同一列,数据类型一致,要求非空或默认值
参照完整性,比如2个表格,一个存的是张三相关,另一个存的是小张相关,如果删除了张三,小张也应该被删除
自定义完整性:比如性别只能是‘男’或者‘女’,而不能是其他
NAVICAT客户端使用
连接数据库
我们之前已经做过连接了,这里再次介绍下连接的界面,然后连接创建完毕,但是要想连接成功,我们还必须双击左侧,让其灰色变绿色,表示真正连接成功
默认情况下会在下面显示4个数据库
创建数据库
右键点击绿色图标点击新建数据库
弹出新建窗口
我们有3个空可以填,第一个数据库名自己起,但是不要和已有的库重名,我们起名python,
字符集我们使用utf8,排序规则使用general ci(以后讲),点确定数据库就建立完毕
数据库创建完是灰色的,因为我们并没有打开,双击打开,此时数据库就变成了绿色
我们在新建的python库表位置右键新建表,出现如下图
比如说我们创建一个字段,名id(注意这里字段名不能用中文),类型int,是不是null勾选作为域完整性约束,我们点了键那里,会出现一个钥匙,此时null也会被自动勾选,这时为主键约束,比如该id是自增的,我们还会下面勾选自动递增
我们选中一行,再加入字段时,按光标↓就可以添加,我们输入字段名name,会发现自动设置了类型varchar,长度255表示最多该项有255个字符。
我们点击保存起名classes,在表下面双击就会发现如下图,即创建了2列的表
如果我们想修改表,可以使用右键-设计表,又回归到之前的界面
查看数据,我们双击表就行
增加数据,我们输入内容,就可以添加数据,由于id设置了自动添加,所以我们可以不填,填入name和size,想新出现一行数据就按光标↓,id自动出现
修改数据,双击属性单元格,输入就行
保存表格,点下面√或者CTRL+S
删除数据,点击减号图标
备份数据库
右键点击数据库转储--结构和数据
我们存储到桌面,就会看见python.sql文件
此时我们可以将文件拷贝给其他工作组同事或者留作备份使用。
如果我们数据库数据丢失了,比如我们先在navicat上删除python数据库,我们可以再新建一个数据库,但是因为是空的,我们可以右键点击数据库选择运行SQL文件
选择桌面上的python.sql文件点击开始,然后需要右键关闭数据库,再双击打开,此时会发现之前的数据已经成功添加进来
MYSQL数据类型
数值
整形类型
不同数据类型存储长度不一样(常用TINYINT,INT)
TINYINT 1字节 -128到127 无符号0-255
SMALLINT 2字节-2**15到2**15-1 无符号0到2**16-1
MEDIUMINT 3字节
INT 4字节
BIGINT 8字节
浮点型
float和double,分别4到8字节,float到小数点后6位,double到16位
定义方法float或者double加(总位数,小数位数) 如float(5,3) 12.345
定点数
decimal(总位数,小数位)需要精确计算小数时,比如价格等
字符串
char 255个字符
varchar65535个字节(常用varchar)其他如上图(第二行应该为字符)
text相关的都是按字节统计
char和varchar区别
比如我们使用char(5)和varchar(5)存储‘he’,char会使用5个字符空间,而varchar只占用2个字符空间
text类型,存储量大
类型选择原则
枚举类型
字段名 enum(枚举值用逗号分隔)
时间类型
datetime和timestamp区别,范围和存储大小不同
MYSQL数据库----登录和退出命令
登录(mysql -uroot -p)
退出(exit或quit或ctrl+d)
我们已经登录了,可以查看版本和当前时间(记得大部分命令开始要结尾;)
数据库操作
create datebase 数据库名; 创建数据库
drop datebase 数据库名 ; 删除数据库
use 数据库名; 切换数据库
select database(); 查看当前选择的数据库
(MYSQL命令大小写不敏感)
上图为刚登陆,查询数据库,因为没有选择,提示NULL
显示所有数据库,show databases;
我们使用use python;切换到python数据库,这时再select database();就可以看到当前选择了python数据库
我们尝试创建一个数据库,比如python_db名字,创建成功,会显示Query OK。否则会出现一行提示,比如我们输错命令就会上图后面的提示。
我们也可以用show create database 数据库名 (可以卡看到数据库创建过程,数据库必须已存在)
上图我们会发现python_db数据库,过程语句和编码及排序,我们会发现编码不是utf8而是utf8mb4,而且排序也不是我们用的utf8_general_ci
我们可以指定编码创建数据库create database python_db1 charset=utf8;
python_db1是我们给新数据库起的名字,可以看出编码已经被设置好,我们一般都设置为utf8否则你打开就是乱码
删除数据库 drop database 数据库名,删除要慎重(找不回来)!!!
表结构创建
为了把数据保存到数据库,我们需要表格,上节学了创建数据库,这节学习创建表
比如与我们打开进入到数据库python_db1,然后先检查有哪些表show tables;因为没创建过,所以是空的
创建表格create table classes(
id int unsigned primary key auto increment,
name varchar(10) not null,
num tinyint unsigned not null
);
语句分析:create table 表格名();基本sql创建表格语句,在括号里添加语句字段,字段间用逗号分隔,最后一个结尾不用逗号。字段用字段名 字段类型(之前讲过)约束条件
比如第一个id我们设置为整数,想要是无符号的用unsigned跟在int后面,约束条件,主键约束(唯一非空),递增(auto_increment)
第二个字段name,我们使用varchar,设定最长10个字符,约束非空
第三个字段num,使用tinyint,约束非空
整体注意结构和语法写法!
应用上述语句,就实现了创建表格
查看表结构
desk 表名; 可以看到表结构和设置,如上图
我们接着再创建一个学生表,结构要求如上
alter database my_db character set 'gbk';(这里需要注意的是,我们输入汉字内容,需要给数据库指定默认编码gbk),否则enum那里会报错,修改完毕后OK,记得每次有中文项目的内容,修改数据库编码
表格创建成功海口可以用show create table 表名 来显示创建过程
我们会发现结果是比较乱的,这是因为尝试将所有内容一行写下,但是屏幕不够长。。。
我们可以给命令改成show create table 表名 \G;效果如下
表结构修改
增加字段
alter table 表名 add 列名 类型;
比如我们给students条件birthday列,语句alter table students add birthday datetime;输入完成功可以desc查看到添加了birthday列
重命名字段
字段已有,但是命名类型或者约束想修改
alter table 表名 change 原名 新名 新类型约束;
比如我开门把birthday改成birth而且要求非空,使用
alter table students change birthday birth datetime not null;
同样修改后可以查看下
修改字段类型和约束
不修改命名,只修改类型和约束(比上一个功能简单点)
alter table 表名 modify 列名 类型及约束;
比如我们把birth类型换成date使用
alter table students modify birth date not null;(需要注意的是之前的约束如果修改没有写进去就是默认,不会继承之前的,上面的change也是,所以约束都要重写)
删除字段
alter table 表名 drop 列名;
如给students删掉birth使用alter table students drop birth;
desc删除后发现drop自段没有了
删除表
drop table 表名;
所有表的增删改查要严格规划,谨慎修改
表数据的增删查改
本节学习表数据的创建,更新,读取,删除
查询所有列 select * from 表名;
之前没有添加数据,所以我们没有得到结果
插入数据insert into 表名 values(字段值用逗号分割,字符串要加引号!!!);
添加数据后就可以查看到数据了
我们可以试试主键效果,如果再插入重复的id,会提示重复错误
我们之前删了students,再创建出来,这回添加一行数据如下图1行插入,然后我们知道有些值可以非空的,我们想给指定列插入内容,可以使用下图最后一行代码,
想多行插入 insert students values()()()();插入几行用几个括号
修改数据
我们尝试给表students的age列赋值age=38,使用update students set age=38;
设置后会发现age列的所有数据都被改成了38
我们想只改一列,比如给第二行age设成88,使用update students set age=88 where name='司马狗剩';结果如下
我们也可以设置多列修改,所以一般模式为
update 表名 set 列名1=参数1, 列名2=参数2 ...where 属性=xxx;(注意set属性逗号分割)
查询数据
我们之前学了查询表格select * from 表名;现在我们也可以加条件,比如查询students中name=‘司马狗剩’的数据,效果如上图。
我们还可以进一步拓展,想查看某些列数据,如上(同理即可查询where指定条件的某些列数据)
我们想显示中文列名,可以使用select 列名 as‘中文列名’ from 表名;效果如上(其实as也可以省略)
删除
delete from 表名 where 条件约束;这种删除后数据不可恢复,是物理删除
我们可以使用逻辑删除,用alter table students add is_delete bit default 0;给表格设置默认为0,
当我们想做逻辑删除时,使用update students set is_delete 1 where id=3;给指定数据设置删除;
这样我们就可以通过where is_delete=0;来过滤掉数据(但是数据库还有这条数据)
数据库备份和恢复
我们之前用过navicat实现数据库备份转储,导入。现在我们用命令行来实现数据备份和恢复。
首先,数据库备份不用进mysql环境,进入终端界面输入如下命令即可
mysqldump -uroot -p python_db1>python_db1.sql就会在命令行当前目录导出一个python_db1.sql文件(得输入密码,因为-p后面没写),我们可以ls -l查看到,我们备份了数据库,就可以删除数据库再导入,登陆mysql, mysql -uroot -p, 然后drop database python_db1;删除成功后,我们同样需要创建一个数据库以备导入,使用create database python_db charset=utf8;创建。然后我们exit退出mysql到终端,输入mysql -uroot -p python_db