MySQL par l’exemple

L’instruction SELECT

Rappel

Avant de commencer, il est bon de rappeler ce qu’est une table dans une base de données.

Une table dans une base de données est un ensemble de lignes de données : les enregistrements.
Chaque donnée possède un nom, c’est le champ.

 

idx

prenom

nom

1

Gérard

Menvussa

2

Alex

Térieur

3

Youssouf

Dido

 

Dans ce tableau, nous voyons 3 lignes d’enregistrements divisées en 3 champs (colonnes) idx, prenom et nom.

Pour nos exemples, nous utiliserons la table que l’on vient de voir (nommée ‘membres’) et les 3 tables suivantes (nommées ‘messages’, ‘commandes’, ‘articles’) :

 

auteur

texte

2

Mon premier message :))

1

j’dois dire quoi là ??!

idx

commande

article

quantite

1

1

1

3

2

1

3

1

3

2

2

1

4

2

1

12

5

2

3

2

idx

nom

prix

1

croissant

0,84

2

gateau

16,77
3 baguette 0,63

 

Si vous voulez afficher le contenu (total ou partiel) d’une table, vous devez demander au serveur MySQL de vous fournir ces informations. Pour cela, on utilise la commande : SELECT.

 

Sélection de champs

Exemple 1 : SELECT ‘Bonjour monde’

Cette commande va nous retourner un seul enregistrement dont le nom du champ est ‘Bonjour monde’ et dont le contenu est ‘Bonjour monde’.

 

Bonjour monde

Bonjour monde

 

Exemple 2 : SELECT ‘Bonjour monde’ as bonjour

 

Cette commande nous retourne toujours un enregistrement contenant ‘Bonjour monde’ mais on en a profité au passage pour renommer le champ en ‘bonjour’ avec la fonction ‘as’.

 

bonjour

Bonjour monde

 

Exemple 3 : SELECT ‘Bonjour monde’ as ‘le bonjour’

 

Cette fois ci, on a renommer le champ en ‘le bonjour’, mais comme ce nom contient un espace, on est obligé de l’encadrer par des guillemets.

le bonjour

Bonjour monde

 

Exemple 4 : SELECT ‘C\’est la date du jour : ‘ as texte, DATE_FORMAT(NOW(),’%d/%m/%Y’) as date

 

Ici, on affiche 2 champs, le premier étant un texte simple (champ renommé ‘texte’) et la date du jour mise dans un format plus ‘français’.

 

On peut remarquer 2 choses:

– La présence d’un antislash devant le guillemet afin que l’interpréteur de commande ne considère pas ça comme une fin de chaîne.

– La date retournée est celle du serveur, donc si vous utilisez un serveur à l’étranger, ne vous étonnez pas si l’heure et la date ne correspondent pas à celles de votre machine.

texte

date

C’est la date du jour :

03/11/2000

 

