Archives de catégorie : SQL cours

SQL INNER JOIN

Les jointures internes INNER JOIN ou les jointures égales sont des jointures qui incluent uniquement les lignes où les valeurs des colonnes jointes correspondent.

Vous pouvez coder les jointures internes soit par syntaxe implicite, soit par syntaxe explicite.

Syntaxe : implicite

SELECT nom_colonne(s)
  FROM table1
  INNER JOIN table2
    ON table1.nom_colonne = table2.nom_colonne;

Syntaxe : explicite

SELECT nom_colonne(s)
  FROM table1, table2
 WHERE table1.nom_colonne = table2.nom_colonne;

Base de données DB2 :

Examinons les données du tableau “Commandes” ci-dessous :

Numéro-CommandeNuméro-ClientDate-Commande
1001102020-09-08
1002992020-09-01
1003172020-08-25
1004762020-09-19
1005442020-09-25

Examinons les données du tableau “Clients” ci-dessous :

Numéro-ClientNom-ClientPays
76JackAmérique
17JancyAllemagne
20CarmenRussie
10robertInde
99BrianChine

Notez que la colonne « Numéro de client » dans la table « Commandes » fait référence au « Numéro de client » dans la table « Clients ». La relation entre les deux tables ci-dessus est la colonne “Numéro-Client”.

Voyons comment créer une instruction SQL qui sélectionne les enregistrements dont les valeurs correspondent dans les deux tables.

L’instruction SQL suivante sélectionne toutes les commandes avec des informations client.

Exemple:

SELECT Commandes.Numero_Commande, Clients.Nom_Client, Commandes.Date_Commande
  FROM Commandes
 INNER JOIN Clients ON Commandes.Numero_Client=Clients.Numero_Client;

Le mot clé INNER JOIN sélectionne toutes les lignes des deux tables tant qu’il existe une correspondance entre les colonnes. S’il y a des enregistrements dans la table “Commandes” qui n’ont pas de correspondance dans “Clients”, ces commandes ne seront pas affichées.

Résultat:
Numéro-CommandeNom-ClientDate-Commande
1001robert2020-09-08
1002Brian2020-09-01
1003Jancy2020-08-25
1004Jack2020-09-19

L’instruction SQL suivante est identique à l’exemple d’instruction SQL ci-dessus.

SELECT Commandes.Numero_Commande, Clients.Nom_Client, Commandes.Date_Commande
  FROM Commandes, Clients
  Where Commandes.Numero_Client = Clients.Numero_Client;

SQL LEFT OUTER JOIN

Le mot clé LEFT JOIN renvoie tous les enregistrements de la table de gauche (table1) et les enregistrements correspondants de la table de droite (table2). Le résultat est NULL du côté droit, s’il n’y a pas de correspondance.

Syntaxe:

SELECT nom_colonne(s)
  FROM table1
  LEFT JOIN table2
   ON table1.nom_colonne = table2.nom_colonne;

Base de données DB2 :

Examinons les données du tableau “Commandes” ci-dessous :

Numéro-CommandeNuméro-ClientDate-Commande
1001102020-09-08
1002992020-09-01
1003172020-08-25
1004762020-09-19
1005442020-09-25

Examinons les données du tableau “Clients” ci-dessous :

Numéro-ClientNom-ClientPays
76JackAmérique
17JancyAllemagne
20CarmenRussie
10robertInde
99BrianChine

Notez que la colonne « Numéro-Client » dans la table « Commandes » fait référence au « Numéro de client » dans la table « Clients ». La relation entre les deux tables ci-dessus est la colonne “Numéro-Client”.

Voyons comment créer une instruction SQL qui sélectionnera tous les clients et toutes les commandes qu’ils pourraient avoir passées.

SELECT Clients.Nom_Client, Commandes.Numero_Commande
  FROM Clients
  LEFT JOIN Commandes ON Clients.Numero_Client = Commandes.Numero_Client
  ORDER BY Clients.Nom_Client;
Explication:

Le mot-clé LEFT JOIN renvoie tous les enregistrements de la table de gauche (Clients), même s’il n’y a pas de correspondance dans la table de droite (Commandes).

Résultat:
Nom-ClientNuméro-Commande
Brian1002
Carmennul
Jack1004
Jancy1003
robert1001

