数据库mysql基础

一、.认识数据库

什么是mysql?

  数据库

    存储数据的仓库存储数据的方式

    学习编程语言第一天就学习了一种 就是变量量 变量量就是用来存储数据的变量量存储的介质是什什么呢?就是内存

  内存有什么问题呢?

    无法永久保存

  要如何永久保存呢 ,比如你刚刚注册成功的用户名密码

    所以我们学习了一个新的知识点 文件处理 之前的很长一段时间我们都在使用文件来进行存取数据

  把文件当成数据库

    那用文件当数据库有没有什什么问题呢?

  首先我们忽略略两个点

    第一点 文件存储带来的效率问题

    效率有什什么问题 因为文件处理是要和硬盘打交道 是一个io操作

    第二点 假设我们的程序所有的组件全都运行在同一台计算机使用文件来作为数据库有没有问题? 没问题

      但是这都是我们的假设 在正常的生产环境中我们必须要考虑文件操作所带来的效率问题

    第二点我们不可能所有组件运行在同一台计算机上为什么?

    一台计算机的性能总归有上限 例如淘宝双11 双12 你用一台计算机来做服务器器的 随便你什么配置都吃不消那怎么办?

  我们需要对计算机的性能进行扩展

   如何扩展

  垂直扩展

    不断的提升硬件性能 不可取

  横向扩展 (分布式计算)

    添加更更多的计算机 将程序的不同组件分别运行在不同的计算机上带来的优点:

  性能提高 稳定性提高(可拔插式)

  现在性能问题已经解决了 通过分布式的方式

    但是这些组件虽然分布在各个计算机上 但是它们还是不是一个整体? 也就是说你操作的数据文件是不是同一份? 是的

    我们都知道默认情况下 我们的程序能访问的数据 只有当前计算机

   如何能访问别的计算机上的文件呢? 只有一种办法,通过网络 通过网络把你要什么数据告诉我 我在通过网络把你要的数据发送给你,得通过socket

    ,需要配套的来一个服务器端 和 客户端 把客户端程序分发给各个python 程序 python程序通过客户端来链接服务器端 从而完成数据的读写

      现在我们说你可以自己写个程序用来管理数据文件 并且你也可以编写socket服务器程序来让别的计算机可以访问你的文件 你想一下

    socket需不需实现并发? 必须要

  既然是并发 还要考虑线程安全问题? 需要给文件操作加锁

    是不是任何计算机请求链接我都要接受呢? 不不是需要进⾏行行⽤用户认证

    你就考虑一下 单纯的对本地计算机上的数据进行读取 速度慢还是快? 硬盘上的数据有寻道寻址时间 平均延迟时间速度太慢!

    要想办法提高数据的存取效率 如何提高 通过索引 后面会

   ok 到现在为止有没有同学说想自己写一个数据库程序呢? 应该没有了是吧

    有的童鞋心气高 说我就不想要用现成的 我就要自己写 老老师支持你然而早早些年年 没有数据软件的时候 大家都是自己来完成上述的功能

    写一个软件之前先写一个socket 服务器 客户端 解决上面4个问题 然后才能开始程序功能的实现

    所以就有人跳出来了了 你们这群傻屌都别写了了 我来写一个给你们用这就有了我们现在看到的这些数据库

 

二、常见数据库

   mysql 免费开源 支持中大型企业

  为了防止mysql被闭源 已经 担心oracle的优化能力

  创始人Widenius 另起灶炉 开发了mariaDB mariaDB 完全兼容

  mysql 使用起来一模一样

  oracle 收费闭源 更更能强⼤大 分布式数据库

  mysql的一生 坎坎坷坷 sun - oracle

  SQLServer 微软生态圈 仅支持 windows系统 太局限

  DB2 IMB 开发的数据库软件 收费闭源 经常与IMB的机器器绑定销售 打折啥的

 以上都属于关系型 :

  表与表之间的数据存在某种关联关系

 非关系型:

  通关key value存储数据各个数据之间没有关系 不是通用性数据库 有局限性

MongoDB redis memcache

  总结 我们通常说的数据库就是一套软件 有服务端和客户端用来操作服务器端上的

