MySQL基础知识整理

文章目录

  • 数据库
    • 数据库分类
    • 视图,索引
    • SQL分类
    • 常用类型
    • 常见操作
    • 联表操作
    • 数据库表的设计
  • 参考资料

数据库

数据库分类

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

  • 关系型数据库包括: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
    
  • 数值类型

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

    date: yyyy:MM:dd HH:mm:ss
    time: HH:mm:ss
    datetime: yyyy:MM:dd
    timestamp(时间戳):长整数
    

常见操作

  • 增加
INSERT INTO table (col1,col2,col3) VALUES (a,b,c),(a1,b1,c1);
  • 删除
DELETE FROM table;
DELETE FROM table where xx = xx;
  • 选择
SELECT * FROM table;
SELECT col1,col2,col3 FROM table;
  • 修改
UPDATE table set col1 = 值 WHERE id=xx;
  • 排序(ORDER BY)
默认升序
SELECT * FROM table WHERE 条件 ORDER BY 列名 ASC|DESC;
  • 去重(DISTINCT)
查询不重复的记录
SELECT DISTINCT 列名 FROM table;
  • 分组(GROUP BY)
一般配合sum(),avg(),count(),max(),min()五个聚合函数使用的
根据部门编号groupId分组,统计每个部分的平均工资
SELECT groupId,avg(sal) avgs FROM table group by groupId;
  • 条件查询(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);
  • 模糊查询
    • _ 一个任意字符
    • % 任意多个任意字符
    select * from table where name like "a%";
    select * from table where name like "_a%";
    
  • 分页查询
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行

联表操作

  • 内连接
    • 隐式内连接(笛卡尔乘积)
    select s.id,t.t_id from student s,teacher t where s.teacher_id = t.t_id;
    
    • 显式内连接(inner join)
    select * from tb_emp e inner join tb_dept d on e.dept_id = d.id;
    inner可省略
    
  • 外连接
    • 左外连接
    相当于查询表1的所有数据,包含表1和表2交集部分的数据
    select 字段列表 from 表1 left outer join 表2 on 条件;
    outer可省略
    
    • 右外连接
    查询表2所有数据包含表1和表2交集部分的数据
    select 字段列表 from 表1 right outer join 表2 on 条件;
    
  • 自连查询
    • 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
    
  • 组合查询
    • 多个查询的结果组合到一起,要求多条sql语句返回的字符必须一样
    select name from tb_emp where salary>8000
    UNION
    select name from tb_emp where age > 40;
    

数据库表的设计

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

参考资料

  • MySQL知识点梳理 万字超详解

  • 数据库索引详解

  • MYSQL-联表查询

你可能感兴趣的:(mysql,数据库)