• Aucun résultat trouvé

3.8 Violation de contrainte d’unicité

4.1.3 Quelques fonctions générales

4.1.3.0.1 Petite mise au point

Le but de cette partie n’est évidemment pas de référen- cer toutes les fonctions existantes. De même, les fonctions présentées seront décrites avec des exemples, mais nous ne verrons pas les petits cas particuliers, les exceptions, ni les éventuels comportements étranges et imprévisibles. Pour ça, la doc est, et restera, votre meilleur compa- gnon. Le but ici est de vous montrer un certain nombre de fonctions que, selon mon expérience, je juge utile que vous connaissiez. Par conséquent, et on ne le répétera jamais assez, n’hésitez pas à faire un tour sur la documentation officielle de MySQL si vous ne trouvez pas votre bonheur parmi les fonctions citées ici.

4.1.3.1 Informations sur l’environnement actuel

4.1.3.1.1 Version de MySQL

La fonction classique parmi les classiques :VERSION()vous permettra de savoir sous quelle version de MySQL tourne votre serveur.

4.1 Rappels et introduction VERSION()

5.5.16

4.1.3.1.2 Où suis-je ? Qui suis-je ?

Vous avez créé plusieurs utilisateurs différents pour gérer votre base de données, et présentement vous ne savez plus avec lequel vous êtes connectés ? Pas de panique, il existe les fonctionsCURRENT_USER()etUSER(). Ces deux fonctions ne font

pas exactement la même chose. Par conséquent, il n’est pas impossible qu’elles vous renvoient deux résultats différents.

— CURRENT_USER(): renvoie l’utilisateur (et l’hôte) qui a été utilisé lors de l’identification

au serveur ;

— USER(): renvoie l’utilisateur (et l’hôte) qui a été spécifié lors de l’identification au serveur.

Mais comment cela pourrait-il être différent ? Tout simplement, parce que si vous vous connectez avec un utilisateur qui n’a aucun droit (droits que l’on donne avec la commandeGRANT, mais nous verrons ça dans une prochaine partie), vous arriverez à vous connecter, mais le serveur vous iden- tifiera avec un “utilisateur anonyme”.USER()vous renverra alors votre utilisateur sans droit,

tandis queCURRENT_USER()vous donnera l’utilisateur anonyme.

Dans notre cas, l’utilisateur “sdz” (ou n’importe quel user que vous avez créé) ayant des droits, les deux fonctions renverront exactement la même chose.

SELECT CURRENT_USER(), USER();

CURRENT_USER() USER()

sdz@localhost sdz@localhost

4.1.3.2 Informations sur la dernière requête

4.1.3.2.1 Dernier ID généré par auto-incrémentation

Dans une base de données rela- tionnelle, il arrive très souvent que vous deviez insérer plusieurs lignes en une fois dans la base de données, et que certaines de ces nouvelles lignes doivent contenir une référence à d’autres nouvelles lignes. Par exemple, vous voulez ajouter Pipo le rottweiller dans votre base. Pour ce faire, vous devez insérer une nouvelle race (rottweiller), et un nouvel animal (Pipo) pour lequel vous avez besoin de l’idde la nouvelle race. Plutôt que de faire unSELECTsur la tableRaceune

fois la nouvelle race insérée, il est possible d’utiliserLAST_INSERT_ID(). Cette fonction ren- voie le dernieridcréé par auto-incrémentation, pour la connexion utilisée (donc si quelqu’un se connecte au même serveur, avec un autre client, il n’influera pas sur leLAST_INSERT_ID()que

vous recevez).

INSERT INTO Race (nom, espece_id, description, prix)

VALUES ('Rottweiller', 1, 'Chien d''apparence solide, bien musclé, à la robe noire avec des taches feu bien délimitées.', 600.00);

INSERT INTO Animal (sexe, date_naissance, nom, espece_id, race_id)

