存取数据的演变史
文本文件
-
文本文件有两个主要的缺点:
第一个就是不能保证多用户存取的文件路径一致
第二个就是不能保证多用户存取的数据格式一致
软件开发目录规范
-
软件开发目录规范了数据文件的大致存储位置:
db文件夹;但是针对数据格式还是没有完全的统一
数据库服务(重点)
-
统一路径 统一操作方式
降低学习成本 提高开发效率
数据库软件应用史
单机模式
- 在不同计算机上的相同程序,数据是无法共享,因为数据库服务全部在本地完成
网络游戏
- 在不同计算机上的相同程序,数据可以共享,因为数据库服务单独在网络架设(远程数据库服务)
数据库的本质
- 数据库三字在不同角度下描述的意思是不一样的,当我们不做特殊说明的情况下提供数据库其实都是在指数据库软件,我们也称数据库软件本质上是一款C/S架构的应用程序,言外之意所有的程序员理论上都可以编写(市面上已经有很多数据库软件)
站在底层原理角度
数据库指的是专用于操作数据的进程
eg:运行在内存中的代码
站在实际应用的角度
数据库指的是拥有操作界面的应用程序
eg:用于操作进程的界面
数据库的分类
- 数据库分为:关系型数据库和非关系型数据库
关系型数据库
特征1:数据的组织方式有明确的表结构(字段名 字段类型)
eg:id name password
ps:关系型数据库存取数据的方式可以看成是表格
特征2:数据之间可以建立数据库层面关系
eg:用户表数据 豪车表数据 豪宅表数据
ps:只要获取到某一表的一条数据,就可以获取到与之相关的其他表数据
3.常用的关系型数据库:MySQL、PostgreSQL、MariaDB、Oracle、sqlite、db2、sq1、server
1.MySQL:是开源的,使用最为广泛的,数据库学习必须要学习的
2.Oracle:收费 使用成本较高但是安全性也最高
3.PostgreSQL:是开源的,支持二次开发,兼容性极高
4.MariaDB:跟MySQL是一个作者 开源免费
5.sqlite:小型数据库 主要用于本地测试(django框架自带该数据库)
非关系型数据库
特征1:数据的组织方式没有明确结构,是以k:v键值对的形式组织的
eg:{'name': 'jason', 'pwd': 123}
{'username': 'kevin'}
特征2:数据之间无法直接建立数据库层面的关系
ps:可以直接编写代码建立逻辑层面的关系
3.常用的非关系数据库:redis、mongoDB、memcache
redis:是目前最火的,使用频率最高的缓存型数据库
mongoDB:文档型数据库,最像关系型的非关系型,主要用于爬虫、大数据
memcache:已经被redis淘汰
-
总结:虽然数据库软件有很多 但是存在方式都差不多 学会了一个几乎就可以学会所有
其中MySQL最为典型
-
数据库的架构可以大致区分为三个概括层次:内层、概念层和外层
MySQL
Mysql介绍
- mysql是一款Oracle公司出口的轻量级数据库软件,广泛应用于互联网场景,同时也是目前最主流的数据库
Mysql的优点
Mysql相对于文件系统,优点如下:
- mysql的结构相对于文件系统更方便管理
- mysql支持各种编程语言
- mysql比文件系统支持更大规模的数据
- mysql更具备扩展性
- mysql数据能更快的检索
- mysql支持分布式
版本问题
-
8.x:最新版
-
5.7:使用频率较高
-
5.6:学习推荐使用
-
ps:站在开发的角度使用哪个版本学习都没有关系
下载流程
- 访问官方网址
2.点击DOWNLOADS并点击GPL
3.点击community server
4.点击Archives
5.选择对应系统的对应版本下载即可(zip压缩包)
把下载好的文件拖到桌面进行解压即可
主要目录介绍
- bin目录
存放启动文件
mysqld.exe(服务端) mysql.exe(客户端)
- data目录
存放核心数据
my-default.ini(默认的配置文件)
readme(软件说明)
MySQL基本使用
cmd建议你使用管理员身份打开
1.切换到mysql的bin目录下先启动服务端
mysqld
2.保持窗口不关闭 重新打开一个新的cmd窗口
3.切换到mysql的bin目录下启动客户端
mysql
'''直接使用mysql命令默认是游客模式 权限和功能都很少'''
管理员账户登录
管理员默认是没有密码的 连续回车即可
mysql -u用户名 -p密码
常见报错解决方案
1.localhost上的mysql无法连接
报错代码:
ERROR 2003 (HY000):Can’t connect to MySQL server on 'localhost' (10061)
报错原因:
① 很明显,localhost本机是存在的;但是它却没有提供mysql的服务供给使用
② 检查磁盘空间是否还有剩余可用空间,尽量保持有足够的磁盘空间可用
③ 查看mysql的负载能力,可能存在mysql的负载过高我们连接不上;一般是看processlist来看下具体线程和连接数运行情况:
1、show processlist只能列出当前100条,我们可以看到所有用户的连接情况
mysql> show processlist;
+----+-----------------+-----------+------+---------+-------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+------+---------+-------+------------------------+------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 30404 | Waiting on empty queue | NULL |
| 14 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+-----------------+-----------+------+---------+-------+------------------------+------------------+
2 rows in set (0.00 sec)
2、查看全部的链接情况
mysql> show full processlist;
+----+-----------------+-----------+------+---------+-------+------------------------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+------+---------+-------+------------------------+-----------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 30527 | Waiting on empty queue | NULL |
| 14 | root | localhost | NULL | Query | 0 | starting | show full processlist |
+----+-----------------+-----------+------+---------+-------+------------------------+-----------------------+
2 rows in set (0.00 sec)
# 注意,针对以上查看结果进行详细字段说明:
① Id 当用户登录mysql时,系统会为用户分配一个"connection_id",可以使用函数connection_id()来查看:
mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 14 | -- 系统分配的id为14
+-----------------+
1 row in set (0.01 sec)
② User 展示当前链接用户
③ Host 连接mysql的ip地址;可查到来源端口,同时可以跟踪出现问题语句的用户
④ db 连接数据库的名称
⑤ Command 当前链接执行的命令;query(查询)、sleep(休眠)、connect(连接)、daemon(守护进程)
⑥ Time 当前连接持续时长,单位时间是秒
⑦ State 展示当前连接的sql语句状态
⑧ Info 展示sql语句,对用来判断sql语句是否有问题很重要
问题解决方案:
① mysql未启动,则启动即可:
mac端:brew services start mysql mysql.server start
centos端: systemctl start mysqld.service service mysql start
其他:找到执行文件根目录执行 启动也ok
2.localhost/IP地址连接不上
报错代码:
➜ ~ mysql -uroot -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
报错原因:
① 概述:用户root访问localhost/IP被拒绝访问
② 一般是数据库的用户名或者密码跟服务器上mysql设置的不一致,导致匹配失败
问题解决方案:
# 注意解决步骤:
① 查看mysql配置文件
② 查看 mysql 配置文件加载顺序
③ 修改配置文件跳过权限验证(skip-grant-tables)
④ 登录mysql客户端修改密码
- 总结:遇到报错不要慌,拷贝报错信息,然后百度搜索
系统服务的制作
1.bin目录添加到环境变量
清空之前打开所有的cmd窗口 一定要把之前的cmd启动的服务端关闭,快捷键(ctrl+c)
2.将mysql添加到系统服务
- 如何查看系统服务
第一种方法:打开设置,搜索任务管理器,点击服务即可查看
第二种方法:cmd输入services.msc回车即可查看
- 以管理员身份打开cmd窗口
3.首次添加不会自动启动 需要人为操作一下
- 方式1:鼠标右键点击启动
- 方式2:命令行启动
输入:net start mysql
如果想卸载重新安装
cmd窗口
1.先关闭服务端
net stop mysql
2.移除系统服务
mysqld --remove
密码相关操作
修改密码
- 方式1:mysqladmin
先输入下列指令:
mysqladmin -u用户名 -p原密码 password 新密码 - 方式2:直接修改存储用户数据的表
select * from mysql.user\G
这种方式需要先登录才能修改
\G读取的内容出现格式错乱,跟上\G后可以一行行展示文件内容 - 方式3:冷门操作 有些版本可能还不支持
set password=password('新密码')
忘记密码
-
方式1:卸载重新装
-
方式2:把data目录删除 拷贝他人的目录
-
方式3:小把戏操作
关闭正常的服务端
net stop mysql
以跳过授权表的方式重启服务端(不校验密码)
mysqld --skip-grant-table
重新开一个cmd窗口
以管理员身份进入然后修改mysql.user表数据即可
mysql -uroot -p
update mysql.user set password=password('123') where Host='localhost' and User='root';
最后一行的代码的作用是设置root账号的密码为123
关闭服务端 然后正常方式启动即可
SQL与NoSQL
-
数据库服务端是可以服务多种类型的客户端,客户端可以是自己开发的,也可以是python代码编写,也可以是java代码编写,但是这样就导致了数据库服务端操作会变得复杂。
-
SQL和NoSQL就相当于是数据库服务端规定了客户端操作服务端的数据时需要使用的语言。
SQL(操作关系型数据库的语言)
- SQL结构化查询语言是一种数据库操作的非过程式编程语言,用于存取数据以及查询、更新和管理关系型数据库系统,一般脚本文件后缀为.sql
NoSQL(操作非关系型数据库的语言)
-
NoSQL泛指非关系型数据库,主要用于针对超大规模和高并发的社交SNS类型网站的解决方案
ps:要想跟数据库交互就必须使用数据库指定的语言。
-
总结:SQL有时候也指代关系型数据库
NoSQL有时候也指代非关系型数据库
数据库重要概念
什么是数据库服务器
- 运行有DBMS服务端的计算机,该计算机对内存和硬盘要求都相对较高
什么是数据库管理系统
管理数据的套接字软件,CS架构
库 | 表 | 记录 | 数据 |
---|---|---|---|
文件夹 | 文件 | 文件夹里面的文件中一行行代码 | 事物的状态 |
验证指令
查看所有的库名称 | 查看所有的表名称 | 查看所有的记录 |
---|---|---|
show databases; | show tables; | select * from mysql.user; |
基本SQL语句
注意事项
- sql语句必须以分号结尾
- sql语句编写错误之后不用担心 可以直接执行报错即可
基于库的增删改查指令
创建库 | 查看库 | 编辑库 | 删除库 |
---|---|---|---|
create database 库名; | show databases; 查看所有的库名称 | alter database 库名 charset='utf8'; | drop database 库名; |
基于表的增删改查
操作表之前需要先确定库
create database db1;
切换操作库
use db1;
- 创建表
create table 表名(字段名 字段类型,字段名 字段类型); - 查看表
show tables; 查看库下所有的表名称
show create table 表名; 查看指定表信息
describe 表名; 查看表结构
desc 表名;
ps:如果想跨库操作其他表 只需要在表名前加库名即可
desc mysql.user; - 编辑表
alter table 表名 rename 新表名; - 删除表
drop table 表名
基于记录的增删改查
插入数据 | 查询数据 | 编辑数据 | 删除数据 |
---|---|---|---|
insert into 表名 values(数据值1,数据值2); | select * from 表名; 查询表中所有的数据 | update 表名 set 字段名=新数据 where 筛选条件; | delete from 表名; |
delete from 表名 where id=2; |