3.1.4MySQL__数据库分组,拼接查询,日期函数,日期加减,间隔,数值四舍五入,排序,分组,having筛选,分组TopN,流程控制函数,
Posted Loves_cc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.1.4MySQL__数据库分组,拼接查询,日期函数,日期加减,间隔,数值四舍五入,排序,分组,having筛选,分组TopN,流程控制函数,相关的知识,希望对你有一定的参考价值。
1、字段进行算术运算
格式:
(字段 符号 字段)
例如:
select (name+age) from students;
注意:
字符串参与运算字符串为0参与运算
2、字段拼接
格式1:
concat(str1,str2...)
例如:把name和age以-拼接显示
select concat(name,'-',age)from students;
格式2:
concat_WS(separator,str1,str2,...)
例如:把name和age以-拼接显示
SELECT CONCAT_WS('-",name,age) from students;
3、日期函数
获取当前日期:
current_timestamp;--过去年月日,时分秒
CURRENT_DATE;-- 获取年月日
CURRENT_TIME();-- 获取时分秒
year–获取年
month–获取月
day–获取日
now–获取当前 时间
时间转str
格式:
date_format(date,format)
date:时间
format:格式
eg:SELECT DATE_FORMAT(CURRENT_DATE(),’%Y-%m-%d’);
str转日期
格式:
str_to_date(str,formaat)
eg:SELECT STR_TO_DATE(‘2021-09-01’,’%Y-%m-%d’); – 前后格式需要一样才可以
4、日期相减
格式:
datediff(expr1,expr2);
eg:SELECT DATEDIFF(‘2011-01-08’,‘2011-01-01’);
注意:只能相减年月日,时分秒参与运算结果为null
5、函数向日期添加指定的时间间隔
格式:
DATE_ADD(date,INTERVAL expr unit);
date:时间
INTERVAL:关键字
expr:间隔的数值(正数加,负数减)
unit:单位
eg:SELECT DATE_ADD(‘2011-09-01’,INTERVAL -20 MONTH) ;
6、数值计算
round(x,d):四舍五入
x:值
d:保留几位小数点
cell(x):向上取整
floor(x):向下取整
rand():随机数(0-1之间)
7、排序
格式:
order by 字段1 asc|desc,字段2 asc|desc...字段n asc|desc;
例如:按照age进行降序排列,age相同按照id进行降序排列
select * from students order by age desc,id desc;
注意:
默认升序asc,降序desc
如果有多个字段,按照先后顺序依次排序
8、group by 分组
格式:
group by 字段1,字段2...字段n;
注意:
多个字段,按照所有字段进行分组(一起分组)
有多少组显示多少条数据(默认情况下,没有经过条件筛选)
每组显示的数据为每组中默认第一条数据
gruop by 通常和聚合函数一起使用
9、筛选:where having
区别:having可以使用聚合函数
例如: where 一般放group by之前
select * from students where age>=25;可以
select * from students having age>=25;可以(如果不是* 而是字段,没有age的话,having就查询不到了)
select sex,count(*) c from students group by sex where c>4;不可以 (在所有字段中没有c)
select sex,count(*) c from students group by sex having c>4;可以 (先select就有c了)
where:执行流程是from–>where–>select 对表中的所有数据做筛选
having:执行流程是 from–>select–>having 对select显示的数据做筛选,是对where筛选的内容做补充
分组:形成新的组数据,原字段不能用了,新的记录以行为一条数据
eg:(主要看分组前还是分组后,分组前有的字段用where在groupby 前写,分组后的字段在group by后用having)
– 查询每个性别学习java的最高年龄
age>30的性别和最大年龄
SELECT MAX(age),press
FROM book
where pro=‘java’
GROUP BY press
HAVING MAX(age)>30;
结论:分组查询中的筛选条件分为两类
分组前筛选 数据源:原始表 位置:group by 子句的前面 关键字:where
分组后筛选 数据源:分组后的结果集 位置:group by 子句的后面 关键字:having
10、TopN:前几条数据
1.TopN age最大的前三个
select * from students order by age desc limit 0,3;
2.分组Top1 按sex分组后,求分组中年龄最大的一个
1.select * from students where age in (select max(age) m from students group by sex);
2.select * from students as stu1 where age=(select max(age) from students as stu2 where stu1.sex=stu2.sex);
2.分组TopN 按sex分组后,求分组中年龄最大的三个(不能使用group by,用group by 每组只有最大的一个数据)直接两张表匹配
思路:两个表数据进行比较 用a1.gender=a2.gender进行分组,男一组,女一组,
然后用a1.age<a2.age(左边每一条数据与右表每一个数据比较,获取每条数据age小于的次数)(…5 4 3 2 1 0,最大数据永远是0 1 2)(最后3>…)
select * from students as stu1 where 3>(select count(*) from students as stu2 where stu1.sex=stu2.sex and stu1.age<stu2.age);
11、流程控制函数
(1)if函数
eg:SELECT IF(10>5,‘大’,‘小’) //三个参数,类似于三元运算符
SELECT id,name, if(money is NULL,‘没有奖金’,‘有奖金’)
from students;
(2)case函数使用一(控制结构,等值判断)
case 要控制的字段或表达式
when 常量1 then 要显示的值1或语句1;(语句需要加;值不需要加;)
when 常量2 then 要显示的值2或语句2;
…
else 要显示的值n或语句n;
end
eg:SELECT age,id,name,press,
CASE id
when 1001 THEN age100
when 1002 THEN age200
else age*300
END as ee from book;
(3)case函数使用二(控制结构)
case
when 条件1 then 要显示的值1或语句1;
when 条件2 then 要显示的值2或语句2;
…
else 要显示的值n或语句n
end
eg:SELECT id,age,name,press,
CASE
WHEN age>30 then ‘A’
when age>20 then ‘B’
ELSE ‘C’
end as e from book;
12、mysql三大范式
1.原子性:字段不可在分割
2.唯一性:字段依赖于主键
3.冗余性:避免数据量过大
以上是关于3.1.4MySQL__数据库分组,拼接查询,日期函数,日期加减,间隔,数值四舍五入,排序,分组,having筛选,分组TopN,流程控制函数,的主要内容,如果未能解决你的问题,请参考以下文章