Mysql学习总结

  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');

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336