Exemple 5 : SELECT CONCAT(‘Nous sommes le <b>’, DATE_FORMAT(NOW(),’%d/%m/%Y’),'</b>’) as date

 

Ici, nous n’avons plus qu’un seul champ, mais nous utilisons la commande ‘CONCAT’ pour coller les textes ensemble.

Vous pouvez remarquer que nous en profitons pour insérer du code HTML afin de mettre en gras la date.

date

Nous sommes le <b>03/11/2000</b>

 

Il est toujours fortement conseillé de renommer les champs avec la fonction ‘as’ car sinon, celui-ci pourrait vite devenir très long.

 

Sélection des données en provenance d’une table

Exemple 6 : SELECT nom, prenom FROM membres

 

Maintenant, les informations proviennent d’une table nommée ‘membres’. Les champs ‘nom’ et ‘prenom’ sont issus de cette table. Comme il peut exister plusieurs lignes d’enregistrements, nous récupérons non plus une seule ligne comme dans les exemples précédents, mais plusieurs (ou aucune si la table est vide).

nom prenom

Menvussa

Gérard

Térieur

Alex

Dido

Youssouf

 

Notez que les champs ‘nom’ et ‘prenom’ dans la table ‘membres’ ne sont pas déclarés dans cet ordre.

 

Exemple 7 : SELECT * FROM membres

 

Ici, le symbole * indique que nous voulons TOUS les champs de la table.

idx

prenom nom

1

Menvussa

Gérard

2

Térieur

Alex
3 Dido Youssouf

 

Nous avons donc TOUS les champs dans l’ordre où ils ont été créés. Vous remarquez bien que ‘prenom’ est déclaré AVANT ‘nom’ (cf : remarque de l’exemple précédent)

 

Exemple 8 : SELECT CONCAT(‘<a href=’whois.php3?idx=’,idx,”>’,prenom, ‘ ‘, nom, ‘</a>’) as membre FROM membres

Ici, nous en profitons pour mettre en forme le texte que l’on va afficher en introduisant directement le code HTML permettant de transformer le couple ‘prenom nom’ en liens hypertexte donnant des indications sur le membre (trés pratique!)

membre
<a href=’whois.php3?idx=1′>Gérard Menvussa</a>
<a href=’whois.php3?idx=2′>Alex Térieur</a>
<a href=’whois.php3?idx=3′>Youssouf Dido</a>

 

Filtrage des données

Exemple 9 : SELECT CONCAT(prenom, ‘ ‘, nom) as membre FROM membres WHERE idx = 3

 

Dans cette exemple, on ne récupère QUE les lignes d’enregistrements qui répondent aux conditions de la clause ‘WHERE’.

Notre table ne contenant qu’un seul enregistrement dont le champ idx est égale à 3, nous avons :

membre
Youssouf Dido

 

Exemple 10 : SELECT nom FROM membres WHERE idx = 2 OR prenom LIKE ‘%a%’

 

On ne récupère que les lignes d’enregistrements dont le champ idx vaut 2 ou le prénom contient un ‘a’.

Une clause ‘WHERE’ peut contenir un ensemble de conditions, dans notre cas : 2.

La commande ‘LIKE’ est très utile pour rechercher un texte sans se préoccuper des majuscules/minuscules. De plus, il est possible de mettre des caractères spéciaux ‘_’ (souligné) pour remplacer n’importe quel caractère et ‘%’ pour remplacer de 0 à n caractères (pour plus d’info sur la commande ‘LIKE’, reportez vous à la documentation de mySQL dans la section ‘Fonctions de comparaisons des chaînes’).

nom

Menvussa

Térieur

 

Jointures

Exemple 11 : SELECT membres.nom, membres.prenom, messages.texte FROM membres, messages

 

Dans cette exemple nous abordons la sélection multi-tables. Comme vous pouvez le constater, nous faisons appelle à 2 tables dans la clause ‘FROM’, et lorsque nous utilisons un champ, nous précisons le nom de la table.

Le résultat de cette requête peut paraître surprenant :

 

nom

prenom

texte

Menvussa

Gérard

Mon premier message :))

Térieur

Alex

Mon premier message :))

Dido

Youssouf

Mon premier message :))

Menvussa

Gérard

j’dois dire quoi là ??!

Térieur

Alex

j’dois dire quoi là ??!

Dido

Youssouf

j’dois dire quoi là ??!

 

En fait, on affiche toutes les lignes d’enregistrements de la table membres avec la première ligne d’enregistrements de la table messages, puis toutes les lignes d’enregistrements de la table membres avec la deuxième ligne d’enregistrements de la table messages.

Le nombre total d’enregistrements est calculé comme suit : nombre d’enregistrements de la première table x nombre d’enregistrements de la deuxième tables.

Si on avait inversé dans la clause ‘FROM’ les tables (… FROM messages, membres nous aurions obtenu le résultat suivant :

nom

prenom

texte

Menvussa

Gérard

Mon premier message :))

Menvussa

Gérard

j’dois dire quoi là ??!

Térieur

Alex

Mon premier message :))

Térieur

Alex

j’dois dire quoi là ??!

Dido

Youssouf

Mon premier message :))

Dido

Youssouf

j’dois dire quoi là ??!

 

Exemple 12 : SELECT a.idx, a.nom, b.auteur, b.texte FROM membres a, messages b

 

Dans ce nouvel exemple, on renomme les tables en placant le nouveau nom après le nom de la table dans la clause ‘FROM’. Il est maintenant possible d’utiliser ces nouveaux noms pour faire référence aux champs. Le code est ainsi racourci.

idx

nom

auteur

texte

1

Menvussa

2

Mon premier message :))

2

Térieur

2

Mon premier message :))

3

Dido

2

Mon premier message :))

1