VALUES ('M', '2010-11-05', 'Pipo', 1, LAST_INSERT_ID()); -- LAST_INSERT_ID() renverra ici l'id de la race Rottweiller

4.1.3.2.2 Nombre de lignes renvoyées par la requête

La fonctionFOUND_ROWS()vous

SELECT id, nom, espece_id, prix

FROM Race;

SELECT FOUND_ROWS();

id nom espece_id prix

1 Berger allemand 1 485.00

2 Berger blanc suisse 1 935.00

3 Singapura 2 985.00 4 Bleu russe 2 835.00 5 Maine coon 2 735.00 7 Sphynx 2 1235.00 8 Nebelung 2 985.00 9 Rottweiller 1 600.00 FOUND_ROWS() 8

Jusque-là, rien de bien extraordinaire. Cependant, utilisée avecLIMIT,FOUND_ROWS()peut avoir

un comportement très intéressant. En effet, moyennant l’ajout d’une option dans la requête

SELECTd’origine,FOUND_ROWS()nous donnera le nombre de lignes que la requête aurait rame- nées en l’absence deLIMIT. L’option à ajouter dans leSELECTestSQL_CALC_FOUND_ROWS, et se

place juste après le mot-cléSELECT.

SELECT id, nom, espece_id, prix -- Sans option

FROM Race

LIMIT 3;

SELECT FOUND_ROWS() AS sans_option;

SELECT SQL_CALC_FOUND_ROWS id, nom, espece_id, prix -- Avec option

FROM Race

LIMIT 3;

SELECT FOUND_ROWS() AS avec_option;

sans_option 3

avec_option 8

4.1 Rappels et introduction

4.1.3.3 Convertir le type de données

Dans certaines situations, vous allez vouloir convertir le type de votre donnée (une chaîne de caractères'45'en entier45par exemple). Il faut savoir que dans la majorité de ces situations, MySQL est assez souple et permissif pour faire la conversion lui-même, automatiquement, et sans que vous ne vous en rendiez vraiment compte (attention, ce n’est pas le cas de la plupart des SGBDR).

Exemple : conversions automatiques

SELECT *

FROM Espece

WHERE id = '3';

INSERT INTO Espece (nom_latin, nom_courant, description, prix)

VALUES ('Rattus norvegicus', 'Rat brun', 'Petite bestiole avec de longues moustaches et une longue queue sans poils', '10.00');

La colonneidest de typeINT, pourtant la comparaison avec une chaîne de caractères renvoie bien un résultat. De même, la colonneprixest de typeDECIMAL, mais l’insertion d’une valeur sous forme de chaîne de caractères n’a posé aucun problème. MySQL a converti automatiquement. Dans les cas où la conversion automatique n’est pas possible, vous pouvez utiliser la fonction

CAST(expr AS type).exprreprésente la donnée que vous voulez convertir, ettypeest bien sûr le type vers lequel vous voulez convertir votre donnée.

Ce type peut être :BINARY,CHAR,DATE,DATETIME,TIME,UNSIGNED(sous-entenduINT),SIGNED

(sous-entenduINT),DECIMAL.

Exemple : conversion d’une chaîne de caractère en date

SELECT CAST('870303' AS DATE);

CAST(‘870303’ AS DATE) 1987-03-03

*SGBDR: Système de Gestion de Base de Données Relationnelles

4.1.3.4 En résumé

— MySQL permet de faire de nombreuses opérations mathématiques, que ce soit directement sur des valeurs entrées par l’utilisateur, ou sur des données de la base.

— MySQL permet l’utilisation des opérateurs mathématiques et des fonctions dans tous les types de requêtes (insertion, sélection, modification, etc.).

— Une fonction est un code qui effectue une série d’instructions bien définie et renvoie un résultat.

— Les paramètres d’une fonction sont des valeurs ou des données fournies à la fonction lors de son appel.

— Une fonction scalaire, appliquée à une colonne de données agit sur chaque ligne indépen- damment.

— Une fonction d’agrégation regroupe les différentes lignes.