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 :
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 :
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 Là, on crée la table avec les 5 champs, mais en fixant leur noms, ce qui peut être excessivement pratique.FROM Pays, Disque WHERE IdPays=pId 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; |