首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静脉曲张的MySQL AVG()可能?

问静脉曲张的MySQL AVG()可能?
EN

Stack Overflow用户
提问于 2017-03-03 18:52:03
回答 1查看 3.8K关注 0票数 5

我正在用MySQL在我的大学做一个数据库课程的作业。我们已经建立了一个高尔夫俱乐部的数据库,在那里我们可以存储不同游戏的结果。

现在我正在为作业编写报告,我试图证明使用int而不是varchar来存储结果更好。如果使用int,被取消资格的玩家将因此得到一个空值.如果使用了varchar,就会有一个字符串:“used”。

我想知道的是:

  1. 当计算即将发生时,MySQL是否会自动将varchar转换为int (例如,使用avg() )?
  2. 如果是这样的话,这会不会大大降低数据库的速度(与使用int时相比)?
  3. 可以对字符串值进行计算吗?例如,如果结果-属性是包含"52“、"68”、"72“的varchar,那么能计算出平均值吗?
  4. 如果我有上面列出的字符串加上一个“取消资格”的结果,会发生什么情况?它会像忽略一个空的int那样忽略那个字符串吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-04 11:26:50

你的问题可以通过运行简单的测试来回答:

代码语言:javascript
复制
drop table if exists golf;
create table golf(id int, int_col int, char_col varchar(50));
insert into golf(id, int_col, char_col) values
    (1, 10, '10'),
    (2, 20, '20');

select avg(int_col), avg(char_col) from golf;

结果:

代码语言:javascript
复制
avg(int_col) | avg(char_col)
     15,0000 |            15

http://rextester.com/NNAZ9432

如您所见,VARCHAR列上的AVG返回预期的结果。

现在使用NULL和'disqualified'添加一行

代码语言:javascript
复制
drop table if exists golf;
create table golf(id int, int_col int, char_col varchar(50));
insert into golf(id, int_col, char_col)values
    (1, 10, '10'),
    (2, 20, '20'),
    (2, NULL, 'disqualified');

select avg(int_col), avg(char_col) from golf;

现在的结果不同了:

代码语言:javascript
复制
avg(int_col) | avg(char_col)
     15,0000 |            10

http://rextester.com/RXOQAZ69820

reoson是:当NULL被AVG忽略时,'disqualified'被转换为0,其结果是(10 + 20 + 0) /3= 10。

要测试性能,可以使用虚拟数据创建一个大表。在使用序列插件的MariaDB中,可以很容易地做到这一点:

代码语言:javascript
复制
drop table if exists golf;
create table golf(id mediumint primary key, int_col smallint, char_col varchar(50));
insert into golf(id, int_col, char_col)
    select seq id
         , floor(rand(1)*1000) int_col
         , floor(rand(1)*1000) char_col
    from seq_1_to_1000000;

超过INT的AVG:

代码语言:javascript
复制
select avg(int_col) from golf;
-- query time: 187 msec

VARCHAR的AVG:

代码语言:javascript
复制
select avg(char_col) from golf;
-- query time: 203 msec

最后但并非最不重要的一点:不应将字符串类型用于数值。还有一个原因是排序。如果您尝试对存储为字符串的数字进行排序,您将得到类似于10、2、22、3的内容。

您也不应该对不同的信息类型使用一列。在您的示例中,您可以再定义一个列,如status,其值为“已完成”或“取消资格”。另一种可能的方法是有一个标志列disqualified,其值为0或1。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42586392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档