Aller au menu - Aller au contenu

Icône Sélectionner une valeur... ne provenant pas d'une table !

Mise à jour : 29/06/2009
1 063 visites depuis 7 jours, dont 86 sur ce chapitre classé 122/786
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 !
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Quelques bases...

Sélectionner une valeur



Essayez donc d'exécuter la requête suivante :

Code : SQL
1
SELECT 'bonjour';

Image utilisateur

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... :p

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
    1
    SELECT 5;
    
  • Pour les valeurs littérales, les apostrophes sont obligatoires :
    Code : SQL
    1
    SELECT 'bonjour';
    
  • Pour les valeurs horodataires, les apostrophes sont obligatoires :
    Code : SQL
    1
    SELECT '01:13:54';
    
  • Les valeurs TRUE, FALSE et NULL ( on en reparlera plus tard ) s'écrivent sans apostrophe :
    Code : SQL
    1
    SELECT NULL;
    


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 : SQL
1
SELECT 'On m''appelle Shepard';

Image utilisateur


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 : SQL
1
SELECT 'bonjour', 1, '01:25:18';


Qui renvoie :
Image utilisateur


Vous remarquez que les noms de colonnes ne sont pas vraiment... pratiques. C'est pour ça qu'existe le renommage de colonnes. Exemple :
Code : SQL
1
SELECT 'bonjour' AS exemple_texte, 1 AS exemple_nombre, '01:25:18' AS exemple_heure;


Résultat :
Image utilisateur


On peut aussi mettre des noms plus exotiques grâce aux accents :
Code : SQL
1
SELECT 'bonjour' AS `Du texte`, 1 AS `Un chiffre`, '01:25:18' AS `De l'horodatage`;


Image utilisateur


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 : SQL
1
SELECT ( 1.0 + 5.0 * 6.0 MOD ( 4.0 % 3.0 ) ) / ( 2.0 / 0.25 ), 0.12 DIV 1;

Image utilisateur


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.

Les fonctions MySQL

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 : SQL
1
SELECT UPPER('C''est un assassinat !!') AS majs, LOWER('NON ?') AS mins;

Image utilisateur


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 : SQL
1
2
SELECT CHAR_LENGTH('Bonjour tout le monde !!');
SELECT CHAR_LENGTH('Il l''a');

Image utilisateur


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 : SQL
1
SELECT CONCAT('Bon', 'jour'), CONCAT_WS(' - ', 1, 2, 3, 4, 5);

Image utilisateur


Effets



Joindre deux chaînes :p .

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 :
Image utilisateur

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 :p .

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 :p . 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 : SQL
1
SELECT LEFT('bonjour', 3) AS gauche3, RIGHT('bonjour', 1) AS droite1, SUBSTRING('Bonjour' FROM 2 FOR 3) AS souschaine23;

Image utilisateur


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 :p :) .

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é :diable: . Résultat à obtenir : NOM Prénom à partir de Nom prenoM :) .

Secret (cliquez pour afficher)
Code : SQL
1
SELECT CONCAT(UPPER('nom'), ' ', UPPER(LEFT('prenoM', 1)), LOWER(SUBSTRING('prenoM' FROM 2)));

Image utilisateur


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 :

FonctionDescriptionRé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 va 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 : SQL
1
SELECT NOW(), CURRENT_DATE(), CURRENT_TIME();

Image utilisateur


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 : SQL
1
SELECT FROM_UNIXTIME(1144835054), UNIX_TIMESTAMP(NOW()), UNIX_TIMESTAMP();

Image utilisateur


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 : SQL
1
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;

Image utilisateur


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 ^^ :p ) :


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 ;) :) .

Les fonctions utilisateur

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 :p :) .

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 : SQL
1
f_format_nom_prenom('pijcke', 'fabiaN');


Le SELECT est obligatoire ! Voici ce qu'il aurait fallu faire :

Code : SQL
1
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 : SQL
1
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 : SQL
1
SELECT f_format_nom_prenom('pijcke', 'fabian') AS shepard;

Image utilisateur


Pas si mal pour 4 petites lignes de code ^^ :p .

Q.C.M.

