MySQL : Requêtes SQL

publicité
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
Téléchargement