2017-03-03 10 views
-1

Ich mache eine Zuordnung in einem Datenbank-Kurs an meiner Uni mit MySQL. Wir haben eine Datenbank eines Golfclubs erstellt, wo wir (unter anderem) Spielergebnisse von verschiedenen Spielen speichern können.MySQL AVG() von Varchar möglich?

Jetzt schreibe ich den Bericht für die Aufgabe, und ich versuche zu beweisen, dass es besser ist, ein int als ein varchar zu verwenden, um die Ergebnisse zu speichern. Wenn ein int verwendet wird, erhalten disqualifizierte Spieler als Ergebnis einen NULL-Wert. Wenn ein Varchar verwendet worden wäre, hätten sie eine Zeichenfolge: "Disqualifiziert".

Die Dinge, ich frage mich, sind:

  1. Hat MySQL automatisch varchar zu int konvertieren, wenn avg() verwendet wird (zum Beispiel), wenn eine Berechnung geschehen?
  2. Wenn dies der Fall ist, verlangsamt das die Datenbank sehr (verglichen mit der Verwendung eines int)?
  3. Ist es möglich, Berechnungen mit String-Werten durchzuführen? Z.B. Wenn das Ergebnis-Attribut ein varchar ist, der "52", "68", "72" enthält, kann der Durchschnitt berechnet werden?
  4. Was passiert, wenn ich die oben aufgelisteten Strings plus ein "disqualifiziertes" Ergebnis habe? Wird diese Zeichenfolge ignoriert, als hätte sie einen NULL eines int ignoriert?
+2

Das ist ein guter Gedanke, dass Sie einen Datenbank-Kurs machen, aber Sie sollten es für sich selbst tun, sonst würden Sie nicht lernen. –

+0

Nun, ich lerne eine ganze Menge, und dieser Kurs ist Teil meines Programms. Ich brauche nur ein bisschen mehr Informationen für diesen Bericht. – lindastralberg

Antwort

0

Ihre Fragen können durch runing einfache Tests zu beantworten:

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; 

Ergebnis:

avg(int_col) | avg(char_col) 
    15,0000 |   15 

http://rextester.com/NNAZ9432

Wie Sie AVG sehen können über eine VARCHAR-Spalte die zurück erwartetes Ergebnis.

Jetzt eine Zeile mit NULL hinzufügen und 'disqualified'

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; 

Nun werden die Ergebnisse sind unterschiedlich:

avg(int_col) | avg(char_col) 
    15,0000 |   10 

http://rextester.com/RXOQAZ69820

Die reoson ist: Während NULL von AVG ignoriert wird, 'disqualified' ist konvertiert zu 0 und das Ergebnis ist (10 + 20 + 0)/3 = 10.

Um die Leistung zu testen, können Sie eine große Tabelle mit Dummy-Daten erstellen.

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; 

AVG über INT:

select avg(int_col) from golf; 
-- query time: 187 msec 

AVG über VARCHAR: verwenden Sie sollten nicht:

select avg(char_col) from golf; 
-- query time: 203 msec 

Last but not least in MariaDB mit der Sequenz Plugin kann dies leicht getan werden Zeichenkettentypen für numerische Werte. Ein weiterer Grund ist das Sortieren. Wenn Sie versuchen, als Zeichenfolgen gespeicherte Zahlen zu sortieren, erhalten Sie etwa [10, 2, 22, 3].

Sie sollten auch keine Spalte für verschiedene Informationstypen verwenden. In Ihrem Fall könnten Sie eine weitere Spalte wie status mit den Werten "Fertig" oder "Disqualifiziert" definieren. Ein anderer möglicher Weg ist, eine Flaggenspalte disqualified mit Werten 0 oder 1 zu haben.

+0

Vielen Dank! – lindastralberg