Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Un premier chapitre peut-être pas des plus attractifs mais nécessaire pour la suite.
Vous vous demandez plus que certainement à quoi peut bien servir une requête appelant des données ne provenant pas d'une table. Je vous le dis tout de suite, pas à énormément de choses, mais dans certains cas, ça peut être très pratique.
Nous verrons plusieurs cas : simplement sélectionner une valeur, sélectionner une valeur ayant subi des "transformations", les variables utilisateur et enfin les fonctions utilisateur (qui n'existent qu'à partir de MySQL 5).
Allez, c'est parti !
Sélectionner une valeur
Essayez donc d'exécuter la requête suivante :
Code : SQL
Vous vous demandez peut-être pourquoi je vous montre ça, et bien juste parce que beaucoup d'entre vous ne savez pas que la clause FROM n'est
pas obligatoire dans une requête SELECT ! Vous vous en doutez certainement vu le titre de ce chapitre : la plupart des requêtes qui suivent seront basées sur le même modèle...
Utilisation des apostrophes
A propos, faisons une petite mise au point à propos de l'utilisation des apostrophes autour des valeurs ...
- Pour les valeurs numériques, les apostrophes ne sont pas obligatoires :
Code : SQL
- Pour les valeurs littérales, les apostrophes sont obligatoires :
Code : SQL
- Pour les valeurs horodataires, les apostrophes sont obligatoires :
Code : SQL
- Les valeurs TRUE, FALSE et NULL ( on en reparlera plus tard ) s'écrivent sans apostrophe :
Code : SQL
Il est fortement conseillé d'utiliser les apostrophes et non pas les guillemets car la norme SQL prévoit l'utilisation des apostrophes et non des guillemets. Respecter la norme vous permettra d'éviter bien des déboires si vous décidez un jour de changer de moteur de gestion de base de données (PostGreSQL, SQLite,... )
Pour écrire une apostrophe, il suffit de la doubler :
Code : SQL1 | SELECT 'On m''appelle Shepard';
|
Il est fortement recommandé de toujours terminer ses requêtes par un point-virgule. Pourquoi ? Parce que quand on en arrivera au chapitre sur les transactions, si vous n'avez pas encore pris cette habitude, vous risquez d'être confrontés à quelques ennuis. Retenez simplement ceci : toute requête SQL doit se terminer par un point-virgule.
Le renommage de colonnes avec AS
Bien sûr, on peut sélectionner plusieurs valeurs en les séparant par des virgules :
Code : SQL1 | SELECT 'bonjour', 1, '01:25:18';
|
Qui renvoie :
Vous remarquez que les noms de colonnes ne sont pas vraiment... pratiques. C'est pour ça qu'existe le renommage de colonnes. Exemple :
Code : SQL1 | SELECT 'bonjour' AS exemple_texte, 1 AS exemple_nombre, '01:25:18' AS exemple_heure;
|
Résultat :
On peut aussi mettre des noms plus exotiques grâce aux accents :
Code : SQL1 | SELECT 'bonjour' AS `Du texte`, 1 AS `Un chiffre`, '01:25:18' AS `De l'horodatage`;
|
Remarquez les espaces et l'apostrophe dans le nom. Il est toutefois vivement contre-indiqué d'utiliser des noms pareils car le traitement PHP s'en trouvera fortement pénalisé.
Les opérateurs mathématiques
Il existe 7 opérateurs principaux sous MySQL:
- L'addition: "+"
- La soustraction: "-"
- La multiplication: "*"
- La division: "/"
- La division entière "DIV"
- Le reste d'une division ( Modulo ): "%" ou "MOD"
- La puissance: "^"
La division entière retourne toujours un nombre
arrondi à l'unité inférieure ! Ne vous étonnez pas si vos calculs sont incorrects si vous utilisez à un moment ou à un autre des nombres décimaux et que vous utilisez DIV plutôt que /.
Toutefois, il est préférable, pour des raisons d'optimisation, d'utiliser 5 DIV 4 que ROUND( 5 / 4 ). (Vous apprendrez l'utilisation de ROUND dans quelques minutes).
Exemple
Code : SQL1 | SELECT ( 1.0 + 5.0 * 6.0 MOD ( 4.0 % 3.0 ) ) / ( 2.0 / 0.25 ), 0.12 DIV 1;
|
Notez que tout ce que j'ai dit dans cette sous-partie ne concerne pas uniquement MySQL. Tous les SGBDR (Système de Gestion de Base de Données Relationnelle) utilisent le doublage de l'apostrophe, le point-virgule final,... ou du moins tous les SGBDR respectant la norme.
C'est peut-être assez con à dire, mais M@teo ne dit à aucun moment qu'il existe des fonctions aussi dans MySQL. Le seul soupçon que vous pourriez avoir par rapport à leur existence était le moment où vous avez appris à compter le nombre de lignes avec COUNT(col).
Il existe une floppée de fonctions MySQL telles que COUNT, certaines agissant sur des chaînes de caractères, d'autres sur des nombres, d'autres sur des dates, certaines sur les colonnes d'une table,...
Comme nous ne travaillons pas sur des tables, nous nous passerons pour le moment de la dernière catégorie, je vous apprendrai dans cette sous-partie les fonctions principales ainsi que leur utilité. Bonne lecture !
UPPER / LOWER
Exemple
Code : SQL1 | SELECT UPPER('C''est un assassinat !!') AS majs, LOWER('NON ?') AS mins;
|
Effets
UPPER met une chaîne en majuscules et LOWER met une chaîne en minuscules. Seuls les caractères alphabétiques sont pris en compte.
Utilisation
Plusieurs utilisations, dont certaines sont contre-indiquées :
- On utilise souvent UPPER() ou LOWER() pour comparer deux chaînes quand on ne veut pas faire attention à la casse (c'est à dire ne pas tenir compte des minuscules / majuscules). Mais il est préférable d'utiliser un autre charset se terminant par _ci (case insensitive). La plupart du temps c'est déjà le cas et vous ne devez même pas vous en préoccuper.
- UPPER et LOWER sont aussi parfois utilisés pour uniformiser des chaînes de caractères (par exemple NOM Prénom). L'exemple le plus courant étant de mettre un nom en majuscules et un prénom en minuscules sauf la première lettre en majuscule.
CHAR_LENGTH
Exemple
Code : SQL1
2 | SELECT CHAR_LENGTH('Bonjour tout le monde !!');
SELECT CHAR_LENGTH('Il l''a');
|
Effets
CHAR_LENGTH renvoie le nombre de caractères contenus dans une chaîne.
La fonction LENGTH sert à la même chose mais tient compte des caractères codés sur 2 octets ! Attention donc aux surprises avec LENGTH que je vous déconseille d'utiliser !
Utilisation
CHAR_LENGTH peut être utilisé comme une vérification (vérifier qu'un pseudo ne contient pas plus de n caractères, etc). Vous allez me dire qu'on peut faire ça du côté PHP, mais moi je trouve ça plus facile du côté SQL, on va dire : "Chacun ses goûts"

.
CONCAT et CONCAT_WS
Exemple
Code : SQL1 | SELECT CONCAT('Bon', 'jour'), CONCAT_WS(', ', 1, 2, 3, 4, 5);
|
Effets
Joindre deux chaînes

.
La norme SQL prévoit deux moyens pour concaténer : CONCATENATE et l'opérateur || (l'opérateur étant plus largement utilisé). Par exemple, sous PostGreSQL :
MySQL ne suit pas la norme et crée une autre fonction : CONCAT.
L'opérateur || n'existe tout simplement pas en MySQL, enfin si il existe, mais il ne sert pas du tout à concaténer

.
Utilisation
Imaginez que vous avez créé un forum où on peut entrer son nom et son prénom. Vous avez stocké ces données dans deux champs distincts. Dans un tableau HTML, vous n'allez tout de même pas écrire le nom et le prénom dans deux colonnes différentes

. Donc vous utilisez CONCAT.
CONCAT_WS est moins connu mais parfois très utile ! Il permet de concaténer des chaînes mais d'insérer entre chaque chaîne des caractères. On en reparlera dans le chapitre sur les variables utilisateur

.
LEFT / RIGHT / SUBSTRING
Exemple
Code : SQL1 | SELECT LEFT('bonjour', 3) AS gauche3, RIGHT('bonjour', 1) AS droite1, SUBSTRING('Bonjour' FROM 2 FOR 3) AS souschaine23;
|
Effets
LEFT('chaine', n) prend n caractères de 'chaine' en partant de la gauche.
RIGHT('chaine', n) prend n caractères de 'chaine' en partant de la droite.
SUBSTRING('chaine' FROM m FOR n) prend n caractères de 'chaine' en partant du caractère m.
Utilisations
Vous vous souvenez de ce qu'on a dit avec UPPER et LOWER à propos du formatage de nom / prénom ? Eh bien maintenant vous savez le faire

.
Essayez de trouver la requête vous-même, puis regardez la solution

.
Note : les données sont dans deux champs différents, rassemblez-les en un seul histoire d'augmenter un (tout petit) peu la difficulté

. Résultat à obtenir : NOM Prénom à partir de Nom prenoM

.
Secret (cliquez pour afficher)Code : SQL1 | SELECT CONCAT(UPPER('nom'), ' ', UPPER(LEFT('prenoM', 1)), LOWER(SUBSTRING('prenoM' FROM 2)));
|
Quelques fonctions mathématiques...
Les fonctions mathématiques s'utilisent pour faire des mathématiques, qui sont des outils universels et utilisables presque partout. Inutile de vous faire une liste de toutes les possibilités qu'elles offrent. Voici un tableau assez éloquent selon moi :
| Fonction | Description | Résultat |
|---|
| CEIL(2.318) |
Arrondit à l'entier supérieur |
3 |
| FLOOR(1.942) |
Arrondit à l'entier inférieur |
1 |
| ROUND(1.452, 2) |
Arrondit 1.452 à 2 décimales. On peut arrondir à un nombre négatif. |
1.45 |
| SIN(0), COS(0), TAN(0), COT(0) |
Donne les sinus, cosinus, tangente et cotangente de 0 (angle exprimé en radians). |
0, 1, 0, NULL |
| ASIN(0), ACOS(0), ATAN(0) |
Donne les arcsinus,... de 0 (l'intervalle ca de -1 à 1 pour ASIN et ACOS). |
0, 1.5707963267949, 0 |
| PI() |
Donne la valeur de Pi. |
3.141593 |
| DEGREES(1) |
Convertit 1 radian en degrés |
57.295779513082 |
| RADIANS(60) |
Convertit 60 degrés en radians |
1.0471975511966 |
| RAND() |
Renvoie un nombre aléatoire entre 0 et 1 |
0.54017342584224 |
| SQRT(4) |
Renvoie la racine carrée de 4 |
2 |
NOW() / CURRENT_TIME() / CURRENT DATE()
Exemple
Code : SQL1 | SELECT NOW(), CURRENT_DATE(), CURRENT_TIME();
|
Effets
NOW() renvoie le timestamp (pas le timestamp UNIX) actuel, CURRENT_TIME() renvoie l'heure et CURRENT_DATE() la date.
Utilisations
Ces valeurs sont très utiles dans les valeurs par défaut de certains champs dans certaines tables. Par exemple, si vous faites un script de news et que vous stockez la date à laquelle a été postée la news, mettre NOW() comme valeur par défaut du champ concerné est une technique fortement conseillée

.
FROM_UNIXTIME() / UNIX_TIMESTAMP()
Exemple
Code : SQL1 | SELECT FROM_UNIXTIME(1144835054), UNIX_TIMESTAMP(NOW()), UNIX_TIMESTAMP();
|
Effets
FROM_UNIXTIME() vous permet de passer d'un timestamp UNIX (par exemple obtenu par PHP) à un timestamp SQL (mieux adapté aux bases de données). Il est déconseillé de stocker des timestamps UNIX dans une BDD, c'est pourquoi ces fonctions existent pour permettre une conversion simple et efficace.
UNIX_TIMESTAMP() vous permet de revenir à un format UNIX ou d'obtenir le timestamp UNIX actuel si aucune date n'est spécifiée en argument. Normalement, cette fonction ne devrait jamais être utilisée : PHP ne devrait plus avoir à traiter des variables de type DATETIME après une requête SQL ; il vaut mieux traiter les dates dans la requête SQL via DATE_FORMAT(), GET_FORMAT() et EXTRACT() (voir juste en dessous).
Utilisation
Ces fonctions servent à stocker une date provenant de PHP dans une BDD au format date SQL. Elles permettent également de revenir à un timestamp UNIX, mais comme ça a déjà été dit, il vaut mieux ne plus traiter de dates du côté de PHP.
DATE_FORMAT() / GET_FORMAT() / EXTRACT()
Exemple
Code : SQL1
2
3 | SELECT DATE_FORMAT(CURRENT_DATE(), GET_FORMAT(DATE, 'EUR')) AS today,
DATE_FORMAT(NOW(), '%d.%m.%Y') AS today2,
CONCAT_WS('.', EXTRACT(DAY FROM NOW()), EXTRACT(MONTH FROM NOW()), EXTRACT(YEAR FROM NOW())) AS today3;
|
Effets
DATE_FORMAT() permet de formater une date selon divers formats fournis soit par vous-même (le truc bizarre avec les signes %), soit par GET_FORMAT(). Toutes les options disponibles pour ces deux options peuvent être trouvées sur cette page (je vais pas copier la doc non plus

) :
Utilisation
Ces fonctions sont utilisées pour rendre des dates au format français, c'est très pratique et ça permet de ne pas devoir intervenir du côté PHP. A préférer aux fonctions UNIX (et donc au traitement du côté PHP).
Et voilà, bien sûr, il existe beaucoup plus de fonctions dans MySQL, mais je crois vous avoir donné les principales, et en tout cas les plus utiles

.
Saviez-vous que, en plus des fonctions préexistantes fournies par MySQL, vous pouviez créer vos propres fonctions à partir de MySQL 5 ?
Dans cette partie, je ne vais pas vous expliquer comment créer vos propres fonctions, on n'a pas encore le niveau, mais je voulais juste vous dire que ça existait, et vous donner un petit exemple

.
Les fonctions utilisateur ont des utilités multiples, de plus, elles peuvent retourner des valeurs qui pourraient être utilisées directement dans une requête. Une seule contrainte : l'appel de la fonction, admettons que vous ayez créé une fonction nommée 'f_format_nom_prenom' qui prend deux arguments (nom et prenom), vous ne pourriez lancer une requête de ce style (ça ne marcherait pas) :
Code : SQL1 | f_format_nom_prenom('pijcke', 'fabiaN');
|
Le SELECT est
obligatoire ! Voici ce qu'il aurait fallu faire :
Code : SQL1 | SELECT f_format_nom_prenom('pijcke', 'fabiaN');
|
Encore une fois, la clause FROM est absente, pourtant dans la fonction, il peut très bien y avoir des SELECT sur des tables, mais on n'en a pas besoin dans la requête qui appelle la fonction

.
Juste pour vous montrer à quoi ça ressemble, voici comment on aurait pu coder la fonction f_format_nom_prenom :
Code : SQL1
2
3
4 | CREATE FUNCTION
f_format_nom_prenom ( nom VARCHAR(25), prenom VARCHAR(25) )
RETURNS VARCHAR(50) LANGUAGE SQL READS SQL DATA
RETURN CONCAT(UPPER(nom), ' ', UPPER(LEFT(prenom, 1)), LOWER(SUBSTRING(prenom FROM 2)));
|
Bien sûr, une fonction peut contenir beaucoup plus de lignes, on ajoute alors les mots-clefs BEGIN et END, mais on verra tout ça plus tard...
Voici comment on utilise cette fonction :
Code : SQL1 | SELECT f_format_nom_prenom('pijcke', 'fabian') AS shepard;
|
Pas si mal pour 4 petites lignes de code

.