Professional Documents
Culture Documents
ET D'APPLICATION
DES TRANSMISSIONS
Division management
des systèmes d'information
Cours Analyse
LANGAGE SQL
(Instruction SELECT)
Edition 1999
SQL Les Bases du Langage
Objectif
SOMMAIRE
V. S.Q.L. : LE LANGAGE
ERROR: REFERENCE SOURCE NOT FOUND
A. RÉCUPÉRATION ÉLÉMENTAIRE DE DONNÉES
5. PRÉDICAT EXISTS
ERROR: REFERENCE SOURCE NOT FOUND
E. ORGANISER LES DONNÉES ET SYNTHÉTISER LES RÉSULTATS
ERROR: REFERENCE SOURCE NOT FOUND
1. FONCTIONS D'AGRÉGATION
ERROR: REFERENCE SOURCE NOT FOUND
♦ Les fonctions SUM / AVG / MAX / MIN
Error: Reference source not found
♦ La fonction COUNT
Error: Reference source not found
♦ Le mot-clé DISTINCT
Error: Reference source not found
2. REGROUPEMENT (GROUP BY)
ERROR: REFERENCE SOURCE NOT FOUND
3. CONDITION DE REGROUPEMENT (HAVING) OU DIVISION EN ALGÈBRE RELATIONNELLE
ERROR: REFERENCE SOURCE NOT FOUND
♦ Rappel sur le principe de la division en algèbre relationnelle 42
♦ Application de la division en langage SQL 43
Issu du langage SEQUEL (Structure English Query Language) mis au point par la société
IBM, il est naturellement basé sur l’anglais comme beaucoup d’autres langages. Il a eu une
reconnaissance internationale et a été adopté par les grands constructeurs de SGBDR comme
langage de référence pour l’exploitation et l’administration des bases de données relationnelles.
Aussi recense-t-on plusieurs normes :
- ISO 83 pour SQL,
- ISO 92 pour SQL 2,
- et une nouvelle norme est à l’étude pour SQL 3.
Ce qui fait que l’on dénombre non pas un SQL standard mais une grande quantité de dialectes
qui répondent à une norme. Car, bien sûr, chaque constructeur a souhaité différencier son
langage par rapport aux autres tout en restant dans le cadre de la norme.
SQL est un langage complet qui ne fait absolument pas référence aux chemins d’accès
aux données comme les langages de type navigationnel. Le programmeur n’est plus obligé de
connaître et de mentionner l’accès aux données qu’il souhaite atteindre.
C’est un langage complet qui permet de réaliser des opérations aussi diverses que la mise
à jour de la base de données, la création, la recherche la récupération et la manipulation de
données et l’administration de la base de données.
Base de Données
C'est un ensemble de données ayant des relations entre elles. Les données sont structurées
de façon à permettre une expansion de la base de données.
Modèle relationnel
Dans une base de données relationnelle, toutes les données sont sous forme de tables.
Une table se compose de lignes et de colonnes et à chaque intersection se trouve une donnée.
Colonne
Une colonne (ou attribut) est analogue à un champ dans un enregistrement. Chaque
colonne d'une ligne donnée contient une valeur unique et chaque colonne est d'un type
déterminé. Toute colonne porte un nom.
Ligne
Une ligne (ou tuple) est analogue à un enregistrement dans un fichier. Les lignes d'une
table sont composées des mêmes colonnes. Chaque ligne contient des données concernant un cas
de la table. Les lignes ne sont pas dans un ordre particulier.
Index
On distingue deux types d’index :
- l’index primaire qui peut porter sur une colonne ou une association de colonnes d’une même
table. On peut le comparer à la clé primaire d’une table. Cet index peut être défini comme
étant unique (les doublons ne seront pas autorisés) ou comme autorisant les doublons. Une
table ne peut posséder qu’un seul index primaire.
- les index secondaires qui, eux, ne seront pas définis comme pouvant être uniques. Ils sont, en
général, définis sur les clés étrangères, clés migrantes des autres tables qui entrent en relation
avec la table concernée.
Les index sont très utiles en ce qui concerne l’accès aux données. En effet, sur la base des
index, le SGBDR entretient des tables d’index qui permettent au système des accès optimisés
aux données.
B.Schéma relationnel
IV.S.Q.L. : Introduction
∧
J déplacement vers le bas PgUp page précédente
∧
K déplacement vers le haut PgDown page suivante
∧
L déplacement latéral d'une page vers la droite
∧
H déplacement latéral d'une page vers la gauche
D.Normes
Certains symboles utilisés dans l’écriture des instructions S.Q.L. sont à connaître pour
une meilleure interprétation de celles-ci.
[ …] Mot(s) à caractère optionnel.
{…|…} Une seule proposition au choix.
objet [, …] Il est possible d’énumérer une liste d’objets de même nature que celui cité.
Les mots-clés dans les différentes instructions S.Q.L. sont en majuscule, gras et surlignés.
Ils sont OBLIGATOIRES ! !
Ingres offre diverses fonctions utilisables pour le langage S.Q.L. Vous pouvez en voir
une liste non exhaustive en fin d’aide de l’outil ISQL.
Trois d’entre-elles nous seront utiles lors des exercices pour les comparaisons de chaîne
de caractères. :
- Lowercase (nom_colonne)
convertit le contenu de la colonne tout en minuscule ;
- Uppercase (nom_colonne)
convertit le contenu de la colonne tout en majuscule.
Pour les colonnes de type char, on peut combiner ces fonctions de la manière suivante :
{Lowercase | Uppercase} (Varchar (nom_colonne_type_char))
Ces fonctions peuvent être utilisées soit au niveau du SELECT, soit au niveau de la
clause WHERE comme nous le verrons.
Vous les retrouverez parmi d’autres avec leur syntaxe et de plus amples explications et
exemples en annexe de cet ouvrage.
La grande partie qui suit, va vous présenter l’essentiel des commandes S.Q.L. à maîtriser
pour pouvoir exploiter une base de données. A chaque étape, à chaque nouvelle syntaxe, vous
apprendrez de nouveaux mots-clés, de nouveaux ordres S.Q.L.
Mais, surtout, sachez d’ores et déjà que la très grande majorité des ordres ou mots-clés
que vous découvrirez peuvent s’associer dans les requêtes S.Q.L. Chaque nouvelle étape, chaque
nouvelle syntaxe n’est donc pas indépendante des autres.
V.S.Q.L. : Le Langage
Syntaxe
FROM <nom_table>
Cette syntaxe permet de sélectionner la totalité des données contenues dans les champs
énumérés. Si des doublons existent, ils seront également affichés.
Exemples
/* Liste de toutes les données des bâtiments */
SELECT *
FROM batiment ;
NOTA
L'ordre d'énumération des colonnes impose l'ordre d'affichage des données après
exécution de la requête. Si vous utilisez " * ", les données seront affichées dans leur ordre de
conservation dans la table.
Questions
Syntaxe
FROM <nom_table>
NOTA
Si plusieurs colonnes sont à sélectionner, le mot-clé DISTINCT s’appliquera sur
l’association des colonnes citées.
Exemples
/* Liste des différents bâtiments où sont localisées les divisions */
SELECT DISTINCT batiment
FROM dept ;
On remarque, dans cet exemple, qu’il apparaît une occurrence ne comportant pas de
valeur réelle. Erreur ou non ? Nous verrons par la suite…
Questions
Syntaxe
SELECT <liste_colonnes>
FROM <nom_table>
WHERE <condition_de_recherche>
Listes IN et NOT IN
Remarque : le NOT
Le NOT traduit une négation d’expression booléenne ou de mot-clé tel que Like,
Between, In , Null.
♦ Opérateurs de comparaison
NOTA
Les littéraux alphanumériques, alphabétiques et les données de type date sont bornés par
des simples quotes (').
Règles de comparaison
F Valeur numérique
- Les nombres négatifs sont plus petits que les nombres positifs.
- Un nombre négatif de grande valeur est plus petit qu'un nombre négatif de faible valeur.
- Un nombre positif de grande valeur est plus grand qu'un nombre positif de faible valeur.
F Les lettres minuscules sont supérieures aux lettres majuscules qui sont supérieures aux
nombres.
Syntaxe
SELECT <liste_colonnes>
FROM <nom_table>
Exemples
EGALITE
/* Liste des employés qui perçoivent un salaire de 6900 F */
SELECT nom
FROM emp
WHERE salaire = 6900 ;
DIFFERENCE
/* Nom et salaire des employés n’appartenant pas à la division 30 */
SELECT nom, salaire
FROM emp
WHERE division != 30 ;
SUPERIORITE
/* Liste des employés embauchés après le 01/01/1992 */
SELECT matricule, nom
FROM emp
WHERE embauche > '01/01/1992' ;
INFERIORITE
/* Nom, salaire et com des employés dont le nom se classe normalement avant celui de
Mr Maréchal */
SELECT nom, salaire, com
FROM emp
WHERE lowercase(nom) < ‘marechal’ ;
Questions
7. Liste des employés non vendeurs avec leur date d’embauche et leur salaire.
8. Liste des divisions implantées dans le bâtiment (A, a).
9. Liste des employés dont la commission est supérieure à 0,00 F.
Syntaxe
SELECT <liste_colonnes>
FROM <nom_table>
Signification
IS NOT NULL : traduit que les données recherchées ne sont pas nulles (NULL).
F Une valeur NULL implique une grandeur inconnue. Elle n’est pas un zéro ou un blanc ;
il n’y a pas de valeur explicitement assignée.
F Une valeur NULL n’est jamais égale à une autre valeur NULL.
Exemples
On remarque maintenant que l’occurrence qui ne contenait pas de valeur réelle n’a pas
été sélectionnée. Cela montre bien que la valeur NULL est une valeur à part entière.
Questions
♦ Intervalles (Between...And...)
Syntaxe
SELECT <liste_colonnes>
FROM <nom_table>
Signification
NOT BETWEEN : mots-clés qui excluent l'intervalle y compris les valeurs extrêmes
spécifiées.
Exemples
/* Liste des employés dont le salaire est compris entre 8000 et 9000 F */
SELECT matricule, nom
FROM emp
WHERE salaire BETWEEN 8000 AND 9000 ;
Questions
12. Liste des employés qui perçoivent entre 100 et 300 F de commission.
13. Liste des divisions alphabétiquement comprises entre la division informatique et celle des
ventes.
14. Divisions pourvues d’un budget exclu de l’intervalle [150000 - 200000] F.
Syntaxe
SELECT <liste_colonnes>
FROM <nom_table>
Signification
LIKE : mot-clé utilisé pour désigner une comparaison sur une portion de caractères.
NOT LIKE : mot-clé qui exclue la portion de caractères saisie de la comparaison.
Caractères spécifiques
% remplace une chaîne de caractères quelconque (de 0 à n caractères).
_ remplace un seul caractère
Ces caractères spécifiques peuvent être combinés et utilisés plusieurs fois simultanément.
• Recherche de donnée(s) dont la 1ère lettre est comprise entre deux valeurs :
select <colonne>
from <table>
where <colonne> LIKE '\[val1-val2\]%' escape '\' ;
• Recherche de donnée(s) commençant par un chiffre inclus dans une liste (continue ou
discontinue) et suivi d’une lettre comprise entre deux valeurs en majuscule puis de n autres
caractères quelconques.
select <colonne>
from <table>
where <colonne> LIKE ‘\[val1 val2 … valn\]\[ val1-val2\]%’ escape ‘\’ ;
Exemples
/* Liste des informations concernant M. Maréchal */
SELECT *
FROM emp
WHERE lowercase (nom) LIKE ‘marechal%’ ;
/* Liste des informations relatives aux bâtiments dont le code postal de la ville ne
contient pas les caractères 5 et 0 respectivement en deuxième et troisième positions. */
SELECT *
FROM batiment
WHERE code_postal NOT LIKE ‘_50%’ ;
Questions
15. Matricule, nom, emploi pour les employés dont le nom n’a pas comme deuxième lettre un
(U, u) et ne se termine pas par (T, t).
16. Liste des divisions dont le libellé contient (TI, ti).
17. Liste des employés dont le nom se termine par (ON, on).
♦ Listes (In)
Syntaxe
SELECT <liste_colonnes>
FROM <nom_table>
Signification
NOT IN : mot-clé qui exclue de la recherche les valeurs contenues dans l’ensemble.
F Les valeurs énoncées peuvent être de type soit caractère, soit numérique.
Exemple
/* Liste des employés des divisions 10 ou 20 avec leur emploi respectif */
SELECT nom, emploi, division
FROM emp
WHERE division IN (10, 20)
/* Liste des divisions qui ne sont pas implantées dans les bâtiments A et B */
SELECT nom_div
FROM dept
WHERE batiment NOT IN (‘A’, ‘B’)
Questions
Syntaxe
SELECT <liste_colonnes>
FROM <nom_table>
A AND B A A OR B A
Vrai Faux Vrai Faux
B Vrai Vrai Faux B Vrai Vrai Vrai
Faux Faux Faux Faux Vrai Faux
NOTA
F Ces opérateurs peuvent être combinés entre-eux et employés à plusieurs reprises dans une
même requête.
F Lorsque plus d’un opérateur logique est employé, leur ordre d’évaluation est :
NOT / AND / OR
F Egalement, ces opérateurs permettent de combiner tous les opérateurs de recherche pour
la clause WHERE vus jusqu’ici.
F L’emploi de parenthèses () peut changer le sens d’une requête.
Exemples
/* Liste des employés de la division 30 ayant un salaire inférieur à 7500 F */
SELECT nom, emploi, salaire
FROM emp
WHERE division = 30
AND salaire < 7500
/* Liste des employés n’appartenant pas à la division 10 ou dont le salaire n’excède pas
7000 F */
SELECT nom, emploi, salaire
FROM emp
WHERE NOT division = 10
OR salaire <= 7000
Questions
23. Liste des employés dont le nom commence par (DU, du) et dont le salaire est compris entre
7000 F et 9000 F.
24. Liste des employés dont le nom se termine par (ON, on). Vous n'utiliserez aucune des
fonctions de conversion vues jusqu'ici.
Comparez le résultat obtenu avec ceux de la question 17.
25. Liste des analystes, des vendeurs et des pupitreurs dont le nom comporte le lettre (E, e). Vous
n'utiliserez aucune des fonctions de conversion vues jusqu'ici.
26. Code des différentes divisions qui embauchent des employés dont le nom comporte un (U, u)
en deuxième lettre et dont le salaire est exclu de l’intervalle [7200-8900] F.
27. Matricule, nom, emploi et salaire du Président et des Directeurs des employés (vous
utiliserez l'opérateur IS NULL pour rechercher le Président).
28. Nom, salaire et métier des employés dans la catégorie des analystes et nom, salaire et métier
des employés dans la catégorie des vendeurs qui ont un salaire supérieur à 8000 F (sans utiliser
l’opérateur ensembliste IN).
29. Nom, salaire et métier des employés dans les catégories des analystes et des vendeurs qui ont
un salaire supérieur à 8000 F (sans utiliser l’opérateur ensembliste IN).
Syntaxe
FROM <nom_table>
WHERE <condition_recherche>
F Les opérateurs proposés sont applicables sur tous les types de données numériques.
F Il existe d’autres opérateurs mathématiques sous forme de fonction tels que la fonction
exponentielle (non utilisable avec des attributs de type money) , le sinus, le cosinus, etc.
Vous les trouverez en fin d’aide au paragraphe des fonctions numériques.
NOTA
Si la colonne est de type chaîne de caractères, la valeur par défaut devra être entre
apostrophes.
Dans le cas d'une colonne de type numérique, le séparateur entre la colonne et la valeur
par défaut devra impérativement être suivi d'un espace, faute de quoi l'analyseur
syntaxique interprétera le contenu des parenthèses comme un décimal.
Exemples
/* Nom, emploi et salaire augmenté de 10 % pour les employés dont le salaire majoré est
supérieur à 10000 F */
SELECT nom, emploi, (salaire * 1,1)
FROM emp
WHERE salaire * 1,1 > 10000
/* Liste des commissions des employés en fixant à 555 F celles qui sont nulles */
SELECT nom, emploi, salaire, IFNULL (com, 555)
FROM emp
Questions
30. Revenu global et emploi pour les secrétaires et les vendeurs. Vous calculerez le revenu
global une fois sans utiliser la fonction IFNULL, une autre fois en utilisant cette fonction et en
attribuant une commission égale à 0 par défaut.
31. Augmentation de 20 % du budget pour les divisions dont le libellé comporte la lettre (C, c).
Syntaxe
FROM <nom_table>
Ecrivez alors le titre entre guillemets (" ") ou remplacez les espaces par des ‘_’ (souligné).
Exemple
/* Nom, emploi et salaire augmenté de 10 % pour les employés dont le salaire est
supérieur à 10000 F */
SELECT nom, emploi, (salaire * 1,1) AS " Salaire majoré "
FROM emp
WHERE salaire > 10000
Questions
32. Matricule, nom, salaire augmenté de 5 % dénommé SALAIRE 1999 pour les employés qui
gagnent moins de 7200 F.
33. Calculer le rapport salaire/commission pour chaque employé qui perçoit une commission
( ]0 ; + ∞[ ). Vous donnerez un titre à la colonne calculée.
Syntaxe
FROM <nom_table>
WHERE <condition_recherche>
Exemple
Trouvez l’autre syntaxe dont l’exécution permet d’obtenir une occurrence de moins.
Questions
Syntaxe
SELECT <liste_colonnes>
FROM <nom_table>
F Le mot-clé ASC (tri croissant) est optionnel car c’est le tri appliqué par défaut. Par
contre, pour un tri décroissant, le mot-clé DESC doit être mentionné.
F En cas de tri sur le résultat d’un calcul arithmétique, on doit utiliser le titre attribué à
l’opération dans la clause de tri ou le numéro d'ordre de la colonne dans la clause
SELECT.
F Les attributs utilisés dans la clause de tri doivent faire partie des colonnes sélectionnées.
Exemples
/* Liste des divisions dans l’ordre alphabétique */
SELECT *
FROM dept
ORDER BY nom_div
Questions
36. Liste des chefs de publicité et directeurs dans l’ordre décroissant de l’emploi.
37. Triez les employés dans l’ordre croissant de leur emploi et dans l’ordre décroissant de leur
salaire en utilisant la position des colonnes.
38. Liste des employés de la division 30 dans l’ordre décroissant de leur "revenu global"
( 0 ≤ com ≤ +∞ ) (la colonne calculée apparaîtra sous cette appellation).
C.Jointures
L’opérateur principal pour établir des jointures entre les tables est l’égalité (=).
1.Introduction
Ces liens s'établissent entre clés primaires et clés étrangères. Ainsi, même s'ils n'ont pas
la même dénomination, les attributs auront le même format (type et taille) et les données
contenues auront la même signification.
Par exemple, la colonne division est une clé étrangère dans la table emp alors qu’elle est
clé primaire dans la table dept.
Toutes les tables énumérées dans la clause FROM doivent être utilisées. Par principe,
il faut un minimum de 2 tables pour réaliser une jointure. Ainsi, pour 2 tables citées dans la
clause FROM, on aura 1 jointure ; pour 3 tables citées, on aura 2 jointures, etc. A partir de 3
tables, on utilisera les conditions de connexion (opérateurs logiques) pour enchaîner les critères
de jointures.
Le nom de la table propriétaire (ou son alias) doit être précisé devant les colonnes
ambiguës où qu’elles soient utilisées (Select, Where, Group by, Having, Order by). Car, en
général, les colonnes servant pour les jointures ont la même dénomination (ex : la colonne
batiment dans les tables dept et batiment).
Conseil
Lorsque vous avez des jointures à mettre en œuvre, écrivez-les en premier dans la clause
WHERE de votre requête SQL. Ainsi, vous serez sûrs de ne pas en omettre.
Remarque
Nous n’aborderons ci-après que les types de jointures internes. Pour les autres cas, si
vous les rencontrez dans des programmes, reportez-vous à la documentation du programme ou à
celle du langage SQL utilisé par le SGBDR.
2.Jointure interne
Syntaxe
SELECT <[tablen].nom_colonne> [, …]
WHERE <condition_de_jointure>
Exemple
/* Donner le nom, l’emploi et le nom de leur division pour tous les employés */
SELECT nom, emploi, nom_div
FROM emp, dept
WHERE emp.division = dept.division
Questions
39. Donner les divisions et leur budget où l’on trouve des postes d’analyste et de vendeur.
L'usage de l'opérateur ensembliste IN vous est strictement défendu pour cette question.
40. Liste des chefs de publicité (matricule, nom, salaire) travaillant à Paris.
41. Liste des employés (nom, emploi, salaire, com) de la division des ventes par ordre croissant
de salaire et décroissant de commission.
3.Alias
Syntaxe
WHERE <condition_de_jointure>
Avec <condition_de_jointure>
ó
[{tablen | alias}].nom_colonne <op.comp.> [{tablen | alias}].nom_colonne
L’alias permet d’attribuer une dénomination raccourcie à une table. L’intérêt est un gain
de temps pour l’écriture des requêtes. Un autre intérêt sera mis en évidence dans le paragraphe
suivant.
Exemple
/* Donner le nom, l’emploi, le numéro et le nom de leur division pour tous les salariés */
SELECT nom, emploi, e.division, nom_div
FROM emp e, dept d
WHERE e.division = d.division
Questions
42. Liste des différents codes postaux et villes des employés ne gagnant pas entre 5000 F et
8000 F.
43. Quels sont les différents noms de division (dans l’ordre croissant) où l’on trouve des postes
de Directeur ?
44. Nom, salaire (renommé) et salaire majoré de 4% (renommé) des employés de la division
informatique. On fera apparaître l’augmentation détaillée comme suit : salaire, majoration,
salaire majoré.
4.Auto-jointure
L’auto-jointure est la liaison d’une table sur elle-même ; il faut donc citer la même table
au moins deux fois. Ceci revient à traiter deux tables strictement identiques, les mêmes noms de
colonnes apparaissant dans chaque table.
Dès lors, on comprend que les jointures peuvent s’opérer indifféremment sur n’importe
quelle colonne. Aussi, l’alias qui sera donné à chaque table aura sa part prépondérante à ce
niveau-là. Il sera le seul élément permettant de différencier les colonnes des tables entre elles.
Syntaxe
WHERE <condition_de_jointure>
Exemple
/* Afficher le nom et le salaire des employés et, dans la même requête, le nom et le
salaire de leur chef respectif */
SELECT e.nom, e.salaire, ec.nom, ec.salaire
FROM emp e, emp ec
WHERE e.mat_chef = ec.matricule ;
Questions
45. Afficher le nom et le salaire des employés avec le nom et le salaire de leur chef respectif et,
pour ces chefs, le nom et le salaire de leur chef respectif.
Que peut-on observer dans le résultat ?
46. Afficher le nom, le salaire, l’emploi des personnels gagnant plus que leur propre chef.
47. Afficher les divisions dont le budget est inférieur ou égal aux budgets des autres divisions.
Vous éliminerez ensuite les comparaisons entre mêmes divisions.
D.Sous-requêtes ou sous-interrogations
Syntaxe
Avec <condition_comparaison>
ó
{<op. comp.> | <op.comp. + mot-clé> | <mot-clé> | <prédicat>}
= (égal à)
> (supérieur strict à)
<op. comp.> < (inférieur strict à)
<>, != (différent de)
>= (supérieur ou égal à)
<= (inférieur ou égal à)
<mot-clé> [NOT] IN
= (égal à)
> (supérieur strict à) ANY
<op. comp. > < (inférieur strict à)
+ <>, != (différent de)
<mot-clé> >= (supérieur ou égal à) ALL
<= (inférieur ou égal à)
Utilisation
Remarques
Une sous-requête peut avoir plusieurs niveaux d’imbrications, c’est-à-dire qu’une sous-
requête peut contenir une ou plusieurs sous-requêtes. A chaque fois, les résultats de la sous-
requête sont substitués dans la requête supérieure.
Seules les colonnes sélectionnées dans la clause SELECT de plus haut niveau seront
affichées.
Dans la sous-requête, la clause SELECT ne peut comprendre qu’un seul nom de colonne.
à partir du moment où la clause WHERE de la requête supérieure comprend un seul nom de
colonne. Les colonnes ainsi jointes devront être compatibles (même domaine).
Le prédicat EXISTS, lui, est un cas particulier puisqu’il n’établit pas de comparaison
entre le résultat de la sous-requête avec une colonne dans la clause WHERE supérieure mais il
teste l’existence ou non de lignes en commun entre les résultats de la requête et de la sous-
requête.
Syntaxe
Exemple
/* Liste des personnels qui ne sont pas employés dans la division Vente */
SELECT nom, emploi
FROM emp
WHERE division != (SELECT division
FROM dept
WHERE nom_div = ‘Vente’) ;
Questions
48. Liste des directeurs et secrétaires des divisions dont le budget est compris entre 400000 F et
700000 F.
49. Liste des personnels travaillant à Rennes et gagnant plus de 8000 F.
50. Liste des employés dont M. Garnier est le chef (par sous requête). On affichera le matricule,
le nom et l’emploi pour les employés et pour le chef dans la même requête.
Syntaxe
F L’élément recherché doit exister dans l’ensemble pris en compte, résultat de la sous-
requête.
Exemple
/* Liste des personnels employés dans les divisions Informatique et Vente */
SELECT nom, emploi
FROM emp
WHERE division IN ( SELECT division
FROM dept
WHERE nom_div IN (‘Informatique’, ‘Vente’) ;
Questions
51. Liste des employés des divisions ayant un budget inférieur à 380000 F.
52. Libellé et budget des divisions non localisées dans le département 75.
53. Nom et revenu global (salaire+com) des employés travaillant dans les divisions de Rennes.
Attribuez 0 (zéro) en cas de commission nulle.
Syntaxe
F La condition doit être vérifiée pour au moins un élément de l’ensemble pris en compte,
résultat de la sous-requête.
Exemple
/* Liste des employés dont le salaire est supérieur à celui d’un directeur */
SELECT nom, emploi, salaire
FROM emp
WHERE salaire > ANY (SELECT salaire
FROM emp
WHERE emploi = ‘DIRECTEUR’) ;
Questions
54. Liste des divisions dont le budget est supérieur à celui d’une division employant du
personnel dont le nom débute par ‘GA’.
55. Nom, emploi, salaire des personnels qui touchent plus qu’au moins un des salariés de la
Direction.
Syntaxe
F La condition doit être vérifiée pour chaque élément de l’ensemble pris en compte, résultat
de la sous-requête. Donc pour tous les éléments de l’ensemble.
Exemple
/* Liste des employés dont le salaire est supérieur à ceux de tous les directeurs */
SELECT nom, emploi, salaire
FROM emp
WHERE salaire > ALL (SELECT salaire
FROM emp
WHERE emploi = ‘DIRECTEUR’) ;
Questions
56. Liste des bâtiments (avec les divisions) où sont installées les divisions dont le budget est
supérieur aux budgets des divisions employant du personnel dont le nom débute par un B.
57. Nom, emploi, salaire des personnels qui touchent plus que tous les salariés du département
Informatique.
5.Prédicat EXISTS
Syntaxe
F EXISTS est utilisé pour trouver les éléments de l’intersection de deux ensembles.
F NOT EXISTS est utilisé pour trouver les éléments appartenant à la différence de deux
ensembles.
F La liste de colonnes qui sera énoncée dans la clause SELECT de la sous-requête sera
généralement " * " (tous les champs) car la fonction [NOT] EXISTS renvoie VRAI ou
FAUX (pas de donnée retournée).
Exemple
SELECT *
FROM dept
WHERE NOT EXISTS (SELECT *
FROM emp
WHERE emp.division = dept.division) ;
Questions
58. Quelles divisions (libellé et budget) emploient des salariés à plus de 9000 F ?
59. Dans quels bâtiments ne sont pas installées les divisions qui emploient des salariés ?
1.Fonctions d'agrégation
Syntaxe
FROM table [, …]
WHERE <conditions_de_recherche>
Signification
F Elles renvoient seulement une ligne (si une clause GROUP BY n’est pas utilisée).
F Elles ne peuvent être utilisées que dans une clause SELECT <liste_colonnes>.
F Elles peuvent être appliquées à toutes les lignes d’une table ou à un sous-ensemble.
F Les opérateurs arithmétiques peuvent être utilisés avec les fonctions SUM, AVG, MAX,
MIN.
F Les colonnes résultats de fonction d’agrégation peuvent être renommées pour être plus
significatives.
Exemple
/* Donner les somme, moyenne, valeurs maxima et minima des salaires des employés de
la division 30*/
SELECT SUM (salaire), AVG (salaire), MAX (salaire), MIN (salaire)
FROM emp
WHERE division = 30
♦ La fonction COUNT
Exemple
♦ Le mot-clé DISTINCT
Exemples
Questions
Pour toutes les questions qui suivent, les colonnes de calculs seront renommées.
SELECT <liste_sélection>
FROM table [, …]
WHERE <conditions_de_recherche>
GROUP BY <colonne> [, …]
F Le regroupement de lignes ne peut s'effectuer que sur les noms des colonnes contenues
physiquement dans la base de données.
F L'usage des titres (attribués par requête), des calculs (arithmétique ou agrégat) ainsi que
des diverses fonctions de conversion vues jusqu'ici est interdit dans cette clause.
F Les valeurs NULL dans la colonne du GROUP BY sont considérées comme un groupe.
F La clause GROUP BY doit contenir les colonnes de tables énoncées dans la clause
SELECT. En revanche, on peut effectuer des regroupements sur des colonnes non citées
au niveau du SELECT.
Exemples
Questions
SELECT <liste_sélection>
FROM table [, …]
WHERE <conditions_de_recherche_1>
GROUP BY <colonne> [, …]
HAVING <conditions_de_recherche_2>
Avec <conditions_de_recherche_2>
=
{<colonne | expression>} <op_arithm>. {<valeur | sous-requête>}
F La clause HAVING est similaire à la clause WHERE mais elle pose les conditions sur la
clause GROUP BY.
F La condition est appliquée aux groupes après leur formation.
F Les fonctions d’agrégation sont autorisées dans la clause HAVING.
F Si la clause HAVING compare une colonne à une valeur ou une sous-requête, cette
colonne devra être contenue dans la clause SELECT de même niveau.
Cette relation (ou table) mémorise la moyenne trimestrielle de chaque élève. Il n’y a que trois
dates de relevé possibles : une par trimestre (31/12/1998, 31/03/1999, 30/06/1999). Ainsi, selon
la période de l’année, il y a 0, 1, 2 ou 3 dates de relevé différentes dans la table.
Soit la question suivante : quels sont les élèves pour lesquels je dispose de tous les relevés de
moyenne générale ?
DIVIDENDE
R2 = PROJECT HISTORIQUE (CODEELEVE, DATERELEVE)
RESULTAT
R3 = DIVISION R2 % R1 (DATERELEVE)
1ère quantité : le diviseur. Comptons le nombre de dates de relevé différentes dans la table.
SELECT COUNT DISTINCT (DATERELEVE)
FROM HISTORIQUE
2nde quantité : le dividende. Comptons le nombre de dates de relevé différentes par élève.
SELECT CODEELEVE, COUNT (DATERELEVE)
FROM HISTORIQUE
GROUP BY CODE ELEVE
Comparons maintenant ces deux quantités dans une seule requête. On ne conserve que les élèves
qui ont autant de date de relevé qu’il en existe en tout, soit 2.
SELECT CODEELEVE
FROM HISTORIQUE
GROUP BY CODE ELEVE
HAVING COUNT (DATERELEVE) = ( SELECT COUNT DISTINCT (DATERELEVE)
FROM HISTORIQUE) ;
Exemple
Questions
77. Quelles sont les divisions dont le salaire moyen de ses employés est supérieur au salaire
moyen des employés de la société ?