Retour à la liste des articles Articles
11 minutes de lecture

Comprendre les types de données numériques en SQL

Travailler avec des bases de données, quelles qu'elles soient, signifie travailler avec des données. Ces données peuvent prendre plusieurs formats prédéfinis. Au fur et à mesure de votre apprentissage sur LearnSQL.fr, vous commencerez à comprendre les différents types de données SQL. Dans cet article, nous aborderons les différentes variations du type de données numériques SQL. Nous examinerons également certaines fonctions qui convertissent les données d'un type à l'autre.

La création de tables est la première étape de tout projet de codage SQL. Pour ce faire, vous utilisez des instructions DDL (Data Definition Language), telles que CREATE et DROP, que vous pouvez découvrir dans notre rubrique " Le langage de définition des données ". Cours de création de tables en SQL. Une fois que vous avez configuré votre table, vous commencez à énumérer les noms de colonnes et les types de données en SQL. Les types de données indiquent à votre base de données les informations à attendre pour cette colonne.

Disons que vous avez une table " utilisateurs ". Chaque utilisateur a des informations dans une colonne de nom et une colonne de numéro de téléphone. Les noms seraient stockés dans une colonne de caractères. Un numéro de téléphone serait dans une colonne numérique. Donc, les colonnes numériques stockent des nombres et tous les nombres sont les mêmes, non ? Détrompez-vous.

