Cet article sur l’instruction SQL Delete fait partie de la série SQL essential sur les instructions, fonctions et opérations clés de SQL Server.
Supprimer une ligne d’une table s’effectue par le biais d’une instruction DML (Data Manipulation Language), alias DML, en utilisant le mot-clé delete. L’opération de suppression SQL est de loin la plus simple de toutes les commandes DML. Lors de l’exécution de la commande delete, nous n’avons pas à nous soucier de récupérer des données de la table, ni de travailler avec les données que nous récupérons de la ou des tables. Nous demandons simplement à la base de données de supprimer un enregistrement spécifique, et elle le fait ou ne le fait pas. C’est aussi simple que cela.
D’abord, passons rapidement en revue ce à quoi ressemble une instruction SQL Delete. Nous devons indiquer à la base de données et à la table d’où elle doit supprimer les données. C’est une bonne idée d’ajouter une clause conditionnelle pour définir la portée de la suppression des données. Sinon, elle supprimera tout ce qui se trouve dans la table.
Regardons notre table et supprimons quelques enregistrements.
Comment supprimer des lignes sans clause where
L’exemple suivant supprime toutes les lignes de la table Person.Person the de la base de données AdventureWorks2014. Aucune restriction n’est appliquée à l’instruction de suppression SQL utilisant une clause WHERE.
.
|
Utiliser Adventureworks2014 ;
GO
DELETE FROM .;
|
Comment supprimer des lignes avec la clause where
L’exemple suivant supprime des lignes de la table . de la base de données AdventureWorks2014 dans lesquelles la valeur de la colonne businessEntityID est supérieure à 30,000
|
Utiliser Adventureworks2014 ;
GO
DELETE FROM .
WHERE businessEntityID > 30000 ;
|
Note : Une erreur malheureuse qui peut se produire est d’exécuter accidentellement un SQL Delete sans clause Where et de supprimer par inadvertance toutes vos données. Pour éviter que cela ne se produise, envisagez d’utiliser la fonction de garde d’exécution d’ApexSQL Complete, pour vous mettre en garde contre de telles actions potentiellement dommageables, avant que vous ne les exécutiez. En savoir plus : Alertes d’exécution
Comment supprimer des lignes en utilisant Top avec clause where
L’exemple suivant supprime 50 lignes aléatoires de la table Person.Person de la base de données AdventureWorks2014. La valeur dans le BusinessEntityID doit être comprise entre 30 000 et 40,000
|
Utiliser Adventureworks2014 ;
GO
DELETE TOP(50) FROM .
WHERE BusinessEntityID entre 30000 et 40000
|
Note : Le lorsque la clause TOP (n) est utilisée avec l’instruction SQL Delete et toute instruction DML (c’est-à-dire . Select, Insert, Delete et Update), l’opération est effectuée sur une sélection aléatoire d’un nombre de lignes spécifiées dans la clause Top.
Comment supprimer les lignes en double
Dans le monde réel, nous avons tendance à recueillir des données provenant de différentes sources ; il n’est pas rare d’avoir des enregistrements en double. Une approche du problème des doublons consiste d’abord à identifier où les doublons se sont produits. Et d’exécuter une requête select sur ces colonnes.
L’exemple suivant utilise l’argument PARTITION BY pour partitionner le jeu de résultats de la requête par toutes les colonnes de la table tb_spaceused. La fonction Row_Number (), une fonction fenêtre, ce qui signifie qu’elle opère sur un ensemble ordonné. La clause ORDER BY spécifiée dans la clause OVER ordonne les lignes de chaque partition par l’ensemble des colonnes de la table tb_spaceused.
1
2
3
4
5
6
.
7
8
9
10
11
12
13
14
15
|
WITH CTE
AS (SELECT *,
ROW_NUMBER() OVER(PARTITION BY database_name,
database_size,
,
réservé,
données,
taille_index,
inutilisé
Ordre par nom de base de données
) AS Row_Num
FROM tb_spaceused)
SeLECT *
FROM CTE
WHERE Row_Num <> 1 ;
|
Remplacer l’instruction Select par une Delete supprime tous les doublons de la table.
1
2
3
4
5
6
7
.
8
9
10
11
12
13
14
15
16
17
|
WITH CTE
AS (SELECT *,
ROW_NUMBER() OVER(PARTITION BY database_name,
database_size,
,
réservé,
données,
taille de l’index,
inutilisé
Ordre par nom de la base de données
). AS Row_Num
FROM tb_spaceused)
–SELECT *
–FROM CTE
–WHERE Row_Num <> 1 ;
Effacer de l’ETC
WhERE Row_Num <> 1 ;
|
Comment supprimer des lignes à l’aide de sous-requêtes
Dans l’exemple suivant, les lignes d’une table sont supprimées en fonction des données d’une autre table. Dans les exemples, les lignes de la table SalesPersonQuotaHistory sont supprimées en fonction de la colonne SalesYTD de la table SalesPerson.
|
DELETE FROM Sales.SalesPersonQuotaHistory
WHERE BusinessEntityID IN
(
SELECT BusinessEntityID
FROM Sales.SalesPerson
WHERE SalesYTD > 4900000.00
) ;
GO
|
Comment supprimer des lignes en utilisant des jointures SQL
Dans cette section, nous allons utiliser l’instruction SQL Delete pour supprimer les données de la base de données Adeventureworks2014. Supprimer des données, à première vue, semble trivial, mais une fois que nous entrons dans la conception d’une grande base de données, les choses pourraient ne plus être les mêmes et faciles.
Dans de nombreux cas, les tables sont liées via une relation de clé primaire et étrangère. Dans l’exemple suivant, nous pouvons voir une utilisation des jointures pour supprimer les données de la table Sales.SalesPersonQuotaHistory.
|
DELETE sq
FROM Sales.SalesPersonQuotaHistory sq
INNER JOIN Sales.SalesPerson sp ON sq.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 4500000.00 ;
GO
|
Comment supprimer des lignes d’une table distante en utilisant des serveurs liés et OpenQuery
L’exemple suivant utilise l’instruction SQL delete pour supprimer des lignes d’une table distante en utilisant le serveur lié nommé, hqdbt01. Interrogez ensuite la table distante en utilisant la convention de dénomination d’objets à quatrepartie pour supprimer les lignes de la table distante
|
DELETE
FROM .AdventureWorks2014..
WHERE ShiftID = 2 ;
|
Dans l’exemple suivant, la table distante est interrogée en spécifiant la fonction OPENQUERY rowset avec la commande delete.
|
DELETE OPENQUERY (hqdbt01, ‘SELECT *
FROM AdventureWorks2014.HumanResources.Department
WHERE DepartmentID = 18′) ;
|
Comment supprimer des lignes à l’aide de SSMS
L’utilisation du SQL Server Management Studio (SSMS), de l’interface utilisateur graphique (GUI) pour supprimer des lignes implique une recherche manuelle. En réalité, il sera beaucoup plus facile et rapide de supprimer des enregistrements avec une requête SQL.
Allons-y et localisons la table pour utiliser une instruction de suppression SQL, dans ce cas, la table dbo.cities est sélectionnée. Maintenant, faites un clic droit et choisissez Modifier les 200 premières lignes. Cette option ouvre une fenêtre de concepteur de requêtes. Ensuite, cliquez avec le bouton droit de la souris sur la fenêtre et sélectionnez Exécuter SQL et écrivez une nouvelle requête qui supprimera les lignes de la table dbo.cities.
Dans le volet des résultats, assurez-vous que l’instruction SELECT tire les bons enregistrements ciblés avant de commencer à supprimer des lignes. Sélectionnez les lignes et faites un clic droit sur les lignes et choisissez Supprimer pour supprimer les lignes de la table.
Résumé
Jusqu’ici, nous avons vu de nombreuses façons différentes d’utiliser l’instruction SQL delete pour supprimer des données. Mais, il y a une liste de considération à suivre tout en utilisant l’instruction delete, et elle est la suivante:
- Il est toujours recommandé de commencer par une instruction SELECT avant de supprimer quoi que ce soit pour s’assurer que vous ciblez les bons enregistrements. Ainsi, l’instruction delete est utilisée pour supprimer les lignes d’une table en utilisant la clause where pour sélectionner uniquement les lignes à supprimer
- Toujours utiliser un identifiant unique pour localiser les lignes que vous devez supprimer
- Pour supprimer toutes les lignes d’une table, utilisez toujours TRUNCATE TABLE. TRUNCATE TABLE qui est plus rapide qu’une instruction SQL delete et qui utilise moins de ressources système et de journal de transaction
- Par défaut, les instructions DELETE induisent un verrou exclusif (X) sur la table, et il maintient le verrou jusqu’à la fin de la transaction
- Un verrou exclusif empêche les autres transactions de modifier les données ; les opérations de lecture sont autorisées avec l’utilisation de l’indice NOLOCK ou du niveau d’isolation read uncommitted
- Il est recommandé de spécifier l’indice TABLOCK dans l’instruction delete. Ce processus permet la désallocation des pages et l’espace associé disponible pour être réutilisé par d’autres objets de la base de données
- C’est une bonne pratique de créer un index clusterisé sur la table heap avant d’exécuter une instruction delete
- Bien que très simple et très puissant, et le résultat d’une instruction Delete est destructeur. Les lignes supprimées ne peuvent pas être facilement récupérées
Note : Pour récupérer les lignes supprimées, voir Récupération après sinistre de SQL Server – Comment récupérer rapidement les données perdues en raison d’une opération de suppression involontaire
C’est tout pour le moment… J’espère que vous avez apprécié la lecture de cet article sur l’instruction SQL delete. Si vous avez des questions, n’hésitez pas à commenter ci-dessous.
.
Je suis un technologue des bases de données ayant 11+ années de riche, expérience pratique sur les technologies de base de données. Je suis un professionnel certifié Microsoft et soutenu par un diplôme de maîtrise en application informatique.
Ma spécialité réside dans la conception & la mise en œuvre de solutions de haute disponibilité et la migration de DB multiplateforme. Les technologies sur lesquelles je travaille actuellement sont SQL Server, PowerShell, Oracle et MongoDB.
Voir tous les messages de Prashanth Jayaram
Derniers messages de Prashanth Jayaram (voir tous)
- Un aperçu rapide de l’audit de base de données en SQL – 28 janvier, 2021
- Comment configurer Azure Data Sync entre les bases de données Azure SQL et le serveur SQL sur site – 20 janvier 2021
- Comment effectuer des opérations d’importation/exportation de bases de données Azure SQL à l’aide de PowerShell – 14 janvier 2021
.