Rappels et introduction

Pour commencer en douceur, voici un chapitre d'introduction. On commence avec quelques rappels et astuces. Ensuite, on entre dans le vif du sujet avec la définition d'une fonction, et la différence entre une fonction scalaire et une fonction d’agrégation. Et pour finir, nous verrons quelques fonctions permettant d'obtenir des renseignements sur votre environnement, sur la dernière requête effectuée, et permettant de convertir des valeurs.

Que du bonheur, que du facile, que du super utile !

Etat actuel de la base de données

Note : les tables de test ne sont pas reprises

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
SET NAMES utf8;

DROP TABLE IF EXISTS Animal;
DROP TABLE IF EXISTS Race;
DROP TABLE IF EXISTS Espece;


CREATE TABLE Espece (
  id smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  nom_courant varchar(40) NOT NULL,
  nom_latin varchar(40) NOT NULL,
  description text,
  PRIMARY KEY (id),
  UNIQUE KEY nom_latin (nom_latin)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

LOCK TABLES Espece WRITE;
INSERT INTO Espece VALUES (1,'Chien','Canis canis','Bestiole à quatre pattes qui aime les caresses et tire souvent la langue'),(2,'Chat','Felis silvestris','Bestiole à quatre pattes qui saute très haut et grimpe aux arbres'),(3,'Tortue d''Hermann','Testudo hermanni','Bestiole avec une carapace très dure'),
(4,'Perroquet amazone','Alipiopsitta xanthops','Joli oiseau parleur vert et jaune');
UNLOCK TABLES;


CREATE TABLE Race (
  id smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  nom varchar(40) NOT NULL,
  espece_id smallint(6) unsigned NOT NULL,
  description text,
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;

LOCK TABLES Race WRITE;
INSERT INTO Race VALUES (1,'Berger allemand',1,'Chien sportif et élégant au pelage dense, noir-marron-fauve, noir ou gris.'),(2,'Berger blanc suisse',1,'Petit chien au corps compact, avec des pattes courtes mais bien proportionnées et au pelage tricolore ou bicolore.'),
(3,'Singapura',2,'Chat de petite taille aux grands yeux en amandes.'),(4,'Bleu russe',2,'Chat aux yeux verts et à la robe épaisse et argentée.'),(5,'Maine coon',2,'Chat de grande taille, à poils mi-longs.'),
(7,'Sphynx',2,'Chat sans poils.'),(8,'Nebelung',2,'Chat bleu russe, mais avec des poils longs...');
UNLOCK TABLES;


CREATE TABLE Animal (
  id smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  sexe char(1) DEFAULT NULL,
  date_naissance datetime NOT NULL,
  nom varchar(30) DEFAULT NULL,
  commentaires text,
  espece_id smallint(6) unsigned NOT NULL,
  race_id smallint(6) unsigned DEFAULT NULL,
  mere_id smallint(6) unsigned DEFAULT NULL,
  pere_id smallint(6) unsigned DEFAULT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY ind_uni_nom_espece_id (nom,espece_id)
) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=utf8;

LOCK TABLES Animal WRITE;
INSERT INTO Animal VALUES (1,'M','2010-04-05 13:43:00','Rox','Mordille beaucoup',1,1,18,22),
(2,NULL,'2010-03-24 02:23:00','Roucky',NULL,2,NULL,40,30),(3,'F','2010-09-13 15:02:00','Schtroumpfette',NULL,2,4,41,31),(4,'F','2009-08-03 05:12:00',NULL,'Bestiole avec une carapace très dure',3,NULL,NULL,NULL),
(5,NULL,'2010-10-03 16:44:00','Choupi','Né sans oreille gauche',2,NULL,NULL,NULL),(6,'F','2009-06-13 08:17:00','Bobosse','Carapace bizarre',3,NULL,NULL,NULL),(7,'F','2008-12-06 05:18:00','Caroline',NULL,1,2,NULL,NULL),
(8,'M','2008-09-11 15:38:00','Bagherra',NULL,2,5,NULL,NULL),(9,NULL,'2010-08-23 05:18:00',NULL,'Bestiole avec une carapace très dure',3,NULL,NULL,NULL),(10,'M','2010-07-21 15:41:00','Bobo',NULL,1,NULL,7,21),
(11,'F','2008-02-20 15:45:00','Canaille',NULL,1,NULL,NULL,NULL),(12,'F','2009-05-26 08:54:00','Cali',NULL,1,2,NULL,NULL),(13,'F','2007-04-24 12:54:00','Rouquine',NULL,1,1,NULL,NULL),
(14,'F','2009-05-26 08:56:00','Fila',NULL,1,2,NULL,NULL),(15,'F','2008-02-20 15:47:00','Anya',NULL,1,NULL,NULL,NULL),(16,'F','2009-05-26 08:50:00','Louya',NULL,1,NULL,NULL,NULL),
(17,'F','2008-03-10 13:45:00','Welva',NULL,1,NULL,NULL,NULL),(18,'F','2007-04-24 12:59:00','Zira',NULL,1,1,NULL,NULL),(19,'F','2009-05-26 09:02:00','Java',NULL,1,2,NULL,NULL),
(20,'M','2007-04-24 12:45:00','Balou',NULL,1,1,NULL,NULL),(21,'F','2008-03-10 13:43:00','Pataude',NULL,1,NULL,NULL,NULL),(22,'M','2007-04-24 12:42:00','Bouli',NULL,1,1,NULL,NULL),
(24,'M','2007-04-12 05:23:00','Cartouche',NULL,1,NULL,NULL,NULL),(25,'M','2006-05-14 15:50:00','Zambo',NULL,1,1,NULL,NULL),(26,'M','2006-05-14 15:48:00','Samba',NULL,1,1,NULL,NULL),
(27,'M','2008-03-10 13:40:00','Moka',NULL,1,NULL,NULL,NULL),(28,'M','2006-05-14 15:40:00','Pilou',NULL,1,1,NULL,NULL),(29,'M','2009-05-14 06:30:00','Fiero',NULL,2,3,NULL,NULL),
(30,'M','2007-03-12 12:05:00','Zonko',NULL,2,5,NULL,NULL),(31,'M','2008-02-20 15:45:00','Filou',NULL,2,4,NULL,NULL),(32,'M','2009-07-26 11:52:00','Spoutnik',NULL,3,NULL,52,NULL),
(33,'M','2006-05-19 16:17:00','Caribou',NULL,2,4,NULL,NULL),(34,'M','2008-04-20 03:22:00','Capou',NULL,2,5,NULL,NULL),(35,'M','2006-05-19 16:56:00','Raccou','Pas de queue depuis la naissance',2,4,NULL,NULL),
(36,'M','2009-05-14 06:42:00','Boucan',NULL,2,3,NULL,NULL),(37,'F','2006-05-19 16:06:00','Callune',NULL,2,8,NULL,NULL),(38,'F','2009-05-14 06:45:00','Boule',NULL,2,3,NULL,NULL),
(39,'F','2008-04-20 03:26:00','Zara',NULL,2,5,NULL,NULL),(40,'F','2007-03-12 12:00:00','Milla',NULL,2,5,NULL,NULL),(41,'F','2006-05-19 15:59:00','Feta',NULL,2,4,NULL,NULL),
(42,'F','2008-04-20 03:20:00','Bilba','Sourde de l''oreille droite à 80%',2,5,NULL,NULL),(43,'F','2007-03-12 11:54:00','Cracotte',NULL,2,5,NULL,NULL),(44,'F','2006-05-19 16:16:00','Cawette',NULL,2,8,NULL,NULL),
(45,'F','2007-04-01 18:17:00','Nikki','Bestiole avec une carapace très dure',3,NULL,NULL,NULL),(46,'F','2009-03-24 08:23:00','Tortilla','Bestiole avec une carapace très dure',3,NULL,NULL,NULL),(47,'F','2009-03-26 01:24:00','Scroupy','Bestiole avec une carapace très dure',3,NULL,NULL,NULL),
(48,'F','2006-03-15 14:56:00','Lulla','Bestiole avec une carapace très dure',3,NULL,NULL,NULL),(49,'F','2008-03-15 12:02:00','Dana','Bestiole avec une carapace très dure',3,NULL,NULL,NULL),(50,'F','2009-05-25 19:57:00','Cheli','Bestiole avec une carapace très dure',3,NULL,NULL,NULL),
(51,'F','2007-04-01 03:54:00','Chicaca','Bestiole avec une carapace très dure',3,NULL,NULL,NULL),(52,'F','2006-03-15 14:26:00','Redbul','Insomniaque',3,NULL,NULL,NULL),(54,'M','2008-03-16 08:20:00','Bubulle','Bestiole avec une carapace très dure',3,NULL,NULL,NULL),
(55,'M','2008-03-15 18:45:00','Relou','Surpoids',3,NULL,NULL,NULL),(56,'M','2009-05-25 18:54:00','Bulbizard','Bestiole avec une carapace très dure',3,NULL,NULL,NULL),(57,'M','2007-03-04 19:36:00','Safran','Coco veut un gâteau !',4,NULL,NULL,NULL),
(58,'M','2008-02-20 02:50:00','Gingko','Coco veut un gâteau !',4,NULL,NULL,NULL),(59,'M','2009-03-26 08:28:00','Bavard','Coco veut un gâteau !',4,NULL,NULL,NULL),(60,'F','2009-03-26 07:55:00','Parlotte','Coco veut un gâteau !',4,NULL,NULL,NULL),
(61,'M','2010-11-09 00:00:00','Yoda',NULL,2,5,NULL,NULL);
UNLOCK TABLES;


ALTER TABLE Race ADD CONSTRAINT fk_race_espece_id FOREIGN KEY (espece_id) REFERENCES Espece (id) ON DELETE CASCADE;

ALTER TABLE Animal ADD CONSTRAINT fk_pere_id FOREIGN KEY (pere_id) REFERENCES Animal (id) ON DELETE SET NULL;
ALTER TABLE Animal ADD CONSTRAINT fk_espece_id FOREIGN KEY (espece_id) REFERENCES Espece (id);
ALTER TABLE Animal ADD CONSTRAINT fk_mere_id FOREIGN KEY (mere_id) REFERENCES Animal (id) ON DELETE SET NULL;
ALTER TABLE Animal ADD CONSTRAINT fk_race_id FOREIGN KEY (race_id) REFERENCES Race (id) ON DELETE SET NULL;

Rappels et manipulation simple de nombres

Rappels

Nous avons vu qu'il était possible d'afficher des nombres ou des chaînes de caractères avec un simple SELECT :

Exemple : affichage simple de nombres et de chaînes de caractères.

1
SELECT 3, 'Bonjour !';

3

Bonjour !

3

Bonjour !

Vous savez également qu'il est possible de faire diverses opérations mathématiques de la même manière, et que la priorité des opérations est respectée :

Exemple : quelques opérations mathématiques.

1
SELECT 3+5, 8/3, 10+2/2, (10+2)/2;

3+5

8/3

10+2/2

(10+2)/2

8

2.6667

11.0000

6.0000

Opérateurs mathématiques

Six opérateurs mathématiques sont utilisables avec MySQL.

Symbole

Opération

+

addition

-

soustraction

*

multiplication

/

division

DIV

division entière

% (ou MOD)

modulo

Pour ceux qui ne le sauraient pas, le modulo de a par b est le reste de la division entière de a par b (par exemple, le modulo de 13 par 10 vaut 3).

Exemple : les six opérateurs mathématiques.

1
SELECT 1+1, 4-2, 3*6, 5/2, 5 DIV 2, 5 % 2, 5 MOD 2;

1+1

4-2

3*6

5/2

5 DIV 2

5 % 2

5 MOD 2

2

2

18

2.5000

2

1

1

Combiner les données avec des opérations mathématiques

Jusqu'ici, rien de plus simple. Cependant, si l'on veut juste faire 3+6, pas besoin de MySQL, une calculette (ou un cerveau) suffit. Après tout, dans une base de données, l'important, ce sont les données. Et, il est évidemment possible de faire des opérations mathématiques (et bien d'autres choses) sur les données.

Modification de notre base de données

Mais avant de rentrer dans le vif du sujet, je vais vous demander d'ajouter quelque chose à notre base de données. En effet, pour l'instant nous n'avons pas de données numériques, si ce n'est les différents id. Or, il n'est pas très intéressant (et ça peut même être dangereux) de manipuler les id. Par conséquent, nous allons ajouter une colonne prix à nos tables Espece et Race, qui contiendra donc le prix à payer pour adopter un animal de telle espèce ou telle race. Cette colonne sera du type DECIMAL, avec deux chiffres après la virgule. Elle ne pourra pas contenir de nombres négatifs, et sera donc également UNSIGNED.

Voici donc les commandes à exécuter :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
ALTER TABLE Race 
ADD COLUMN prix DECIMAL(7,2) UNSIGNED;

ALTER TABLE Espece 
ADD COLUMN prix DECIMAL(7,2) UNSIGNED;

-- Remplissage des colonnes "prix"
UPDATE Espece SET prix = 200 WHERE id = 1;
UPDATE Espece SET prix = 150 WHERE id = 2;
UPDATE Espece SET prix = 140 WHERE id = 3;
UPDATE Espece SET prix = 700 WHERE id = 4;
UPDATE Espece SET prix = 10 WHERE id = 5;
UPDATE Espece SET prix = 75 WHERE id = 6;

UPDATE Race SET prix = 450 WHERE id = 1;
UPDATE Race SET prix = 900 WHERE id = 2;
UPDATE Race SET prix = 950 WHERE id = 3;
UPDATE Race SET prix = 800 WHERE id = 4;
UPDATE Race SET prix = 700 WHERE id = 5;
UPDATE Race SET prix = 1200 WHERE id = 7;
UPDATE Race SET prix = 950 WHERE id = 8;
UPDATE Race SET prix = 600 WHERE id = 9;

Le prix de la race sera prioritaire sur le prix de l'espèce. Donc pour un Berger allemand, on ira chercher le prix dans la table Race, tandis que pour un bâtard ou une tortue d'Hermann, on prendra le prix de la table Espece.

Opérations sur données sélectionnées

Exemple 1 : Imaginons que nous voulions savoir le prix à payer pour acheter 3 individus de la même espèce (sans considérer la race). Facile, il suffit de multiplier le prix de chaque espèce par 3.

1
2
SELECT nom_courant, prix*3 AS prix_trio
FROM Espece;

nom_courant

prix_trio

Chien

600.00

Chat

450.00

Tortue d'Hermann

420.00

Perroquet amazone

2100.00

Exemple 2 : toutes les opérations courantes peuvent bien entendu être utilisées.

1
2
3
4
SELECT nom_courant, prix, 
       prix+100 AS addition, prix/2 AS division,
       prix-50.5 AS soustraction, prix%3 AS modulo
FROM Espece;

nom_courant

prix

addition

division

soustraction

modulo

Chien

200.00

300.00

100.000000

149.50

2.00

Chat

150.00

250.00

75.000000

99.50

0.00

Tortue d'Hermann

140.00

240.00

70.000000

89.50

2.00

Perroquet amazone

700.00

800.00

350.000000

649.50

1.00

Modification de données grâce à des opérations mathématiques

Il est tout à fait possible, et souvent fort utile, de modifier des données grâce à des opérations.

Exemple : la commande suivante va augmenter le prix de toutes les races de 35 :

1
2
UPDATE Race 
SET prix = prix + 35;

C'est quand même plus élégant que de devoir faire une requête SELECT pour savoir le prix actuel des races, calculer ces prix +35, puis faire un UPDATE pour chaque race avec le résultat.

Bien entendu, on peut faire ce genre de manipulation également dans une requête de type INSERT INTO ... SELECT par exemple. En fait, on peut faire ce genre de manipulation partout.

Définition d'une fonction

Nous avons déjà utilisé quelques fonctions dans ce cours. Par exemple, dans le chapitre sur les sous-requêtes, je vous proposais la requête suivante :

1
2
3
4
5
6
7
8
SELECT MIN(date_naissance)     -- On utilise ici une fonction !
FROM (
    SELECT Animal.id, Animal.sexe, Animal.date_naissance, Animal.nom, Animal.espece_id
    FROM Animal
    INNER JOIN Espece
        ON Espece.id = Animal.espece_id
    WHERE Espece.nom_courant IN ('Tortue d''Hermann', 'Perroquet amazone')
) AS tortues_perroquets;

Lorsque l'on fait MIN(date_naissance), on appelle la fonction MIN(), en lui donnant en paramètre la colonne date_naissance (ou plus précisément, les lignes de la colonne date_naissance sélectionnées par la requête).

Détaillons un peu tout ça !

Une fonction

Une fonction est un code qui effectue une série d'instructions bien précises (dans le cas de MIN(), ces instructions visent donc à chercher la valeur minimale), et renvoie le résultat de ces instructions (la valeur minimale en question). Une fonction est définie par son nom (exemple : MIN) et ses paramètres.

Un paramètre

Un paramètre de fonction est une donnée (ou un ensemble de données) que l'on fournit à la fonction afin qu'elle puisse effectuer son action. Par exemple, pour MIN(), il faut passer un paramètre : les données parmi lesquelles on souhaite récupérer la valeur minimale. Une fonction peut avoir un ou plusieurs paramètres, ou n'en avoir aucun. Dans le cas d'une fonction ayant plusieurs paramètres, l'ordre dans lequel on donne ces paramètres est très important.

On parle aussi des arguments d'une fonction.

Appeler une fonction

Lorsque l'on utilise une fonction, on dit qu'on fait appel à celle-ci. Pour appeler une fonction, il suffit donc de donner son nom, suivi des paramètres éventuels entre parenthèses (lesquelles sont obligatoires, même s'il n'y a aucun paramètre).

Exemples

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
-- Fonction sans paramètre
SELECT PI();    -- renvoie le nombre Pi, avec 5 décimales

-- Fonction avec un paramètre
SELECT MIN(prix) AS minimum  -- il est bien sûr possible d'utiliser les alias !
FROM Espece;

-- Fonction avec plusieurs paramètres
SELECT REPEAT('fort ! Trop ', 4);  -- répète une chaîne (ici : 'fort ! Trop ', répété 4 fois)

-- Même chose qu'au-dessus, mais avec les paramètres dans le mauvais ordre
SELECT REPEAT(4, 'fort ! Trop '); -- la chaîne de caractères 'fort ! Trop ' va être convertie en entier par MySQL, ce qui donne 0. "4" va donc être répété zéro fois...

PI()

3.141593

minimum

140.00

REPEAT('fort ! Trop ', 4)

fort ! Trop fort ! Trop fort ! Trop fort ! Trop

REPEAT(4, 'fort ! Trop ')

Il n'y a pas d'espace entre le nom de la fonction et la parenthèse ouvrante !

Fonctions scalaires vs fonctions d'agrégation

On peut distinguer deux types de fonctions : les fonctions scalaires et les fonctions d'agrégation (ou fonctions de groupement). Les fonctions scalaires s'appliquent à chaque ligne indépendamment, tandis que les fonctions d'agrégation regroupent les lignes (par défaut, elles regroupent toutes les lignes en une seule). Un petit exemple rendra cette explication lumineuse.

Fonction scalaire

La fonction ROUND(X) arrondit X à l'entier le plus proche. Il s'agit d'une fonction scalaire.

1
2
SELECT nom, prix, ROUND(prix)
FROM Race;

nom

prix

ROUND(prix)

Berger allemand

485.00

485

Berger blanc suisse

935.00

935

Singapura

985.00

985

Bleu russe

835.00

835

Maine coon

735.00

735

Sphynx

1235.00

1235

Nebelung

985.00

985

Il y a sept races dans ma table, et lorsqu'on applique la fonction ROUND(X) à la colonne prix, on récupère bien sept lignes.

Fonction d'agrégation

La fonction MIN(X) par contre, est une fonction d'agrégation.

1
2
SELECT MIN(prix)
FROM Race;

MIN(prix)

485.00

On ne récupère qu'une seule ligne de résultat. Les sept races ont été regroupées (ça n'aurait d'ailleurs pas de sens d'avoir une ligne par race). Cette particularité des fonctions d'agrégation les rend un peu plus délicates à utiliser, mais offre des possibilités vraiment intéressantes. Nous commencerons donc en douceur avec les fonctions scalaires pour consacrer ensuite plusieurs chapitres à l'utilisation des fonctions de groupement.

