MySQL Null kann 5 Probleme verursachen (alle schwerwiegend)

MySQL Null kann 5 Probleme verursachen (alle schwerwiegend)

Bevor wir offiziell beginnen, werfen wir einen Blick auf die Konfigurations- und Versionsnummerninformationen des MySQL-Servers, wie in der folgenden Abbildung dargestellt:

„Die Nahrung und das Futter müssen bereitstehen, bevor die Truppen aufbrechen.“ Nachdem wir die entsprechende Konfiguration gelesen haben, erstellen wir eine Testtabelle und einige Testdaten.

-- Wenn die Personentabelle vorhanden ist, löschen Sie sie zuerst. DROP TABLE IF EXISTS person; 
 
- Erstellen Sie eine Personentabelle, in der das Feld „Benutzername“ leer sein kann, und legen Sie einen normalen Index dafür fest. CREATE TABLE person (
 ID INT PRIMARY KEY auto_increment,
 Name VARCHAR(20),
 mobiles VARCHAR(13),
 Index(Name)
)ENGINE='innodb';
 
-- Testdaten zur Personentabelle hinzufügen, insert into person(name,mobile) values('Java','13333333330'),
 ('MySQL','13333333331'),
 ('Redis','13333333332'),
 ('Kafka','13333333333'),
 ('Frühling','13333333334'),
 ('MyBatis','13333333335'),
 ('RabbitMQ','13333333336'),
 ('Golang','13333333337'),
 (NULL,'13333333338'),
 (NULL,'13333333339');
 
wählen Sie * aus Person;

Die erstellten Testdaten sind in der folgenden Abbildung dargestellt:

Nachdem wir nun die Daten haben, schauen wir uns an, welche Probleme auftreten, wenn die Spalte NULL -Werte enthält.

1. Zähldaten gehen verloren

Wenn eine Spalte einen NULL -Wert hat, führt die Verwendung count zum Abfragen der Spalte zu einem Datenverlust, wie im folgenden SQL gezeigt:

Wählen Sie Anzahl(*), Anzahl(Name) aus Person;

Die Ergebnisse der Abfrageausführung lauten wie folgt:

Aus den obigen Ergebnissen können wir ersehen, dass bei Verwendung count(name) zwei Daten mit NULL -Werten verloren gehen.

Lösung

Wenn eine Spalte einen NULL -Wert hat, wird count(*) für die Datenstatistik verwendet.

Erweitertes Wissen: Verwenden Sie nicht count(constant)

Alibabas „Java Development Manual“ legt fest, dass Sie count(Spaltenname) oder count(Konstante) nicht als Ersatz für count( ) verwenden sollten. count( ) ist die von SQL92 definierte Standardsyntax zum Zählen von Zeilen. Sie hat nichts mit der Datenbank zu tun und hat nichts mit NULL oder Nicht-NULL zu tun.

Hinweis: count(*) zählt die Zeilen mit NULL-Werten, während count(Spaltenname) die Zeilen mit NULL-Werten in dieser Spalte nicht zählt.

2. Deutlicher Datenverlust

Wenn bei Verwendung der Abfrage count(distinct col1, col2) eine der Spalten NULL , gehen im Abfrageergebnis Daten verloren, auch wenn die andere Spalte einen anderen Wert hat, wie im folgenden SQL gezeigt:

Wählen Sie die Anzahl (eindeutiger Name, Mobiltelefon) aus der Person aus.

Die Ergebnisse der Abfrageausführung lauten wie folgt:

Die Originaldaten der Datenbank lauten wie folgt:

Aus den obigen Ergebnissen können wir ersehen, dass die 10 Daten in der Spalte mit der Mobiltelefonnummer alle unterschiedlich sind, das Abfrageergebnis jedoch 8 ist.

3.Datenverlust auswählen

Wenn eine Spalte NULL Werte enthält, führt die Ausführung einer ungleichen Abfrage (<>/!=) dazu, dass die Ergebnisse NULL Werte verloren gehen. Beispielsweise folgende Daten:

Ich muss alle Daten abfragen, außer denen mit dem Namen „Java“. Das erwartete Ergebnis sind Daten mit IDs von 2 bis 10. Bei der Ausführung der folgenden Abfrage jedoch:

Wählen Sie * von Person, wobei Name<>'Java' nach ID sortiert ist;
- oder wählen Sie * von Person, wobei Name!='Java' nach ID sortiert ist;

Die Abfrageergebnisse lauten wie folgt:

Es ist ersichtlich, dass die beiden NULL -Daten aus dem Nichts verschwunden sind und dieses Ergebnis nicht unseren normalen Erwartungen entspricht.

Lösung

Um das obige Problem zu lösen, müssen Sie nur das Ergebnis mit NULL Wert zum Abfrageergebnis hinzufügen. Führen Sie SQL wie folgt aus:

Wählen Sie * von Person, wobei Name<>'Java' oder isnull(Name) sortiert nach ID ist;

Die endgültigen Ausführungsergebnisse sind wie folgt:

4. Verursacht eine Nullzeiger-Ausnahme

Wenn eine Spalte einen NULL -Wert hat, kann das Rückgabeergebnis von sum(column) NULL statt 0 sein. Wenn das Ergebnis sum NULL ist, kann dies während der Programmausführung zu einer Null Pointer Exception (NPE) führen. Lassen Sie uns dieses Problem demonstrieren.

Lassen Sie uns zunächst eine Tabelle und einige Testdaten erstellen:

-- Wenn die Warentabelle vorhanden ist, löschen Sie sie zuerst. DROP TABLE IF EXISTS Waren; 
 
-- Erstellen Sie die Warentabelle CREATE TABLE Waren (
 ID INT PRIMARY KEY auto_increment,
 Zahl int
)ENGINE='innodb';
 
-- Testdaten zur Warentabelle hinzufügen, in Waren(Anzahl) Werte(3),(6),(6),(NULL) einfügen;
 
* aus Waren auswählen;

Die Originaldaten in der Tabelle lauten wie folgt:

Als nächstes verwenden wir die sum und führen das folgende SQL aus:

Wählen Sie Summe(Anzahl) aus Waren, bei denen ID > 4 ist;

Die Ergebnisse der Abfrageausführung lauten wie folgt:

Wenn das Abfrageergebnis NULL statt 0 ist, kann dies zu einer Nullzeigerausnahme führen.

Lösen der Nullzeiger-Ausnahme

Sie können NullPointerException vermeiden, indem Sie Folgendes verwenden:

Wählen Sie ifnull(sum(num), 0) aus Waren, bei denen ID>4;

Die Ergebnisse der Abfrageausführung lauten wie folgt:

5. Erhöhte Abfrageschwierigkeit

Wenn eine Spalte NULL -Werte enthält, wird es schwieriger, NULL Werte oder Nicht- NULL -Werte abzufragen.

Der sogenannte erhöhte Abfrageschwierigkeitsgrad bedeutet, dass Sie bei der Durchführung einer NULL Wertabfrage NULL Wert-übereinstimmende Abfragemethode verwenden müssen, wie z. B. IS NULL oder IS NOT NULL oder IFNULL(cloumn) -Ausdrücke für die Abfrage, während herkömmliche =、!=、<>... und andere Ausdrücke nicht verwendet werden können. Dies erhöht den Abfrageschwierigkeitsgrad, insbesondere für unerfahrene Programmierer. Als Nächstes demonstrieren wir diese Probleme.

Nehmen wir als Beispiel person Personentabelle. Ihre ursprünglichen Daten lauten wie folgt:

Falsche Verwendung 1:

Wählen Sie * aus der Person, wo Name<>null ist;

Das Ausführungsergebnis ist leer und es wurden keine Daten gefunden, wie in der folgenden Abbildung dargestellt:

Falsche Verwendung 2:

Wählen Sie * aus der Person, wo Name!=null;

Das Ausführungsergebnis ist ebenfalls leer und es werden keine Daten abgefragt, wie in der folgenden Abbildung dargestellt:

Richtige Anwendung 1:

Wählen Sie * aus der Person, deren Name nicht null ist;

Die Ausführungsergebnisse sind wie folgt:

Richtige Anwendung 2:

Wählen Sie * von Person, wobei !isnull(Name);

Die Ausführungsergebnisse sind wie folgt:

Empfohlene Verwendung