Menvussa

1

j’dois dire quoi là ??!

2

Térieur

1

j’dois dire quoi là ??!

3

Dido

1

j’dois dire quoi là ??!

Exemple 13 : SELECT a.idx,a.nom,b.auteur,b.texte FROM membres a, messages b WHERE a.idx = b.auteur

Le résultat de cette requête nous donne :

idx

nom

auteur

texte

2

Térieur

2

Mon premier message :))

1

Menvussa

1

j’dois dire quoi là ??!

 

En fait, on n’a gardé que les enregistrements où le champ idx de membres est égal au champ auteur de message (regardez le tableau de l’exemple précédent). Nous venons de réaliser notre première jointure !

‘A quoi ça sert ?’ me direz-vous. En fait, imaginez notre cas présent, on a une table contenant les membres inscrits. Chaque membre peut laisser un message. On ne va pas créer un enregistrement avec le message et les coordonnées complètes de l’auteur, puisqu’on les a déjà dans la table des membres. On n’enregistre alors que l’index sur la table des membres et lors de l’affichage, on fait ce que l’on appelle une ‘jointure’ entre nos deux tables.

 

Exemple 14 : SELECT a.nom, b.texte FROM membres a, messages b WHERE a.idx = b.auteur AND a.idx = 1

Dans cette exemple, on réalise une jointure entre nos deux tables et en plus, on ne veut QUE les messages écrit par le membre 1.

nom

texte

Menvussa

j’dois dire quoi là ??!

 

Exemple 15 : SELECT b.texte, a.nom FROM membres a, messages b WHERE a.idx = b.auteur

 

[Dans cette exemple, on suppose que le membre 1 n’existe plus]

 

On veut dans cette requête, afficher TOUS les messages de la table ‘messages’ avec le nom de l’auteur à côté. Ce qui donne :

texte

nom

Mon premier message :))

Térieur

 

Le message ‘j’dois dire quoi là ??!’ n’est pas affiché car le membre 1 n’existe plus dans la base et il est donc impossible de résoudre la jointure ‘a.idx = b.auteur’ dans le cas de ‘auteur = 1’.

Exemple 16 : SELECT b.texte, a.nom FROM messages b LEFT JOIN membres a ON a.idx = b.auteur

[Dans cette exemple, on suppose que le membre 1 n’existe plus]

Ici, on n’utilise plus la jointure par la clause ‘WHERE’, mais une clause spécifique aux jointures ‘LEFT JOIN … ON …’.

L’avantage de cette méthode est que si l’on ne trouve pas l’enregistrement correspondant dans la deuxième table, l’enregistrement de la première est malgré tout retourné.

 

ATTENTION : Les champs correspondants aux enregistrements absents ne sont pas des champs vides, mais des champs nuls.

texte

nom

Mon premier message :))

Térieur

j’dois dire quoi là ??!

 

Tris

Exemple 17 : SELECT CONCAT(prenom, ‘ ‘, nom) as membre FROM membres ORDER BY nom

Ici, on utilise une clause supplémentaire, la clause ‘ORDER BY’ qui, comme son nom l’indique, permet d’ordonner les lignes d’enregistrements.

Dans cette exemple, on ordonne par le champ ‘nom’.

 

membre

Youssouf Dido

Gérard Menvussa

Alex Térieur

 

Exemple 18 : SELECT CONCAT(prenom, ‘ ‘, nom) as membre FROM membres ORDER BY membre DESC

 

Dans le cas présent, la clause ‘ORDER BY’ se porte sur le nouveau champ créé ‘membre’. De plus, on fait le tri dans l’ordre descendant (DESC). Ce qui est dommage, car on obtient dans notre cas, la même chose que la requête précédente !

membre

Youssouf Dido

Gérard Menvussa

Alex Térieur

 

Exemple 19 : SELECT CONCAT(prenom, ‘ ‘, nom) as membre FROM membres ORDER BY prenom ASC, nom DESC

 

La clause ‘ORDER BY’ se porte maintenant sur deux champs. Les enregistrements vont donc être triés par les prénoms dans l’ordre ascendant (En fait, ASC n’est pas obligatoire, puisque c’est l’ordre normal d’un tri), et si les prénoms sont identiques, le tri sera fait sur le nom dans l’ordre inverse.

 

membre

Alex Térieur

Gérard Menvussa

