- 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
- 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;
- 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
- 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字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。建立索引会占用磁盘空间
- 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');
网友评论