SQL n’est pas seulement un langage, c’est le cœur qui fait battre les bases de données. Pour qui développe, c’est l’outil qui transforme la masse brute des données en informations structurées, utiles, actionnables. Les requêtes sont la clé de voûte de tout système s’appuyant sur SQL. Voici une sélection des commandes fondamentales à connaître, parce qu’aucune base de données ne tourne sans elles.
| 1. Requête pour lire des tables | 31. Instructions SQL pour la gestion des bases de données |
| 2. Sélectionner les colonnes d’une table | 32. Ajouter de nouvelles tables à une base |
| 3. Extraire des données sous contrainte | 33. Modifier ou supprimer des tables avec SQL |
| 4. Trier les données avec « Order By » | 34. Les bases d’une indexation efficace |
| 5. Utiliser « Grouper par » pour structurer les résultats | 35. Concepts avancés pour booster les performances |
| 6. Compter avec COUNT | 36. Sous-requêtes conditionnelles et leurs résultats |
| 7. Manipuler les données avec SUM | 37. Copier une table par sélection |
| 8. Moyenne de données avec AVG | 38. Gérer les résultats nuls |
| 9. Lister toutes les vues | 39. Clause HAVING |
| 10. Créer une vue | 40. Travailler les chaînes de caractères |
| 11. Lire une vue | 41. COALESCE, pour la première valeur non nulle |
| 12. Mettre à jour une vue | 42. Convertir les types de données |
| 13. Supprimer une vue | 43. Analyse avancée avec DENSE_RANK() |
| 14. Afficher les tables utilisateur | 44. La clause query_partition |
| 15. Visualiser les clés primaires | 45. Extraire les cinq derniers enregistrements |
| 16. Lister les clés uniques | 46. LAG |
| 17. Afficher les clés étrangères | 47. LEAD |
| 18. Voir les déclencheurs | 48. PERCENT_RANK |
| 19. Accéder aux tables internes | 49. MIN |
| 20. Liste des processus | 50. MAX |
| 21. Inverser deux colonnes | 51. Requêtes « Top N » |
| 22. Sélectionner des valeurs uniques | 52. L’analyse « CORR » |
| 23. Générer un Top 25 | 53. Requête NTILE |
| 24. Rechercher avec des caractères génériques | 54. VARIANCE, VAR_POP, VAR_SAMP |
| 25. Filtrer entre deux dates | 55. STDDEV, STDDEV_POP, STDDEV_SAMP |
| 26. Croiser deux tables | 56. Appariement de modèles |
| 27. Fusionner avec UNION | 57. FIRST_VALUE |
| 28. Rendre les colonnes plus lisibles | 58. LAST_VALUE |
| 29. Utiliser ANY et ALL | 59. Fonction « PREDICTION » |
| 30. Commentaires dans SQL | 60. CLUSTER_SET |
1. Requête pour lire des tables
Une base de données organisée autour du schéma My_Schema ? Cette commande vous donne la liste complète des tables présentes :
A lire également : Base de données : Pourquoi Excel n'est pas efficace ?
SELECT * FROM MY_SCHEMA.TABLES;
2. Sélectionner les colonnes d’une table
Pour extraire une colonne précise, comme « Student_ID » de la table Student, il suffit d’écrire :
A lire aussi : Vers une gestion des données plus responsable en entreprise
SELECT STUDENT_ID FROM STUDENT
Et pour visualiser tous les attributs d’une table :
SELECT * FROM STUDENT;
3. Extraire des données sous contrainte
Besoin de cibler un seul employé par son identifiant ? Cette requête remonte uniquement les lignes répondant à la condition :
SELECT EMP_ID, NAME FROM EMPLOYEE_TBL WHERE EMP_ID = ‘0000’;
4. Trier les données avec « Order By »
Classer les résultats selon l’ordre de votre choix, c’est le rôle d’ORDER BY. Que l’attribut soit numérique ou textuel, ascendant ou descendant, SQL s’adapte :
SELECT EMP_ID, LAST_NAME FROM EMPLOYEE WHERE CITY = ‘Seattle’ ORDER BY EMP_ID
Pour préciser explicitement l’ordre :
SELECT EMP_ID, LAST_NAME FROM EMPLOYEE_TBL WHERE CITY = ‘INDIANAPOLIS’ ORDER BY EMP_ID ASC;
5. Utiliser « Grouper par » pour structurer les résultats
Le regroupement par attribut permet de synthétiser l’information :
SELECT Name, Age FROM Patients WHERE Age > 40 GROUP BY Age ORDER BY Name
Manipuler les données avec les fonctions mathématiques
SQL embarque des fonctions puissantes comme COUNT ou AVG, bien pratiques pour compter ou calculer des moyennes sur vos résultats.
6. Compter avec COUNT
Pour savoir combien de clients vous avez par pays :
SELECT COUNT(CustomerID), Country FROM Customers GROUP BY Country;
7. Manipuler les données avec SUM
Pour additionner tous les salaires des employés de moins de 30 ans :
SELECT SUM(salary) FROM Employee WHERE Emp_Age < 30;
8. Moyenne de données avec AVG
Obtenir la moyenne d’un prix sur la table Products :
SELECT AVG(Price) FROM Products;
9. Lister toutes les vues
Pour afficher toutes les vues d’un schéma :
SELECT * FROM MY_SCHEMA.VIEWS;
10. Créer une vue
Une vue, c’est l’équivalent d’une table virtuelle générée par une requête. L’intérêt ? Simplifier de futures analyses en évitant de répéter une requête complexe à chaque fois. Par exemple :
CREATE VIEW Failing_Students AS SELECT S_NAME, STUDENT_ID FROM STUDENT WHERE GPA < 40;
11. Lire une vue
Accéder aux données d’une vue s’effectue comme pour une table classique :
SELECT * FROM failing_students;
12. Mettre à jour une vue
Pour rafraîchir ou générer une vue « Product List » selon une condition :
CREATE OR REPLACE VIEW ProductList AS SELECT ProductID, ProductName, Category FROM Products WHERE Discontinued = No;
13. Supprimer une vue
Nettoyer une vue devenue inutile :
DROP VIEW V1
14. Afficher les tables utilisateur
Les tables utilisateur sont créées par le développeur ou l’application. Pour les lister :
SELECT * FROM SYS.Objects WHERE type=’u’
15. Visualiser les clés primaires
Pour identifier les champs qui servent de clé primaire :
SELECT * FROM Sys.Objects WHERE TYPE=’PK’
16. Lister les clés uniques
Une clé unique garantit l’unicité des valeurs pour une colonne donnée. Pour les repérer :
SELECT * FROM Sys.Objects WHERE TYPE=’UQ’
17. Afficher les clés étrangères
Les clés étrangères relient les tables entre elles. Pour lister celles en place :
SELECT * FROM SYS.Objects WHERE TYPE=’F’
18. Voir les déclencheurs
Un déclencheur lance une action automatique à la survenue d’un événement. Pour les inventorier :
SELECT * FROM SYS.Objects WHERE TYPE=’TR’
19. Accéder aux tables internes
Les tables internes sont générées en complément des actions utilisateur, mais restent inaccessibles pour la modification. Pour visualiser leurs métadonnées :
SELECT * FROM SYS.Objects WHERE TYPE=’IT’
20. Liste des processus
Un processus stocké regroupe plusieurs requêtes dans une même unité logique. Pour savoir ce qui existe :
SELECT * FROM Sys.Objects WHERE type=’p’
21. Inverser deux colonnes
Imaginons une table Clients où les champs téléphone et code postal auraient été inversés par erreur : une simple requête corrige la situation d’un coup :
UPDATE Clients SET Zip=Phone, Phone=Zip
22. Sélectionner des valeurs uniques
Pour extraire uniquement les identifiants clients distincts, pratique si des doublons se glissent :
SELECT DISTINCT ID FROM Clients
23. Générer un Top 25
Lorsque la table Clients enfle, il peut être utile de ne remonter qu’un échantillon de 25 lignes :
SELECT TOP 25 * FROM Clients WHERE Customer_ID IS NOT NULL
24. Rechercher avec des caractères génériques
Dans une table de milliers de clients, isoler tous ceux dont le nom commence par « Herb » devient un jeu d’enfant grâce au joker % :
SELECT * FROM Clients WHERE Name LIKE ‘Herb%’
25. Filtrer entre deux dates
Pour retrouver toutes les commandes passées entre lundi et mardi, la clause BETWEEN fait le travail :
SELECT ID FROM Orders WHERE Date BETWEEN ’01/12/2018′ AND ’01/13/2018′
26. Croiser deux tables
Les bases de données relationnelles existent pour ce genre d’opération : trouver les correspondances entre deux tables. INNER JOIN permet d’afficher toutes les entrées partagées :
SELECT ID FROM Customers INNER JOIN Orders ON Customers.id = Orders.id
Ici, seules les lignes où l’ID client figure dans les deux tables sont retenues. D’autres variantes de JOIN permettent d’autres croisements, mais mieux vaut démarrer avec la version la plus courante.
27. Fusionner avec UNION
Pour combiner en une seule liste les numéros de téléphone extraits de la table Clients et les articles issus de la table Orders :
SELECT Phone FROM Clients UNION SELECT Item FROM Orders
UNION sert aussi à générer des tableaux personnalisés à partir de plusieurs requêtes.
28. Rendre les colonnes plus lisibles
Renommer temporairement l’affichage d’une colonne facilite la lecture, surtout quand les intitulés sont cryptiques par défaut :
SELECT Item AS item_description FROM Orders
29. Utiliser ANY et ALL
Parfois, il faut filtrer sur « n’importe quelle » ou « toutes les » valeurs parmi un sous-ensemble. Les mots-clés ANY et ALL entrent alors en jeu. Exemple : afficher les articles commandés par tous les clients ayant commandé plus de 50 unités :
SELECT Item FROM Orders WHERE id = ALL (SELECT ID FROM Orders WHERE quantity > 50)
30. Commentaires dans SQL
Les commentaires, qu’ils soient sur une ligne (—) ou sur plusieurs (/* … */), sont vitaux pour clarifier le sens d’un script. Ils permettent aussi de désactiver temporairement une portion de code sans la supprimer :
/* Cette requête n’est pas exécutée car elle est commentée */
/* SELECT Item FROM Orders WHERE DATE = ALL (SELECT ORDER_ID FROM ORDERS WHERE quantity > 50) */
SELECT item — commentaire en ligne
FROM Orders — autre commentaire
WHERE id = ALL (SELECT ID FROM Orders WHERE quantity > 25)
31. Instructions SQL pour la gestion des bases de données
Passer du requêtage à la gestion structurelle : pour créer une nouvelle base, rien de plus simple :
CREATE DATABASE ALLSales
32. Ajouter de nouvelles tables à une base
Pour créer la table Clients, avec ses différents champs :
CREATE TABLE Clients (ID varchar(80), Name varchar(80), Phone varchar(20), …);
Bien que la plupart des bases soient générées par des outils graphiques, il est toujours utile de savoir écrire ces commandes à la main, par exemple lors de l’installation d’une application qui exige un nom de base à la création.
33. Modifier ou supprimer des tables avec SQL
Un anniversaire à souhaiter ? Ajoutez la colonne correspondante à la table Clients :
ALTER TABLE Clients ADD Birthday varchar(80)
Pour supprimer une table devenue obsolète ou endommagée :
DROP TABLE table_name
34. Les bases d’une indexation efficace
Une clé primaire doit contenir uniquement des valeurs uniques. Cela garantit la fiabilité des opérations de jointure. Exemple de table Clients avec ID comme clé primaire :
CREATE TABLE Clients (ID int NOT NULL, Name varchar(80) NOT NULL, PRIMARY KEY (ID));
Pour rendre l’incrémentation de l’ID automatique :
ID int NOT NULL AUTO_INCREMENT
35. Concepts avancés pour booster les performances
Pour optimiser la vitesse, il vaut mieux spécifier les colonnes à sélectionner plutôt que d’utiliser le joker *. Par exemple :
SELECT Name, Birthday, Phone, Address, Zip FROM Clients
Autre astuce : éviter de préfixer les procédures stockées par « sp_ », et activer NOCOUNT ON pour limiter le comptage systématique des lignes affectées. INNER JOIN avec condition est aussi plus rapide que WHERE sur de grands ensembles. Approfondir ces techniques permet de franchir un cap en production. Si vous avez parcouru les exemples précédents, vous aurez remarqué l’usage fréquent d’INNER JOIN.
36. Sous-requêtes conditionnelles et leurs résultats
L’opérateur EXISTS vérifie la présence d’entrées dans une sous-requête et retourne TRUE si c’est le cas. Exemple :
SELECT Name FROM Customers WHERE EXISTS (SELECT Item FROM Orders WHERE Customers.id = Orders.id AND Price > 50)
Ici, la requête renvoie TRUE si le client a passé une commande supérieure à 50€.
37. Copier une table par sélection
Pour archiver les commandes d’une année, il suffit de les copier dans une nouvelle table :
INSERT INTO Yearly_Orders SELECT * FROM Orders WHERE Date <= ‘1/1/2018’
Les commandes de l’année 2018 sont ainsi archivées.
38. Gérer les résultats nuls
Quand un champ peut contenir NULL, utiliser IFNULL permet de remplacer cette absence de valeur par zéro lors des calculs :
SELECT Item, Price * (QtyInStock + IFNULL(QtyOnOrder, 0)) FROM Orders
39. Clause HAVING
La clause WHERE ne s’applique pas aux résultats de fonctions d’agrégation : pour filtrer après un GROUP BY, HAVING s’impose. Exemple : compter les clients en stock par région uniquement si au moins un client existe par région :
SELECT COUNT(ID), Region FROM Clients GROUP BY Region HAVING COUNT(ID) > 0;
40. Travailler les chaînes de caractères
Les fonctions sur les chaînes, comme SUBSTRING_INDEX, facilitent la manipulation des contenus textuels. Pour isoler la partie gauche d’une adresse web après le deuxième point :
SELECT SUBSTRING_INDEX(‘www.bytescout.com’, ‘.’, 2);
20 autres exemples de requêtes SQL utiles restent à explorer…
41. COALESCE, pour la première valeur non nulle
La fonction COALESCE prend une liste de valeurs et renvoie la première qui n’est pas nulle. Pratique pour gérer les valeurs manquantes.
Syntaxe
SELECT COALESCE(NULL, NULL, ‘BytesCout’, NULL, ‘Byte’)
Résultat : BytesCout
42. Convertir les types de données
Pour transformer par exemple un nombre décimal en entier, la fonction CONVERT s’utilise ainsi :
Syntaxe
SELECT CONVERT(int, 27.64)
Résultat : 27
43. Analyse avancée avec DENSE_RANK()
DENSE_RANK() attribue un rang à chaque ligne d’un ensemble ordonné. Les rangs sont consécutifs, même si plusieurs lignes partagent la même valeur. Exemple d’attribution de rangs à des employés :
SELECT eno, dno, salary, DENSE_RANK() OVER (PARTITION BY dno ORDER BY salary) AS ranking FROM Employee;
Ce code classe les employés par département et par salaire, sans trou dans la séquence des rangs.
44. La clause query_partition
La clause query_partition_clause répartit les résultats en sous-ensembles pour appliquer des fonctions analytiques. Si elle n’est pas utilisée, l’ensemble du résultat est traité comme une seule partition. Par exemple, pour calculer la moyenne des salaires sur tout l’effectif :
SELECT eno, dno, salary, AVG(salary) OVER () AS avg_sal FROM Employee;
Chaque ligne affiche le salaire et la moyenne globale du tableau.
45. Extraire les cinq derniers enregistrements
Obtenir les dernières lignes d’une table est parfois laborieux, surtout avec de grandes quantités de données. Utiliser « rownum » ou une clause « UNION » permet de les récupérer. Par exemple, pour les huit derniers enregistrements :
SELECT * FROM Employee A WHERE rownum <= 8 UNION SELECT * FROM (SELECT * FROM Employee ORDER BY ID DESC) WHERE rownum <= 8
Les requêtes SQL, loin d’être un simple outil, sont le véritable squelette de toute base de données. Les maîtriser, c’est s’assurer de transformer l’inertie des données en un levier pour l’action. Demain, c’est peut-être une seule de ces requêtes qui révélera l’insight que tout le monde attendait.