Peut-on exécuter une requête SELECT sans clause FROM ?
Comment doit-on écrire "Je m'appelle Shepard !" en SQL ?
Que renvoient respectivement les requêtes suivantes ?

Code : SQL
1
SELECT 5 / 2;

Code : SQL
1
SELECT 5 % 2;

Code : SQL
1
SELECT 5 DIV 2

Statistiques de réponses au QCM

C'était pas trop dur ? :p

Bon comme je vous l'avais dit, ce chapitre est doté d'un pouvoir assez... soporifique, j'espère au moins que vous avez eu 20 / 20 au Q.C.M. ! :ange:
Chapitre précédent Sommaire Chapitre suivant

Partager

24 commentaires pour "Sélectionner une valeur... ne provenant pas d'une table !"
Note moyenne : 3.87 / 4 (31 votes)
Pseudo Commentaire
Hors ligne Anonyme # Posté le 14/09/2007 à 16:00:58

Un petit détail au passage sur les opérateurs, le ^ n'est pas l'opérateur de puissance, c'est un XOR.
Un SELECT 2^24 retourne bien 26 et non 16 millions et quelques comme ça le devrait si c'était une puissance ^^
Hors ligne eurekainstant # Posté le 22/08/2009 à 18:28:58
Et si tout était plus simple
Avatar

Une toute petite chose que j'ai remarqué c'est cette faute dans la dernière question du QCM:
SELECT 5 DIV 2

Il manque ';' à la fin de la requête.
(erreur que tout le monde commet tôt ou tard^^)

Très bon tuto qui approfondi mysql, j'ai particulièrement apprécié que chaque propros soit illustré par des exemples simples et complet (certaines fonctions peuvent être très utiles et plus rapide/simple que ses homologues PHP ;) )
 
Hors ligne geekooo # Posté le 06/02/2011 à 10:06:57

Hello

Code : SQL - Sélectionner
SELECT 'bonjour';



la clause FROM n'est pas obligatoire dans une requête SELECT

La clause FROM est tout à fait obligatoire avec un SELECT (standarts)

++
Hors ligne Shepard # Posté le 28/03/2011 à 00:58:27
SQL Beginner ...
Avatar
Groupe : Anciens

Ville : Mouscron
Pays : Belgique
Études : Université de Mons-Hainaut

Merci à tous pour vos commentaires !

Pour le moment je n'ai pas trop le temps de m'occuper de ce tuto, mais dès que j'en ai je m'y remet ! Promis ! :D (a priori à partir de Juillet, mais rien n'est sûr :p )

@geekooo, la confusion est probablement ma faute: Je ne précise pas assez souvent qu'il s'agit d'un tutoriel concernant MySQL uniquement, dans le standard effectivement, la clause FROM est obligatoire, mais la plupart des SGBDR proposent un mécanisme pour contourner cela si vous voulez appliquer ce tuto à votre SGBDR favori :) (Sous MS SQL Server et PostGreSQL, FROM peut être omis, sous Oracle, il faut utiliser la pseudo-table DUAL (SELECT 1 FROM DUAL;)

À bientôt !
Hors ligne noelle04 # Posté le 24/02/2012 à 12:03:11

Bonjour,
moi j' ai un petit souci avec la création d' une fonction, pouvez vous m' expliquer pourquoi svp.

voici ce que ma console sgl me dit ( pouvant faire de copier coller, je vous l' écrit :
mysql>CREATE FUNCTION
-> f_format_nom_prenom (nom VARCHAR(25°, prenom VARCHAR(25° °
-> RETURNS VARCHAR(50° LANGUAGE SQL READS SQL DATA
-> RETURN CONCAT(UPPER5nom),'',UPPER(LEFT(prenom, )),LOWER(SUBSTRING(prenom FROM 2)));
ERROR 1046 (3D000): no database selected
mysql> SELECT f_format_nom_prenom('pijcke','fabian') AS sheperd;
ERROR 1305 (42000): FONCTION f_format_nom_prenom does not exist
mysql>

pouvez vous m' aider pour les error, merci


PS: trés bon tuto même si je suis au début, très bien expliquer pour les débutant comme moi, Merci

Voir tous les commentaires