MySQL : Requêtes SQL Sommaire 1. Qu'est­ce qu'une requête SQL ? 2. Requêtes les plus usuelles : SELECT, INSERT, DELETE, UPDATE 1. Qu'est­ce qu'une requête SQL ? Une requête SQL est un texte qui donne un ordre à exécuter à un moteur de base de données sur une base de données. Elle peut concerner un enregistrement ou plusieurs, elle peut mettre en jeu une table ou plusieurs. La requête est composée de mots clés, les commandes SQL (que j'écrirai arbitrairement en majuscules). Je reprécise également que les commandes SQL ne sont pas sensibles à la casse (différence majuscules/minuscules) ni à l'écriture mais les champs sont sensibles ; pour plus de clarté j'écrirai mes requêtes sur plusieurs lignes, permettant d'individualiser les blocs de données. les commandes SQL seront écrites en majuscules et les noms des champs intégralement en minuscules (sauf indication contraire). 2. Requêtes les plus usuelles : SELECT, INSERT, DELETE, UPDATE Pour les exemples qui vont suivre, je supposerai cet exemple de base de données sur 2 tables : -- TABLE : contacts id nom prenom ville cp id_pays ----------------------------------------------------------1 Alpha Alain Paris 75000 1 2 Beta Benjamin Lyon 69000 1 3 Beta Benjamin Lyon 69000 1 4 Gamma Gaëlle London 1234 2 -- TABLE : pays id pays ----------1 FRANCE 2 UNITED KINGDOM Le SELECT : choix d'enregistrements La requête SELECT permet de choisir des enregistrements suivant une certaine condition. Sa syntaxe est la suivante : SELECT FROM WHERE champ1, champ2, ... champX nom_de_la_table { condition }; Le SELECT retournera ainsi un jeu de données ("dataset") qui sera une sorte de table virtuelle contenant tous les enregistrements qui remplissent la condition (si existante) organisés selon les champs choisis. ATTENTION : Les programmeurs du dimanche ont vite fait d'utiliser la syntaxe SELECT * FROM ... qui permet de rapatrier tous les champs. Très pratique pour être sûr d'avoir l'information désirée, le SELECT * est à éviter pour 3 raisons : 1. Problème de poids : la plupart du temps, on n'a pas besoin de tous les champs, mais seulement des principaux. Si le résultat du SELECT retourne un enregistrement dont la totalité des champs pèse 5 kilo octets, imaginez alors si dans quelques jours cette réponse renvoie 1000 enregistrements ... Cela fait 5 mille kilo octets soit 5 mega octets ... Juste pour avoir l'ID et le prénom ... 2. Problème de sécurité : supposons que notre enregistrement soit un contact et que figure dans sa "fiche" son numéro de compte, ou son mot de passe. Un SELECT * va rapatrier le numéro de compte ou le mot de passe, même s'il n'est pas utilisé dans le script ; l'information sera rapatriée en mémoire, donc potentiellement utilisable (imaginons ­ au pire ­ le cas d'une faille de sécurité ...) 3. Problème d'évolutivité : (indirectement lié au problème de taille) aujourd'hui la table comporte 3 champs. Dans quelques jours, j'aurai ajouté 3 autres champs, ce qui en fera 6 au total. Or dans la partie du script où est fait ce SELECT *, je n'ai pas forcément besoin des 6 champs, dont je rapatrie de l'information en trop : consommation inutile de ressources. Bref, j'espère que ces raisons vous auront convaincu de ne pas utiliser le SELECT *. Le SELECT permet de rapatrier les champs tels qu'indiqués, mais par simplicité, il est possible de les manipuler un peu. Voici quelques exemples (exemple simple pour le premier, pour comparer) : SELECT nom, prenom, ville, cp FROM contacts; Renvoie : nom prenom ville cp ---------------------------------Alpha Alain Paris 75000 Beta Benjamin Lyon 69000 Beta Benjamin Lyon 69000 Gamma Gaëlle London 1234 Exemple de renommage des champs à la volée : SELECT FROM nom AS nom_de_famille, prenom AS prenom_contact, ville, cp contacts; Renvoie : nom_de_famille prenom_contact ville cp ---------------------------------------------------Alpha Alain Paris 75000 Beta Benjamin Lyon 69000 Beta Benjamin Lyon 69000 Gamma Gaëlle London 1234 Exemple de concaténation : SELECT FROM CONCAT('[ ', nom, '] ', prenom) AS employe, ville, cp contacts; Renvoie : employe ville cp -----------------------------------[ Alpha ] Alain Paris 75000 [ Beta ] Benjamin Lyon 69000 [ Beta ] Benjamin Lyon 69000 [ Gamma ] Gaëlle London 1234 On peut faire encore bien d'autres manipulations, la documentation de MySQL en donne beaucoup d'autres. L'INSERT : ajout d'enregistrements L'INSERT ajoute des valeurs suivant des champs. INSERT INTO la_table (champ1, champ2, ... champX) VALUES ('valeur1', 'valeur2, ... 'valeurX'); -- ou bien INSERT INTO la_table SET champ1='valeur1', champ2=‘valeur2’, ...,champX=‘valeurX’ ; LETE : suppression d'enregistrements Cette commande supprime des enregistrements répondant à une condition. Elle ne renvoie pas de dataset. Sa syntaxe est la suivante : DELETE FROM la_table WHERE { condition }; Supposons mes contacts affichés plus haut. La requête qui correspond à effacer tous les contacts en France : DELETE FROM contacts WHERE ID_PAYS = 1; Modifiera la table comme ceci : -- TABLE : contacts id nom prenom ville cp id_pays ----------------------------------------------------------4 Gamma Gaëlle London 1234 2 L'UPDATE : mise à jour d'enregistrements Mettre à jour un ou des enregistrements, c'est changer le contenu de certains champs. Pour effectuer la mise à jour, le moteur de la base de données va d'abord examiner la condition puis sélectionner les enregistrements qui la vérifient; ensuite il met à jour ceux­ci. Attention, si la condition est mal formulée, il est possible de mettre à jour beaucoup plus d'enregistrements que prévu ... L'UPDATE a pour syntaxe : UPDATE SET WHERE la_table champ1 = 'nouvelle_valeur_1', champ2 = 'nouvelle_valeur_2', champX = 'nouvelle_valeur_X' { CONDITION }; (On n'est pas obligé de mettre à jour tous les champs systématiquement). Je prends toujours mes contacts, je souhaite renommer la ville "Lyon" en "Toulouse", et changer le code postal vers "31000" : UPDATE SET WHERE contacts ville = 'Toulouse', cp = '31000' ville = 'Lyon'; Une fois exécutée, la table devient : -- TABLE : contacts id nom prenom ville cp id_pays ----------------------------------------------------------1 Alpha Alain Paris 75000 1 2 Beta Benjamin Toulouse 31000 1 3 Beta Benjamin Toulouse 31000 1 4 Gamma Gaëlle London 1234 2