Il existe différents types de nombres, et différents types de colonnes numériques. Toute personne ayant des connaissances en statistiques sait qu'il existe quatre échelles différentes qui s'appliquent aux nombres : nominale, ordinale, intervalle et rapport. Contrairement aux autres types de données, les types numériques peuvent représenter toutes ces échelles (c'est pourquoi, plutôt que de parler de type de données numériques SQL, nous parlons de types). Mais comment ces échelles se différencient-elles les unes des autres ?

  • Les valeurs nominales se différencient uniquement par le " nom ". Les valeurs nominales ne sont pas traitées comme des nombres ; vous ne pouvez pas les ajouter ou les soustraire, et elles n'ont pas d'ordre inhérent. Par exemple, les numéros d'identification des étudiants et les numéros de téléphone sont des valeurs nominales. Elles fonctionnent davantage comme une étiquette que comme un numéro. Nous pouvons dire que nos numéros de téléphone sont égaux (même importance, même longueur) mais nous ne pouvons pas les comparer ou dire que l'un d'eux est le premier. Nous ne pouvons pas les additionner et obtenir un numéro de téléphone significatif.
  • Les valeurs ordinales fournissent un ordre ou un rang. Dans les valeurs ordinales, c'est l'ordre entre elles qui est significatif. Supposons que vous ayez une échelle de 1 à 3 pour évaluer votre humeur. Si vous vous sentez malheureux, vous obtenez la valeur " 1 " ; si vous êtes satisfait, vous obtenez la valeur " 2 ", et si vous êtes heureux, vous obtenez la valeur " 3 ". Vous savez qu'heureux a un rang plus élevé que content ou malheureux, mais c'est à peu près tout. Vous ne pouvez pas additionner " content " et " malheureux " et obtenir " heureux ".
  • Les valeurs d'intervalle montrent les différences exactes. Dans une échelle d'intervalles, ce sont les différences entre les valeurs qui sont importantes. Si vous soustrayez 90 degrés centigrades de 100 degrés centigrades, vous obtenez une différence de 10 degrés. Les années, les dates et la plupart des mesures de la personnalité sont des mesures d'intervalle. Les valeurs d'intervalle sont numériques et sont représentées sous forme numérique dans la base de données.
  • Les valeurs de rapport sont des intervalles avec une valeur zéro définie. Comme une échelle d'intervalles, un rapport présente des différences mesurables entre les valeurs. Dans une échelle de rapport, cependant, une valeur zéro signifie qu'il n'y a rien à mesurer. Par exemple, pensez à la masse, à la longueur et à la durée. Si l'une de ces valeurs est nulle, il n'y a rien à mesurer. Les échelles de rapport sont très importantes en science.

Chaque type de données numériques SQL est utilisé pour représenter toutes les valeurs ci-dessus, en particulier les intervalles et les ratios. Vous pouvez comparer des valeurs de caractères en SQL, on pourrait donc dire que les valeurs de caractères peuvent également représenter des données d'intervalle. Cependant, c'est un sujet pour un autre article.

En SQL, les nombres sont définis comme étant soit exacts, soit approximatifs.

Les types de données numériques exacts sont SMALLINT, INTEGER, BIGINT, NUMERIC(p,s) et DECIMAL(p,s). Le type de données numériques SQL exact signifie que la valeur est stockée comme une représentation littérale de la valeur du nombre.

Les types de données numériques approximatifs sont FLOAT(p), REAL et DOUBLE PRECISION. Ils représentent des nombres réels, mais ils ne sont pas représentés comme des nombres exacts dans la base de données. Il s'agit plutôt d'une approximation du nombre réel en raison de la manière dont les systèmes informatiques représentent les nombres. Si cela vous semble confus, soyez assuré que nous l'expliquerons en détail plus tard.

Commençons notre étude des types numériques SQL par les types de données exacts ou numériques.

Type de données numériques SQL

Les types de données numériques exacts de SQL se composent des sous-types NUMERIC(p,s) et DECIMAL(p,s). Ils sont exacts, et nous les définissons par la précision (p) et l'échelle (s). La précision est un nombre entier qui représente le nombre total de chiffres autorisés dans cette colonne. Ces chiffres sont dans une base arithmétique particulière, ou base numérique - c'est-à-dire binaire (base 2) ou décimale (base 10). Ils sont généralement définis par un point décimal. L'échelle, qui est également une valeur entière, représente le nombre de décimales à droite (si elle est positive) ou à gauche (si elle est négative ; ceci est rarement utilisé) du point décimal.

Prenons un exemple. Supposons que vous ayez défini une colonne " solde " comme NUMERIC avec une précision de 8 et une échelle de 2.

La DDL ressemblerait à ceci :

CREATE TABLE compte (
  numero_de_compte integer,
  solde numeric(8,2)
);

La colonne " solde " peut stocker en toute sécurité le nombre 173226.62.

Types de données numériques, décimales en SQL

P représente le nombre total de tous les chiffres et s représente les deux chiffres après la décimale.

Il existe une petite différence entre le type de données numériques SQL NUMERIC(p,s) et DECIMAL(p,s). NUMERIC détermine la précision et l'échelle exactes. DECIMAL ne spécifie que l'échelle exacte ; la précision est égale ou supérieure à ce qui est spécifié par le codeur. Les colonnes DECIMAL peuvent avoir une précision supérieure à celle spécifiée si cela est plus pratique ou efficace pour le système de bases de données.

En d'autres termes, DECIMAL vous donne une certaine marge de manœuvre.

N'oubliez pas que les données financières, telles que les soldes de comptes, doivent être stockées sous forme de données de type NUMÉRIQUE ou DÉCIMAL.

Sachez également que de nombreux systèmes de gestion de base de données de premier plan ont des représentations de types numériques propres à chaque fournisseur (par exemple, le type de données NUMBER d'Oracle). Ces implémentations ne font généralement pas la différence entre les types NUMERIC et DECIMAL. (Dans Oracle, les deux sont le type NUMBER ).

Erreurs courantes concernant les types de données numériques

Lorsque vous insérez des données dans une colonne NUMERIC, n'oubliez pas ses limites de précision. Si vous essayez d'insérer un nombre trop grand, vous risquez d'obtenir une erreur. Par exemple, nous voulons insérer ce qui suit :

INSERT INTO compte(numero_de_compte, solde) VALUES(1313,12331411.23);

Cela produira une erreur. Pourquoi ? Nous réessayons avec un nombre similaire :

INSERT INTO compte(numero_de_compte, solde) VALUES(1313,123314.1123);

La deuxième tentative fonctionne. C'est parce que le SGBDR arrondit le nombre inséré en éliminant les chiffres en excès à droite de la virgule. Dans ce cas, il a gardé " .11 " mais a écarté " 23 " qui suit. Notez que si le premier chiffre écarté est un 5 ou plus, le SGBDR arrondit le chiffre le plus à gauche.

Dans notre exemple, cela signifierait que si vous insérez :

INSERT INTO compte(numero_de_compte, solde) VALUES(1313,123314.1153);

...le solde dans la base de données serait de 123314.12.

Pour en savoir plus sur les arrondis et les fonctions numériques courantes, consultez le cours SQL pour les débutants.

Les types de données entiers

Les types de données entiers contiennent des nombres entiers ou sans point décimal. (En latin, integer signifie entier.) ANSI SQL définit SMALLINT, INTEGER et BIGINT comme des types de données entiers. La différence entre ces types est la taille du nombre qu'ils peuvent stocker.

Ci-dessous, nous pouvons voir la définition de Microsoft SQL de divers types de données entières :

Type de données Gamme Espace de stockage
bigint -2^63 (-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807) 8 Bytes
int -2^31 (-2,147,483,648) to 2^31-1 (2,147,483,647) 4 Bytes
smallint -2^15 (-32,768) to 2^15-1 (32,767) 2 Bytes
tinyint 0 to 255 1 Byte

Pour ces types, la taille par défaut de la colonne est importante. Définir une taille de colonne plus petite pour les types d'entiers plus petits (si vous connaissez la taille maximale à l'avance) peut aider à garder vos tables aussi petites que possible.

Erreurs courantes concernant les types de nombres entiers

Les colonnes INTEGER arrondissent les points décimaux. Pour expliquer, modifions un peu notre table :

CREATE TABLE compte (
  numero_de_compte integer,
  solde integer
);

Si nous exécutons cette instruction :

INSERT INTO compte(numero_de_compte, solde) VALUES (1313, 123314.3153);

... les valeurs insérées sont arrondies au premier chiffre avant la virgule. Supposons que nous insérions 123314.5 dans la colonne du solde :

INSERT INTO compte(numero_de_compte, solde) VALUES (1313, 123314.5);

Comme nous avons changé la valeur derrière la virgule pour une valeur égale ou supérieure à 5, nous obtiendrons 123315.

Si vous utilisez des types de données entiers dans les formules, sachez que les arrondis peuvent provoquer des incohérences dans les formules. Si vous soustrayez 123314.3153+123314.3153 :

INSERT INTO compte(numero_de_compte, solde) VALUES (1313, 123314.3153 + 123314.3153);

... la valeur insérée serait 123314. Si vous soustrayez du solde les mêmes valeurs que nous avons ajoutées précédemment :

SELECT solde - 123314.3153
FROM compte; 

... le résultat, maintenant un nombre décimal, serait 123314.3147. Il s'agit là d'une incohérence manifeste. Vous pouvez l'éviter en définissant des types de données de colonne appropriés en fonction des opérations qui seront effectuées sur les colonnes.

Les types de données flottantes

Les types de données numériques SQL flottants et liés aux flottants contiennent des valeurs numériques approximatives. Ils se composent d'un significatif (une valeur numérique signée) et d'un exposant (un nombre entier signé qui spécifie la magnitude du significatif). Ces types de données ont une précision, ou un nombre entier positif qui définit le nombre de chiffres significatifs (exposant de la base du nombre).

Ce type de représentation des données est communément appelé représentation en virgule flottante.

Si nous devions représenter 173226,62 dans cette notation (avec une base de 10), cela ressemblerait à ceci.

Type de données décimales en sql

La valeur d'une valeur numérique approximative est sa valeur significative multipliée par 10 à l'exposant.

Pour vraiment comprendre le type de données numériques SQL à virgule flottante, vous devrez vous plonger dans un peu d'informatique. Cela peut être amusant, mais à ce stade de votre parcours SQL, je pense que c'est un peu exagéré. Pour l'instant, souvenez-vous simplement qu'il existe trois types approximatifs SQL standard ANSI : FLOAT(p), REAL, et DOUBLE PRECISION.

La différence entre FLOAT(p) et REAL est que FLOAT a une précision binaire (et non décimale) égale ou supérieure à la valeur définie. REAL a une précision prédéfinie basée sur la base de données mise en œuvre. Dans la vie professionnelle normale, FLOAT est rarement utilisé ; REAL et DOUBLE PRECISION sont liés à des implémentations système particulières et les développeurs ont tendance à confier le travail d'implémentation système aux DBA et aux Sysadmins.

La différence entre REAL et DOUBLE PRECISION est que REAL représente les nombres sur 34 bits et DOUBLE PRECISION sur 64 bits.

Travailler avec des types approximatifs

Il est très important de se rappeler que ce type de données numériques SQL sacrifie la précision au profit de l'étendue, d'où le nom d'approximatif.

Dans les calculs, les types approximatifs peuvent donner des résultats bizarres, comme 204.000000056 alors que le résultat exact devrait être 204. Si vous construisez votre base de données pour une application technique ou scientifique, les types de données flottants devraient convenir. Il y a aussi la différence de vitesse ; si vous effectuez un nombre exceptionnellement élevé de calculs compliqués (par exemple, des fonctions trigonométriques, etc.), les types flottants doivent être beaucoup plus rapides que les autres types de données numériques. En revanche, si vous travaillez sur une application financière, bancaire ou autre, l'utilisation de la représentation décimale est plus appropriée.

Le catalogue des types de données numériques SQL ne se limite pas à ceux liés aux nombres entiers et décimaux. Ils reflètent la nécessité de stocker les données d'une manière sûre, prévisible et utilisable. Comme dans tout langage de programmation, ils nous rappellent l'aspect informatique des bases de données et de SQL.

Pour vous entraîner à utiliser chaque type de données numériques SQL et vous familiariser avec leurs possibilités, leur utilisation, leurs contraintes et les erreurs les plus courantes, rendez-vous à l'adresse suivante LearnSQL.fr et amusez-vous bien !