• MySQL基础知识整理


    数据库

    数据库分类

    数据库分为关系型数据库和非关系型数据库

    • 关系型数据库包括:Oracle,MySQL,SQL Server
    • 非关系型数据库包括:
      • 基于键值对key-value:如redis,memcached
      • 基于文档型:如mongodb
      • 基于列族:如hbase
      • 基于图型:如neo4j
    • 区别
    关系型数据库非关系型数据库
    使用SQL不强制要求,一般不基于SQL实现
    事务支持支持不支持
    复杂操作支持不支持
    海量读写操作效率低效率高
    基本结构基于表和列 结构固定灵活性比较强
    使用场景业务方面的OLTP系统用于数据的缓存,或基于统计分析的OLAP的系统

    视图,索引

    • 视图
      • 一个虚拟的数据表,该数据集表中的数据记录是由一条查询语句的查询结果得到的。
      • 使用视图的优点是:简化查询,提高复用性;提高安全性
        • 表是直接存储结构化数据的,而视图时用户在进行访问的时候,获取到的虚拟表。
        • 查询可能只查询几个字段,用视图可以简化查询,并且我们可以重新排序,命名,显示的更清楚;
        • 控制用户可以查询和操作的数据范围,比如学生表中手机表中学生联系方式是保密的,权限低的用户无法查询到此字段。
    • 索引
      • 类似于目录,可以加快数据库的查询效率和提升程序性能;
      • 作用
        • 通过创建索引,可以在查询过程中,提高系统的性能;
        • 通过创建唯一性索引,可以保持数据库表中每一行数据的唯一性;
        • 在使用分组和排序子句进行数据检索时,可以减少查询中分组和排序的时间
      • 缺点
        • 创建索引和维护索引要耗费时间,而且时间随着数据量的增加而增大;
        • 索引需要占用物理空间,如果要建立聚簇索引,所需要的空间会更大;
        • 在对表中的数据进行增删改时需要耗费较多的时间,因为索引也需要动态地维护。
      • 需要索引的场景
        • 经常需要搜索的列上
        • 作为主键的列上
        • 经常用在链接的列上,这些列主要是一些外键,可以加快连接的速度
        • 经常需要根据范围进行搜索的列上
        • 经常需要排序的列上
        • 经常使用在where子句上面的列上
      • 不应该创建索引的场景
        • 查询中很少用到的列
        • 对于哪些具有很少数据值的列,比如性别列,bit数据类型的列
        • 对于哪些定义为text,image的列,因为这些列的数据量相当大(太小没必要,太大也不行)
        • 当对修改性能的要求远远大于搜索性能时,因为当增加索引时,会提高搜索性能,但是会降低修改性能;
      • 索引分类与说明(待补充

    SQL分类

    • 数据定义语言(Data Definition Lauguage, DDL),用来维护数据的结构
      代表指令:create(创建数据库,表,视图,索引等),drop(删除表、视图、索引等), alter(修改)
    • 数据操纵语言(Data Manipulate Lauguage,DML),对数据进行操作
      代表指令:insert,delete,update, select
    • 数据控制语言(Data Control Lauguage, DCL),负责权限管理和事务
      代表指令:grant(分配权限),revoke(回收权限),commit(提交)

    常用类型

    • 字符类型

      char
      varchar(M),M是最大的字符数,可变长度的字符,节省空间,效率低
      text
      blob
      
      • 1
      • 2
      • 3
      • 4
    • 数值类型

      tinyint(1字节),smallint(2字节),mediumint(3字节),int/integer(4字节)
      bigint(8字节)
      浮点型小数:float(M,D),double(M,D),
      定点型小数:dec(M,D), decimal(M,D)
      
      • 1
      • 2
      • 3
      • 4
    • 日期类型

      date: yyyy:MM:dd HH:mm:ss
      time: HH:mm:ss
      datetime: yyyy:MM:dd
      timestamp(时间戳):长整数
      
      • 1
      • 2
      • 3
      • 4

    常见操作

    • 增加
    INSERT INTO table (col1,col2,col3) VALUES (a,b,c),(a1,b1,c1);
    
    • 1
    • 删除
    DELETE FROM table;
    DELETE FROM table where xx = xx;
    
    • 1
    • 2
    • 选择
    SELECT * FROM table;
    SELECT col1,col2,col3 FROM table;
    
    • 1
    • 2
    • 修改
    UPDATE table set col1 = 值 WHERE id=xx;
    
    • 1
    • 排序(ORDER BY)
    默认升序
    SELECT * FROM table WHERE 条件 ORDER BY 列名 ASC|DESC;
    
    • 1
    • 2
    • 去重(DISTINCT)
    查询不重复的记录
    SELECT DISTINCT 列名 FROM table;
    
    • 1
    • 2
    • 分组(GROUP BY)
    一般配合sum(),avg(),count(),max(),min()五个聚合函数使用的
    根据部门编号groupId分组,统计每个部分的平均工资
    SELECT groupId,avg(sal) avgs FROM table group by groupId;
    
    • 1
    • 2
    • 3
    • 条件查询(WHERE)
    select * from table where id=1;
    select * from table where name > 18;
    select * from table where name > 18 and gender = 0;
    select * from table where name > 18 or gender = 0;
    select * from table where not (name > 18 and gender = 0);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 模糊查询
      • _ 一个任意字符
      • % 任意多个任意字符
      select * from table where name like "a%";
      select * from table where name like "_a%";
      
      • 1
      • 2
    • 分页查询
    SELECT * FROM table LIMIT 10;(查询前10行)
    SELECT * FROM table LIMIT 10 OFFSET 20; 从查询到的第20行开始返回10行
    SELECT * FROM table LIMIT pageSize OFFSET offset;
    SELECT * FROM table LIMIT offset,count; 从offset位置开始,返回count行
    
    • 1
    • 2
    • 3
    • 4

    联表操作

    • 内连接
      • 隐式内连接(笛卡尔乘积)
      select s.id,t.t_id from student s,teacher t where s.teacher_id = t.t_id;
      
      • 1
      • 显式内连接(inner join)
      select * from tb_emp e inner join tb_dept d on e.dept_id = d.id;
      inner可省略
      
      • 1
      • 2
    • 外连接
      • 左外连接
      相当于查询表1的所有数据,包含表1和表2交集部分的数据
      select 字段列表 from 表1 left outer join 表2 on 条件;
      outer可省略
      
      • 1
      • 2
      • 3
      • 右外连接
      查询表2所有数据包含表1和表2交集部分的数据
      select 字段列表 from 表1 right outer join 表2 on 条件;
      
      • 1
      • 2
    • 自连查询
      • select * from 表 join 表 on 连接条件;
    • 子查询
      • 一个查询的结果,作为另一个查询的条件或临时表
      select * from tb_emp where dept_id = (select id from tb_dept where name='xx');//()返回的是一条记录,可以用=
      select * from tb_emp where dept_id in (select id from tb_dept where name in ('xx','yy'));//查询返回多条记录,用in
      
      • 1
      • 2
    • 组合查询
      • 多个查询的结果组合到一起,要求多条sql语句返回的字符必须一样
      select name from tb_emp where salary>8000
      UNION
      select name from tb_emp where age > 40;
      
      • 1
      • 2
      • 3

    数据库表的设计

    • 一对一
    • 一对多
    • 多对多

    参考资料

  • 相关阅读:
    Runtime——探索类,对象,分类本质
    MAC M1安装多个JDK版本及动态切换
    Dart_Flutter【插件介绍+平台发布+视频】【180个网址导航】
    mac建议装双系统吗,详细分析苹果电脑双系统的利弊
    Leetcode hot 100之回溯O(N!):选择/DFS
    【无标题】
    Openresty(二十二)ngx.balance和balance_by_lua终结篇
    游戏制作资源推荐
    信息收集笔记(一)
    程序员都看不懂的代码
  • 原文地址:https://blog.csdn.net/qq_37998848/article/details/133589124