Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zér0 > Les tutoriels > Non-Officiels > Site Web > PHP > Base de données > Lecture du tutoriel

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

Avatar
Auteur : Shepard
Créé : le 12/04/2006 01:04:49
Modifié : le 03/04/2007 21:08:01
Noter et commenter ce tutoriel
Imprimer ce tutoriel
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 !
Sommaire 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 ...



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:



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 :


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


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
Auteur : Shepard
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Nombre de connectés 361 Zér0s connectés | Requêtes SQL 11 requêtes | Temps de génération de la page 0.0673s (0.0372s)

Changer de design - Revue de presse - En savoir plus - Plan du site
Nous contacter - Mentions légales - Publicité
Politique d'accessibilité - Fil RSS - XHTML 1.0 - CSS 2.0

Y'a plus rien à lire, faut remonter maintenant !