Youssouf Dido

 

Regroupements et calculs

Exemple 20 : SELECT commande, count(*) as ‘nombre d\’articles’ FROM commandes GROUP BY commande

 

En fait, la clause ‘GROUP BY’ s’utilise, dans presque tous les cas, avec des commandes spéciales telles que ‘COUNT’, ‘MAX’, ‘MIN’, SUM’, AVG’ … etc.

En fait, quand ces commandes sont utilisées sans la clause ‘GROUP BY’, elles sont exécutées sur l’ensemble des enregistrements.

commande

Nombre d’articles

1 2
2 3

 

Exemple 21 : SELECT b.commande, SUM(a.prix * b.quantite) as ‘Total (Euros)’, CEILING(SUM(a.prix * b.quantite*6.55957)*100)/100 as ‘Total (Francs)’ FROM commandes b, articles a WHERE a.idx = b.article GROUP BY b.commande

 

Cette exemple est un peu long, mais il permet d’aborder plusieurs choses :

– Un regroupement avec une somme

– Une jointure

– Des calculs

 

Plutôt que d’utiliser la commande ‘ROUND’ pour arrondir à 2 chiffres après la virgule, je fais une multiplication, arrondi et division afin d’arrondir sur 2 décimales au chiffre supérieur. Ben oui … il faut bien que les euros nous fassent gagner un peu d’argent. 😉

commande

Total (Euros)

Total (Francs)

1

3.15

20.67

2

28.11

184.39

 

Limitation du nombre d’enregistrement

Exemple 22 : SELECT * FROM membres LIMIT 1,2

Il est arrivé très souvent de devoir limiter le nombre d’enregistrements. Dans cet exemple, on veut les 2 enregistrements commençant à la position 1. Notez que les enregistrements commencent en position 0.

 

idx

prenom

nom

2

Alex

Térieur

3

Youssouf

Dido

 

Le cas d’utilisation le plus courant de cette clause, est l’affichage d’informations par pages. Le premier chiffre étant le numéro de la page que multiplie le nombre d’enregistrements par pages et le deuxième chiffre, le nombre d’enregistrements par pages.

 

Fonctions de contrôle

Exemple 23 : SELECT CONCAT(‘<option value=”,idx,”’,IF(idx = 2,’ selected’,”),’>’,nom,'</option>’) as opt FROM articles

 

Voici un bel exemple trés pratique de génération de code HTML directement dans une requête. Ici, on veut générer une liste permettant de choisir un article.

Mais dans une boîte de liste, il y a souvent un élément déjà selectionné, pour cela, on utilise une commande ‘IF’ afin d’ajouter l’option ‘selected’ dans le cas où l’article correspond à l’index 2. Si ‘idx’ est égal à 2, la commande renvoie ‘ selected’ (avec un espace devant) sinon elle renvoie ” (2 guillemets de suite), c’est à dire rien.

opt

<option value=’1′>croissant</option>

<option value=’2′ selected>gateau</option>
<option value=’3′>baguette</option>

 

Exemple 24 : SELECT b.texte, IFNULL(a.nom,'(inconnu)’) FROM messages b LEFT JOIN membres a ON a.idx = b.auteur

 

[Dans cette exemple, on suppose que le membre 1 n’existe plus]

J’ai repris l’exemple 16. Dans le cas où l’auteur n’existe pas (le 1), au lieu d’avoir un champ nul, on a le texte ‘(inconnu)’, ce qui est quand même plus explicite ! En fait, la commande ‘IFNULL’ renvoie le premier argument intact si celui-ci n’est pas nul, sinon elle renvoie le deuxième argument.

texte

nom

Mon premier message :))

Térieur

j’dois dire quoi là ??!

(inconnu)

 

Conclusion

Ces exemples ne parle pas de TOUTES les fonctions utilisables dans la commande SELECT, mais aborde les principales.

Je vous invite à lire la documentation sur les fonction utilisées dans les clauses SELECT et WHERE de MySQL (version anglaise, version française).

 

Ne sous-estimez pas les possibilités des requêtes SELECT, car elles peuvent parfois remplacer un traitement lourd et complexe en PHP.

 

2 Insertion, suppression et mise à jour

Pour nos exemples, nous utiliserons les 4 tables (vides) suivantes :

 

La table ‘membres‘ :

idx

