MySQL知识梳理

MySQL

一:简介

https://www.cnblogs.com/gyxpy/articles/13909272.html

二:配置

三:权限

四:库操作

五:表操作

六:记录操作

七:约束

八:表关系

九:pymysql

十:了解部分

  • 基础
    • 简介
      • 本质:基于网络通信的应用程序
      • 单机变联网,data统一存放且格式固定
    • 分类
      • 关系型:MySQL、Oracle等,data之间有约束和联系,例如男生表,现女友、前女友之间的关系
      • 非关系型:redis、mongdb、memory。key-value键值对形式 存data。
    • 本质
      • 数据库---文件夹
      • 表-----文件
      • 表首行----字段
      • 行-----记录
    • 安装
      • 下载
      • 初始化服务端
        • 默认给了一个用户root,但是没有密码,mysqladmin -uroot -p原密码 password,然后输入新密码
        • windows平台将mysql做成服务 mysqld --install 然后net  start mysql开机启动mysql服务,可执行文件点点点安装的,服务已经帮你做好了(linux忽略) 
    • 授权
      • 授权表都放在默认的mysql数据库
        • 授权库,主要存储系统用户的权限信息
      • 创建新用户
        create user "gyx"@"192.168.1.%" identified by "123456";
        创建了用户gyx,@后面表示host的ip,%表示任意多个字符,_表示任意单个字符
      • 授权
        约束用户只能看某个数据库某个表
        grant 权限 on 库.表 to 人;
        grant select,insert,update on db1.* to “gyx”@"192.168.1.%";
        grant all privileges on db1.* to “gyx”@"192.168.1.%";
        给与所有权限,除了grant以外。
        flush privileges;刷新权限,立刻生效。
      • 更多操作MySQL知识梳理MySQL知识梳理
      • 默认自带的剩下三个库
        • 新单词scheme:(计划或理论的)提要,纲要
        • information_schema:虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等
        • performance_schema:MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象
        • test: MySQL数据库系统自动创建的测试数据库
    • 基础操作
      • 连接数据库:mysql -h 192.168.1.1 -P 3306 -uroot -p123后两个连接在一起没有空格
      • SQL语句:Mysql是多客户端的软件,有自己写的client,各个语言也可以作为客户端,为了统一标准,所有client都用Sql语句
    • 配置文件
      • my.ini
        [mysql]
        ​自己客户端的config
        [msyqld]
        服务端的config
        [client]
        所有客户端的cofig
        尤其是编码问题,都改为utf8
  • 必会操作
    • 库操作------操作文件夹
      建库:
      create database 库名 default charset utf8;
      删库
      drop database 库名
      查看建库语句
      show create database 表名;
      改库属性
      alter database 表名 charset ="gbk";
    • 表操作-----操作文件
      1 切库,选择文件夹
      use 库名
      2 查看当前库
      selelct database();
      3 建表
      create table 表名(
      字段1(显示宽度) 约束,
      字段3(显示宽度) 约束,
      字段2(显示宽度) 约束
      ​) engine=innodb;
      4 删表
      drop table 表名
    • 记录操作-----操作文件内容
      1 增,表名后面加字段,否则就按表中默认字段顺序插数据
      insert into stu_table values(1,"json","female"),(2,"lili","male");
      2 删
      delete from stu_table where id=2;必须加where否则全部删除了
      3 改
      update stu_table set name="lisi" where id=3;
      4 查 
      select * from stu_table;
  • 存储引擎
    • 本质:针对不同文件格式的不同存储方式和存储机制。例如.mp4 .mp3 .exe .doc .exel
    • mysql内置的存储引擎很多,还有接口可以让你自己开发存储引擎,但是我们只掌握
      • Innodb
        • 5.5版本之后的默认engine,支持事务、行锁、外键
        • 这种引擎的表,由.frm和.idb组成,前者放表结构,后者放表数据
      • Myisam
        • 5.5版本之前的默认engine,不支持事务
        • 比innodb多了一个.myi文件,存放的索引
      • blackhole
        • 无论存什么都立刻消失
      • Memory
        • 内存引擎,数据放内存里面,断点就消失,十分不安全,所以只是了解
        • 只有一个.frm存放着表结构,因为数据在内存里面
  • 建表详解
    • 基本规则
      • 1宽度与约束条件是可选的
      • 2字段名与数据类型必不可少
      • 3约束条件支持多个
      • 4最后一个字段后面不加逗号
      • 5宽度一般指的是对存储数据的限制
        • 宽度对于整型是特殊的,表示的是显示宽度,并不是存储位数限制
        • 对于整型这个大类不用指定显示宽度,因为在这个数据类型的数字范围内默认的显示宽度够用了,不需要你多此一举,你只要知道这个宽度是显示宽度
      • 6约束条件是在宽度限制的基础上加的额外的约束
    • 实例操作
      create table my_table(
      id int primary key,
      name varchar(20) unique,
      height float(4,2) not null
      ) engine=innodb;
    • null
      • 这只是表示一个关键字,并不是一个数据,默认所有的数据都可以为null,当不想让数据为null必须传递data时,加约束not null
      • null不算重复,因为它不是数据,在mysql中你就将它看成一个关键字
      • 如果加了not null,还不想传值,那么加default 值,当你不传值时默认用default值,而不是填null
    • 清空表
      • delete from t1;删除表里面所有记录,但是自增ID仍然记录
      • truncate table t1;重置表,记录和自增id全部重置,删的速度比前者快。
    • 删除表
      • drop table t1;
  • 基本数据类型
    • 数字
      • 整型---默认都是有符号的,定义时不用写宽度,这个宽度表示显示宽度而非存数据时对整数的约束。
        • tinyint
          • 1bytes 8bit, 0111 1111-1111 1111
          • 范围:-128-127,首位表示符号
          • 无符号范围0-256
          • 默认都是有符号,加上约束unsigned去掉符号
        • int
          • 4bytes 32bit 
        • bigint
          • 用的不多,用的时候再说,
          • 8bytes 64bit
        • 实例操作
          create table my_table1 (id int);
          create table my_table2 (id tinyint); 此时存200,超过了范围只会存最大值127
          create table my_table3(id bigint);
      • 小数
        • float 0.12005454可以这里就开始不精准了
        • double 0.21653131684313131354更长一些的位置开始不精准了
        • decimal (m,n) 永远精准,因为内部底层用的字符串存储
          • m总位数
          • n小数的位数
    • 字符串
      • char(n)速度快
      • varchar(n) 节省空间
      • 最多也就用到text了,65535个字符
      • 再大把它放到文件中,数据库中存放文件的路径,文件放文件服务器,通常图片视频都这样存储。
      • n表示最大的存储字符位数,最大是255个字符,大于255个字符用text存储
      • 创建表时,把定长的列字段往前放,变长的往后放
    • 日期类型
      • datetime用的最多
      • time
      • date
      • year
      • timestampMySQL知识梳理
    • 枚举
      • enum
      • 建表时在enum里面规定了多个值,存放的时候数据必须是这几个数据里面的一个。
      • 例如性别
    • 集合
      • set用的很少
      • 建表是set里面放了多个值,存放的时候数据必须是这几个数据里面的一个或多个。
      • 例如爱好,插入的时候是集合中元素的任意组合。
  • 约束
    • null:默认每个字段都有此约束,不传值默认用null填充
    • not null不允许不传值时加的约束,通常和unique或者default约束连用
    • default:默认约束,当插入数据时,用户没有传值用默认值填充,默认是default null
    • unique:唯一性约束
      • 单列唯一
        • name varchar(32) not null unique
      • 多列唯一
        • unique (ip,port)MySQL知识梳理
    • primary key:不能重复 不能为空 可以加速查找(索引),一个表只能有一个主键。
      • 一个主键不一定是一列,可以两列合起来作为一个主键,但是效率低。
    • auto_increment: 一个表只能有一个自增列,用在主键上,字段必须是一个key。MySQL知识梳理
    • 外键foreign key,表的存储引擎必须是innodb,且关联表的字段必须是唯一的
      • 此时父表是部门表,子表是员工表,因为子表关联着父表。父子关系是看谁依赖谁,而非看谁的数据多。父表用来约束子表。外键加载子表身上,让父表监视子表
      • 先创建父表,才能创建子表
      • 删除父表记录,子表的记录会被级联删除,更新父表记录,子表记录也会被更新
      • 想让那个表的某一列的值被限定在一定的范围内,那么就在这个字段加外键。
      • 外键加在哪,就看你想约束哪个列,还要考虑是否需要唯一,再考虑是否加unique,例如一个员工只能一个部门就要加unique和foreign key,如果一个部分可以多个员工就不用加unique,所以加不加完全取决于业务。
        当员工表中有个部门字段,
        限制部门只能是那么几个不能多不能少,首先想到是枚举,
        但问题是再增加了一个部门怎么办?枚举做不到,除非你改动表,太麻烦了。
        此时将所有的部门单独搞一张表存储起来,此时主表存放另一张表的id即可代表它处于哪个部门
        此时是最好的,因为米有建立约束,但是好处是部门用了数字来代替复杂长的字段的冗余存储。
        这样只是建立了口头约束,并没有真正的将两张表建立联系,
        如果另一个人来存数据时存放的部门id不在部门表中,此时仍然能存进去数据,此时这条数据就是脏数据,新员工没有遵守约定,没有约束住他,很有可能插入大量脏数据。
        此时主表的部门id添加外键约束,关联到部门表的id字段,那么再添加数据时,插入的id必须是部门表存在的id,否则插不进去数据。
        实际开发时,不加外键
        就是靠着双方自觉遵守约定,这样可以减少外键,提高效率。
      • 总结:
        • 节省空间
        • 约束此字段
          create table emplyee(
          id int primary key auto_increment,
          name varchar(32) not null,
          department_id int ,
          //添加外键约束,本表的外键字段关联另一张表的主键
          constraint fk_emp_depart foreign key ("departmet_id") references department("id")

          )engine=innodb;

          create table department(
          id int primary key auto_increment,
          ​ department varchar(32) not null unique
          ) engine = innodb;

          //但是必须先创建下面的表,才能创建上面的表。
          即必须先创建子表,才能创建主表
          删除数据的时候,必须先删掉所有主表里面还有子表那行记录的数据,才能删除主表内的数据。
        • 什么情况下用外键呢?页面填写用户名,密码,以及用户类型
          插入新员工信息时,部门是不能填写的,而是下拉框选择的,用外键约束住,下拉框的选项从那个表中拿到数据。
          外键引发的问题是,不能直接删除部门表,除非你把有外键字段的表,将所有关联到部门表的那个字段全删除了,才能删除部门表的记录。
          此时只能先才做用户表,然后操作部门表。
      • 外键变种
        • 一对一:但是外键字段无法约束数据唯一,因此一对一时,还要给外键字段加上unique约束
        • 一对多:用户表和部门表,一个用户只能有一个部门,多人可以在同一个部门下;这是最普通的用法。
        • 多对多MySQL知识梳理
    • 唯一索引unique
      • 作用:唯一约束不能重复 以及索引加速查找 但是可以为null
      • 可以起名字,单独放一行 unique uq1 (num),通常是联合唯一才单独放一行,否则直接放字段后
      • 可以不起名字,直接放字段后
    • 总结
      • 一个表一个主键
      • 一个主键可以由多列组成
      • 对于外键可以多个字段,关联的字段必须是多字段的联合主键,才可以关联上,否则无法关联
      • 约束名不能重复MySQL知识梳理
    • 备份
      • MySQL知识梳理
  • SQL语句
    • 学习sql的本质就是 操作文件夹 操作文件 操作文件里面的内容
    • 插入数据
      • insert [into] t1(id,name) values(1,"json")
      • 可以不写into
      • 全部字段都插入数据时可以直接insert t1 values(id,"json")
      • 注意values后面的值要与前面的字段对应起来
      • 自增ID起始指定,存储引擎后加auto_increment=4,自增id下一个是4,再添加就从4开始继续加
    • 查用的最多
      • select 字段1,字段2 from 表 where 条件1 and 条件2 group by 分组字段 limit 3; 

      • update t1 set name="zhangsan" where id =1;必须加where否则全部的name都改成了张三;

      • delete from t1 where id =2 ;必须有where否则全部记录都没了。
  •  
上一篇:LeetCode 动态规划


下一篇:std::shared_ptr及std::unique_ptr使用数组