Langage SQL - Hajraoui
Langage SQL - Hajraoui
Langage SQL - Hajraoui
Filière: MP
Matière : Informatique
Langage SQL
1. Introduction
SQL signifie «Structured Query Language », c'est-à-dire «Langage d'interrogation
Structuré ». En fait SQL est un langage complet de gestion de bases de données
relationnelles. Il a été conçu par IBM dans les années 70. Il est devenu le langage standard
des systèmes de gestion de bases de données (SGBD) relationnelles (SGBDR). C'est à la fois
un langage:
d'interrogation de la base de données (commande : SELECT),
de manipulation (modification) des données (commandes : INSERT, UPDATE,
DELETE),
de définition des données (commandes : CREATE, ALTER, DROP),
de contrôle de l'accès aux données (commandes : GRAN, REVOKE).
Le langage SQL est utilisé par les principaux SGBDR : DB2, Oracle, SQL Server,
Microsoft Access, PostgreSQL, SQLite, MySQL... . Chacun de ces SGBDR a cependant sa
propre variante du langage. Ce support de cours présente un noyau de commandes
disponibles sur l'ensemble de ces SGBDR, et leur implantation dans SQLite pendant les
séances de TP.
EMPLOYE
1
NSS Nom Prenom Salaire Departement
175457 Aissaoui Hamid 8500 Marketing
183982 Saadani Adil 6000 Production
195484 Amrani Louay 10500 Conception
295060 Fawzi Siham 7500 Vente
Si l’ont veut avoir la liste de toutes les départements des employés, il suffit d’effectuer la
requête suivante :
SELECT Departement FROM Employe
Résultat :
Marketing
Production
Conception
Vente
Pour obtenir les noms et les prénoms des employés, il faut alors faire la requête suivante:
SELECT Nom, Prenom FROM Employe
Résultat :
Aissaoui Hamid
Saadani Adil
Amrani Louay
Fawzi Siham
Auteur : Abdellatif Hajraoui
Il est possible de retourner automatiquement toutes les colonnes d’une table. Au lieu de
lister toutes les colonnes, il faut simplement utiliser le caractère « * ». Il s’utilise de la
manière suivante :
SELECT * FROM Employe
Cette requête retourne exactement les mêmes colonnes qu’il y a dans la table de tous les
enregistrements.
2
L’utilisation de la commande SELECT en SQL permet de lire toutes les données d’une ou
plusieurs colonnes. Cette commande peut potentiellement afficher des lignes en doubles.
Pour éviter des redondances dans les résultats il faut simplement ajouter DISTINCT après le
mot SELECT.
La commande ALL indique que les doublons peuvent apparaître dans le résultat d'une
requête, elle constitue une commande par défaut de SELECT.
L’utilisation basique de l’une de ces deux commandes consiste alors à effectuer la requête
suivante :
SELECT DISTINCT | ALL nom_colonne FROM nom_table
Exemple : Prenons le cas concret d’une table «librairie » qui contient les informations d’une
liste de livres :
Librairie
ISBN Titre Editeur Prix
1565926978 ORACLE SQL : THE ESSENTIAL REFERENCE O'REILLY 330.00
1565929489 ORACLE : COURS ET EXERCICES O'REILLY 286.00
2212092857 INITIATION A SQL EYROLLES 183.00
2744009296 SQL - COURS ET EXERCICES CAMPUS PRESS 62.00
Pour sélectionner uniquement les titres des livres sans doublons il faut utiliser la requête
suivante :
SELECT DISTINCT Titre FROM Librairie
Résultat :
Auteur : Abdellatif Hajraoui
ORACLE SQL : THE ESSENTIAL REFERENCE
ORACLE SQL - COURS ET EXERCICES
INITIATION A SQL
SQL- COURS ET EXERCICES
Apprendre à programmer en Java
Ce résultat affiche volontairement qu’une seule fois le livre «SQL » grâce à l’utilisation de
la commande DISTINCT qui n’affiche que les résultats distincts.
Exemples:
Dans la table «Librairie», pour obtenir seulement la liste des livres de l’éditeur
«EYROLLES», il faut effectuer la requête suivante :
SELECT * FROM Librairie WHERE Editeur = ' EYROLLES '
4
Résultat :
Dans la table «Employé», pour obtenir seulement la liste des employés qui ont un salaire
entre 7000 et 9000, il faut effectuer la requête suivante :
SELECT * FROM Employe WHERE Salaire >= 7000 AND Salaire <= 9000
Résultat :
175457 Aissaoui Hamid 8500 Marketing
295060 Fawzi Siham 7500 Vente
L’opérateur BETWEEN est utilisé dans une requête SQL pour sélectionner un
intervalle de données. Ce dernier peut être constitué de chaînes de caractères, de nombres ou
de dates. L’exemple le plus concret consiste par exemple à récupérer uniquement les
enregistrements entre 2 dates définies.
Exemple: WHERE date_Embauche BETWEEN #01-01-2010# AND #31-12-2014#
L’opérateur BETWEEN peut être utilisé avec l’opérateur logique NOT (NOT
BETWEEN) pour sélectionner des données qui ne sont pas inclues dans un intervalle.
Dans la table «Employé», pour avoir les noms et prénoms des employés qui travaillent
uniquement dans les départements: Production ou Conception ou Vente, voici 2 requêtes qui
retourneront les mêmes résultats, l’une utilise plusieurs OR, tandis que l’autre utilise
l’opérateur IN.
SELECT Nom, Prenom FROM Employe WHERE Departement = ' Production ' OR
Departement = ' Conception ' OR Departement = ' Vente ' Auteur : Abdellatif Hajraoui
SELECT Nom, Prenom FROM Employe WHERE Departement IN ( ' Production ', '
Conception ' , ' Vente ')
La syntaxe utilisée avec l’opérateur IN est plus simple que d’utiliser une succession
d’opérateur OR. En effet, entre les parenthèses il n’y a pas de limite du nombre d’arguments.
Cette syntaxe peut être associée à l’opérateur NOT (NOT IN)pour recherche toutes les
lignes qui ne sont pas égales à l’une des valeurs stipulées
Dans la table «Librairie», si l’ont souhaite obtenir uniquement la liste des livres dont le
titre commence par ‘SQL’, il faut effectuer la requête en utilisant l’opérateur LIKE:
5
SELECT * FROM Librairie WHERE Titre LIKE ' SQL% '
Résultat :
L’opérateur LIKE permet d’effectuer une recherche sur un modèle particulier. Il est par
exemple possible de rechercher les enregistrements dont la valeur d’une colonne commence
par telle ou telle lettre. Les modèles de recherches sont multiples, mais il ressemble très
généralement à l’un des exemples suivants :
LIKE ‘%a’ : le caractère « % » est un caractère joker qui remplace tous les autres
caractères. Ainsi, ce modèle permet de rechercher toutes les chaines de caractère qui se
termine par un «a».
LIKE ‘a%’ : ce modèle permet de rechercher toutes les lignes de « colonne » qui
commence par un « a ».
LIKE ‘%a%’ : ce modèle est utilisé pour rechercher tous les enregistrements qui
utilisent le caractère « a ».
LIKE ‘pa%on’ : ce modèle permet de rechercher les chaines qui commence par « pa »
et qui se terminent par « on », comme « pantalon » ou « pardon ».
LIKE ‘a_c’ : peu utilisé, le caractère « _ » (underscore) peut être remplacé par
n’importe quel caractère, mais un seul caractère uniquement (alors que le symbole
pourcentage « % » peut être remplacé par un nombre incalculable de caractères . Ainsi, ce
modèle permet de retourner les lignes « aac », « abc » … « azc ».
L’opérateur IS NULL est utilisé dans une requête SQL pour filtrer les résultats qui
contiennent la valeur NULL. Il convient d’utiliser la syntaxe suivante :
SELECT * FROM Table WHERE Nom_colonne IS NULL
A l’inverse, pour obtenir uniquement les enregistrements qui ne sont pas null, il convient
d’utiliser L’opérateur IS NOT NULL.
Auteur : Abdellatif Hajraoui
La clause LIMIT est à utiliser dans une requête SQL pour spécifier le nombre maximum
de résultats que l’ont souhaite obtenir.
Exemple : dans la table «Employe», si l’ont souhaite obtenir uniquement les informations
des 3 premiers enregistrements :
SELECT * FROM Employe LIMIT 3
La clause LIMIT est souvent associé à un OFFSET, c’est-à-dire effectuer un décalage sur
le jeu de résultat. Par exemple, la requête suivante retourne les enregistrements de 3 à 6 de la
table Employe:
SELECT * FROM Employe LIMIT 4 OFFSET 2
6
2.4. Les fonctions d'agrégation
Il existe plusieurs fonctions qui peuvent être utilisées pour manipuler plusieurs
enregistrements, il s’agit des fonctions d’agrégations statistiques. Ce sont des fonctions qui
accomplissent un calcul sur plusieurs valeurs et retournent un résultat. Les principales sont
données dans le tableau ci-dessous:
Exemples : dans la table «Employé»:
Pour obtenir le nombre des employés:
SELECT count (*) FROM Employe
Pour obtenir le nombre des départements:
SELECT count (distinct departement) FROM Employe
Pour obtenir la somme des salaires des employés:
SELECT sum (salaire) FROM Employe
Pour obtenir le plus grand salaire:
SELECT max (salaire) FROM Employe
Fonction Description
AVG retourne la moyenne des valeurs d'un groupe.
COUNT retourne le nombre d'éléments figurant dans un groupe.
MAX retourne la valeur maximale de l'expression.
MIN retourne la valeur minimale de l'expression.
SUM retourne la somme de toutes les valeurs
STDEV retourne l'écart type de toutes les valeurs de l'expression spécifiée.
VAR retourne la variance de toutes les valeurs de l'expression spécifiée.
7
La clause HAVING en SQL est presque similaire à WHERE à la seule différence que
HAVING permet de filtrer en utilisant les fonctions d’agrégation. HAVING est très souvent
utilisé en même temps que GROUP BY. L’utilisation de HAVING se fait de la manière
suivante :
SELECT colonne1, fonction (colonne2) FROM nom_table GROUP BY colonne1
HAVING fonction(colonne2) operateur valeur
Exemple : dans la table «Employé», on souhaite récupérer la somme des salaires des
employés de chaque département dont cette somme est supérieur à 15000.
SELECT departement, sum (salaire) FROM Employe GROUP BY departement
HAVING sum (salaire) >= 15000
Le critère de la clause ORDER BY peut être soit le nom, soit le numéro d'une des colonnes
sélectionnées par la requête.
Exemple : on souhaite retourner le nom et le salaire de chaque employé, classé par ordre
croissant du salaire :
SELECT nom, salaire FROM Employe ORDER BY salaire
Par défaut les résultats sont classés par ordre ascendant (croissant) ASC, toutefois il est
possible d’inverser l’ordre en utilisant le suffixe DESC (décroissant) après le nom de la
colonne.
SELECT nom, salaire FROM Employe ORDER BY salaire DESC
Par ailleurs, il est possible de trier sur plusieurs colonnes en les séparant par une virgule.
Exemple : on souhaite retourner le nom et le salaire de chaque employé, classé par ordre Auteur : Abdellatif Hajraoui
croissant du salaire et par ordre alphabétique du nom:
SELECT nom, salaire FROM Employe ORDER BY salaire, nom
8
Exemple 1: on souhaite afficher le nom, le prénom et le salaire de l’employé qui a le plus
grand salaire:
SELECT nom, prenom, salaire FROM Employe WHERE salaire = (SELECT max
(salaire) FROM Employe)
Exemple 2: on souhaite retourner le nom, le prénom et le salaire des employés qui ont un
salaire plus grand que le salaire moyen:
SELECT nom, prenom, salaire FROM Employe WHERE salaire >(SELECT avg
(salaire) FROM Employe)
La clause AS affectant un alias à une table ou une colonne, peut être remplacé par un simple
espace blanc.
Exemple :
SELECT departement AS D, sum (salaire) AS SS FROM Employe AS E GROUP BY D
HAVING SS >= 15000
Ou bien
3. Les jointures
Un bon moyen de retrouver les données de plusieurs tables consiste à effectuer la jointure
des tables. Les jointures en SQL permettent d’associer plusieurs tables dans une même Auteur : Abdellatif Hajraoui
requête.
L’opération de jointure porte sur 2 tables qui doivent avoir au moins un attribut défini
dans le même domaine.
La condition de jointure peut porter sur l'égalité d'un ou de plusieurs attributs définis dans
le même domaine (mais n'ayant pas forcément le même nom) (l'équijointure).
Les n-uplets de la table résultat sont formés par la concaténation des n-uplets des relations
d'origine qui vérifient la condition de jointure.
Des jointures plus complexes que l'équijointure peuvent être réalisées en généralisant
l'usage de la condition de jointure à d'autres critères de comparaison que l'égalité (<,>,
<=,>=, <>).
9
Il y a d’autres cas de jointures, incluant des jointures sur la même table.
Pour bien illustrer cette notion de jointure, prenons l’exemple d’une la base de données
constituée de deux relations EMPLOYE et DEPARTEMENT dont les schémas
relationnelles sont:
EMPLOYE (IdE, Nom, Prenom, Salaire, #IdD)
DEPARTEMENT (IdD, Nom, #IdChef)
IdE (identité de l’employé) et IdD (identité du département) sont respectivement les clés
primaires des deux relations EMPLOYE et DEPARTEMENT.
L'attribut IdD (identité du département) de la relation EMPLOYE fait référence à la clé
primaire de la relation DEPARTEMENT.
L'attribut IdChef (identité du chef de département) de la relation DEPARTEMENT fait
référence à la clé primaire de la relation EMPLOYE.
On donne ci-dessous deux exemples de tables représentant ces deux relations.
EMPLOYE
IdE Nom Prenom Salaire IdD
1 Amrani Hamid 10000 1
2 Saadani Adil 9000 1
3 Fawzi Imane 7500 1
4 El hassani Najwa 9500 2
5 Alaoui Siham 6000 2
6 Hamidi Said 5500 2
DEPARTEMENT
IdD Nom IdChef
1 Marketing 1
2 Vente 4
Auteur : Abdellatif Hajraoui
3.1. Jointure d'égalité (équijointure)
Une jointure d'égalité symbolisée par INNER JOIN crée une relation de correspondance
entre des tables. C’est un type de jointures très communes pour lier plusieurs tables entre-
elles pour retourner des enregistrements lorsqu’il y a au moins une ligne dans chaque
colonne qui correspond à la condition de jointure.
Exemple 1 : Si on veut retourner les informations de chaque Employé avec les
informations du département où il travaille, il convient d’utiliser la requête suivante :
SELECT * FROM Employe, departement WHERE Employe.IdD=Departement.IdD
10
IdE Nom Prenom Salaire IdD IdD Nom IdChef
1 Amrani Hamid 10000 1 1 Marketing 1
2 Saadani Adil 9000 1 1 Marketing 1
3 Fawzi Imane 7500 1 1 Marketing 1
4 El hassani Najwa 9500 2 2 Vente 4
5 Alaoui Siham 6000 2 2 Vente 4
6 Hamidi Said 5500 2 2 Vente 4
On constate dans le résultat de cette requête, que la colonne IdD est en double. Pour l’éviter,
on doit spécifier les noms des colonnes à afficher.
Exemple 2 : Maintenant, si on veut retourner l’identité, le nom, le prénom de chaque
Employé et le nom du département où il travaille, on utilisera la requête suivante :
SELECT IdE, E.nom, prenom, D.nom FROM Employe AS E, departement AS D WHERE
E.IdD=D.IdD
12