一、.认识数据库
什么是mysql?
数据库
存储数据的仓库存储数据的方式
学习编程语言第一天就学习了一种 就是变量量 变量量就是用来存储数据的变量量存储的介质是什什么呢?就是内存
内存有什么问题呢?
无法永久保存
要如何永久保存呢
所以我们学习了一个新的知识点 文件处理 之前的很长一段时间我们都在使用文件来进行存取数据
把文件当成数据库
那用文件当数据库有没有什什么问题呢?
首先我们忽略略两个点
第一点 文件存储带来的效率问题
效率有什什么问题 因为文件处理是要和硬盘打交道 是一个io操作
第二点 假设我们的程序所有的组件全都运行在同一台计算机使用文件来作为数据库有没有问题? 没问题
但是这都是我们的假设 在正常的生产环境中我们必须要考虑文件操作所带来的效率问题
第二点我们不可能所有组件运行在同一台计算机上为什么?
一台计算机的性能总归有上限 例如淘宝双11 双12 你用一台计算机来做服务器器的 随便你什么配置都吃不消那怎么办?
我们需要对计算机的性能进行扩展
如何扩展
垂直扩展
不断的提升硬件性能 不可取
横向扩展
添加更更多的计算机 将程序的不同组件分别运行在不同的计算机上带来的优点:
性能提高 稳定性提高(可拔插式)
现在性能问题已经解决了 通过分布式的方式
但是这些组件虽然分布在各个计算机上 但是它们还是不是一个整体? 也就是说你操作的数据文件是不是同一份? 是的
我们都知道默认情况下 我们的程序能访问的数据 只有当前计算机
如何能访问别的计算机上的文件呢? 只有一种办法,通过网络 通过网络把你要什么数据告诉我 我在通过网络把你要的数据发送给你,得通过socket
程序 python程序通过客户端来链接服务器端 从而完成数据的读写
好 现在我们说你可以自己写个程序用来管理数据文件 并且你也可以编写socket服务器程序来让别的计算机可以访问你的文件那 你想一下
需不需实现并发? 必须要
还要考虑线程安全问题? 需要给文件操作加锁
是不是任何计算机请求链接我都要接受呢? 不不是需要进⾏行行⽤用户认证
你就考虑一下 单纯的对本地计算机上的数据进行读取 速度慢还是快? 慢 硬盘上的数据有寻道寻址时间 平均延迟时间速度太慢!
要想办法提高数据的存取效率 如何提高 通过索引 后面会讲
到现在为止有没有同学说想自己写一个数据库程序呢? 应该没有了是吧
有的童鞋心气高 说我就不想要用现成的 我就要自己写 好老老师支持你然而早早些年年 没有数据软件的时候 大家都是自己来完成上述的功能
服务器 客户端 解决上面4个问题 然后才能开始程序功能的实现
所以就有人跳出来了了 你们这群傻屌都别写了了 我来写一个给你们用这就有了我们现在看到的这些数据库
二、常见数据库
免费开源 支持中大型企业
被闭源 已经
另起灶炉 开发了mariaDB mariaDB 完全兼容
mysql 使用起来一模一样
收费闭源 更更能强⼤大 分布式数据库
的一生 坎坎坷坷
微软生态圈 仅支持 windows系统 太局限
开发的数据库软件 收费闭源 经常与IMB的机器器绑定销售 打折啥的
以上都属于关系型
表与表之间的数据存在某种关联关系
非关系型:
存储数据各个数据之间没有关系 不是通用性数据库 有局限性
MongoDB redis memcache
总结 我们通常说的数据库就是一套软件 有服务端和客户端用来操作服务器端上的
文件
数据库相关概念
数据: 用于记录事物的状态信息 可以输数字 字符 声音 图像等记录长什么样呢
name = yyh
记录: 一条记录用于保存一个事物的典型特征 就相当于文件中的一行
yyh,180,man,帅
表: 本质就是一个文件 创建表的时候其实就是在创建一个文件 等会儿你就看到了
可不可能把所有数据全放到同一个文件里?
为了了降低耦合性 方便管理 都应该把数据分门别类 放到不同文件中
库: 就是一个文件夹
数据库管理软件 就是一个套接字服务器端软件数据库服务器:
在公司我们开发者关心的部分是哪些?
从库网上的需要我们关系 DBMS 和 服务器器是运维关心的
二.安装mysql
下载安装包
下载的时候提供了带界面的和不带界面的 用哪个呢? 你到公司后你想想服务器是什么系统?
有界面吗? 所以我们安装不带界面的
mysql目录解析bin
mysqld mysql
data
文件夹库
my-default.ini
启动mysql服务器器cd mysqld
程序 这时候相当于做了什么事?
并监听端口 默认绑定当前ip 端口默认3306 接下来做什么呢?
启动客户端,
程序 要连接服务器需要什么?
ip 和
mysql -h ip -P port -uroot -p 密码默认为空
看到欢迎界面了是吧 说明socket链接成功了这个命令提示符本质是什么?
接受一条指令然后怎么办? 发送个服务器器
服务器接收到之后呢?
解析指令 取出你要的数据在send给客户端
那问题来了 指令肯定不能随便写,不认服务器不认识,大家的有套规范就是sql show databases;对比data文件夹
那在讲命令之前呢 你想想 我们每次要使用mysql都得先cd到这个目录中
非常麻烦
怎么解决呢?
加到环境变量量命令总结:
启动服务器器
mysqld
启 动 客 户 端 mysql -h -P -u -p 简写
tasklist | findstr mysqld taskkill /F /PID 8372
服务器的启动和关闭都需要执行命令 还是不够方便 怎么办呢? 将mysql注册到系统服务中
终端执行
运行->services.msc 查看系统服务
三.修改管理理员密码
现在密码默认为空 这样安全吗?
不安全 万一谁过来把你数据删了 怎么办? 改密码
怎么改:
mysqladmin -uroot -p旧密码password "123'
警告 没关系
破解密码:
万一你不小心把密码忘记了怎么办?不可能卸载重装吧所以我们下来讲的是如何破解密码,如何破解呢?
那你就要想 这个密码它肯定要找地方存储起来 ,那存客户端还是服务器呢? 服务器
那你有没有什么思路?
方式1:删文件
没问题 简单粗暴 但是,这个文件里不只有你的账号信息 还有别人账号数据 还有授权相关的数据
所以你最好不要这么干!
那你在思考一下,服务器验证用户的本质是什么,是不是读取一个文件的数据来 和你输入的数据进行对比,
那你可不可以这样子 我告诉服务器说你不要去读那个授权文件,可以!
跳过授权表 进入系统修改授权表
跳过这个操作是服务器相关的操作所以 咱的先关掉服务器重新开 在重新开的时候来告诉它停止服务
启动服务器并添加参数
mysqld --skip-grant-tables
使用客户端登录服务器 执行修改命令 此时不需要输入密码
update mysql.user set password = password("123123") where user="root" and host="localhost"
刷新权限
flush privileges
命令行中重启服务器验证新密码
四 编码设置
来看一下
来看一下 这边latin1 gbk 什么意思 是不是就是编码? 那这样有没有什么问题? 服务器是拉丁 客户端是 GBK 乱码 如何解决乱码?
如何设置呢?
他就是配置⽂文件,但是他不不是正在使用的
而是一个模板文件,我们如果要自己编写配置文件,需要自己复制一个叫做my.ini的文件来编写
编写格式? 你已经学习过了了
回顾一下 conf文件包含什么? 分区 和 选项
[section]
option = value
分区
文件 找到命令对应的标题加载里面的设置项
在思考一下 我们在登录的时候是不是每次都需要输入用户信息 麻不麻烦? 麻烦 那怎么解决?
中
是在你执行命令是手动传的参数,那既然是参数可不可以定义到配置文件中呢? 可以! 来看看如何定义
[mysql]
user = "root"
pasword = "123"
下面我们来测试一下看行不行?
报错了 说明他确实读取了了配置文件 报错原因 名字写错了
思考
你现在这个配置文件是给谁用的 是客户端还是服务端?
即是客户端也是服务器端 因为我们现在客户端和服务器端在同一台电脑上正常情况下 我们不会这么干 你客户端想要用你就在客户端安装目录中建一个my.ini
同样服务器要⽤用就在服务器端建 只写服务器相关内容
最终结果[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci [mysql]
default-character-set = utf8
[client]
default-character-set = utf8
思考?
是什什么意思呢? 就是客户端的意思
有什什么区别?
mysql也是客户端的其中⼀一种
除了了它 还有python客户端
client是所有客户端的总称
如果都有的话 同时设置了了两个的话 哪个⽣生效呢? 当然是mysql 因为他指名道姓说了了mysql这个程序
验证一下将client中加一个不存在的用户名
user = xxxxxxxxx
看看是否能成功登陆
分区 再次验证
注意:修改了了mysqld配置需要重启服务器器
五
开发者 你觉得配置文件书写方法相同好还是不不同好? 相同 降低使用成本
首先明确 配置文件编写方式相同! 不同的在于
的安装路路径
使用command + shift + g 来前往
配置文件名称为
六 基本sql语句句
库相关
增
create database mydb charset utf8;
查
show databases;
show create databases mydb;
改
alter database mydb charset gbk
删
drop database mydb;
表相关
增
切换文件夹
use mydb;
create table t1 (id int,name char)
查
show tables;
show create table t1; desc t1;
改
改字段
表名
跟 列列名和类型
跟 列列名 和 类型
drop 跟列列名
跟 旧列列名 新列列名 类型改字符编码
表名
改名称
rename table tname1 to tname2
删
drop table 表名
记录相关
增
nsert into tablename values(data,....),(data)...
查
select id,name from t1; 列列名可⽤用*号表示通配符
改
表名 set 列列名 = 值 where 条件 ; 可同时修改多个字段用逗号隔开 列列名=值,列列名=值... 没有条件则修改全部
删
表名 where 条件; 没有条件则删除所有;
重建表,清空所有数据;
七 相关规范
字段名 表名 库名
由 数字 字母
表的分类(数据存储引擎)
先说什什么是引擎?
汽车的发动机是不是引擎? 引擎就是一个系统的核心部分
为什什么需要分类呢? 发动机分类呢? 分柴油 汽油 电动
各自的使用场景不同
mysql支持的引擎show engines
不同引擎效果