学习大数据的第35天(mysql篇)——时间函数、逻辑判断、排序、分页、分组以及mysql三大范式

学习大数据的第35天(mysql篇)——时间函数、逻辑判断、排序、分页、分组以及mysql三大范式

时间函数

获取时间 获取年月日 获取时分秒 获取年月日时分秒

-- 获取所有
select CURRENT_TIMESTAMP();
select CURRENT_TIMESTAMP;
--  获取年月日
select CURRENT_DATE();
select CURRENT_DATE;
-- 获取时分秒
SELECT CURRENT_TIME();
SELECT CURRENT_TIME;

时间和varchar相互转换

 时间转str
-- SELECT CURRENT_Date;

-- SELECT DATE_FORMAT(CURRENT_Date(),'%Y-%m-%d');

-- str转时间
-- select STR_TO_DATE('2022-03-10','%Y-%m-%d');

时间相减(两个时间相减)

select datediff('2022-03-14','2022-03-01'); # 13

时间相加减(加减时间间隔)

DATE_ADD(date,INTERVAL expr unit)
## INTERVAL:关键字
## expr:加减的值
## unit:单位(year 月 day)

select DATE_ADD('2022-03-03',INTERVAL -3 day)

练习:求时间的分类

create table test(
datetime varchar(255),
sum int
)
insert into test(datetime,sum) values(‘2022-03-01’,20);
insert into test(datetime,sum) values(‘2022-03-02’,34);
insert into test(datetime,sum) values(‘2022-03-03’,15);
insert into test(datetime,sum) values(‘2022-03-04’,26);
insert into test(datetime,sum) values(‘2022-03-05’,20);
insert into test(datetime,sum) values(‘2022-03-06’,13);
insert into test(datetime,sum) values(‘2022-03-07’,34);
insert into test(datetime,sum) values(‘2022-03-08’,54);
insert into test(datetime,sum) values(‘2022-03-09’,20);
insert into test(datetime,sum) values(‘2022-03-10’,22);
insert into test(datetime,sum) values(‘2022-03-11’,20);
insert into test(datetime,sum) values(‘2022-03-12’,21);
insert into test(datetime,sum) values(‘2022-03-13’,11);
insert into test(datetime,sum) values(‘2022-03-14’,26);

-- 第一步 时间相减 0 1 2 3 4 5 6---13
select *,datediff(datetime,'2022-03-01') from test;
-- 第二部 除以7    0.0 0.0002 0.0003..1.1
select *,datediff(datetime,'2022-03-01')/7 from test;
-- 第三步 向下取整
select *,FLOOR(datediff(datetime,'2022-03-01')/7) as g from test;
-- 第四步:确定开头和结尾
select *,FLOOR(datediff(datetime,'2022-03-01')/7)*7  from test;
select *,DATE_ADD('2022-03-01',INTERVAL FLOOR(datediff(datetime,'2022-03-01')/7)*7 day) from test;
select *,DATE_ADD('2022-03-01',INTERVAL FLOOR(datediff(datetime,'2022-03-01')/7)*7+6 day) from test;
-- 第五步concat()
select *,CONCAT(
	DATE_ADD('2022-03-01',INTERVAL FLOOR(datediff(datetime,'2022-03-01')/7)*7 day),
	'~',
	DATE_ADD('2022-03-01',INTERVAL FLOOR(datediff(datetime,'2022-03-01')/7)*7+6 day)) from test;

逻辑判断

if

格式:if(判断条件,true,false)

select *,if(sex='1','男','女') from student;
select *,if(age>=18,'成年','未成年') from student;

case when

格式1双分支: case when 判断条件 then true else false end;

格式2多分枝:case when 判断条件 then true when 判断条件 then true else false end

select *,case when sex='1' then '男' else '女' end as gender from student;
select *,case when age>=18 then '成年' else '未成年' end as gender from student;


select *,case when age=18 then '刚成年' when age<18 then '未成年' else '以成年' end from student;

排序

order by 字段1,字段2 asc|desc

#  默认不给排序规则 就是升序
select * from student order by age;		# age 从小到大 升序
select * from student order by age asc;#   age从小到大 升序
select * from student order by age desc;#  从大到小 降序

# age 从小到大 如果有相同的age按sex从小到大
select * from student order by age ,sex;

# age 从小到大 如果有相同的age按sex从大到小
select * from student order by age ,sex desc;


# age 从大到小 如果有相同的age按sex从大到小
select * from student order by age desc ,sex desc;

分页

limit mysql中数据默认下标为0

limit m;默认从0开始取m个数据

limit n,m 从n开始取m个数据

select * from student limit 2; # 从0开始取两个
select * from student limit 2,5; # 从2开始取5个

MSQL三大范式

第一范式:原子性 字段不可再分割

第二范式:唯一性 字段必须依赖与逐渐

第三范式:冗余性 不能进行依赖传递