Quelques fonctions générales

Petite mise au point

Le but de cette partie n'est évidemment pas de référencer 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 compagnon. 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.

Informations sur l'environnement actuel

Version de MySQL

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

1
SELECT VERSION();

VERSION()

5.5.16

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 fonctions CURRENT_USER() et USER(). 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 commande GRANT, mais nous verrons ça dans une prochaine partie), vous arriverez à vous connecter, mais le serveur vous identifiera avec un "utilisateur anonyme". USER() vous renverra alors votre utilisateur sans droit, tandis que CURRENT_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.

1
SELECT CURRENT_USER(), USER();

CURRENT_USER()

USER()

sdz@localhost

sdz@localhost

Informations sur la dernière requête

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

Dans une base de données relationnelle, 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'id de la nouvelle race. Plutôt que de faire un SELECT sur la table Race une fois la nouvelle race insérée, il est possible d'utiliser LAST_INSERT_ID(). Cette fonction renvoie le dernier id créé 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 le LAST_INSERT_ID() que vous recevez).

1
2
3
4
5
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

Nombre de lignes renvoyées par la requête

La fonction FOUND_ROWS() vous permet d'afficher le nombre de lignes que votre dernière requête a ramenées.

1
2
3
4
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 avec LIMIT, FOUND_ROWS() peut avoir un comportement très intéressant. En effet, moyennant l'ajout d'une option dans la requête SELECT d'origine, FOUND_ROWS() nous donnera le nombre de lignes que la requête aurait ramenées en l'absence de LIMIT. L'option à ajouter dans le SELECT est SQL_CALC_FOUND_ROWS, et se place juste après le mot-clé SELECT.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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

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 entier 45 par 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

1
2
3
4
5
6
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 colonne id est de type INT, pourtant la comparaison avec une chaîne de caractères renvoie bien un résultat. De même, la colonne prix est de type DECIMAL, 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). expr représente la donnée que vous voulez convertir, et type est bien sûr le type vers lequel vous voulez convertir votre donnée.

Ce type peut être : BINARY, CHAR, DATE, DATETIME, TIME, UNSIGNED (sous-entendu INT), SIGNED (sous-entendu INT), DECIMAL.

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

1
SELECT CAST('870303' AS DATE);

CAST('870303' AS DATE)

1987-03-03


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épendamment.
  • Une fonction d’agrégation regroupe les différentes lignes.