Professional Documents
Culture Documents
M44 Chapitre-3 Langage SQL
M44 Chapitre-3 Langage SQL
SQL :
SQL-86 (ou SQL-87) : Version d'origine
…
Syntaxe :
CREATE TABLE nom_table (nom_col1 TYPE1, nom_col2 TYPE2, ...);
Types alphanumériques
CHAR Un caractère
CHAR(n) Chaîne de n caractères. (1 par défaut)
VARCHAR(n), VARCHAR2(n) Chaîne dynamique d’au plus n caractères
Text, LONG Chaîne pouvant atteindre jusqu’a 65000 caractères.
Types numériques
INT∗, INTEGER Nombre entier signé
SMALLINT, INT2∗ entier codé sur 2 octets
MEDIUMINT, INT4∗ entier 4 octets
BIGINT, INT8∗ entier 8 octets
NUMBER[ (n[,d])] Nombre de n chiffres dont éventuellement d après la virgule.
REAL, FLOAT, FLOAT4∗ Réels 4 octets
DOUBLE PRECISION, FLOAT8∗ Réels 8 octets
NUMERIC[(m,e)], DECIMAL[(m [,e])] nombre réel de mantisse à m chiffres et d’exposant e
RAW (n) Binaire de longueur n (pour stocker des images par exemple).
Pr. A. El Mhouti 10 FSTH
Langage de Définition des Données
Créer une table
Autres types
DATE structure composée de champs et stockant le jour, mois, année
TIME structure composée de champs et stockant l’heure, les min et les sec.
TIMESTAMP permet de stocker des données constituées d’une date et d’une heure
INTERV AL∗ intervalle de dates
ROWID Pointeur de ligne
MONEY permet de stocker des valeurs monétaires.
BOOLEAN permet de stocker des valeurs Booléenne.
Remarque
Indépendamment des types, la valeur NULL est une valeur spéciale qui dénote
l’absence de valeurs.
Exemples :
Clé primaire non composée :
13
Langage de Définition des Données
Créer une table : Contraintes d’intégrité
Clients Commandes
ON DELETE SET NULL : quand le tuple contenant la clé primaire référencée est supprimé dans
la table Clients, il y aura mise à NULL des tuples dépendants dans la table Commandes
ON UPDATE CASCADE : quand le tuple contenant la clé primaire référencée est modifié dans la
table Clients, il y aura modification des tuples dépendants dans la table Commandes
Langage de Définition des Données
Renommer/Supprimer une table : DROP TABLE
En fait l'ordre SQL SELECT est composé de 6 clauses dont 4 sont optionnelles.
Syntaxe générale : SELECT liste d'attributs projetés
FROM liste de relations
WHERE liste de critères de restriction et de jointure
GROUP BY ………
HAVING ……
ORDER BY……
De manière synthétique, on peut dire que la clause :
▪ SELECT : spécifie les colonnes qui doivent apparaıtre dans les résultats : projection
▪ FROM : spécifie la table ou les tables à utiliser : produit cartésien
▪ WHERE : filtre les lignes selon une condition donnée : sélection
▪ GROUP BY : forme des groupes de lignes de même valeur de colonne
▪ HAVING : filtre les groupes sujets a une certaine condition
▪ ORDER BY : spécifie l’ordre d’apparition des données dans le résultat
Pr. A. El Mhouti 22 FSTH
Langage d'Interrogation de Données
La clause SELECT : Opérateurs
L’opérateur AS :
permet de nommer une colonne créée dans la requête.
Exemple: soit la table Employes(nuemp, numdept, nome, job, salaire, comm) :
Afficher le nom, le prénom et le salaire annuel des employés,:
SELECT nome , prenom, salaire*12 AS Salaire_annuel
FROM Employes; nuemp numdept nome job salaire comm
01245 1250 Kamal Secrétaire 3500 10%
12035 1422 Hicham Ingénieur 9800 15%
L’opérateur de concaténation || : 12574 1482 Kamal Sécurité 2500 5%
Projection :
Opération sur une relation R1 produisant une relation R2 en enlevant de R1
tous les attributs non mentionnés en opérandes.
Elle se traduit en SQL par la requête :
SELECT DISTINCT A1, ..., An
FROM Relation;
SELECT *
FROM T
WHERE adr='Lyon';
Pr. A. El Mhouti 27 FSTH
Langage d'Interrogation de Données
La clause SELECT : Opérateurs relationnels
Produit cartésien :
Opération portant sur deux relation R1 et R2, consistant à construire une
relation R3 ayant pour schéma la concaténation de R1 et R2 et pour lignes
toutes les combinaisons des lignes des relations opérandes.
Il se traduit en langage SQL par la requête :
SELECT *
FROM Relation1, Relation2;
Exemple : soit les relations homme et ville suivantes :
SELECT *
FROM homme, ville;
Jointure :
Opération portant sur deux relations et consiste en un produit cartésien suivi
d’une sélection.
Elle se traduit en SQL par la requête :
SELECT *
FROM Relation1, Relation2
WHERE Relation1.A1 = Relation2.A2;
Exemple : soit les relations homme et ville suivantes :
SELECT *
FROM homme, ville
WHERE homme.adr= ville.nomV;
AVG moyenne
SUM somme
MIN plus petite des valeurs
MAX plus grande des valeurs
VARIANCE variance
STDDEV écart type (déviation standard)
COUNT(*) nombre de lignes
COUNT(col ) nombre de valeurs non nulles de la colonne
COUNT(DISTINCT col ) nombre de valeurs non nulles différentes
Exemples : soit la table Employes(nuemp, numdept, nome, job, salaire, comm) :
a) SELECT COUNT(*) FROM Employes;
b) SELECT SUM(comm) FROM Employes WHERE numdept = 10;
Pr. A. El Mhouti 30 FSTH
Langage d'Interrogation de Données
La clause FROM : Jointure (équi-jointure)
Exemple : soit les deux tables : Employes (nuemp, #numdept, nome, job, salaire, comm)
Departements (numdept, nomdept, nbemploye)
Afficher la liste des employés avec le nom du département où ils travaillent :
SELECT nome, nomdept
FROM Employes JOIN Departements
ON Employes.numdept = Departements.numdept;
WHERE permet de filtrer les tuples (lignes) selon une condition : sélection
Syntaxe : WHERE condition
Opérateurs de comparaison :
Exemples : soit la table : Employes (nuemp, #numdept, nome, job, salaire, comm)
2. Afficher une liste comprenant les employés du département 30 dont le salaire est
supérieur à 11000 DH ou les employés qui ne touchent pas de commission.
SELECT nome FROM Employes
WHERE numdept = 30 AND salaire > 11000 OR comm IS NULL;
Notion de groupe :
Un groupe est un sous-ensemble des lignes d’une table ayant la même valeur pour un
attribut.
Exemple : soit la table Employes (nuemp, #numdept, nome, job, salaire, comm) :
nuemp numdept nome job salaire comm
1 10 Ali Technicien 4000 10
2 12 Salah Ingénieur 9000 15
3 10 Karima Secrétaire 5000 8
4 24 Imrane Ingénieur 8500 7,5
5 10 Maryem Technicien 3800 5
Un groupe est déterminé par la clause GROUP BY suivie du nom du ou des attributs
sur lesquels s’effectuent le regroupement.
Exemple : on peut grouper les employés en fonction de leur département.
Syntaxe : GROUP BY exp1, exp2,...
Pr. A. El Mhouti 35 FSTH
Langage d'Interrogation de Données
La clause GROUP BY
Cette clause :
1) subdivise la table en groupes.
2) produit une table résultat comportant une ligne pour chaque groupe.
Cette clause se place juste après la clause WHERE ou après FROM si WHERE n'existe pas.
Exemple 1 : Soient la table Etudiants(CNE, Nom, Prenom, Ville, Moyenne).
On veut le meilleur étudiant de chaque ville, en affichant sa moyenne et son prénom.
SELECT Ville, Prenom, MAX(Moyenne)
FROM Etudiants
GROUP BY Ville;
Ville Prenom Moyenne
Tanger Salah 17 Ville Prenom Max(Moyenne)
Tanger Brahim 13 Tanger Salah 17
Tanger Khadija 15
Al-Hoceima Rita 19
Al-Hoceima Karim 16
Al-Hoceima Rita 19 Fès Sara 14
Fès Sara 14
Table résultat comportant une ligne pour
Table divisée en groupes ayant la même chaque groupe + fonction de calcul
valeur pour l’attribut Ville
Pr. A. El Mhouti 36 FSTH
Langage d'Interrogation de Données
La clause HAVING
Si WHERE permet de sélectionner certaines lignes dans un SELECT, alors HAVING permet
de sélectionner certaines groupes dans un SELECT comportant un GROUP BY.
Obtenir l'âge moyen du personnel pour chaque société comportant plus de 2 employés :
SELECT Societes.Nom, AVG(Personnes.Age)
FROM Personnes, Societes
WHERE Personnes.NomSoc = Societes.Nom
GROUP BY Societes.Nom
HAVING COUNT(Personnes.NumSS) > 2;
Nom Age
Oracle 45 Nom AVG (Age)
Nom AVG (Age)
Oracle 35 Oracle 40
IBM 25
IBM 20 IBM 25
IBM 25 Table comportant une ligne Table résultat : une 2ème sélection
IBM 30 pour chaque groupe. (condition de HAVING)
Table divisée en groupes selon le Nom (GROUP BY)
Pr. A. El Mhouti 38 FSTH
Langage d'Interrogation de Données
La clause ORDER BY
Les lignes constituant le résultat d'un SELECT sont obtenues dans un ordre indéterminé.
ORDER BY précise l'ordre dans lequel la liste des lignes sélectionnées sera donnée.
Syntaxe : ORDER BY col ASC | DESC ;
expression : spécifie une colonne, ou une opération mathématique sur les colonnes.
ASC : spécifie l’ordre ascendant (valeur par défaut).
DESC : spécifie l’ordre descendant.
ORDER BY est la dernière clause de tout ordre SQL et ne doit figurer qu’une seule fois
dans le SELECT, même s’il existe des requêtes imbriquées.
Exemple 1 : Soit la table Employes (nuemp, #numdept, nome, job, salaire, comm)
On veut la liste des employés, triée par numéro de département et dans chaque
département par ordre de salaire décroissant :
SELECT *
FROM Employes
ORDER BY numdept, salaire DESC ;
Exemple 2 : Soit la table Employes (nuemp, #numdept, nome, job, salaire, comm)
On veut la liste des groupes de départements par ordre croissant du total des salaires :
SELECT numdept, SUM(Salaire) "Total salaires"
FROM Employes
GROUP BY numdept
ORDER BY 2 ;
numdept salaire
5 12000 numdept SUM(Salaire)
7 5289 7 5289
9 9000 5 12000
9 5200 9 14200
13 8500 13 20000
13 7000
Table comportant une ligne pour chaque groupe (GROUP BY).
13 4500
+
Table divisée en groupes selon le numdept Tri croissant du total des salaires (ORDER BY)
Les résultats de deux requêtes peuvent être combinés en utilisant les opérateurs
ensemblistes.
UNION : permet de fusionner deux sélections de tables pour obtenir un ensemble de lignes égal à la
réunion des lignes des deux sélections.
INTERSECT : permet d'obtenir l'ensemble des lignes communes à deux sélections.
EXCEPT : permet d'ôter d'une sélection les lignes obtenues dans une deuxième sélection.
Remarques :
requête_1 et requête_2 doivent avoir le même schéma.
Il est tout à fait possible de chaîner plusieurs opérations ensemblistes.
le comportement par défaut des opérateurs ensemblistes élimine les doublons.
Une condition utilisée dans WHERE peut comporter un SELECT imbriqué (à droite d'un
opérateur de comparaison).
Syntaxe : WHERE exp op (SELECT ...)
où :
▪ op est un des opérateurs : =, !=, <, >, <,=, >,=
▪ exp : toute expression légale.
Exemple : Soit la table Employes (nuemp, #numdept, nome, job, salaire, comm).
On veut sélectionner les employés ayant même job que Karim:
SELECT nome FROM Employes
WHERE job= (SELECT job
FROM Employes
WHERE nome = 'Karim');
Il est possible de comparer le résultat d'un SELECT ramenant plusieurs colonnes à une
liste de colonnes.
La liste de colonnes figurera entre parenthèses à gauche de l'opérateur de comparaison.
Syntaxe : WHERE (exp, exp,...) op (SELECT ...)
Exemple : soit la table : Employes (nuemp, #numdept, nome, job, salaire, comm)
Afficher les employés ayant même job et même salaire que PIERRE :
SELECT nome, job, Salaire
FROM Employes
WHERE (job, Salaire) = (SELECT job, Salaire FROM Employes
WHERE nome = ‘PIERRE')
Les expressions figurant dans la liste entre parenthèses seront comparées à celles qui sont
ramenées par le SELECT.
Exemple : soit la table : Employes (nuemp, #numdept, nome, job, salaire, comm)
Sous-requête IN à une colonne et plusieurs lignes :
Liste des employés ayant même job que quelqu'un du département 10 :
SELECT nome
FROM Employes
WHERE job IN (SELECT job FROM Employes
WHERE numdept=10);
Remarque : NOT IN
On peut tester la non existence du tuple dans la sous requête en utilisant NOT IN à la
place de la clause IN.
EXISTS permet de vérifier que la sous-requête contient au moins une valeur/tuple (le
résultat de la sous-requête n’est pas vide).
Syntaxe : WHERE EXISTS (SELECT ...)
Exemple : soit la table : Employes (nuemp, #numdept, nome, job, salaire, comm)
Liste des employés gagnant plus que tous les employés du département 30 :
SELECT nome, Salaire FROM Employes
WHERE Salaire > ALL (SELECT Salaire FROM Employes
WHERE numdept=30)