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 |
|
division entière |
|
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.