day38数据库

今天开始介绍数据库,作为一名程序员我们需要清楚的是我们的大部分操作都是抽象化得来的,包括对象概念并发概念等等,而我们所使用的方法包括函数包括传输我们的最终目的都是操作数据,所以在我个人看来说数据是编程的全部也不为过,所以关于保存数据就显得特别重要了。

数据存储的演变过程:
大家都知道数据在内存中无法永久保存,所以基于之前的学习我们更多的是将数据保存于文件中。我们将数据随意的保存到一个文件夹中,而数据的格式也是各有不同。

之后我们了解了文件目录规范,这规定了数据的存储位置,了解了序列化概念,规定了数据存储的格式,于是我们有了一个类似于单机游戏的概念。那么我们每个人的数据都会以一个固定的形式保存在一个固定的位置。

之后随着我们对数据的要求更多,要求不同计算机能够访问一块公共的数据,完成某种意义上的联机,上述存储方式就出现了比较明显的缺点。

1.我们所访问的数据可能来自于不同的计算机
2.我们将数据存储到不同的计算机上通过网络传输完成数据交互,就会出现数据安全问题,比如两个客户端同时修改一块数据
3.并发问题,我们的数据公共部分可能有多用户同时访问,这就意味着我们每个服务端都要实现并发

基于上述问题以及我们提出的可能解决问题的方法,一款对数据高度整合的软件诞生了。

数据库本质上就是一款基于网络通信的应用程序,原则上来说所有的人都可以写一款数据库软件,但是我们的大佬前辈们已经为我们准备好了较为完善的数据库软件,那么接下来我们介绍一下常见的几种数据库。
关系型数据库
MySQL、oracle、db2、access、sql server
非关系型数据库
redis、mongodb、memcache
(关系型:数据之间相互有关联或者约束,同时一般是由表格来存储的。 非关系型:通常是k,v键值对的形式)

我们最常使用也是实用基数最大的一款数据库软件是mysql,所以我们接下来就来根据mysql来为大家讲解数据库。

根据上面的介绍我们知道数据库其本质上就是一款基于网络通信的用于数据存储的软件,所以我们的mysql也是一样,但凡基于网络通信那么底层必定调用了socket通信,所以我们知道我们的数据库有两个部分,服务端与客户端。

那么MySQL不单单支持MySQL自己的客户端app还支持其他编程语言来充当客户端操作
如何解决语言沟通的障碍?
1 让服务端兼容所有的语言(一个人精通多国语言),从字面意思上来看就知道,这种方式的可行性并不大。
2 采用统一的语言(SQL语句)也是我们编写应用程序时遵循的语法规范

之后再详细讲解数据库的开始我们首先来了解几个重要的概念
库 类比 文件夹
表 类比 文件
记录 类比 文件中的具体数据
表头 就是表的首行,第一行
字段 就是每一行中具体的数据内容
mysql的安装:这里就不为大家详细介绍安装的过程,大家可以自行百度或者直接去官网安装,值得一提的是我们在使用软件的时候并不会去挑选最新 的软件,因为最新就意味着不确定因素也就是我们常说的bug会很多。


mysql的服务端和客户端:

前文和大家提到过,既然是基于网络通信那么就必然会存在客户端和服务端的概念,有的小伙伴在使用一些集成类软件的时候发现我们并没有手动启动服务端,而是直接使用的客户端,因为这些软件在启动的时候就会为我们将服务端启动,所以在大家没有 启动软件而直接在命令行模式下取启动数据库就会提醒你服务并未启动的字样。

在安装好数据库之后我们可以打开文件夹,根据目录相关规范我们可以很轻松的在bin目录下找到我们的服务端和客户端的启动程序

服务端:mysqld.exe
客户端:mysql.exe
ps:在前期我们配置mysql的时候要使用管理员身份运行cmd,这样我们才有权限对其进行一些操作

常见软件的默认端口号:

MySQL 3306
redis 6379
mongodb 27017
django 8000
flask 5000
在第一次进入mysql的时候我们是没有设置密码的所以在启动了服务端和客户端之后在客户端直接输入命令:
mysql -h 127.0.0.1 -P 3306 -uroot -p即可。

sql语句初始:作为一种独立的语言,那么他就会存在一种语法,所以在这里为大家先简单介绍一些语句
1 MySQL中的sql语句是以分号作为结束的标志

2 基本命令
show databases; 查看所有的库名

3 连接服务端的命令可以简写
mysql -uroot -p

4 当你输入的命令不对 又不想让服务端执行并返回报错信息 可以用\c取消
错误命令 \c

5 客户端退出 退出命令加不加分号都可以执行
quit
exit

6 当你在连接服务端的时候 发现只输入mysql也能连接
但是你不是管理员身份 而只是一个游客模式,权限并不全

系统服务制作:首先说一下为什么要制作系统服务,因为大家会发现每次我们在使用数据库的时候都需要打开一次服务端,很麻烦。所以我们将其添加 到系统服务中去,设置为开机自启,这样我们就不需要每次都打开了,同时我们在命令行打开数据库的时候需要进入到sql文件夹下, 所以我们将其添加环境变量,这里就不详细介绍了。

查看当前计算机的运行进程数
services.msc

将mysql制作成系统服务
mysqld --install

移除mysql系统服务
mysqld --remove
ps:值钱啊提到过我们应该在管理员模式下进行这些操作,游客没有这些权限。

设置密码:
这也是保护数据安全的一种方式,我们需要密码来限制其他人的登录。

mysqladmin -uroot -p原密码 password 新密码
改命令直接在终端输入即可 无需进入客户端

密码的破解:
值得一提的是我们并不能找回原密码,我们只能修改它。为什么我们可以修改密码呢?

你可以将mysql获取用户名和密码校验的功能看成是一个装饰器装饰在了客户端请求访问的功能上我们如果将该装饰器移除 那么mysql服务端就不会校验用户名和密码了。
1 先关闭当前mysql服务端
命令行的方式启动(让mysql跳过用户名密码验证功能)
mysqld --skip-grant-tables
2 直接以无密码的方式连接
mysql -uroot -p 直接回车
3 修改当前用户的密码
update mysql.user set password=password(123456) where user='root' and host='localhost';
ps where的作用是声明我们要修改的是哪一个用户的密码,如果不加上那么所有的密码都会被重置
4 立刻将修改数据刷到硬盘
flush privileges;
5 关闭当前服务端 然后以正常校验授权表的形式启动

基本的sql语句:
到现在为止我们所有的数据操作无论多么复杂,逻辑上多么繁琐,最终落在实际上就是对数据的增删改查。

对库操作:

create database db1;
create database db2 charset='gbk';

show databases; # 查所有
show create database db1; # 查单个

alter database db2 charset='utf8';

drop database db2;

对表操作:
查看当前所在的库的名字
select database();
# 切换库
use db1;


create table t1(id int,name char(4));

show tables; # 查看当前库下面所有的表名
show create table t1;
describe t1; # 支持简写 desc t1;

alter table t1 modify name char(16);

drop table t1;

对数据操作:

insert into t1 values(1,'jason');
insert into t1 values(1,'jason'),(2,'egon'),(3,'tank');

select * from t1; # 该命令当数据量特别大的时候不建议使用
select name from t1;

update t1 set name='DSB' where id > 1;

delete from t1 where id > 1;
delete from t1 where name='jason';
将表所有的数据清空
delete from t1;

这里要强调一下所有的下层操作都是在有上层存在的前提下完成的。

猜你喜欢

转载自www.cnblogs.com/Jicc-J/p/12823607.html
今日推荐