时间:2020/9/21-2020/9/28
学习内容:第一阶段MYSQL教程第一章节到第七章节
心得体会:
1.虽然说SQL的内容自己之前掌握了很大一部分,但报班之后才发现自己很多知识点的细节没有做到位,遇到深入一点的知识点或者题目就会很有些棘手,另外自己的知识体系系统性仍需加强。
2.在sql的书写过程中,特别是针对比较复杂的sql内容书写,首先要耐心一点,理清自己的思路,一步步分析题目的条件,写出一个条件之后去思考下一个条件,而不要短期内就追求一步到位,对于题目有自己的分析思路更重要,哪怕前期语句不够简洁,后期可以优化。
后续目标:努力练习做到最多5分钟之内不管什么难度的一道sql题目都可以解出来
后期安排:抓住利用运营工作的机会,尽可能多去了解业务,把自己技能上的薄弱点增强,做好就业班项目练习
知识点归纳
阶段1 mysql教程
数据库的作用
存储数据
相对于Excel,数据库的存储数据量更大,读写速度高,程序支持性好
数据库
数据库是有一系列表构成的数据集合
由列和行构成,列成为字段,行成为纪录
主键:唯一标识的纪录字段
关系型数据库
表与表之间可以相互关联的数据库
RDBMS——关系型数据库管理系统
SQL
不区分大小写
数据完整性
如何完整:数据类型+约束
数据类型
使用数据类型的原则是:够用就行,尽量使用取值范围小的,而不用大的,这样可以更多的节省存储空间
常用数据类型如下:
整数:int,bit
小数:decimal
字符串:varchar,char
日期时间: date, time, datetime
枚举类型(enum)——例如:enum('男','女')
特别说明的类型如下:
decimal表示浮点数,如decimal(5,2)表示共存5位数,小数占2位
char表示固定长度的字符串,如char(3),如果填充'ab'时会补一个空格为'ab '
varchar表示可变长度的字符串,如varchar(3),填充'ab'时就会存储'ab'
字符串text表示存储大文本,当字符大于4000时推荐使用
对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径
约束
主键primary key
非空 not null
唯一unique
默认default
外键foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常(说明:虽然外键约束可以保证数据的有效性,但是在进行数据的crud(增加、修改、删除、查询)时,都会降低数据库的性能,所以不推荐使用,那么数据的有效性怎么保证呢?答:可以在逻辑层进行控制)
数据库的设计
基本要满足三范式
第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。
第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
第二章节
数据库的连接
1 命令行查询——mysql(部分不行)
2 window+R 输入mysql路径bin目录——mysql -utest -p/mysql -uroot -pmysql
3使用navicat或者workbench连接
数据库操作
显示版本——select version();
查看时间——select now();
查看数据库——show databases;
查看现在使用的数据库——select database();
使用某个数据库——use 数据库名;
创建数据库(不指定字符集)——create database 数据库名;
创建数据库(指定字符集)——create database 数据库名 charset=utf8;
查看数据库的创建——show create database 数据库名;
数据表操作
若没有进入某数据库,要在表前面加上 (数据库名).表名
查看当前数据库的所有表——show tables;
创建表 ——create table(列名 数据类型 约束,列名2 数据类型 约束.......)
查看表的信息——desc 表名;
查看表的创建语句——show create table 表名;
更改表(增加列)——ALTER TABLE 表名 ADD 列名 数据类型 约束;
更改表(修改列modify)——ALTER TABLE 表名 MODIFY 列名 类型+约束;
更改表(修改列change)——ALTER TABLE 表名 CHANGE 原列名 新列名 类型+约束;
更改表(删除类)——ALTER TABLE表名 DROP 列名;
删除表——drop table 表名;(删除不存在的表会报错)
数据操作
插入数据INSERT(全部列) ——INSERT INTO 表名 VALUES(第一行第一列,第一行第二列....),(第二行第一列,第二行第二列.........).......
插入数据INSERT(部分列单行插入)——INSERT INTO 表名(列1,列2) VALUES(列1第一行,列2第一行)
插入多行数据——INSERT INTO 表名(列1,列2) VALUES(列1第一行,列2第一行),(列1第二行,列2第二行)........
更改数据UPDATE——update 表名 set 列名 = 值(where 列名 = 某值);
查找数据——select 列名1,列名2.../* from 表名;
查找数据作为别名——select 列名1,列名2...as别名 from 表名;
(物理删除)删除某行数据—— delect from 表名 where 列名 = 值;
(逻辑删除)——1 增加列 isdelete——2 update 表名 set isdelete = 1 (where 列名 = 值)
(很少用)数据备份:mysqldump –uroot –p 数据库名 > python.sql;
(很少用)数据恢复:mysql -uroot –p 新数据库名 < python.sql
第三章节 查询1
简单查询
查询全部 SELECT * FROM 表;
查询部分列 SELECT 列名1,列名2....FROM 表名;
查询并且命名别名: SELECT 列名 AS 别名, 列名2 FROM 表名 AS 别名2;(取了别名的表必须要用,不然会出错)
去重查询: SELECT DISTINCT 列名 FROM 表名;
条件查询 WHERE 条件
注意语序:逻辑——NOT 条件
空值判断—— IS NOT NULL
比较查询:
等于: =
大于: >
大于等于: >=
小于: <
小于等于: <=
不等于: != 或 <>
逻辑查询:
and
or
not
模糊查询LIKE
like
%表示任意多个任意字符
'x%'——以x开头, ‘%x%’——含有x,不管开头结尾,‘%x’——以x结尾
_表示一个任意字符
‘__’——有两个字符 ‘__%’——至少有连个字符,后面还有其他的
范围查询:
in表示在一个非连续的范围内
in(条件1,条件2,条件3)——非连续集合
between....and....——连续性集合
空值查询:
注意:null与''是不同的
判空is null
排序查询 order by
一个字段排序: ......ORDER BY 字段 (DESC/ASC)
多个字段排序:........ORDER BY 字段1,字段2,字段3(注意有先后顺序......,,如果都分不出来,最后默认按主键排序)
聚合函数
数量——SELECT COUNT(列名/*)FROM 表名;
最大值——SELECT MAX(列名/*)FROM 表名;
最小值——SELECT MIN(列名/*)FROM 表名;
平均值——SELECT AVG(列名/*)FROM 表名;
求和值——SELECT SUM(列名/*)FROM 表名;
保留小数位数——SELECT ROUND(值,保留的小数位数)FROM 表名;(注意,round可以保留负数的小数位数,指小数点前面进多少位)
分组查询GROUP BY
查询某字段有几种——SELECT 某列 FROM 表名 GROUP BY 某列 ;
查询某字段有几种,各类的统计值多少——SELECT 某列,COUNT/AVG/MIN/MAX/SUM(*/列名) FROM 表名 GROUP BY 某列;
对分组值限定条件——SELECT 某列 FROM 表名 GROUP BY 某列 HAVING 条件;
group concat函数——select 列名,group_concat(列名2) from 表名 group by 列名; (把所有这个列名的类相关列全部联在一起作为查询内容)
with rollup汇总—— select 列名,group_concat(列名2) from 表名 group by 列名 with rollup;(与不加 with rollup 相比多了一行汇总求和选项)
第四章节 MYSQL查询2
分页查询
limit start(开始显示位置),count(显示条数)——限制结果条数
limit 放在所有语句的最后
每页显示x个,第n个页面——limit (n-1)*x,x
内连接
没有别名:select 表1.某列,表2.某列........from 表1 inner join 表2 on 表1.列1 = 表2.列2
有别名:select 表1.某列,表2.某列........from 表1 as 别名1 inner join 表2 as 别名2 on 表1.列1 = 表2.列2
为什么内连接一定有 on语句 ——确定和谁关联,如果不确定,那和谁都可以关联(笛卡尔积),这样的结果不具意义
最好不要用where 那种写法
左连接
inner join = 两个表都有的交集
left join/right join = 取其中一个表的全部(包括两者都有的交集),具体以left/right位置为主
子查询
标量子查询(查询一个值)
行级子查询(查询一行值)
select * from students
where (gender,height) = (select gender, max(height) from students where gender=1);
该案例中 gender,height是一行记录,子查询与之匹配
列级子查询(查询一列值)
select * from students
where cls_id IN (select id from classes);
该案例中注意子查询查的是一列数据因此不可能是一个,要用 IN
完整的select语句
selectdistinct*from表名where....groupby...having...orderby...limitstart,count
执行顺序为:
from 表名 > where .... >group by ... >select distinct * >having ... >order by ... >limit start,count
第五章视图(工作中较为少用)
视图
注意:1 show tables 可以查到视图 2 视图不存储数据,即使原数据改变,结果也不会改变
用视图解决的问题——比如列名更改后,视图也不会改变查询结果
创建视图:create view 视图名 as select 语句;
删除视图 : drop view 视图名;
使用视图:select*from视图名;
事务
原子性(atomicity)
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性
一致性(consistency)
数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,一致性确保了,即使在执行第三、四条语句之间时系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。)
隔离性(isolation)
通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元。)
持久性(durability)
一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。)
开始事务——start transaction; +语句(增删改查);...... 结束事务(提交)——commit; /结束事务(撤销)——rollback;
注意:一旦提交就不可更改
注意:书写时每一句都要写分号,事务中每一句话都是单独语句,表的引擎类型必须是innodb类型才可以使用事务
作用:增加查询速度
索引
加快查询速度,优化查询工具
原理:把有相似元素的内容放在一起成为一个“组”,直接在这个“组”里找内容
开始时间监测: set profiling =1;
创建索引: create index 索引名 on 表名(列名);
查看操作时间:show profiles;
第六章 时间函数(新内容)
获取当前时间
select now()与select sysdate( )
两者区别: Now在输出结果前就已经得到结果, Sys date可以保持是实时更新
select now(), sleep(3),now(); 中sleep指时间往后面走3秒,前后两个now()时间保持不变select sysdate(), sleep(3),sysdate(); 前后两个sysdate()时间相差3秒
获取当前年月日
select current_date()/select curdate()——两者分别表示完整与缩写,没有区别
获取当前时分秒
select current_time()/select curtime()——两者分别表示完整与缩写,没有区别
字符串和日期相互转换
str_to_date函数——将文本转化为日期(新内容)
格式 描述
%Y 年,4 位
%y 年,2 位
%M 英文名称的月名(一月为January,二月为February)
%m 数值月份 (00-12)
%D 带有英文后缀的天(不太直观)
%d 数值天 (00-31)
%H 小时 (00-23)
%h 小时 (01-12)
%I 小时 (01-12)
%i 分钟,数值(00-59)
%S 秒(00-59)
%s 秒(00-59)
%a 英文缩写星期名
%b 英文缩写月名
%c 月,数值
%f 微秒
%p 显示是 AM 还是 PM
%r 显示时分秒时间,12小时制(hh:mm:ss AM 或 PM)
%T 显示时分秒时间, 24小时制 (hh:mm:ss)
%j 显示当前日期是今年的第几天 (001-366)
注意,前后参数格式一定要一致
select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09
select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09
select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09
select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30
select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); --2008-08-09 08:09:30
日期转换为字符串(易错点)
dateformat——日期转换为字符串
select date_format(now(),'%Y-%M-%d %H') ; -- 2020-May-23 17
select date_format('2020-02-03 13:45:06.676','%Y-%M-%D %I:%i:%S-%T') ; --2020-February-3rd 01:45:06-13:45:06
提取日期信息
直接用year、month 等函数提取,不建议使用extract函数
时间函数名作用
date获取日期(年月日)
time获取时间(时分秒)
year获取年份
month获取月份
day获取日
hour获取时
minute获取分
second获取秒
microsecond获取毫秒
quarter获取季度
week获取周
weekofyear获取周
dayofyear日期在年度中第几天
dayofmonth日期在月度中第几天
dayofweek日期在周中第几天;周日为第一天
weekday日期在周中第几天;周二为第一天
yearweek年和周
dayname返回英文星期
monthname返回英文月份
last_day返回月份中最后一天
SELECT TIME('2018-05-15 10:37:14.123456');-- 获取时间:10:37:14.123456
SELECT YEAR('2018-05-15 10:37:14.123456');-- 获取年份: 2018
SELECT MONTH('2018-05-15 10:37:14.123456');-- 获取月份: 5
SELECT DAY('2018-05-15 10:37:14.123456');-- 获取日:15
SELECT HOUR('2018-05-15 10:37:14.123456');-- 获取时:10
SELECT MINUTE('2018-05-15 10:37:14.123456');-- 获取分:37
SELECT SECOND('2018-05-15 10:37:14.123456');-- 获取秒:14
SELECT MICROSECOND('2018-05-15 10:37:14.123456');-- 获取毫秒:123456
SELECT QUARTER('2018-05-15 10:37:14.123456');-- 获取季度:2
SELECT WEEK('2018-05-15 10:37:14.123456');-- 获取周:19
日期数据计算
将日期进行偏移
date_sub(date(偏移基准), interval 数字 日期单位)
date_add(date, interval 数字 日期单位)
时间函数名作用
YEAR增加减少年
MONTH增加减少月
DAY增加减少天
HOUR增加减少小时
MINUTE增加减少分钟
SECOND增加减少秒
MICROSECOND增加减少毫秒
WEEK增加减少周
QUARTER增加减少季度
SECOND_MICROSECOND增加减少秒到毫秒
MINUTE_MICROSECOND增加减少分钟到毫秒
MINUTE_SECOND增加减少分钟到秒
HOUR_MICROSECOND增加减少小时到毫秒
HOUR_SECOND增加减少小时到秒
HOUR_MINUTE增加减少小时到分钟
DAY_MICROSECOND增加减少天到毫秒
DAY_SECOND增加减少天到秒
DAY_MINUTE增加减少天到分钟
DAY_HOUR增加减少天到小时
YEAR_MONTH增加减少年到月
select date_add('2008-08-08 10:12:33', interval '01:10:30' hour_second);
--偏移时间到秒,1小时10分30秒:2008-08-08 11:23:03
select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);
--偏移天到秒,1天1小时1分1秒:1997-12-30 22:58:59
两个日期之间的计算
datediff(日期1,日期2)
两个时间之间的计算
timediff(时间1,时间2)
两个时间的制定差(推荐,新知识)
timestampdiff(时间单位,开始时间值,结束时间值)
unit格式unit实际含义
YEAR年份
MONTH月份
DAY天
HOUR小时
MINUTE分钟
SECOND秒
MICROSECOND微秒
QUARTER季度
WEEK周
select timestampdiff(year,'2002-05-01','2001-01-01');-- -1
select timestampdiff(day,'2002-05-01','2001-01-01');-- -485
select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00');-- -12
timestampdiff用来计算生日十分有用,没有满一年的就算不出结果