Easy-Micro

ESPACEMEMBRE SQL
Instructions DML

Data Manipulation Language - Langage de manipulation de données

Formation SQL par Easy-Micro Insertion de données dans une table

Le DML permet de consulter ou modifier le contenu de la base de données comme les clauses SELECT, INSERT ou UPDATE

INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] nomdelatable [(col1, col2,...)]
VALUES (enregcol1 | DEFAULT), (enregcol2 | DEFAULT),...
-> les paramètres entre crochets sont optionnels

On peut utiliser la même syntaxe avec un SELECT à la place du VALUES ou encore un SET avec col1=(expression | DEFAULT), col2=(expression | DEFAULT)...

  • LOW_PRIORITY permet de demander à MySQL d'attendre qu'il n'y ait plus d'autres demandes sur l'objet concerné par l'insertion. Action non prioritaire donc.
  • DELAYED permet de ne pas attendre la fin de l'exécution de l'insertion pour reprendre la main. L'avantage est que MySQL regroupe toutes les insertions ayant l'option DELAYED, l'opération sera donc plus rapide qu'en effectuant des insertion unitaires.
  • IGNORE, s'il est spécifié avec des insertions multiples, demande à MySQL de ne pas tenir compte des enregistrements dont les clés primaires existent déjà. Si l'option n'est pas spécifiée et si un enregistrement contient une clé déjà existante, alors MySQL abandonne l'insertion en cours.
  • INTO est un mot mort, c'est à dire qu'il peut être ou ne pas être spécifié.
  • DEFAULT permet de spécifier une valeur par défaut pour la colonne. Une valeur par defaut permet à MySQl d'effectuer les insertions plus rapidement.

Si nous insérons un enregistrement dans une table contenant une colonne de type AUTO_INCREMENT, alors nous ne sommes pas obligé de spécifier de valeur pour cette colonne. MySQL génère automatiquement la valeur. Si on utilise la syntaxe avec SELECT, nous pouvons insérer dans une table des enregistrements provenant d'une autre table. La requête utilisant le mot SET, bien que moins utilisée, permet une lecture aisée de la syntaxe.

Création des premiers clients et les premiers articles


INSERT INTO clients VALUES
(1, 'DUTRON', 'Pierre','rue duchemin', 44200,'Nantes'),
(2, 'ANGE', 'Raoul','rue blanche', 75009,'Paris'),
(3, 'SURCOUF', 'Eric','rue du pont', 44000,'Nantes'),
(4, 'VASY', 'Philippe','rue montagne', 65100,'Pau'),
(5, 'PONG', 'Eric','bvd voltaire', 75011,'Paris');
INSERT INTO articles VALUES
('CLA01', 'Clavier basic', 20.20,50,1),
('UNI01', 'Unite central pro', 1456,5,1),
('SUI01', 'Suite Bureautique', 100,40,2),
('UNI02', 'Unite central basic', 1032,5,1),
('ANT01', 'Antivirus', 40,50,2),
('CLA02', 'Clavier ergo', 30,23,1);
Récapitulatif des noms de colonnes des deux tables
TABLE clients (idclient , nom, prenom, adresse, codepostal, ville)
TABLE articles (codearticle, nom, prix, stock, idcategorie)

Formation SQL par Easy-Micro Lecture des données

