Sommaire du site
Présentation
Comment apprendre
L'équipement
La page web
Styles et CSS
HTML, structure de la page
HTML, éléments du corps
Le langage JavaScript
JavaScript, objets "core"
JavaScript, DOM, les bases
JavaScript, DOM, node
JavaScript, compléments
Le langage PHP, les bases
PHP, fonctions utiles
PHP pour le web
PHP, compléments
SQL, introduction
MySQL et PHP pour le web
MySQL, plus loin...
Applications AJAX
Annexes utiles
Fichier .htaccess
Sécurité des sites web
Conception d'un site web
Référencement,
syndication
Page mise à jour le : 12-08-2015
Cette page présente des fonctionnalités plus avancées de MySQL. Toutefois, il est évident que tout ne sera pas vu ici. Les lecteurs voulant approfondir le sujet pourront consulter utilement le site de référence :
http://dev.mysql.com/doc/refman/5.0/fr/index.html
Ou se reporter aux ouvrages spécialisés sur SQL et MySQL
Par ailleurs, afin d'illustrer quelques unes des informations données ici, une page d'exemples de requêtes (nouvelle fenêtre / nouvel onglet) est proposée sur ce site.
Bien que SQL ne soit pas un véritable langage de programmation, il dispose d'opérateurs et de fonctions. Ceux-ci sont utiles pour les sélections d'enregistrements dans la clause WHERE mais aussi, parfois, lors de l'insertion de données ou dans le cas de requêtes complexes.
On a déjà vu dans cette clause :
WHERE `date_cotisation` < NOW() - INTERVAL 1 YEAR
où l'on trouve l'opérateur de comparaison '<', la fonction 'NOW()' qui renvoie la date actuelle et l'opérateur INTERVAL qui, s'appliquant à une valeur de type "date", renvoie une autre valeur du même type.
Il existe une fonction INTERVAL qui s'applique aux nombres et qui sert à trouver la position d'un nombre dans une liste ordonnée :
INTERVAL(12, 0, 5, 10, 15, 20) renvoie 3 car 12 est compris entre 10 (3° élément de la liste et 15.
Nous allons voir quelques autres opérateurs et fonctions utiles.
On a les classiques opérations +, -, *, /
ainsi que <, >, =, >=, <=, != pour les comparaisons et
AND, OR, NOT pour associer les valeurs logiques.
Pour les fonctions, voici les plus utiles, elles sont utilisées essentiellement dans les regroupements (voir le paragraphe suivant) :
MAX(col) renvoie la plus grande des valeurs obtenues d'une colonne.
MIN(col) renvoie la plus petite des valeurs obtenues d'une colonne.
Le résultat de ces deux fonctions peut aussi être obtenu en classant une colonne et en ne prenant que son premier élément.
SUM(col) renvoie la somme des valeurs obtenues d'une colonne.
AVG(col) renvoie la moyenne des valeurs obtenues d'une colonne.
COUNT(*) donne le nombre d'éléments.
LIKE 'motif' est utilisé pour trouver une chaîne correspondant à 'motif' dans lequel on peut utiliser :
_ pour remplacer exactement un caractère,
% pour remplacer un nombre quelconque de caractère, y compris aucun.
Par exemple :
SELECT `nom` FROM `adherents` WHERE `fonction`LIKE 'adh_rent%'
trouvera les nom des personnes qui ont comme fonction : 'adhérent', 'adherent', 'adhérente', 'adherente' voire 'adhérents', 'adhérentes'...
MD5(chaine)
SHA1(chaine) // à partir de MySQL 4.02
Ces deux fonctions renvoient la valeur de hachage de la chaîne passée en paramètre.
Elles sont principalement utilisées dans les cas de gestion de mots de passe car ces codages ne sont pas réversibles.
MD5 renvoie une chaîne représentant un nombre hexadécimal de 32 caractères alors pour que SHA1 ce sera sur 40 caractères. L'algorithme SHA1 a la réputation d'être plus sûr que MD5.
Exemple, test du mot de passe d'un utilisateur dont on connait l'ID.
$requete= "SELECT id FROM `utilisateurs`
WHERE `id` = $id AND `passe` = SHA1($mot_de_passe)";
$id_req= mysql_query($requete);
if (mysql_num_rows($id_req) == 0)
exit("Erreur");
On a déjà aperçu la clause LIMIT. Elle peut prendre un ou deux arguments :
LIMIT n
LIMIT p, n
Dans le premier cas les 'n' premiers enregistrements seront produits.
Dans le second,
les 'n' enregistrements à partir du rang 'p'+1 seront produits.
ORDER BY col
SELECT renverra les résultats dans l'ordre de classement (ascendant) de la colonne 'col'.
Il est possible de spécifier plusieurs colonnes :
ORDER BY `nom', `prenom`.
L'ordre descendant est obtenu en suffixant par :
DESC : ORDER BY `age` DESC, `nom`.
Si des valeurs sont identiques dans une colonne, on peut les regrouper pour limiter le nombre de résultats avec la clause :
GROUP BY col
Exemple :
SELECT `classe`, COUNT(*) FROM 'liste' GROUP BY `classe`
Regroupe tous les enregistrements de 'liste' qui on la même valeur dans la colonne 'classe' et affiche pour chacun 'classe' et le nombre d'enregistrements de cette 'classe'.
Si des valeurs à obtenir se trouvent dans plusieurs tables ayant des relations entre elles, on peut les trouver avec une seule requête SELECT. Il suffit d'indiquer les tables derrière FROM et de spécifier la relation avec WHERE.
Imaginons qu'une bibliothèque ait une liste de personnes (emprunteurs) et une liste d'ouvrages. Un ouvrage ne peut être prêté qu'à un emprunteur à la fois.
Table 'personnes' : |
|
Table 'ouvrages' : |
|
Ici, 'emprunteur' contient 'id' de la personne ayant emprunté.
On veut obtenir la liste des ouvrages empruntés et par qui.
SELECT titre, auteur, nom FROM personnes, ouvrages
WHERE personnes.id = emprunteur
On remarque que dans la clause WHERE on a 'personne.id' car le nom de colonne 'id' est utilisé dans les deux tables.
Naturellement les jointures ne se limitent pas à deux tables. Notre premier exemple d'adhérents participant à des activités contient trois tables. Si l'on veut connaitre les activités pratiquées par chacun, la jointure sera faite sur ces trois tables.
Voir l'interrogation : "Adhérent <-> Activités" sur la page de démonstration (nouvelle fenêtre / nouvel onglet).
Il existe des jointures plus élaborées qui utilisent l'opérateur JOIN.
Cela est présenté sur le site de référence :
http://dev.mysql.com/doc/refman/5.0/fr/join.html
Voir aussi (et c'est plus développé) :
http://sqlpro.developpez.com/cours/sqlaz/jointures/
Le résultat d'une requête SELECT peut être utilisé dans une autre.
C'est surtout intéressant pour fournir une valeur à une clause WHERE.
Voir la dernière interrogation : "Adhérent qui fait le plus d'activités" sur la page de démonstration (nouvelle fenêtre / nouvel onglet).
Après avoir vu HTML, JavaScript, PHP et SQL, une synthèse serait utile.
L'occasion en est donnée en voyant le type d'application AJAX qui autorise la réalisation de pages interactives grâce à la communication en "temps réel" avec un serveur.