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 age
200
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,流程控制函数,的主要内容,如果未能解决你的问题,请参考以下文章

MySQL_基本概念&DQL查询语言

spark 分组后字符串拼接

MYSQL05_ORDR BY排序LIMIT分组GROUP BY分组

MySQL.MySQL基础

MySQL.MySQL基础

MySQL.MySQL基础