SELECT [DISTINCT]  expression
[INTO - OUTFILE | DUMPFILE -  nomfichier options]
[WHERE definition]
[GROUP BY definition
[Having definition
[ORDER BY definition
[LIMIT [debut,]nbenregistrements]
Sélectionnons toutes les lignes de la table articles
SELECT * FROM articles;

Sélectionnons le code et le nom de la table articles
SELECT codearticle, nom FROM articles;

Si nous précisons le paramètre DISTINCT, MySQL renvoie une seule occurrence des enregistrements en double ou plus.

Formation SQL par Easy-Micro La clause WHERE

La clause WHERE permet de lire les enregistrements répondant à certaines conditions.

Obtenir le nom de l'articles dont le code est UNI01
SELECT nom FROM articles WHERE codearticle='UNI01';

Sélectionner les articles dont le prix est égal à une valeur ou à une autre
SELECT nom FROM articles WHERE prix IN (5, 30);

Lire les enregistrements contenant le mot clavier dans le nom de l'article
SELECT * FROM articles WHERE nom LIKE '%clavier%';

Formation SQL par Easy-Micro La clause UPDATE ... SET

Permet de modifier les données

UPDATE [LOW_PRIORITY] [IGNORE] nomtable
SET nomcolonne1=expression1 [, nomcolonne2=expression2]
[WHERE definition]
[LIMIT #]

• LOW_PRIORITY permet de demander à MySQL d'attendre qu'il n'y ait plus d'autres demandes sur l'objet concerné par l'insertion. Action non prioritaire donc.

• IGNORE, s'il est spécifié avec des insertions multiples, demande à MySQL de ne pas tenir compte des enregistrements dont les clés primaires existent déjà. Si l'option n'est pas spécifiée et si un enregistrement contient une clé déjà existante, alors MySQL abandonne l'insertion en cours.

• WHERE permet de limiter la mise à jour à certains enregistrement.

Exemple pour augmenter tous les prix de 20%
UPDATE articles SET prix=prix*1.20;

Exemple pour diminuer le stock d'articles à chaque fois qu'un article sera acheté
UPDATE articles SET stock=stock-1 WHERE codearticle='UNI01';

Si nous ne connaissons pas la valeur des enregistrements à modifier, nous utilisons le mot LIKE.
Objectif: Ajouter la lettre P au code article de tous les articles contenant le mot clavier. Mais afin de réaliser cette requête, il nous faut d'abord augmenter le nombre de caractère du champ codearticle de la table articles:
ALTER TABLE articles CHANGE codearticle codearticle CHAR(6);

Et voici donc la requête (avec les jockers % ou _ soit tiret infèrieur)
UPDATE articles
SET codearticle=concat(codearticle,'p')
WHERE nom LIKE '%clavier%';

Requête pour supprimer les P
UPDATE articles SET codearticle=TRIM(TRAILING 'p' FROM codearticle);

Autre exemple de requête: Modifier le prix de l'article contenant le mot clavier dans son nom
UPDATE articles SET prix=50 WHERE nom LIKE '%clavier%';

Formation SQL par Easy-Micro Suppression des données

DELETE [LOW_PRIORITY | QUICK] FROM nomtable
[WHERE definition]
[ORDER BY definition [DESC]
[LIMIT #]<

En spécifiant le paramètre QUICK, la suppression est plus rapide dans certain cas.

Supprimons l'article ayant pour code CLA02
DELETE FROM articles WHERE codearticle='CLA02';

Supprimons tous les articles contenant le mot clavier dans le nom
DELETE FROM articles WHERE LIKE='%clavier%';

La clause ORDER BY permet de supprimer les enregidtrements répondant à la clause WHERE mais dans l'ordre spécifié par la clause ORDER BY. Le mot DESC trie les enregistrements dans l'ordre inverse. La clause LIMIT # limite la suppression aux # premiers enregistrements répondant à la clause WHERE.

Récapitulatif des noms de colonnes des deux premières tables
TABLE clients (idclient , nom, prenom, adresse, codepostal, ville)
TABLE articles (codearticle, nom, prix, stock, idcategorie)

Création de la table commande (le TIMESTAMP(6) = YYMMDD et l'idclient correspond à la table client)
CREATE TABLE commandes (
numcommande INT UNSIGNED PRIMARY KEY,
idclient SMALLINT(5) NOT NULL,
codearticle CHAR(5),
date TIMESTAMP(6)
);
INSERT INTO commandes(numcommande, idclient, codearticle, date)  VALUES
(1, 2, 'CLA01', '070322'),
(2, 2, 'CLA01', '070323'),
(3, 4, 'UNI01', '070323');

Supprimons la dernière commande saisie
DELETE FROM commandes ORDER BY date DESC LIMIT 1;

< Page précédente SQL Page suivante >