Avez-vous remarqué le résultat des jointures externes GAUCHE et DROITE ? 
Le résultat est le même. Est-ce que tu sais pourquoi? parce que nous venons d’échanger la table dans l’instruction SQL.

SQL RIGHT OUTER JOIN

Le mot clé RIGHT JOIN renvoie tous les enregistrements de la table de droite (table2) et les enregistrements correspondants de la table de gauche (table1). Le résultat est NULL à partir du côté gauche, lorsqu’il n’y a pas de correspondance.

Syntaxe:

SELECT nom_colonne(s)
  FROM table1
  RIGHT JOIN table2
   ON table1.nom_colonne = table2.nom_colonne;

Base de données DB2 :

Examinons les données du tableau “Commandes” ci-dessous :

Numéro-CommandeNuméro-ClientDate-Commande
1001102020-09-08
1002992020-09-01
1003172020-08-25
1004762020-09-19
1005442020-09-25

Examinons les données du tableau “Clients” ci-dessous :

Numéro-ClientNom-ClientPays
76JackAmérique
17JancyAllemagne
20CarmenRussie
10robertInde
99BrianChine

Notez que la colonne « Numéro-Client » dans la table « Commandes » fait référence au « Numéro de client » dans la table « Clients ». La relation entre les deux tables ci-dessus est la colonne “Numéro-Client”.

Voyons comment créer une instruction SQL qui renverra tous les noms de clients et toutes les commandes qu’ils pourraient avoir passées :

SELECT Clients.Nom_Client, Commandes.Numero_Commande
  FROM Commandes
  LEFT JOIN Clients ON Commandes.Numero_Commande = Clients.Numero_Client;
  ORDER BY Clients.Nom_Client;
Explication:

Le mot-clé RIGHT JOIN renvoie tous les enregistrements de la table de droite (Clients), même s’il n’y a aucune correspondance dans la table de gauche (Commandes).

Résultat:
Nom-ClientNuméro-Commande
Brian1002
Carmennul
Jack1004
Jancy1003
robert1001

Avez-vous remarqué le résultat de la jointure externe DROITE et externe GAUCHE ? 
Le résultat est le même. Est-ce que tu sais pourquoi? parce que nous venons d’échanger la table dans l’instruction SQL.

SQL FULL OUTER JOIN

Le mot-clé FULL OUTER JOIN renvoie tous les enregistrements lorsqu’il existe une correspondance dans les enregistrements de table de gauche (table1) ou de droite (table2). FULL OUTER JOIN et FULL JOIN sont identiques.

FULL OUTER JOIN peut potentiellement renvoyer de très grands ensembles de résultats. Parce que FULL OUTER JOIN renvoie tous les enregistrements correspondants des deux tables, que l’autre table corresponde ou non.

Syntaxe:

SELECT nom_colonne(s)
  FROM table1
  FULL OUTER JOIN table2
  ON table1.nom_colonne = table2.nom_colonne
  WHERE condition;

Base de données DB2 :

Examinons les données du tableau “Commandes” ci-dessous :

Numéro-CommandeNuméro-ClientDate-Commande
1001102020-09-08
1002992020-09-01
1003172020-08-25
1004762020-09-19
1005442020-09-25

Examinons les données du tableau “Clients” ci-dessous :

Numéro-ClientNom-ClientPays
76JackAmérique
17JancyAllemagne
20CarmenRussie
10robertInde
99BrianChine

Notez que la colonne « Numéro de client » dans la table « Commandes » fait référence au « Numéro de client » dans la table « Clients ». La relation entre les deux tables ci-dessus est la colonne “Numéro-Client”.

Voyons comment créer une instruction SQL qui sélectionnera tous les clients et toutes les commandes :

SELECT Clients.Nom_Client, Commandes.Numero_Commande
  FROM Clients
  FULL OUTER JOIN Commandes ON Clients.Numero_Client = Commandes.Numero_Client
  ORDER BY Clients.Nom_Client;
Résultat:
Nom-ClientNuméro-Commande
Brian1002
Carmennull
Jack1004
Jancy1003
robert1001
null1005

Opérateur SQL UNION

À l’aide d’UNION, plusieurs instructions SELECT peuvent être spécifiées et leurs résultats peuvent être combinés en un seul ensemble de résultats.

Une UNION doit être composée de deux ou plusieurs instructions SELECT, chacune séparée par le mot-clé UNION.