nom

prenom

[Numérique]
(Auto-incrémenté)

[Chaîne]

[Chaîne]


La table ‘projets‘ :

idx nom

[Numérique]
(Auto-incrémenté)

[Chaîne]


La table ‘
participants‘ (le couple projet-membre est déclaré unique) :

projet

membre

remarque

[Numérique]

[Numérique]

[chaîne]


La table ‘messages‘ (cette table a été mal créée, mais ce n’est pas important):

date

priorite

nom

message

[Date/Heure]

[Numérique]

[Chaîne]

[Chaîne]

 

Les exemples évoluent au fur et à mesure des requêtes.

 

L’insertion : INSERT

Exemple 1 : INSERT INTO messages VALUES(‘2001-12-17 20:07:52′,’1′,’fred’,’C\’est mon premier message’)

 

Cette commande ajoute un enregistrement dans la table ‘messages’.

Vous noterez que l’on a ajouté un anti-slash ‘\’ dans le dernier champ pour indiquer à MySQL de ne pas prendre en compte la guillemet après le ‘C’ comme une fin de chaîne. Notez également que cet anti-slash ne figure pas au final dans la table.

Dans cet exemple, nous partons du principe que les valeurs données respectent scrupuleusement en ordre et en nombre la structure de la table, le premier champ est bien une date, et le dernier le message sous forme d’une chaîne.

date

priorite

nom

message

2001-12-17 20:07:52

1

fred

C’est mon premier message

 

Exemple 2 : INSERT INTO messages VALUES(‘1′,’fred’,’2001-12-17 20:07:52′,’deuxième message’)

 

Ici, nous avons fait une erreur, car nous n’avons pas respecté l’ordre des champs, ce qui ne donne pas le résultat attendu pour le deuxième enregistrement.

 

date

priorite

nom

message

2001-12-17 20:07:52

1

fred

C’est mon premier message

0000-00-00 00:00:00 0 2001-12-17 20:07:52 deuxième message

 

Exemple 3 : INSERT INTO messages VALUES(‘Troisième message’)

Cette commande ne marche pas, et MySQL retourne une erreur (‘Column count doesn’t match value count at row 1’) car le nombre de valeurs que l’on veut insérer ne correspond pas au nombre de champs de la table. Il n’y a donc pas eu d’insertion.

date

priorite

nom

message

2001-12-17 20:07:52

1

fred

C’est mon premier message

0000-00-00 00:00:00 0 2001-12-17 20:07:52 deuxième message

 

xemple 4 : INSERT INTO messages (nom,message,date) VALUES (‘Ingride’,’Message 4′,NOW())

 

Cette fois-ci, il n’y a pas d’erreur, car nous précisons avant de donner les valeurs, le nom des champs à utiliser, ainsi que l’ordre.

Vous remarquez que nous avons omis le champ ‘priorite’ et qu’il a donc pris sa valeur par défaut, qui est dans notre cas : ‘0’.

Notez également que la date est renseignée en faisant appel à une fonction de MySQL : NOW() qui a pour résultat de donner la date courante du serveur.

Remarque : Il est vraiment intéressant de préciser les noms et l’ordre des champs dans une insertion, car si par la suite vous ajoutez un champ supplémentaire, vos anciennes requêtes fonctionneront toujours et utiliseront les valeurs par défaut de votre nouveau champ.

date

priorite

nom

message

2001-12-17 20:07:52

1

fred

C’est mon premier message

0000-00-00 00:00:00

0

2001-12-17 20:07:52

deuxième message

2001-12-17 20:27:17

0

Ingride

Message 4

 

Exemple 5 : INSERT INTO membres (prenom,nom) VALUES(‘Ingride’,’Ibeule’)

 

Cette commande ajoute un enregistrement dans la table ‘membres’. Encore une fois, nous ne donnons pas tous les champs, qui sont donc remplis avec les valeurs par défaut. Or, la valeur par défaut du champ manquant ‘idx’ n’est pas ‘0’, mais ‘1’ car ce champ est un champ auto-incrémenté. La valeur par défaut est donc MAX(idx)+1.

idx

nom

prenom

1 Ibeule Ingride

 

Exemple 6 : INSERT membres (idx,prenom,nom) VALUES(5,’Agathe’,’Zeublouse’)

 