Alibabas „Java Development Manual“ empfiehlt, dass wir ISNULL(cloumn) verwenden, um den NULL Wert zu bestimmen . Der Grund dafür ist, dass in der SQL-Anweisung ein Zeilenumbruch vor Null die Lesbarkeit beeinträchtigt, während ISNULL(column) ein Ganzes ist, prägnant und leicht zu verstehen. Bei der Analyse der Leistungsdaten ist ISNULL(column) auch effizienter.

Erweitertes Wissen: NULL hat keinen Einfluss auf den Index

Aufmerksame Freunde haben möglicherweise bemerkt, dass ich beim Erstellen name person einen normalen Index dafür erstellt habe, wie in der folgenden Abbildung dargestellt:

Anschließend analysieren wir mit explain den Abfrageplan, um zu sehen, ob der NULL Wert im name die Indexauswahl beeinflusst.

Das Ausführungsergebnis von explain ist in der folgenden Abbildung dargestellt:

Aus den obigen Ergebnissen können wir ersehen, dass selbst wenn in name ein NULL Wert vorhanden ist, dies keinen Einfluss auf die Verwendung der Indizes für Abfragen durch MySQL hat.

Zusammenfassen

In diesem Artikel haben wir fünf mögliche Probleme besprochen, die auftreten können, wenn eine Spalte NULL ist: Verlust von Abfrageergebnissen, Nullzeigerausnahmen und erhöhte Abfrageschwierigkeit. Daher empfehlen wir, beim Erstellen einer Tabelle die Einschränkung „ is not null festzulegen. Wenn eine Spalte keinen Wert hat, können Sie einen Nullwert ('') oder 0 als Standardwert festlegen.

Damit ist dieser Artikel über 5 Probleme (alle schwerwiegend), die durch MySQL Null verursacht werden, abgeschlossen. Weitere Informationen zu Problemen, die durch MySQL Null verursacht werden, finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Lösen Sie das Problem, dass MySQL „not in“ verwendet, um Nullwerte einzuschließen
  • Lösen Sie das Problem, dass bei der Set-Operation kein NULL gefunden wird, nicht wie bei MySQL
  • Lösung für das MySQL IFNULL-Beurteilungsproblem
  • Lösung für das Problem der Nullspalte in der NOT IN-Füllgrube in MySQL
  • mysql nicht drin, linker Join, IST NULL, EXISTIERT NICHT Effizienzproblem-Datensatz

<<:  So verwenden Sie das Docker-Plugin, um Projekte remote auf Cloud-Servern in IDEA bereitzustellen

>>:  Tutorial zu HTML-Tabellen-Tags (23): Zeilenrahmen-Farbattribut BORDERCOLORDARK

Artikel empfehlen

MySQL Series II-Konfiguration für mehrere Instanzen

Tutorial-Reihe MySQL-Reihe: Grundlegende Konzepte...

Detaillierte Erklärung von MySQL Explain

Bei unserer täglichen Arbeit führen wir manchmal ...

Zwei Möglichkeiten zur Visualisierung von ClickHouse-Daten mit Apache Superset

Apache Superset ist ein leistungsstarkes BI-Tool,...

Probleme und Lösungen bei der Installation von Docker in der Alibaba Cloud

Frage Bei der Installation von Docker mithilfe de...

Implementierungsschritte zur Installation eines FTP-Servers in Ubuntu 14.04

Inhaltsverzeichnis Installieren Softwareverwaltun...

Zusammenfassung der 7 Fallstricke bei der Verwendung von React

Inhaltsverzeichnis 1. Komponentenaufblähung 2. Än...

Analyse der Nutzung des Xmeter API-Schnittstellentesttools

XMeter API bietet einen umfassenden Online-Schnit...

Detaillierte Darstellung des MySQL 5.7.33-Installationsprozesses

Inhaltsverzeichnis Download des Installationspake...

Teilen Sie die Fallstricke von MySQLs current_timestamp und ihre Lösungen

Inhaltsverzeichnis MySQLs current_timestamp-Falle...

So handhaben Sie gleichzeitige Aktualisierungen von MySQL-Daten

Wird UPDATE gesperrt? Wird die SQL-Anweisung gesp...

MySql-Wissenspunkte: Transaktion, Index, Sperrprinzip und Nutzungsanalyse

Dieser Artikel erläutert anhand von Beispielen di...

CSS3-Radarscan-Kartenbeispielcode

Verwenden Sie CSS3, um coole Radar-Scan-Bilder zu...