Chaque requête dans une UNION doit contenir les mêmes colonnes, expressions ou fonctions d’agrégation Les types de données des colonnes doivent être compatibles

Les noms de colonne dans le jeu de résultats sont généralement égaux aux noms de colonne dans la première instruction SELECT de l’UNION.

Syntaxe : UNION

SELECT Nom_Colonne(s) FROM table1
  UNION
SELECT Nom_Colonne(s) FROM table2;

L’UNION supprime automatiquement toutes les lignes en double du jeu de résultats de la requête.

Si vous voulez que toutes les occurrences de toutes les correspondances soient renvoyées, vous pouvez utiliser UNION ALL.

Syntaxe : UNION ALL

SELECT Nom_Colonne(s) FROM table1
  UNION ALL
SELECT Nom_Colonne(s) FROM table2;

Base de données DB2 :

Examinons les données du tableau “Commandes” ci-dessous :

Numéro-CommandeNuméro-ClientDate-CommandeVille
1001102020-09-08Londres
1002992020-09-01New York
1003172020-08-25Paris
1004762020-09-19Dubai
1005442020-09-25Sidney

Examinons les données du tableau “Clients” ci-dessous :

Numéro-ClientNom-CientPaysVille
76JackAmériqueNew York
17JancyAllemagneCalifornie
20CarmenRussieLondres
10robertIndeNew Delhi
99BrianChineChennai

Exemple 1:

L’instruction SQL suivante renvoie les villes (uniquement des valeurs distinctes) des tables “Commandes” et “Clients”.

SELECT Ville FROM Commandes
  UNION ALL
SELECT Ville FROM Clients
  ORDER BY Ville ;

Si “Commandes” ou “Clients” ont la même ville, chaque ville ne sera listée qu’une seule fois, car UNION ne sélectionne que des valeurs distinctes. Utilisez UNION ALL pour inclure les valeurs en double.

Résultat:

Ville
Californie
Chennai
Dubai
Londres
New Delhi
New York
Paris
Sidney

Si vous souhaitez que toutes les occurrences de toutes les correspondances soient renvoyées, vous pouvez utiliser UNION ALL au lieu de UNION.

Exemple 2 :

L’instruction SQL suivante renvoie les villes (avec des doublons) des tables “Commandes” et “Clients”.

SELECT Ville FROM Commandes
  UNION 
SELECT Ville FROM Clients
  ORDER BY Ville ;

Si “Commandes” ou “Clients” ont la même ville, chaque ville ne sera listée qu’une seule fois, car UNION ne sélectionne que des valeurs distinctes. Utilisez UNION ALL pour sélectionner également les valeurs en double

Résultat:

Ville
Californie
Chennai
Dubai
Londres
Londres
New Delhi
New York
New York
Paris
Sidney

Instruction SQL GROUP BY

L’instruction GROUP BY est utilisée pour regrouper les lignes qui ont les mêmes valeurs dans la table.

Le regroupement vous permet de diviser les données en ensembles logiques afin que vous puissiez effectuer des calculs agrégés sur chaque groupe. Les groupes sont créés à l’aide de la clause GROUP BY dans l’instruction SELECT.

La clause GROUP BY demande au DB2 de regrouper les données, puis d’effectuer l’agrégation sur chaque groupe plutôt que sur l’ensemble des résultats.

Syntaxe:

SELECT nom_colonne(s)
  FROM nom_table 
  WHERE condition
  GROUP BY nom_colonne(s);

Base de données DB2 :

Vous trouverez ci-dessous une sélection de la table “Product” de la base de données DB2.

ID-ProduitNom-ProduitCatégoriePrixStockValeur-Totale
7001SourisAccessoires75,00
7002Disque durAccessoires65,00201 300
7003ClavierAccessoires36.00331 118,00
7004RAMComposants23.5016376,00
7005VTTvélos1 200
7006StyloPapeterie7.451074,50
7007Clé USBAccessoires65,00201 300

Exemple 1:

L’instruction SQL suivante répertorie le nombre de catégories différentes dans la table “Produit”.

SELECT Categorie, COUNT(Categorie) As "Nombre_de_Produit"
    FROM Produit
    GROUP BY Categorie;

La clause GROUP BY demande à DB2 de trier les données et de les regrouper par catégorie. Ainsi, “Number_of_Products” est calculé une fois par catégorie plutôt qu’une fois pour l’ensemble du tableau.