Cette fois ci, le champ ‘idx’ est fixé à ‘5’, malgré que ce champ soit auto-incrémenté. Si le membre ‘5’ existe déjà, on obtiendra l’erreur : “Duplicata du champ ‘5’ pour la clef 1 “.

Comme vous pouvez le remarquer, la directive INTO n’est pas présente, en fait, elle n’a jamais été obligatoire, mais elle l’est pour d’autres bases de données SQL !

x

nom

prenom

1

Ibeule

Ingride

5

Zeublouse

Agathe

 

Exemple 7 : INSERT projets SET idx = ‘1’ , nom = ‘Avenir’

 

Ici, nous introduisons une nouvelle forme de requête d’insertion avec la directive SET où il faut préciser le nom du champ suivit d’un signe ‘=’ (égal) et de la valeur du champ. Tous les couples nom/valeur sont séparés par une virgule.

idx

nom

1

Avenir

 

Le remplacement : REPLACE

Exemple 8 : REPLACE INTO participants (membre,projet,remarque) VALUES(5,1,’Remarque 1′)

 

La commande REPLACE est identique à la commande INSERT !.

Vous me direz “Alors, à quoi ça sert ?”. Voyons l’exemple suivant.

projet

membre

Remarque

1 5 remarque 1

 

Exemple 9 : REPLACE participants SET projet = 1, membre = 5, remarque = ‘Nouvelle remarque’

 

Si j’avais utilisé une commande INSERT, MySQL m’aurait retourné une erreur car le couple projet/membre est unique, et ce couple existe déjà ! La commande REPLACE remplace donc cet enregistrement.

Il n’y a rien de plus à dire sur cette commande qui se comporte comme la commande INSERT.

 

projet

membre

remarque

1 5 Nouvelle remarque

 

L’insertion multiple : INSERT … SELECT

Exemple 10 : INSERT messages (date,nom,message) SELECT NOW(),’MySQL’,CONCAT(‘membre ‘,idx,’ : ‘,prenom,’ ‘,nom) FROM membres

 

Voici une requête intéressante qui permet d’insérer des données en provenance d’autres tables.

Pour mener à bien la chose, il suffit de remplacer la partie VALUE(…) par une commande SELECT … en respectant l’ordre et le nombre de champs à retourner.

 

date

priorite

nom

message

2001-12-17 20:07:52

1

fred

C’est mon premier message

0000-00-00 00:00:00

0

2001-12-17 20:07:52

deuxième message

2001-12-17 20:27:17

0

Ingride

Message 4

2001-12-17 20:13:07

0

MySQL

membre 1 : Ingrid Ibeule

2001-12-17 20:13:07 0 MySQL membre 5 : Agathe Zeublouse

 

La mise à jour : UPDATE

Exemple 11 : UPDATE messages SET priorite = priorite + 1 WHERE nom LIKE ‘%MySQL%’

Cette commande met à jour les enregistrements dont les nom contient ‘MySQL’, en incrémentant le champ ‘priotite’.

 

date

priorite

nom

message

2001-12-17 20:07:52

1

fred

C’est mon premier message

0000-00-00 00:00:00

0

2001-12-17 20:07:52

deuxième message

2001-12-17 20:27:17

0

Ingride

Message 4

2001-12-17 20:13:07

1

MySQL

membre 1 : Ingrid Ibeule

2001-12-17 20:13:07 1 MySQL membre 5 : Agathe Zeublouse

 

Exemple 12 : UPDATE messages SET priorite = 3, priorite = priorite + 5

 

Dans une requête UPDATE, les mises à jour sont exécutées de gauche à droite. Cette commande met donc le champ ‘priorite’ de tous les enregistrement (pas de clause WHERE) à 3, puis le champ ‘priorite’ est incrémenté de ‘5’. Tous les enregistrements ont donc le champ ‘priorite’ à ‘8’.

 

date

priorite

nom

message

2001-12-17 20:07:52

8

fred

C’est mon premier message

0000-00-00 00:00:00

8

2001-12-17 20:07:52

deuxième message

2001-12-17 20:27:17

8

Ingride

Message 4

2001-12-17 20:13:07

8

MySQL

membre 1 : Ingrid Ibeule

2001-12-17 20:13:07 8 MySQL membre 5 : Agathe Zeublouse

 

La suppression : DELETE

Exemple 13 : DELETE FROM participants

 