文件

数据库相关概念

   数据: 用于记录事物的状态信息 可以输数字 字符 声音 图像等记录长什么样呢

  name = yyh

  记录: 一条记录用于保存一个事物的典型特征 就相当于文件中的一行

  yyh,180,man,帅

  表: 本质就是一个文件 创建表的时候其实就是在创建一个文件 等会儿你就看到了

 

 

可不可能把所有数据全放到同一个文件里?

  为了了降低耦合性 方便管理 都应该把数据分门别类 放到不同文件

库: 就是一个文件夹

  DBMS: 数据库管理软件 就是一个套接字服务器端软件数据库服务器:

  运行有数据库管理软件的计算机在公司我们开发者关心的部分是哪些?

  从库网上的需要我们关系 DBMS 服务器器是运维关心的

 

 

 

二.安装mysql

下载安装包

  下载的时候提供了带界面的和不带界面的 用哪个呢? 你到公司后你想想服务器是什么系统?

  linux 有界面吗? 所以我们安装不带界面的

  mysql目录解析bin

  mysqld mysql

  data

  文件夹

  my-default.ini

 

启动mysql服务器器cd mysqld

  这是一个socket程序 这时候相当于做了什么事?

  启动服务器socket 并监听端口 默认绑定当前ip 端口默认3306 接下来做什么呢?

启动客户端,

  运行mysql 注意他是一个socket程序 要连接服务器需要什么?

ip 端口

  mysql -h ip -P port -uroot -p 密码默认为空

 看到欢迎界面了是吧 说明socket链接成功了这个命令提示符本质是什么?

  就是一个input 对不对接受一条指令然后怎么办? 发送个服务器器

服务器接收到之后呢?

  解析指令 取出你要的数据在send给客户端

  那问题来了 指令肯定不能随便写,不认服务器不认识,大家的有套规范就是sql show databases;对比data文件夹

 那在讲命令之前呢 你想想 我们每次要使用mysql都得先cd到这个目录中

  非常麻烦

