就业班第一阶段 Mysql

时间: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 依赖于主键的情况。


第一范式1NF
第二范式2NF
第三范式3NF

第二章节

数据库的连接

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用来计算生日十分有用,没有满一年的就算不出结果

你可能感兴趣的:(就业班第一阶段 Mysql)