Nous attaquons ici des requêtes “dangereuses” car nous supprimons des données dans les tables. Il faut donc faire très attention à ce que l’on fait !.

Ici, nous supprimons TOUS les enregistrements de la table ‘participants’ sans distinction.

En fait, dans ce cas précis, MySQL supprime le fichier qui correspond à cette table et la recrée, ce qui est beaucoup plus rapide que d’effacer élément par élément. Mais en contre partie, vous ne pouvez pas connaître le nombre d’éléments supprimés.

projet

membre

remarque

 

Exemple 14 : DELETE FROM messages WHERE date = 0

Cette requête ne supprime que les enregistrements où (WHERE dans la langue de Shakespeare) la valeur du champ date est à ‘0’. C’est déjà mieux que de tout supprimer.

Remarque : Lorsque l’on supprime un enregistrement au”milieu” d’une table, celui-ci laisse une place. Lors de l’insertion suivante, la donnée se placera dans ce “trou”. Donc si vous parcourez cette table sans ordonner (ORDER BY), ne vous étonnez pas si vous retrouvez un enregistrement récent avant un enregistrement ancien.

date

priorite

nom

message

2001-12-17 20:07:52

8

fred

C’est mon premier message

2001-12-17 20:27:17

8

Ingride

Message 4

2001-12-17 20:13:07

8

MySQL

membre 1 : Ingrid Ibeule

2001-12-17 20:13:07 8 MySQL membre 5 : Agathe Zeublouse

 

Exemple 15 : DELETE FROM messages LIMIT 2

Cette requête supprime les messages en se limitant aux 2 premiers enregistrements.

ATTENTION : Avec phpMyAdmin, la clause LIMIT est supprimée, et vous risquez d’avoir de très mauvaise surprise !

 

date

priorite

nom

message

2001-12-17 20:13:07

8

MySQL

membre 1 : Ingrid Ibeule

2001-12-17 20:13:07 8 MySQL membre 5 : Agathe Zeublouse

 

Conclusion

Il existe parfois quelques subtilités en fonction de la version de MySQL, je vous invite donc à consulter la documentation MySQL sur les commandes :

 

INSERT :

REPLACE : http://dev.nexen.net/docs/mysql/annotee/manuel_REPLACE.php#REPLACE

UPDATE :

DELETE : http://dev.nexen.net/docs/mysql/annotee/manuel_DELETE.php#DELETE

 

3 Autre exemples

Tout ces exemples sont fait a partire du client mysql en ligne de commande.

login mysql

$ mysql -u username -p mydatabase

 

Creation d’une base

mysql> CREATE DATABASE suser;

Utilisation de la base

mysql> use suser;

creation d’une table “user” dans la base suser

mysql> CREATE TABLE user (

id int(11) NOT NULL auto_increment,

login char(6) NOT NULL,

passwd char(8),

last_name char(20),

first_name char(20),

birth_date date,

addr1 char(50),

addr2 char(50),

city char(20),

state char(20),

postcode char(10),

country char(15),

email char(50),

phone char(25),

mobphone char(25),

fax char(25),

company char(20),

tvanum char(20),

ok_forspam int(11),

PRIMARY KEY (id),

UNIQUE ix_login (login)

);

 

Visualisation du format de la table

mysql> describe user ;

 

Insérer des donnée

mysql> INSERT INTO user (id, login, passwd, last_name, first_name, birth_date, addr1, addr2, city, state, postcode, country, email, phone, mobphone, fax, company, tvanum, ok_forspam) VALUES (”, ‘cdemaria’, ‘garlaban’, ‘Castro Demaria’, ‘Mike’, ”, ’85 rue de Cannes’, ”, ‘Le Cannet’, ‘AM’, ‘06110’, ‘Fr’, ‘mcd@supersonique.net’, ‘+33 (0)4 93 45 72 46’, ‘+33 (0)6 09 20 52 54’, ”, ‘SuperSonique.Net’, ”, ‘0’)

ou

mysql> INSERT INTO user birth_date=”17/12/72″

 

Voir les tables d’une base

mysql> show tables ;

Effacer la table “user “

mysql> DROP TABLE user

 

Effacer un champ dans “user”

mysql> ALTER TABLE user DROP champaeffacer

 

0.00 avg. rating (0% score) - 0 votes