怎么解决呢?

  加到环境变量量命令总结:

    启动服务器器

      mysqld

    启 mysql -h -P -u -p 简写 mysql -u -p 关闭服务器器

      tasklist | findstr mysqld taskkill /F /PID 8372

  服务器的启动和关闭都需要执行命令 还是不够方便 怎么办呢? 将mysql注册到系统服务中

    终端执行 mysqld --install

  运行->services.msc 查看系统服务

 三.修改管理理员密码

  现在密码默认为空 这样安全吗?

    不安全 万一谁过来把你数据删了 怎么办? 改密码

  怎么改:

    mysqladmin -uroot -p旧密码password "123'

   警告 没关系

   破解密码:

    万一你不小心把密码忘记了怎么办?不可能卸载重装吧所以我们下来讲的是如何破解密码,如何破解呢?

    那你就要想 这个密码它肯定要找地方存储起来 ,那存客户端还是服务器呢? 服务器 ,那存在内存还是硬盘呢? 必然是硬盘,既然如此,一定有一文件用于干嘛? 存放密码信息

  那你有没有什么思路?

    方式1:删文件

    没问题 简单粗暴 但是,这个文件里不只有你的账号信息 还有别人账号数据 还有授权相关的数据

  所以你最好不要这么干!

    那你在思考一下,服务器验证用户的本质是什么,是不是读取一个文件的数据来   和你输入的数据进行对比,

    那你可不可以这样子 我告诉服务器说你不要去读那个授权文件,可以!

  方式2: 跳过授权表 进入系统修改授权表

    跳过这个操作是服务器相关的操作所以 咱的先关掉服务器重新开 在重新开的时候来告诉它停止服务

  启动服务器并添加参数

      mysqld --skip-grant-tables

    使用客户端登录服务器 执行修改命令 此时不需要输入密码

      update mysql.user set password = password("123123") where user="root" and host="localhost"

  刷新权限

    flush privileges

   命令行中重启服务器验证新密码

  编码设置

  来看一下 当前服务器的设置信息使用客户端执行\s

  来看一下 这边latin1 gbk 什么意思 是不是就是编码? 那这样有没有什么问题? 服务器是拉丁 客户端是 GBK 乱码 如何解决乱码?

  保证编码方式一致! 如何设置呢?

  在mysql安装⽬目录下有个my_default.ini 他就是配置⽂文件,但是他不不是正在使用的

  而是一个模板文件,我们如果要自己编写配置文件,需要自己复制一个叫做my.ini的文件来编写

 编写格式? 你已经学习过了了

  configpaser 回顾一下 conf文件包含什么? 分区 选项

    [section]

    option = value

 要设置客户端的内容就写在mysql分区   要设置服务器器的内容就写在mysqld分区下

   原理:mysql在启动的时候会自动到安装目录下找my.ini文件 找到命令对应的标题加载里面的设置项

  在思考一下 我们在登录的时候是不是每次都需要输入用户信息 麻不麻烦? 麻烦 那怎么解决?

    你看在mysql -uroot -p123 -u -p是不是参数

  是在你执行命令是手动传的参数,那既然是参数可不可以定义到配置文件中呢?  可以! 来看看如何定义

    [mysql]

    user = "root"

     pasword = "123"

  下面我们来测试一下看行不行?

    ok 报错了 说明他确实读取了了配置文件 报错原因 名字写错了

  思考

    好现在我问你: 你现在这个配置文件是给谁用的 是客户端还是服务端?

    即是客户端也是服务器端 因为我们现在客户端和服务器端在同一台电脑上正常情况下 我们不会这么干 你客户端想要用你就在客户端安装目录中建一个my.ini

    只写客户端相关的内容同样服务器要⽤用就在服务器端建 只写服务器相关内容

   最终结果[mysqld]

    character-set-server = utf8

    collation-server = utf8_general_ci [mysql]

    default-character-set = utf8

    [client]

    default-character-set = utf8

 

  思考?

    client是什什么意思呢? 就是客户端的意思

    和mysql有什什么区别?

    mysql也是客户端的其中⼀一种

    除了了它 还有python客户端 java客户端等等

    client是所有客户端的总称

  如果都有的话 同时设置了了两个的话 哪个⽣生效呢? 当然是mysql 因为他指名道姓说了了mysql这个程序

  验证一下将client中加一个不存在的用户名

  user = xxxxxxxxx

  看看是否能成功登陆

  删除mysql分区 再次验证

  注意:修改了了mysqld配置需要重启服务器器

mac配置

  如果你是mysql开发者 你觉得配置文件书写方法相同好还是不不同好? 相同 降低使用成本

  首先明确 配置文件编写方式相同! 不同的在于

  mysql的安装路路径 mac默认无法修改位于:/usr/local

  使用command + shift + g 来前往

  配置文件名称为 my.cnf

基本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;

    改

      改字段

      alter table 表名 add | modify | drop | change

      add  列列名和类型

      modify 列列名 类型

      drop 跟列列名

      change 旧列列名 新列列名 类型改字符编码

      alter table 表名 default character set gbk

      改名称

      rename table tname1 to tname2

    删

      drop table 表名

  记录相关

    增

      nsert into tablename values(data,....),(data)...

    查

      select id,name from t1; 列列名可⽤用*号表示通配符

    改

      update 表名 set 列列名 = where 条件 ; 可同时修改多个字段用逗号隔开 列列名=,列列名=值... 没有条件则修改全部

    删

      delete from 表名 where 条件; 没有条件则删除所有;

       truncate  table   t1; 重建表,清空所有数据;

  相关规范

  字段名 表名 库名

   由 数字 字母 @ $ # _ 组成不不能纯数字不能是关键字

   表的分类(数据存储引擎)

  先说什什么是引擎?

    汽车的发动机是不是引擎? 引擎就是一个系统的核心部分

  为什什么需要分类呢? 发动机分类呢? 分柴油 汽油 电动

    各自的使用场景不同

  mysql支持的引擎show engines

    不同引擎效果

 

posted on 2018-09-11 16:43  一条流浪鱼  阅读(132)  评论(0编辑  收藏  举报

导航