Tous les articles par Mr COBOL

Sous-requêtes SQL

Les sous-requêtes SQL sont utilisées pour combiner différentes requêtes en une seule instruction.

Les sous-requêtes sont toujours traitées en commençant par l’instruction SELECT la plus interne et en allant vers l’extérieur.

Exemple:

SELECT ordre_conso_id
    FROM tb_ordre
    WHERE ordre_num IN
      (SELECT ordre_objet_num
         FROM tb_ordre_objet
      WHERE ordre_objet_prod_id = 'RGAN01');

Lorsque l’instruction SELECT précédente est traitée, le SGBD effectue en fait deux opérations.

Il exécute d’abord la sous-requête :

SELECT ordre_objet_num
    FROM tb_ordre_objet
   WHERE ordre_objet_prod_id = 'RGAN01'

Cette requête s’appelle “Inner Query”.

Cette requête renvoie deux numéros d’ordre 20007 et 20008. Ces deux valeurs sont ensuite transmises à la clause WHERE de la “requête externe” dans le format délimité par des virgules requis par l’opérateur IN. La requête externe devient alors la suivante :

SELECT ordre_conso_id
    FROM tb_ordre
    WHERE ordre_num IN (20007,20008)

Vous pouvez utiliser une sous-requête dans une comparaison simple :

  • IN
  • ANY
  • SOME
  • ALL
  • EXIST
  • Si une sous-requête renvoie une seule ligne, l’opérateur =, <, >, <=, >= ou <> peut être utilisé pour la comparaison avec la sous-requête. Si plusieurs enregistrements sont renvoyés, l’opérateur IN, ANY, ALL ou SOME doit être utilisé. Avec ANY ou SOME, la condition doit être vraie pour l’une des valeurs renvoyées par la sous-requête. Avec ALL, la condition doit être vraie pour toutes les valeurs renvoyées par la sous-requête.

Exemple:

La sous-requête qui utilise l’opérateur ANY est la suivante :

SELECT conso_no
  FROM tb_cons
  WHERE conso_no = ANY
    (SELECT inv_cons_no
       FROM tb_inv
       WHERE inv_total > 200);

Types de sous-requêtes

  1. Sous-requête non corrélée
  2. Sous-requête corrélée

Sous-requête non corrélée :

Dans la sous-requête, si la requête interne et la requête externe fonctionnent indépendamment, la sous-requête est appelée sous-requête non corrélée.

Sous-requête corrélée SQL

Dans une sous-requête corrélée, la requête interne ne fonctionne pas indépendamment de la requête externe.

Dans ce cas, la requête interne est effectuée une fois pour chaque ligne de la requête externe.

Pour corréler la table de la requête interne avec la table de la requête externe, vous devez définir un alias pour la requête externe et l’utiliser comme qualificatif dans la requête interne.

  1. Lorsque vous utilisez l’alias dans ce contexte, il est appelé “nom de corrélation” et la connexion qu’il établit est appelée “référence corrélée”.
  2. Une sous-requête corrélée avec le mot-clé EXISTS ne nomme aucune colonne car aucune donnée n’est transférée lorsque vous utilisez EXISTS.

Exemple:

SELECT nom_conso
    FROM tb_conso A
      WHERE NOT EXISTS
      (SELECT * FROM tb_inv WHERE inv_conso = A.conso_no)

Opérateur EXISTS

  • L’opérateur EXISTS est utilisé pour les sous-requêtes corrélées.
  • Il teste si la sous-requête renvoie au moins une ligne.
  • L’opérateur EXISTS renvoie vrai ou faux, jamais inconnu.
  • Étant donné que EXISTS teste uniquement si une ligne existe, les colonnes affichées dans la liste SELECT de la sous-requête ne sont pas pertinentes. En règle générale, vous utilisez un littéral de texte à un seul caractère tel que ‘1’ ou ‘X’ ou le mot-clé NULL.

Exemple:

Il s’agit d’une sous-requête corrélée qui affiche les instructeurs où INSTRUCTEUR_ID a une ligne correspondante dans la table SECTION.

Le résultat affiche les valeurs des colonnes INSTRUCTEUR_ID , INSTRUCTEUR_PRENOM des enseignants affectés à au moins une section.

SELECT instructeur_id, instructeur_nom
    FROM tb_instructeur I
      WHERE EXISTS
      (SELECT 'X'
          FROM tb_section
            WHERE I.instructeur_id = instructeur_id)

Pour chaque ligne de la table INSTRUCTEUR, la requête externe évalue la requête interne. Il vérifie si la valeur INSTRUCTEUR_ID de la ligne actuelle existe pour la colonne INSTRUCTEUR_ID de la table SECTION. Seulement si une ligne avec la valeur appropriée est trouvée, la condition est vraie et la ligne externe est incluse dans le résultat.

Opérateur NOT EXISTS :

L’opérateur NOT EXISTS est l’opposé de l’opérateur EXISTS ; il teste si une ligne correspondante est introuvable.

Clause SQL JOIN

Une clause JOIN est utilisée pour combiner des lignes de deux tables ou plus, en fonction d’une colonne liée entre elles.

Une jointure est un mécanisme utilisé pour associer des tables dans une instruction SELECT.

Pour créer une jointure, vous devez spécifier toutes les tables à inclure et comment elles sont liées les unes aux autres.

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

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

Numéro-clientNom-clientPays
76JackAmérique
17JancyAllemagne
10robertInde
99BrianChine

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

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

Exemple:

SELECT Commandes.Numero_Commande, Clients.Nom_Client, Commandes.Date_Commande
  FROM Commandes
  INNER JOIN Clients ON Commandes.Num_Clients=Clents.Num_Client;

Résultat:

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

Explication:

L’instruction SELECT démarre de la même manière que toutes les instructions que vous avez vues jusqu’ici, en spécifiant les colonnes à récupérer. La grande différence ici est que deux des colonnes spécifiées (Orderid et Orderdate) se trouvent dans une table, tandis que l’autre (Customername) se trouve dans une autre table.

Contrairement à toutes les instructions SELECT précédentes, celle-ci comporte deux tables répertoriées dans la clause FROM, Orders et Customers.

Vous devez utiliser le nom de colonne complet (table et colonne séparées par un point) chaque fois qu’il existe une éventuelle ambiguïté quant à la colonne à laquelle vous faites référence. Dans ce cas, vous spécifiez Orders.Orderid et Customers.Customername.

Types de jointures :

Il existe deux types de jointures :

  • Inner Join – Récupère les valeurs correspondantes dans les deux tables.
  • Outer Join – Récupère tous les enregistrements de la table de gauche et les enregistrements correspondants de la table de droite.
    1. Left Outer Join – Récupère tous les enregistrements de la table de gauche et les enregistrements correspondants de la table de droite.
    2. Right Outer Join – Récupère tous les enregistrements de la table de droite et les enregistrements correspondants de la table de gauche.
    3. Full Outer Join – Récupère tous les enregistrements des deux tables.

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