Mysql学习总结

作者: 胖波波玻璃球 | 来源:发表于2020-06-28 23:48 被阅读0次
    1. Day 01
      Day01 第一节课中介绍了mysql的基本使用,我认为在这里比较容易忽视的是数据库的设计部分,虽然写明是阅读了解,但这部分对于数据库的整体框架解释的很到位,这里再次做个总结:
    • 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。


      image.png
    • 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。


      image.png
    • 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。


      image.png

      E-R模型

    • 实体A对实体B为1对1,则在表A或表B中创建一个字段,存储另一个表的主键值
    • 实体A对实体B为1对多:在表B中创建一个字段,存储表A的主键值
    • 实体A对实体B为多对多:新建一张表C,这个表只有两个字段,一个用于存储A的主键值,一个用于存储B的主键值

    另一部分,需要再熟悉的是数据完整性,常用的数据类型如下:

    • 整数:int, bit
    • 小数: decimal
    • 字符串:varchar, char
    • 日期时间:date, time, datetime
    • 枚举类型:enum, 如性别男、女

    约束:

    • Primary key、not null、unique、default、foreign key
    1. Day 02
      这部分内容总结为数据库的基本操作和数据的增删改查:create/update/retrieve/delete, 总结代码如下:
    • show databases;
    • use 数据库名字;
    • select database();
    • create database python charset=utf8; (注意这里是需要声明中文字体)
    • drop database python;
    • show tables;
    • desc 表名;
    • 创建表:create table students(
      id int unsigned auto_increment primary key not null,
      name varchar(20) default '',
      age tinyint unsigned default 0,
      height decimal (5,2),
      gender enum('男','女','人妖','保密'),
      cls_id int unsigned default 0
      );
    • 修改表 alter table students add birthday datetime;
    • alter table students modify birth date not null;
    • alter table students drop birthday;
    • drop table students;
    • show create table classes;

    增加数据:

    • insert into students values(),();
    • insert into students(name) values(),(),();
      修改:
    • update students set gender=0, hometown='北京' where id=5;
      删除:
    • delete from students where id=5;
    • update students set isdelete=1 where id=1;
    1. Day 03
      第三天最主要的强化mysql查询语句的练习,这里的学习也是mysql中最常用的,为了运用自如,还是需要不断的强化学习。
    • 条件查询
      -- 比较运算符:=,>,>=,<,<=,!=, or <>
      -- 逻辑运算符: and, or, not
      -- 模糊查询: like, %任意多个任意字符, _表示一个任意字符
      -- 范围查询:
      --- in 表示在一个非连续的范围内, 例:select * from students where id in(1,3,8);
      --- between and 表示在一个连续的范围内, 例如,select * from students where id between 3 and 8;
      -- 空判断
      ---- 注意:null 与'' 是不同的
      ---- 判空is null
      -- 优先级
      --- 顺序为:小括号,not,比较运算符, 逻辑运算符, and 比or先运算,如果同时出现并希望先算or,需要结合()使用

    • 聚合函数
      -- 总数:count(*)、count(1)表示计算总行数,count(列名)不会统计null值记录
      -- 最大值:max(列)
      -- 最小值:min(列)
      -- 求和:sum(列)
      -- 平均值:avg(列)

    • 分组查询
      -- group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组,group by可用于单个字段分组,也可用于多个字段分组。
      --

    • group by + group_concat()
      -- group_concat(字段名)可以作为一个输出字段来使用,表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合,如:
      select gender, group_concat(name) from students group by gender;

    • group by + having
      -- having 条件表达式:用来分组查询后指定一些条件来输出查询结果,having作用和where一样,但having只能用于group by.

    • group by + with rolluo
      -- with rollup的作用是:在最后新增一行,来记录当前列里所有记录的总和, select gender, group_concat(age) from students group by gender with rollup;

    4 Day 04
    第四天还是以查询语句为主线,做了以下补充

    • 分页查询:limit start,count
      -- 从start 开始,获取count条数据,查取前三行男生信息:select * from students where gender=1 limit 0,3;
      -- 每页显示m条数据,当前显示第n页,求第n页的数据:select * from students where is_delete=0 limit (n-1)*m, m;

    • 连接查询
      -- 内连接查询:查询的结果为两个表匹配到的数据
      -- 左连接查询:查询的结果为两个表匹配到的数据,左表特有的数据,对于右表中不存在的数据使用null填充。

    • 子查询
      -- 子查询是嵌入到主查询中
      -- 子查询是辅助主查询的,要么充当条件,要么充当数据源
      -- 子查询是可以独立存在的语句,是一条完整的 select 语句

    • 子查询分类
      -- 标量子查询: 子查询返回的结果是一个数据(一行一列)
      select * from students where age > (select avg(age) from students);
      -- 列子查询: 返回的结果是一列(一列多行)
      select name from classes where id in (select cls_id from students);
      -- 行子查询: 返回的结果是一行(一行多列)
      select * from students where (height,age) = (select max(height),max(age) from students);
      -- 格式: 主查询 where 条件 in (列子查询)

    • 完整的select语句
      select distinct *
      from 表名
      where ....
      group by ... having ...
      order by ...
      limit start,count

    • 执行顺序为:
      -- from 表名
      -- where ....
      -- group by ...
      -- select distinct *
      -- having ..
      -- order by ..
      -- limit start,count

    1. Day 05 mysql高级
    • 视图:视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

    视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);

    • 视图的作用
      -- 提高了重用性,就像一个函数
      -- 对数据库重构,却不影响程序的运行
      -- 提高了安全性能,可以对不同的用户
      --让数据更加清晰

    • 定义视图:建议以v_开头
      create view 视图名称 as select语句;

    • 查看视图:查看表会将所有的视图也列出来
      show tables;

    • 使用视图:视图的用途就是查询
      select * from v_stu_score;

    • 删除视图:drop view v_stu_sco;

    • 事务:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

    • 事务四大特性(简称ACID)
      -- 原子性(Atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性
      -- 一致性(Consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态。
      -- 隔离性(Isolation):通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。
      -- 持久性(Durability):一旦事务提交,则其所做的修改会永久保存到数据库。

    • 开启事务:begin; start transaction;

    • 提交事务,命令如下:commit;

    • 回滚事务,命令如下:rollback;

    • 注意: 修改数据的命令会自动的触发事务,包括insert、update、delete,而在SQL语句中有手动开启事务的原因是:可以进行多次数据的修改,如果成功一起成功,否则一起会滚到之前的数据

    • 索引:索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

    更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度

    • 索引的使用
      -- 查看索引: show index from 表名;
      -- 创建索引:如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致, 字段类型如果不是字符串,可以不填写长度部分.
      create index 索引名称 on 表名(字段名称(长度))
      -- 删除索引:drop index 索引名称 on 表名;

    • demo:
      -- create table test_index(title varchar(10));
      -- set profiling=1;
      -- select * from test_index where title='ha-99999';
      -- show profiles;
      -- create index title_index on test_index(title(10));
      -- select * from test_index where title='ha-99999';
      -- show profiles;

    -要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。建立索引会占用磁盘空间

    1. Day 06 时间函数
    • 获取年月日时分秒: select now(); select sysdate();

    • 区别:now()在执行开始时值就得到了;
      sysdate() 在函数执行时动态得到值.

    • 获取年月日: select current_date(); select current_time();

    • 时间格式的转换
      -- str_to_date(时间字符串,字符串日期格式) :能够把字符串转换为标准日期格式

    • 日期转换为特殊字符串形式
      -- date_format (日期,字符串格式):能够把一个日期转换为各种样式的字符串

    • 提取时间信息
      -- 直接用year、month 等函数提取

    • 日期的运算
      -- 现有日期进行偏移(推荐)
      --- date_sub(日期 ,要减少偏移的间隔):
      date_sub(date,INTERVAL expr type)
      --- date_add(日期 ,要增加偏移的间隔)
      date_add(date,INTERVAL expr type)
      expr 是要偏移的数值,type 是要偏移的方式,type 的取值,year/month/day/hour

      -- 两个日期计算天数差
      date_diff(time1,time2):返回两个日期之间(time1-time2)的天数。
      select datediff('2008-08-08','2008-08-01');

      -- 两个日期计算时间差
      timediff(time1,time2):两个日期相减 time1 - time2,返回 time 差值。注意:timediff(time1,time2) 函数的两个参数类型必须相同。
      -- 两个日期得到指定差(推荐)
      timestampdiff(unit,begin,end):返回end-begin的结果,其中begin和end是date或datetime格式
      select timestampdiff(year,'2002-05-01','2001-01-01');

    相关文章

      网友评论

        本文标题:Mysql学习总结

        本文链接:https://www.haomeiwen.com/subject/hupwfktx.html