SQL - Enregistrements




  1. Les Enregistrements



  1. 1. Préliminaire

Tous les exemples qui vont suivre fonctionnent dans le cas de la table Personne.
Pour bien pouvoir manipuler les tables et les enregistrements, il est essentiel de connaître la structure de la table.


  1. 2. Ajouter un enregistrement : INSERT INTO



  1.2.1. Ajout standard : INSERT INTO

Pour ajouter un enregistrement, 3 choses sont importantes à connaître :
  • Les champs pouvant être vides (c'est à dire que leur valeur peut être NULL
  • Les champs remplis automatiquement (auto incrémenté par exemple)
  • Les champs qui doivent être remplis (Les clés, index et champs NOT NULL)
l'ajout d'un enregistrement se fait de la façon suivante :
INSERT INTO Nom_Table VALUES ([Liste des champs]);

Dans notre exemple :
INSERT INTO Personne VALUES ('','Dupont', 'Michel');
INSERT INTO Personne VALUES ('','Dupont', '');


la première valeur étant auto-incrémenté, il est nécessaire de la fixer en utilisant juste le '' comme valeur de champs.
Les champs numériques (Int, TinyInt...) n'ont pas besoin des guillemets (ils sont mêmes à éviter), sauf de le cas d'une valeur par défaut.


  1.2.2. Insertion depuis le contenu d'autres tables : INSERT INTO ... SELECT ...



  1.2.2.1. Structure

Il est possible de faire un insert qui cherche des informations dans une table. Ceci est faisable évidemment si la table existe, sinon, il faut d'abord la créer, et seulement ensuite faire cette insertion. Il est également possible de faire une requête de création de table, mais nous verrons cela plus tard.

Voici la structure de ce genre de requête :
INSERT INTO [Nom_Table] SELECT [Champs] FROM [Table] WHERE [Condition] [Option]
Il est important de noter que le nom des Champs renvoyé par la requête doivent être les mêmes que ceux de la table Nom_Table, de manière à ce que le moteur de BD sache à quel champs associer la valeur renvoyée. De plus, si vous avez des valeurs qui sont calculées automatiquement (un compteur, des sequences...), la valeur du champs n'a pas à être fixée.



  1.2.2.2. Exemple

Supposons que l'on ait une base de ce style :
Table_Generale
Nom_Disque CHAR(50)
Commentaires LONGTEXT
NomPays CHAR(50)
Pays
pId INT AUTO_INCREMENT
NPays CHAR(50)
Disque
dId INT AUTO_INCREMENT
Nom_Disque CHAR(50)
Commentaires LONGTEXT
IdPays INT
Create table Pays (pId int PRIMARY KEY AUTO_INCREMENT, NPays CHAR(50)) Create table Disque (dId int PRIMARY KEY AUTO_INCREMENT, Nom_Disque CHAR(50), Commentaires LONGTEXT, IdPays int);


On souhaite diviser le contenu de la table Table_Generale en mettant dans la table Pays la liste des pays avec l'index numérique associé, et mettre dans la table Disque le nom et les commentaires de chaque disque, et l'Id du pays associé (de la table Pays) dans le champs IdPays.

Il faut d'abord remplir la table Pays.
Pour se faire, on utilise le code suivant :
INSERT INTO Pays SELECT NomPays as NPays FROM Table_Generale GROUP BY NomPays;
Ce code list le contenu de la table Table_generale et regroupe sur le champs NomPays. On remarque également que le Select prend uniquement le champs NomPays (le seul à devoir être ajouté dans la table Pays) et le renomme en NPays (qui est le nom du champs dans la table Pays).

Ensuite, on ajoute dans la table Disque les enregistrements de la table Table_Generale, en mettant le numéro du pays à la place de son nom.
INSERT INTO Disque SELECT NomDisque As NDisque, pId as pIdD FROM Table_Generale, Pays WHERE pIdTG=pId;
Le principe est le même pour pour l'autre requête : on ajoute dans une table à partir d'une requête classique. Tous les champs qui sont à ajouter portent le même nom que dans la table Disque (grâce à la commande As).



  1.2.3. Insertion depuis le contenu d'autres tables : SELECT ... INTO ...



  1.2.3.1. Structure

Le SELECT INTO a le même principe que l'insertion dans une table depuis une requête, sauf que dans ce cas précis, la table n'existe pas avant !
En fait, il s'agit d'un SELECT standard auquel on ajoute juste la clause "INTO".
SELECT [Champs] INTO [Nom_Table] FROM [Table] WHERE [Condition] [Option]



  1.2.3.2. Exemple

En reprenant notre cas précédent, si on dispose des tables "Pays" et "Disque" et que l'on souhaite créer une table "General" pour laquelle on associe le nom du pays au disque en question (obtenir en gros la même table que "table_generale").
Il suffit de faire comme suit :
SELECT dId, Nom_Disque, Commentaires, NPays INTO General FROM Pays, Disque WHERE IdPays=pId
Ceci va donc créer la table "General" avec les 4 champs en gardant les noms dans les anciennes tables.

Si en plus on souhaite préciser les noms des champs, il suffit d'utiliser la commande "as" comme précédemment :
SELECT dId as gId, Nom_Disque as Nom, Commentaires as Comment, NPays as Pays INTO General
FROM Pays, Disque WHERE IdPays=pId
Là, on crée la table avec les 5 champs, mais en fixant leur noms, ce qui peut être excessivement pratique.

Attention, ceci est très pratique, malheureusement, on ne peut créer qu'une table simple (sans clés, ni index). Il peut être nécessaire d'utiliser ensuite la commande ALTER si l'on souhaite en changer la structure...
A vous de voir ce qui vous parait le plus simple !



  1. 3. Modifier un enregistrement : UPDATE

L'utilisation de la fonction UPDATE est assez simple en fait : il suffit de définir sur quelle table la modification doit être faite (UPDATE), quelle est la modification à faire (SET) et sur quels enregistrements (WHERE).
Si par exemple, je souhaite supprimer tous les commentaires de la table Disque, voici ce que je pourrais obtenir comme requête :
UPDATE Disque SET Commentaires='';
Ceci va donc supprimer tous les commentaires de la table Disque.

Maintenant, si je souhaites supprimer les Commentaires uniquement des Disque dont le pays est France, voila ce que j'obtiendrais :
UPDATE Disque SET Commentaires='' WHERE IdPays=1;
Ce code est valable si je connais le code du pays à modifier, ce qui peut être pratique.
Si je ne le connais pas, voici un code qui permet de modifier une table en fonction du contenu d'autres tables :
UPDATE Disque SET Commentaires='' WHERE IdPays=1;

Une autre fonction intéressante consiste à, par exemple, modifier la valeur courante.
Nous allons faire un exemple avec un ajout de '1' à la colonne Avis (qui n'existe pas dans notre exemple, mais supposons qu'il s'agit d'une valeur numérique précisant si on apprécie ou non), et qui ajoute la balise "<b>" au commentaires (ce qui permet de mettre en gras le commentaires en HTML, et ce uniquement pour les IdPays égaux à 1.
La requête sera donc de ce style :
UPDATE Disque
SET Commentaires=concat('<b>',Commentaires,'</b>'), Avis=Avis+1
WHERE IdPays=1;



  1. 4. Supprimer un enregistrement : DELETE

Le DELETE est encore plus simple que le UPDATE. En effet, le DELETE efface tout un enregistrement (une ligne, un tuple) et pas seulement certains champs. Il suffit donc de préciser, grâce à la clause WHERE, quelles sont les valeurs à supprimer.

Si l'on souhaite, par exemple, supprimer tous les enregistrements dont l'IdPays est 2, voici un exemple de requête faisant celà :
DELETE FROM Disque
WHERE IdPays=2;





Page modifiée le : 13/11/2002
Site modifié le : 14/09/2020


Valid XHTML 1.0 Transitional