首页 > 技术分享 > MySQL
收藏

Mysql查询百分比方法及所用函数详解

12/22 19:42
大潇博客 原创文章,转载请标明出处

通过一条sql语句,实现查询当前的胜率、超越了多少人等等,返回结果为百分比,下面通过实际案例说明。


假设有张表tableName,结构和数据如下:

百分比数据表.png


条件1:查询type_id为10,score分数大于120的人所占百分比,sql语句为:

SELECT 

CONCAT(

CAST(

CONVERT(

CAST((SELECT COUNT(id) FROM tableName where type_id=10 and score>120) AS DECIMAL)*100

 / 

CAST((SELECT COUNT(id) FROM tableName where type_id = 10) AS DECIMAL), 

DECIMAL) 

AS CHAR) ,

'%') AS percentage 

FROM tableName GROUP BY percentage;

拆解分析SQL语句:

1、首先查询大于120分的人数:SELECT COUNT(id) FROM tableName where type_id = 10 and score >120

2、通过CAST(查询结果 AS DECIMAL)函数,把查询到的结果转换成浮点数

3、浮点数 * 100(获得百分比方法为:A/B*100,然后拼接百分号,我们这里先乘100再除)

4、查询全部人数并通过CAST()函数转化成浮点数

5、用大于120分的人数除以全部人数

6、通过CONVERT(相除结果,DECIMAL)函数,把计算的结果转成浮点数

7、通过CAST(计算结果 AS CHAT)函数,把计算结果转成字符型

8、通过CONCAT(字符型结果,'%')函数,把百分号拼到查询结果后面


条件2:查询type_id为10,score分数大于120的男生所占百分比,假设用户表名是userTable,性别字段sex,sql语句为:

SELECT 

CONCAT(

CAST(

CONVERT(

CAST((SELECT COUNT(A.id) FROM tableName A JOIN userTable U ON A.user_id=U.id WHERE A.type_id=10 AND A.score<120 AND U.sex='男') AS DECIMAL)*100

 / 

CAST((SELECT COUNT(A.id) FROM tableName A JOIN userTable U ON A.user_id=U.id WHERE A.type_id=10 AND U.sex='男') AS DECIMAL), 

DECIMAL) 

AS CHAR) ,

'%') AS percentage 

FROM tableName GROUP BY percentage;

上面的sql语句只是在第一条的基础上,做了简单修改,主要为了体现联表查询应该在什么位置,方便快速使用。



补充上面出现的Mysql基本函数和数据类型:

1、CAST()函数:

对数据进行类型转换,CAST()函数语法为:CAST(字段名 AS 转换的类型),其中类型可以为:

CHAR[(N)]    字符型 

DATE           日期型

DATETIME   日期和时间型

DECIMAL     float型

SIGNED       int

TIME           时间型


2、DECIMAL数据类型:

DECIMAL是MySQL中存在的精准数据类型(浮点型),语法格式“DECIMAL(M,D)”,其中:

M是整个数字的最大精度(长度),其范围为“1~65”(个字符),默认值是10;

D是小数点右侧数字的数目(标度),其范围是“0~30”,但不得超过M;

要把某列的数据类型定义为DECIMAL,使用以下语法:

column_name DECIMAL(M,D);

#DECIMAL(M,D)表示列可以存储D位小数的M位数。十进制列的实际范围取决于精度和刻度

#M是表示有效数字数的精度(数字长度),M范围为1〜65。

#D是表示小数点后的位数,D的范围是0~30,MySQL要求D小于或等于(<=)M


以下示例使用DECIMAL数据类型定义的一个叫作money的列。

money DECIMAL(8,2);

#在此示例中,money列最多可以存储8位数字,小数位数为2位,整数位数为8-2=6位

#因此,money列的范围是从“-999999.99”到“999999.99


MySQL允许使用以下语法:

column_name DECIMAL(M);

这相当于:

column_name DECIMAL(M,0);

在这种情况下,列只有整数部分,不包含小数部分和小数点


此外,我们甚至可以使用以下语法:

column_name DECIMAL;

在这种情况下,M的默认值为10,相当于:

column_name DECIMAL(10,0);


3、CONVERT()函数:

CONVERT函数用于将值转换为指定的数据类型或字符集

⑴.转换指定字符集,语法结构:

CONVERT(要转换的值 USING 要转换成的字符集);

例如:

-- 原本为utf8mb4

SELECT CHARSET('ABC'); #输出utf8mb4

-- 转换gbk

SELECT CHARSET(CONVERT('ABC' USING gbk)); #输出gbk


⑵.转换指定数据类型,语法结构:

CONVERT(expr,type);

#expr: 要转换的值

#type: 要转换为的数据类型 

type参数取值:

描述
DATE将expr转换成'YYYY-MM-DD'格式
DATETIME将expr转换成'YYYY-MM-DD HH:MM:SS'格式
TIME将expr转换成'HH:MM:SS'格式
CHAR将expr转换成CHAR(固定长度的字符串)格式
SIGNED将expr转换成INT(有符号的整数)格式
UNSIGNED将expr转换成INT(无符号的整数)格式
DECIMAL将expr转换成FLOAT(浮点数)格式
BINARY将expr转换成二进制格式


4、concat()函数:

将多个字符串连接成一个字符串。

语法:concat(str1, str2,...),返回结果为连接参数产生的字符串,如:

SELECT CONCAT('11','22','333','4444') FROM DUAL;

返回如下结果:

MySQL_CONCAT.png

注意:如果有任何一个参数为null,则返回值为null,如:

MySQL_CONCAT_NULL.png



cast()和convert()的区别:

cast()和convert()都是类型转换函数,可以将某个数据类型的值转换为另一种数据类型。

其实在大部分情况下,这两个函数都是没有区别的,MySQL官方文档中对于cast()也提到:

This operation may also be expressed as CONVERT(expr, type), which is equivalent.

意思是:cast()的此操作(类型转换)可以被convert()替换,他们是等价的。


打赏

阅读排行

大家都在搜

博客维护不易,感谢你的肯定
扫码打赏,建议金额1-10元
  • 15601023311