5th Jul 2022 9 Leseminuten Numerische Datentypen in SQL verstehen Aldo Zelen Datentypen Numerische Funktionen Inhaltsverzeichnis Numerischer SQL-Datentyp Häufige Fehler bei numerischen Typen Die Integer-Datentypen Häufige Fehler bei Integer-Typen Die Float-Datentypen Arbeiten mit Näherungstypen Wenn du mit Datenbanken arbeitest, musst du auch mit Daten arbeiten. Diese Daten können eine Reihe von vordefinierten Formaten annehmen. Wenn du dich mit LearnSQL.de vertraut machst, wirst du die verschiedenen Datentypen von SQL lernen. In diesem Artikel werden wir verschiedene Varianten des numerischen Datentyps von SQL behandeln. Außerdem werden wir einige Funktionen untersuchen, die Daten von einem Typ in einen anderen umwandeln. Das Erstellen von Tabellen ist der erste Schritt in jedem SQL-Programmierprojekt. Dies geschieht mithilfe von DDL-Anweisungen (Data Definition Language) wie CREATE und DROP, die in unserem Erstellen von Tabellen in SQL Kurs behandelt werden. Sobald du deine Tabelle erstellt hast, fängst du an, Spaltennamen und Datentypen in SQL aufzulisten. Die Datentypen sagen deiner Datenbank, welche Informationen sie für die jeweilige Spalte erwarten. Nehmen wir an, du hast eine Tabelle mit dem Namen ‶Benutzer". Jeder Benutzer hat Informationen in einer Namensspalte und einer Telefonnummernspalte. Die Namen würden in einer Zeichenspalte gespeichert werden. Eine Telefonnummer würde in einer numerischen Spalte gespeichert. In numerischen Spalten werden also Zahlen gespeichert und alle Zahlen sind gleich, richtig? Falsch gedacht. Es gibt verschiedene Arten von Zahlen und es gibt verschiedene Arten von numerischen Spalten. Jeder, der sich mit Statistik auskennt, weiß, dass es vier verschiedene Skalen für Zahlen gibt: Nominal, Ordinal, Intervall und Ratio. Im Gegensatz zu anderen Datentypen können numerische Typen alle diese Skalen darstellen (deshalb sprechen wir nicht von SQL numerischen Daen-Typen, sondern von Typen). Aber wie unterscheiden sich diese Skalen voneinander? Nominalwerte unterscheiden sich nur durch ihren Namen. Nominalwerte werden nicht wie Zahlen behandelt; du kannst sie nicht addieren oder subtrahieren, und sie haben keine eigene Reihenfolge. So sind zum Beispiel Schülerausweisnummern und Telefonnummern Nominalwerte. Sie funktionieren eher wie ein Etikett als eine Zahl. Wir können sagen, dass unsere Telefonnummern gleich sind (gleiche Bedeutung, gleiche Länge), aber wir können sie nicht vergleichen oder sagen, dass eine Nummer die erste ist. Wir können sie nicht addieren und erhalten eine sinnvolle Telefonnummer. Ordinalwerte geben eine Reihenfolge oder einen Rang an. Bei Ordinalwerten ist die Reihenfolge zwischen ihnen das Entscheidende. Angenommen, du hättest eine Skala von 1 bis 3, um deine Stimmung zu bewerten. Wenn du dich unglücklich fühlst, bekommst du eine 1, wenn du zufrieden bist, eine 2 und wenn du glücklich bist, einen Wert von 3. Du weißt, dass glücklich einen höheren Wert hat als zufrieden oder unglücklich, aber das war's auch schon. Du kannst "zufrieden" und "unglücklich" nicht addieren und erhältst "glücklich". Intervallwerte zeigen genaue Unterschiede an. Bei einer Intervallskala sind die Unterschiede zwischen den Werten das, was wichtig ist. Wenn du 90 Grad Celsius von 100 Grad Celsius abziehst, erhältst du einen Unterschied von 10 Grad. Jahre, Daten und die meisten Persönlichkeitsmaße sind Intervallmaße. Intervallwerte sind numerisch und werden in der Datenbank als Zahlenwert dargestellt. Ratio-Werte sind Intervalle mit einem definierten Nullwert. Wie bei einer Intervallskala gibt es auch bei einer Ratio messbare Unterschiede zwischen den Werten. Bei einer Ratio-Skala bedeutet ein Nullwert jedoch, dass es nichts zu messen gibt. Denke zum Beispiel an Masse, Länge und Dauer. Wenn einer dieser Werte den Wert Null hat, gibt es nichts. Ratio-Skalen sind in der Wissenschaft sehr wichtig. Jeder numerische Datentyp in SQL wird verwendet, um alle oben genannten Werte darzustellen, insbesondere Intervalle und Ratio. Da du in SQL auch Zeichenwerte vergleichen kannst, könnte man argumentieren, dass Zeichenwerte auch Intervalldaten darstellen können. Aber das ist ein Thema für einen anderen Artikel. In SQL werden Zahlen entweder als exakte oder ungefähre Werte definiert. Die exakten numerischen Datentypen sind SmallInt, Integer, BigInt, Numeric(p,s), und Decimal(p,s). Exakter numerischer SQL-Datentyp bedeutet, dass der Wert als wörtliche Darstellung des Zahlenwerts gespeichert wird. Die ungefähren numerischen Datentypen sind Float(p), Real und Double Precision. Sie stellen reale Zahlen dar, werden aber nicht als exakte Zahlen in der Datenbank gespeichert. Aufgrund der Art und Weise, wie Computersysteme Zahlen darstellen, sind sie vielmehr eine Annäherung an die reale Zahl. Falls sich das verwirrend anhört, sei versichert, dass wir es später im Detail erklären werden. Beginnen wir unsere Betrachtung der numerischen SQL-Typen mit den exakten oder numerischen Datentypen. Numerischer SQL-Datentyp Die exakten numerischen Datentypen von SQL bestehen aus den Subtypen Numeric(p,s) und Decimal(p,s). Sie sind exakt und werden durch Präzision (p) und Skala (s) definiert. Die Genauigkeit ist eine ganze Zahl, die die Gesamtzahl der zulässigen Ziffern in dieser Spalte angibt. Diese Ziffern sind in einer bestimmten Radix oder Zahlenbasis - z. B. binär (Basis-2) oder dezimal (Basis-10). Sie werden normalerweise mit einem Dezimalpunkt angegeben. Die Skala, ebenfalls ein ganzzahliger Wert, gibt die Anzahl der Dezimalstellen rechts (wenn positiv) oder links (wenn negativ; dies wird selten verwendet) vom Dezimalpunkt an. Schauen wir uns ein Beispiel an. Angenommen, du hast eine Spalte ‶Saldo" als Numeric mit einer Genauigkeit von 8 und einer Skala von 2 definiert. Die DDL würde wie folgt aussehen: CREATE TABLE Konto ( Kontonummer integer, Saldo numeric(8,2) ); In der Spalte ‶Saldo" kann die Zahl 173226,62 sicher gespeichert werden. P steht für die Gesamtzahl aller Ziffern und s für die beiden Nachkommastellen. Es gibt einen kleinen Unterschied zwischen den numerischen Datentypen Numeric(p,s) und Decimal(p,s) in SQL. Numeric legt die genaue Genauigkeit und den Maßstab fest. Decimal legt nur den genauen Maßstab fest; die Genauigkeit ist gleich oder größer als die vom Programmierer angegebene. Decimal Spalten können eine größere als die angegebene Genauigkeit haben, wenn dies für das Datenbanksystem bequemer oder effizienter ist. Mit anderen Worten: Decimal gibt dir einen gewissen Spielraum. Denke daran, dass Finanzdaten wie Kontostände als Numeric- oder Decimal-Datentypen gespeichert werden müssen. Beachte auch, dass viele führende Datenbankmanagementsysteme herstellerspezifische Darstellungen von numerischen Typen haben (z.B. Oracles Number Datentyp). Diese Implementierungen unterscheiden normalerweise nicht zwischen den Typen Numeric und Decimal. (In Oracle sind beide der Typ Number). Häufige Fehler bei numerischen Typen Wenn du Daten in eine Numeric Spalte einfügst, denke an die Genauigkeitsgrenzen. Wenn du versuchst, eine zu große Zahl einzufügen, bekommst du möglicherweise eine Fehlermeldung. Wir wollen zum Beispiel die folgende Zahl einfügen: INSERT INTO Konto(Kontonummer, Saldo) VALUES(1313,12331411.23); Dies wird einen Fehler verursachen. Und warum? Wir versuchen es noch einmal mit einer ähnlichen Zahl: INSERT INTO Konto(Kontonummer, Saldo) VALUES(1313,123314.1123); Der zweite Versuch funktioniert. Das liegt daran, dass das RDBMS die eingefügte Zahl rundet, indem es alle "zusätzlichen" Ziffern rechts vom Dezimalpunkt verwirft. In diesem Fall wurde "11" beibehalten, aber die "23" danach verworfen. Wenn die erste verworfene Ziffer eine 5 oder höher ist, rundet das RDBMS die Ziffer links davon auf. In unserem Beispiel würde das bedeuten, dass, wenn du einfügst: INSERT INTO Konto(Kontonummer, Saldo) VALUES(1313,123314.1153); ... der Saldo in der Datenbank 123314,12 wäre. Wenn du mehr über Rundungen und allgemeine numerische Funktionen erfahren möchtest, schau dir den SQL für Anfänger Kurs an. Die Integer-Datentypen Ganzzahlige Datentypen enthalten Zahlen, die ganz oder ohne Dezimalpunkt sind. (In der lateinischen Sprache bedeutet integer ganz.) ANSI SQL definiert Smallint, Integer und Bigint als ganzzahlige Datentypen. Der Unterschied zwischen diesen Typen ist die Größe der Zahl, die sie speichern können. Unten sehen wir die Definition der verschiedenen Integer-Datentypen von Microsoft SQL: Datentype Bereich Speicher bigint -2^63 (-9,223,372,036,854,775,808) bis 2^63-1 (9,223,372,036,854,775,807) 8 Bytes int -2^31 (-2,147,483,648) bis 2^31-1 (2,147,483,647) 4 Bytes smallint -2^15 (-32,768) bis 2^15-1 (32,767) 2 Bytes tinyint 0 bis 255 1 Byte Für diese Typen ist die Standardgröße der Spalte wichtig. Wenn du für kleinere Integer-Typen eine kleinere Spaltengröße definierst (wenn du die maximale Größe im Voraus kennst), kannst du deine Tabellen so klein wie möglich halten. Häufige Fehler bei Integer-Typen Integer-Spalten runden Dezimalstellen ab. Um das zu erklären, wollen wir unsere Tabelle ein wenig verändern: CREATE TABLE Konto ( Kontonummer integer, Saldo integer ); Wenn wir diese Anweisung ausführen: INSERT INTO Konto(Kontonummer, Saldo) VALUES(1313,123314.3153); ... werden die eingefügten Werte auf die erste Stelle vor dem Komma gerundet. Nehmen wir an, wir fügen 123314,5 in die Saldo-Spalte ein: INSERT INTO Konto(Kontonummer, Saldo) VALUES(1313,123314.5); Da wir den Wert hinter dem Komma in einen Wert gleich oder größer als 5 geändert haben, erhalten wir 123315. Wenn du ganzzahlige Datentypen in Formeln verwendest, solltest du wissen, dass Rundungen zu Inkonsistenzen in Formeln führen können. Wenn du 123314.3153+123314.3153 addierst: INSERT INTO Konto(Kontonummer, Saldo) VALUES(1313,123314.3153+123314.3153); ... wäre der eingefügte Wert 246629. Wenn man jetzt den addierten Wert (123314.3153) einmal vom Saldo abzieht: SELECT Saldo - 123314.3153 FROM Konto; ... wäre das Ergebnis eine Dezimalzahl: 123314.6847. Das ist eine klare Inkonsistenz. Du kannst sie vermeiden, indem du geeignete Spalten-Datentypen definierst, je nachdem, welche Operationen mit den Spalten durchgeführt werden sollen. Die Float-Datentypen Der numerische Datentyp Float und Float-verwandte SQL-Datentypen enthalten ungefähre numerische Werte. Sie bestehen aus einem Signifikanten (einem vorzeichenbehafteten numerischen Wert) und einem Exponenten (einer vorzeichenbehafteten ganzen Zahl, die die Größe des Signifikanten angibt). Diese Datentypen haben eine Genauigkeit oder eine positive ganze Zahl, die die Anzahl der signifikanten Stellen (Exponent der Basis der Zahl) angibt. Diese Art der Datendarstellung wird gemeinhin als Fließkommadarstellung bezeichnet. Wenn wir 173226,62 in dieser Notation darstellen würden (mit einer Basis von 10), würde es so aussehen. Der Wert eines ungefähren Zahlenwerts ist sein Hochwert multipliziert mit 10 zum Exponenten. Um den numerischen Datentyp Float in SQL wirklich zu verstehen, musst du dich ein bisschen in die Informatik vertiefen. Das kann Spaß machen, aber in diesem Stadium deiner SQL-Reise ist es meiner Meinung nach zu viel des Guten. Erinnere dich einfach daran, dass es drei ANSI-Standard-SQL-Näherungstypen gibt: Float(p), Real, und Doube Precision. Der Unterschied zwischen Float(p) und Real ist, dass Float eine binäre (nicht dezimale) Genauigkeit hat, die gleich oder größer als der definierte Wert ist. Real hat eine vordefinierte Genauigkeit, die auf der implementierten Datenbank basiert. Im normalen Arbeitsleben wird Float nur selten verwendet; Real und Double Precision sind an bestimmte Systemimplementierungen gebunden und die Entwickler neigen dazu, die Arbeit an der Systemimplementierung an die DBAs und Sysadmins zu übergeben. Der Unterschied zwischen Real und Double Precision ist, dass Real Zahlen in 34 Bit und Double Precision in 64 Bit darstellt. Arbeiten mit Näherungstypen Es ist sehr wichtig, sich daran zu erinnern, dass dieser numerische SQL-Datentyp die Präzision für den Bereich opfert, daher der Name Näherung. Bei Berechnungen können ungefähre Typen seltsame Ergebnisse liefern, wie 204.000000056, wo das genaue Ergebnis 204 sein sollte. Wenn du deine Datenbank für eine technische oder wissenschaftliche Anwendung aufbaust, sollten Float-Datentypen in Ordnung sein. Es gibt auch einen Geschwindigkeitsunterschied: Wenn du außergewöhnlich viele komplizierte Berechnungen durchführst (z. B. trigonometrische Funktionen usw.), sollten Fließkommadatentypen viel schneller sein als andere numerische Datentypen. Wenn du hingegen an einer Finanz-, Bank- oder anderen Geschäftsanwendung arbeitest, ist die Dezimaldarstellung besser geeignet. Der Katalog der numerischen Datentypen in SQL ist nicht auf die ganzzahligen und dezimalen Datentypen beschränkt. Sie spiegeln die Notwendigkeit wider, Daten so zu speichern, dass sie sicher, vorhersehbar und benutzbar sind. Wie bei jeder Programmiersprache erinnern sie uns an den Informatikaspekt von Datenbanken und SQL. Um die einzelnen numerischen SQL-Datentypen zu üben und ihre Möglichkeiten, Verwendung, Einschränkungen und häufigen Fehler kennenzulernen, besuche LearnSQL.de und hab Spaß! Tags: Datentypen Numerische Funktionen