group分组

格式 :select … group by 字段1,字段2…字段n;

求的是组的数据 不是组中的数据

有多少组 结果就有多少条数据(是把每组中数据进行了聚合转化为了一条)

gruop by 通常和聚合函数一起使用

分组字段有多个 是一起进行分组

默认情况下 显示每组中第一条数据

select * from student group by sex; # 所获取的id name age 没有任何作用
select sex,聚合函数 from student group by sex;  # 通常使用获取分组字段 和聚合函数

TopN

不能再使用group by 解决TopN的问题

因为group by所获的数据量是固定的(和组的数量保持一致)

TopN数量不固定

-- TopN 
-- Top1
select * from student  s1 where 0=(select count(*) from student as s2  where s1.sex=s2.sex and s1.age(select count(*) from student as s2  where s1.sex=s2.sex and s1.age

测试代码:

-- order by 默认升序排序
select * from worker order by age;

-- 时间函数
-- 获取时间 获取年月日 获取时分秒 获取年月日时分秒

-- 获取所有
select CURRENT_TIMESTAMP();
select CURRENT_TIMESTAMP;

-- 获取年月日
select CURRENT_DATE();
select CURRENT_DATE;

-- 获取时分秒
select CURRENT_TIME();
select CURRENT_TIME;

-- 时间和varchar相互转换
-- 格式:select DATE_FORMAT(date,format)

-- 时间转str
select CURRENT_DATE;
select DATE_FORMAT(CURRENT_DATE(),'%Y-%m-%d');

-- str转时间
-- STR_TO_DATE(str,format)
select STR_TO_DATE('2022-03-10','%Y-%m-%d');

-- 两个时间相减(减减时间间隔)
-- DATEDIFF(expr1,expr2)
select DATEDIFF('2022-03-14','2022-03-01') as '时间间隔';

-- 时间相加减(加减时间间隔)
-- DATE_ADD(date,INTERVAL expr unit)  日期  关键字  加减的值   单位(year、month、day)

select DATE_ADD('2022-03-03',INTERVAL -3 YEAR);  #2019-03-03
select DATE_ADD('2022-03-03',INTERVAL -3 MONTH);  #2021-12-03
select DATE_ADD('2022-03-03',INTERVAL -3 DAY);   #2022-02-28

练习:求时间的分类
USE shujia;
create table test(
	datetime VARCHAR(255),
	sum int
)

insert into test(datetime,sum) values('2022-03-01',20);
insert into test(datetime,sum) values('2022-03-02',34);
insert into test(datetime,sum) values('2022-03-03',15);
insert into test(datetime,sum) values('2022-03-04',26);
insert into test(datetime,sum) values('2022-03-05',20);
insert into test(datetime,sum) values('2022-03-06',13);
insert into test(datetime,sum) values('2022-03-07',34);
insert into test(datetime,sum) values('2022-03-08',54);
insert into test(datetime,sum) values('2022-03-09',20);
insert into test(datetime,sum) values('2022-03-10',22);
insert into test(datetime,sum) values('2022-03-11',20);
insert into test(datetime,sum) values('2022-03-12',21);
insert into test(datetime,sum) values('2022-03-13',11);
insert into test(datetime,sum) values('2022-03-14',26);

-- 第一步时间相减 01234567
select *,DATEDIFF(datetime,'2022-03-01') from test;

-- 第二步 除以7  取余看是否在一个星期中
select *,DATEDIFF(datetime,'2022-03-01')/7 from test;

-- 向下取整
select *,FLOOR(DATEDIFF(datetime,'2022-03-01')/7) as g from test;

-- 同类的是一个星期的
select *,FLOOR(DATEDIFF(datetime,'2022-03-01')/7)*7 as g from test;

select *,DATE_ADD('2022-03-01',INTERVAL FLOOR(DATEDIFF(datetime,'2022-03-01')/7)*7 DAY) from test;
select *,
	CONCAT_WS('~',DATE_ADD('2022-03-01',INTERVAL FLOOR(DATEDIFF(datetime,'2022-03-01')/7)*7 DAY),
	DATE_ADD('2022-03-01',INTERVAL FLOOR(DATEDIFF(datetime,'2022-03-01')/7)*7+6 DAY)) as 时间分类 
	from test;

-- 逻辑判断
-- 格式: if(判断条件,true,false)

select * from worker;
-- 识别是男还是女
select *,if(sex='1','男','女') as '性别' from worker;

-- 识别成年还是未成年
select *,if(age>=18,'成年','未成年') as '是否成年' from worker;

-- 逻辑判断的分支判断
-- 意思是 如果有两种以上的条件需要判断

-- case WHEN
-- 格式1 双分支:case when 判断条件 then true else  false end;
-- 格式2:多分支:case when 判断条件 then true when 判断条件 then true else false end;

你可能感兴趣的:(mysql,学习,数据库)