数据库
存储数据的演变过程
-
数据随意的存到一个文件中,数据的存取位置不一;数据的格式千差万别
''' # 小张 data_str='jason|123|nb' with open('a.txt',)... # 小王 data_str='egon/123/nb' with open('b.txt')' # 小赵 data_str='egon:123:nb' with open('x.txt') ... '''
-
软件开发目录规范
规定了不同数据具体的存储位置
""" bin 启动 conf 配置 core 核心逻辑 bd 处理数据 lib 公共方法 readme 软件需知"""
假设上述的是一个 单机游戏,那么每个人的游戏数据(等级、装备)只能在自己的设备上保持,注册登录的账号也只能在自己的设备上有效,那么怎么才能将单机游戏变成网络游戏呢?
-
数据的操作统一到一个计算机上
""" 将操作数据的部分全部统一到一个计算机上,所有人操作数据的时候基于网络通信操作这台计算机上的数据,这台计算机就是我们说的服务器。"""
数据库的本质
数据库的本质就是一款基于网络通信的应用软件,就说是其实所有人都可以开发一款数据库软件, 正是因为这样,数据库软件有很多。
数据库 的分类
-
关系型
MySQL、oracle、db2、access、sql server
特性:
- 数据之间彼此有关系或者约束
例:老师表和课程表,老师教授的课程、课程的任课老师
2)存储数据以表格的形式存储
例:
name password hobby stu_1 123 打游戏 stu_2 123 喝酒 stu_3 123 逃课打游戏
每个字段还会有存储类型的限制,姓名只能存字符串
-
非关系型
MongoDB、redis、memcache
特性:存储数据通常都是以k,v键值对的形式存储,多用于临时缓存
数据库软件很多,我们每个都使用,具体根据需求来定,那最常用的一款数据库软件是什么呢?
MySQL
"""
任何基于网络通信的应用程序底层用的都是socket套接字
-服务端
-基于socket通信
-收发消息(SQL语句)
-客户端
-基于socket通信
-收发消息(SQL语句)
"""
MySQL不单单支持总结的客户端来连接服务端, 还支持其他语言来充当客服端连接服务端操作数据,这样就会出现一个问题就是不同语言的数据格式不同,这样会导致数据错乱,MySQL对数据的格式进行了统一,统一用SQL语句来操作数据。
重要概念:
- 库——>文件夹
- 表——>文件
- 记录——>文件内一行行的数据
- 表头——>表格的第一行字段
- 字段——>表每一列的名称
MySQL的安装
"""
在IT界 一般都不会轻易的使用最新版本的软件,因为新版本可能会出现各种问题
(你原本项目跑的好好的 非要画蛇添足更新版本 然后项目奔溃)
小段子:
更新完没事 那么你还是一个普通员工
更新完出事 那么你就是一名"烈士"
"""
# MySQL有很多版本(5.6、5.7、8.0) 目前企业里面用的比较多的还是5.6左右
官网:https://www.mysql.com/
下载5.6版本即可,如果你下载了其他版本问题也不大,因为sql语句是一样的,按照教学方式下载,会将服务端和客户端一并下载到本地为了学习方便我们将服务端和客户端都在本地启动,在公司服务端会专门跑在一台服务器上,所有人基于网络连接服务端操作。
MySQL服务端与客户端:
解压MySQL会得到如图的文件,服务端和客户端都在bin目录下。
打开bin文件,里面有MySQL的服务端和客户端、
两个都是exe文件,即为程序mysqld.exe mysql.exe
启动
启动注意事项:
"""
在前期配置MySQL的时候 cmd终端尽量以管理员的身份运行
windows+r 输入cmd 进入的是普通用户终端 有一些命令是无法执行的
搜索cmd右键 以管理员身份运行
必须先启动服务端,客服端连接服务端的时候才能连上。
"""
启动步骤:
-
先启动服务端,以管理员身份打开cmd窗口,切到MySQL的bin目录下,输入mysqld就能启动服务端
-
保留原来的cmd窗口,再重新打开一个,同样切到bin目录下输入客服端连接服务端的命令:mysql -h 127.0.0.1 -P 3306 -uroot -p
注意:前一个字母P是大写,后一个是小写。
常见数据库软件端口号:
MySQl——>3306
redis——>6379
MongoDB——>27017
djangGo——>8000
flask——>5000
初始SQL语句
-
MySQL中的sql语句是以分号(;)作为结束的标志。
-
基本命令
show databases ; # 查看所有的库名
-
简写的连接服务端命令
mysql -uroot -p
-
当输入的命令不对且不想让服务端执行错误的命令,可以在后面加c取消
错误命令 c
-
客服端退出 退出命令加不加分号都可以执行
quit # quit()
exit # exit()
-
当你连接服务端时,只输入mysql也能连接,但至少游客身份,一些操作无法执行,而且显示的数据也不同。
每次启动服务端、客服端连接服务端都需要切到bin目录下很是麻烦,那有没有其他方法呢?
配置环境变量:
将mysqld所在的文件路径添加到系统环境变量中,也就是将mysql解压文件的bin文件的绝对路径添加到环境变量中,跟我们之前配置python环境变量是一个方法。
我们还得起两个cmd窗口,还是麻烦
服务端制作成系统服务(开机自启动)
"""
查看当前计算机的运行进程数
services.msc
将mysql制作成系统服务
mysqld --install
移除mysql系统服务
mysqld --remove
"""
知识补充:
"""
1 如何查看当前具体的进程
tasklist
tasklist |findstr mysql
2 如何杀死具体的进程(只有在管理员cmd窗口才能成功)
taskkil /F /PID PID号
"""
设置密码
"""
mysqladmin -uroot -p原密码 -password 新密码
该命令直接在终端输入即可,无需进入客服端
mysqladmin -uroot -p123 -password 321
"""
破解密码
我们写选课系统和ATM的时候写过登录认证装饰器,其实mysql用户名于密码的验证功能也相当于一个装饰器,实现原理相同。
也就是说我们只要将该装饰起移除,那么就不需要在登录时验证用户名和密码了
具体步骤:
# 1 先关闭当前的mysql服务端
# 2 以命令行的方式启动服务端,跳过验证功能
mysqld --skip-grand-tables
# 3 客户端直接以无密码的方式连接
myslq -uroot -p # 直接回车
# 4 修改当前用户的密码
update mysql.user set password=password(123) where user='root' and host='localhost';
# ps
"""
真正存储用户表的密码字段 存储的肯定是密文
只有用户自己知道明文是什么 其他人都不知道 这样更加的安全
密码比对也只能比对密文"""
# 4 立即将其修改数据刷新到硬盘上
flush privileges;
# 5 关闭当前服务端,然后以正常校验授权表的形式启动
统一编码
"""
my-default.ini
ini结尾的一般都是配置文件
程序启动会先加载配置文件中的配置之后才真正的启动
"""
[mysqld] # 一旦服务端启动立刻加载下面的配置
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysql] # 一旦客户端启动立刻加载下面的配置
...
[client] # 其他客户端
...
# 需要你自己新建一个my.ini的配置文件
# 验证配置是否真的是自动加载
[mysql]
print('hello world')
# 修改配置文件后一定要重启服务才能生效
# 统一编码的配置 无需掌握 直接拷贝即可
# 偷懒 将管理员的用户名和密码也添加到配置文件中
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
user="root"
password=123456
default-character-set=utf8
基本SQL语句
ps:大部分的程序的义务逻辑其实都是对数据进行增删改查
小段子皮一下:辛辛苦苦一个月 只为了一条sql语句(将自己账户的钱修改一下)
针对库的增删该查(文件夹)
# 增
create database db1;
create database bd2 charset='utf8';
# 查
show databases; # 查所有
show create databse db1 # 查单个
# 改
alter database db1 charset='gbk';
# 删
drop database db1;
针对表...
"""
在操作表的时候需要指定所在的库
"""
# 查看所在库的名字
select database();
# 切换库
use db2;
# 增
create table t1(id int,name char(4));
# 查
show tables # 查看所在库里所有的表名
show create table t1; #查单个表
# 改
alter table t1 modify name char(14);
# 删
drop table t1;
"""
create tabel db1.t1(id int); #绝对路径的形式操作不同的库里的表
"""
针对数据...(一行行的数据) 重点掌握
"""
一定要先有库,再有表,最后才能操作记录"""
# 增
insert into t1 values(1,'tom');
insert into t1 values(2,'jack'),(3,'marry');
# 查
select * from table t1; # 查询表t1下所有的字段,数据量较大时不建议使用
select name from table t1; # 查询t1下的那么字段
# 改
update t1 set name='nb' where id > 1;
# 删
delete from t1 where id =1
delete form t1 where name='nb'
# 清空表里数据
delete from t1;