Le résultat de cette requête est le suivant.

CatégorieNombre_de_Produit
Accessoires4
Composants1
vélos1
Papeterie1

Clause SQL HAVING

En plus de pouvoir regrouper des données à l’aide de GROUP BY, SQL vous permet également de filtrer les groupes à inclure et ceux à exclure.

Par exemple, vous pouvez souhaiter une liste de tous les clients qui ont passé au moins deux commandes. Pour obtenir ces données, vous devez filtrer en fonction du groupe complet, et non des lignes individuelles.

HAVING est très similaire à WHERE. La seule différence est que WHERE filtre les lignes et HAVING filtre les groupes. WHERE filtre avant que les données ne soient regroupées et HAVING filtre après que les données soient regroupées.

De plus, la clause HAVING a été ajoutée à SQL car le mot-clé WHERE ne pouvait pas être utilisé avec les fonctions d’agrégation.

Base de données DB2 :

Vous trouverez ci-dessous une sélection de la table “Commandes” de la base de données DB2.

Numéro-CommandeNuméro-ClientDate-Commande
1001102020-09-08
1002992020-09-01
1003172020-08-25
1004762020-07-19
1005992020-09-21
1006172020-08-25
1007762020-05-19
1008992020-03-01
1009302020-06-25
1010402020-09-19
1011762020-05-19
1011992020-05-19

Exemple 1:

L’instruction SQL suivante sélectionne la liste de tous les clients qui ont passé au moins deux commandes.

SELECT Numero_Client, COUNT(*) AS Commandes
   FROM Commandes
   GROUP BY Numero_Client
   HAVING COUNT(Numero_Client) >= 2;

Dans cette instruction, la clause GROUP BY est utilisée pour regrouper les données par numéro de client afin que la fonction COUNT(*) puisse renvoyer le nombre de commandes passées par chaque numéro de client.

La clause HAVING filtre les données afin que seules les commandes avec deux éléments ou plus soient renvoyées.

Résultat:

Numéro-ClientCommandes
172
763
994

Exemple 2 : Regroupement et tri

Pour trier la sortie de GROUP BY, vous devez utiliser ORDER BY.

SELECT Numero_Client, COUNT(*) AS Commandes
    FROM Commandes
    GROUP BY Numero_Client
    HAVING COUNT(Numero_Client) >= 2;
     ORDER BY COUNT(Numero_Client) DESC;

Dans cette instruction, la clause GROUP BY est utilisée pour regrouper les données par numéro de client afin que la fonction COUNT(*) puisse renvoyer le nombre de commandes passées par chaque numéro de client.

La clause HAVING filtre les données afin que seules les commandes avec deux éléments ou plus soient renvoyées. Enfin, la sortie est triée à l’aide de la clause ORDER BY.

Résultat:

Numéro-ClientCommandes
994
763
172

Opérateur SQL EXISTS 

L’opérateur EXISTS teste l’existence de certaines lignes dans une sous-requête.

L’opérateur EXISTS renvoie true si la sous-requête renvoie un ou plusieurs enregistrements.

Le résultat de l’opérateur EXISTS :

  1. Est vrai uniquement si le nombre de lignes spécifié par la sous-requête est différent de zéro.
  2. Est faux uniquement si le nombre de lignes spécifié par la sous-requête est zéro.
  3. Ne peut pas être inconnu.

Syntaxe:

SELECT nom_colonne(s)
    FROM nom_table 
    WHERE EXISTS
    (SELECT nom_colonneFROM nom_table WHERE condition);

Examinons les données du tableau “Commandes” ci-dessous :

Numéro-CommandeNuméro-ClientDate-Commande
1001102020-09-08
1002992020-09-01
1003172020-08-25
1004762020-09-19
1005702020-09-19

Examinons les données du tableau “Clients” ci-dessous :

Numéro-ClientNom-ClientPays
76JackAmérique
17JancyAllemagne
20CarmenPakistan
10robertInde
99BrianChine
70AvrilAmérique

Exemple 1

L’instruction SQL suivante renvoie TRUE et répertorie les clients qui ont passé une commande.

SELECT Nom_Client
  FROM Clients
  WHERE EXISTS (SELECT Numero_Commande
                  FROM Commandes
                 WHERE Commandes.Numero_Commande = Clients.Numero_Commande
);
Résultat:
Nom-Cient
Jack
Jancy
robert
Brian
Avril

