mysql基本命令3

时间函数

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

-- 获取所有
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) #2022-02-28
​

练习:求时间的分类

以一周为界线

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;##确定结尾,开头和结尾差6
-- 第五步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...case when...)

if

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

把数据的结果从0 1转化为男女进行显示

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

case when

格式1双分支: case when 判断条件 then true else false end;(以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)

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

--from 获取数据

--select 显示

--order by 排序

#  默认不给排序规则 就是升序
select * from student order by age;     # age 从小到大 升序 不加asc默认升序
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从小到大,sex从大到小排序)
​
​
# age 从大到小 如果有相同的age按sex从大到小
select * from student order by age desc ,sex desc;(age,sex都是从大到小排序

分页

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个

select * from student oder by age desc limit 0,3;#先排序后分页

需求:求平均年龄

select *,avg(age) from student;

求大于平均年龄的

--执行流程:from获取所有数据-->where avg(age)聚合函数,结果只有一个对不上->select

select * from student where age>avg(age);改写为:

select * from student where age>(select avg(age) from student);

注意:一个sql语句的结果可以进行再次查询

MSQL三大范式

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

idnameage街道
1001    zs18安徽        合肥蜀山浮山路

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

问题1:冗余:数据重复 同一个科目 有n个学生会重复n-1次

同一个学生有n个科目会重复n-1次

问题2:更新异常:因为数据重复,要修改都修改

问题3;插入问题:假如有一门科目,没有学生考试那么这个科目信息就不会录入到数据库

问题4;删除

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

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;  # 通常使用获取分组字段 和聚合函数

求所有age的最大值

select max(age) from student;

求age最大的学生

select * from student where age=(select max(age) from student);

求按性别分组并求出每组age最大值

select sex,max(age) from student group by sex;

求每组age最大的学生(TopN)

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<s2.age)
        ​​​​​​​        ​​​​​​​       最大的           记录数
-- Top3
select * from student  s1 where 3>(select count(*) from student as s2  where s1.sex=s2.sex and s1.age<s2.age)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值