Exemple : 2

L’instruction SQL suivante renvoie TRUE et répertorie les clients qui ont passé une commande à la date ‘2020-09-19’.

SELECT Nom_Client
  FROM Clients
  WHERE EXISTS (SELECT Numero_Commande
                  FROM Clients
                  WHERE Clients.Numero_Commande = Client.Numero_Commande
                    AND Date_Commande='2020-09-19');
Résultat:
Nom-Client
Brian
Avril

Instruction SQL CASE 

L’instruction CASE passe par des conditions et renvoie une valeur lorsque la première condition est remplie (comme une instruction COBOL Evaluate). Ainsi, si une condition est vraie, elle arrêtera de lire et renverra le résultat. Si aucune condition n’est vraie, elle renvoie la valeur dans la clause ELSE.

Si la partie ELSE n’est pas ajoutée dans l’instruction CASE et qu’aucune condition n’est vraie, elle renvoie la valeur NULL.

syntaxe:

CASE
    WHEN condition1 THEN resultat1 
    WHEN condition2 THEN resultat2
    WHEN conditionN THEN résultatN 
    ELSE resultat
END;

Base de données DB2 :

Vous trouverez ci-dessous une sélection de la table “Employé” de la base de données DB2.

ID-EmployéNom-EmployéServiceÂgePaysVille
7001robertADM25IndeChennai
7002JancyHUM35AmériqueNew York
7003BrianOPE40Chine
7004PhilDES50AmériqueBoston
7005CarmenADM47Russie
7006HélèneOPE39AngleterreLondres

Exemple 1:

Supposons que dans la table “Employé”, le premier caractère d’un numéro de service représente la division de l’organisation. Utilisez une expression CASE pour répertorier le nom complet de la division à laquelle appartient chaque employé.

SELECT ID_Employe, Nom_Employe,
       CASE SUBSTR(Service,1,1)
          WHEN 'A' THEN 'Administration'
          WHEN 'H' THEN 'Resources Humaines'
          WHEN 'D' THEN 'Design'
          WHEN 'O' THEN 'Operations'
       END AS "Departement"
   FROM Employe;
Résultat:
ID-EmployéNom-EmployéDépartement
7001robertAdministration
7002JancyRessources humaines
7003BrianOpérations
7004PhilConcevoir
7005CarmenAdministration
7006HélèneOpérations

Exemple 2 :

L’instruction SQL suivante ordonnera l’employé par Ville. Cependant, si Ville est NULL, alors trier parPays :

SELECT ID_Employe, Nom_Employe, Ville, Pays
    FROM Employe
    ORDER BY
    (CASE
        WHEN Ville IS NULL THEN Pays
        ELSE Ville
    END);
Résultat:
ID-EmployéNom-EmployéVillePays
7004PhilBostonAmérique
7001robertChennaiInde
7006HélèneLondresAngleterre
7002JancyNew YorkAmérique
7003BrianChine
7005CarmenRussie

Commentaires SQL

A quoi servent les commentaires ?

Les commentaires sont utilisés pour expliquer des sections d’instructions SQL ou pour empêcher l’exécution d’instructions SQL.

Comment ajouter des commentaires dans le code SQL ?

Il existe deux manières de commenter une ligne.

  1. Commentaires sur une seule ligne
  2. Commentaires multi-lignes

Voyons chaque type ci-dessous :

Commentaires sur une seule ligne :

Les commentaires sur une seule ligne commencent par “–” .

Tout texte entre “–” et la fin de la ligne sera ignoré (ne sera pas exécuté).

Exemple 1:

--Sélectionner toutes les colonnes:
SELECT * FROM Employe;

Exemple 2 :

Vous pouvez également utiliser un commentaire sur une seule ligne comme ci-dessous.

SELECT * FROM Employe;   --Sélectionner toutes les colonnes:

Commentaires multi-lignes :

Les commentaires multi-lignes commencent par /* et se terminent par */. Tout texte entre /* et */ sera ignoré.

Exemple 2 :

/*Sélectionner toutes les colonnes
de la table Employe:*/
SELECT * FROM Employe;

Vous pouvez également utiliser un commentaire multi-lignes comme ci-dessous.

SELECT Nom_Employe, /*Age,*/ Ville FROM Employe;