CPGE-REDA SALAOUI –AGADIR MP-PSI-TSI
LANGAGE SQL
I- INTRODUCTION
Le langage SQL (structured Query language) est un langage utilisé pour interroger, mettre à jour et gérer les
informations contenues dans des bases de données relationnelles.
SQL a une triple fonction.
- Définition et modification du schéma de la base de données.
DDL : Data Definition Language.
- Interrogation et modification des données.
DML : Data Manipulation Language
- Contrôler la sécurité et l’intégrité de la base de données
DCL : Data Control Language
II- LANGAGE DE DESCRIPTION DES DONNEES (DDL)
1. CREATE DATABASE : Créer une base de données.
2. CREATE TABLE : Créer une table.
3. ALTER TABLE : Modifier une table
4. DROP TABLE : Supprimer une table
Exemple : voir base de données VIDEOSCARE.
5. CREATE INDEX : Permet de créer un index
Un index (indexer) favorise une recherche plus rapide des enregistrements dans une table.
Exemple :
Pour chercher rapidement le nom d’un employé, il faut indexer la table employé selon la colonne nom.
Employé
CIN Nom Prénom Salaire
1 A24578 ALAMI AHMED 5500.00
2 JE4569 FAOUZI SAID 6200.00
3 AB6593 DAOUDI YOUSSEF 4000.00
4 B1234 ARABI FATIMA 8500.00
5 J3659 FELAH AMNIA 7550.00
CREATE INDEX indx_Nom
on employé (Nom asc)
indx_Nom
N°ligne Nom
1 ALAMI
4 ARABI
3 DAOUDI
2 FAOUZI
5 FELAH
Pour supprimer cet index :
DROP INDEX realisa.indx_Nom
Langage SQL 1 M.GUEROIHI
6. CREATE VIEW : Permet de créer une vue
Une vue est une table virtuelle, c'est-à-dire dont les données ne sont pas stockées dans une table de la
BD, et dans laquelle il est possible de rassembler des informations provenant de plusieurs tables. On
parle de "vue" car il s’agit simplement d’une représentation des données dans le but d’une exploitation
visuelle. Les données présentes dans une vue sont définies grâce à une clause SELECT.
Exemple 1:
On désire afficher la liste suivante :
Filmcod filmtit catlib reanom reapre
…. …… …… …….. ……..
…. …… …… …….. ……..
…. …… …… …….. ……..
Donc il faut créer la vue ci-dessous :
Create view film_categ_realisa
(Code,Titre,Categorie,Nom_realisateur,Prenom_realisateur)
As
SELECT Filmcod,filmtit,catlib,reanom,reapre
FROM Film,categ,realisa
Where Film.catcod=categ.catcod and Film.reacod=realisa.reacod
Pour afficher les données d’une vue on peut écrire :
SELECT * from film_categ_realisa
Intérêt d’une vue.
Une sélection des données à afficher
Une restriction d’accès à la table pour l’utilisateur, c'est-à-dire une sécurité des données.
Un regroupement d’information au sein d’une entité.
Pour supprimer une vue :
DROP VIEW NOM_Vue
Langage SQL 2 M.GUEROIHI
- Exercice
1- Créer la vue qui permet d’afficher la liste suivante :
CodeK7 titreFilm Categorie nomrealisateur typeK7
…… …… …… …… ……
…… …… …… …… ……
…… …… …… …… ……
…… …… …… …… ……
2- Créer la vue qui affiche la liste suivante :
CodeFilm Titre NomActeur NomRéalisateur
…… …… …… ……
…… …… …… ……
…… …… …… ……
…… …… …… ……
Langage SQL 3 M.GUEROIHI
III- LANGAGE DE MANIPULATION DES DONNEES (DML)
1- Sélection de données
a- Expression d’une Projection
Instruction SELECT
Requête 1 :
Affiche tous les champs et toutes les lignes de la table Acteur
SELECT *
FROM Acteur Remarque :
SELECT : Instruction
FROM : Clause
Requête 2 :
Affiche tous les noms et les prénoms de
SELECT Actnom as "Nom Acteur", Actpre as prenom
tous les Acteurs
FROM Acteur
Requête 3 :
SELECT Actnom as "Nom Acteur", Affiche tous les noms et les prénoms de tous les
Acteurs triés dans l’ordre décroissant des noms (Z--
Actpre as prenom
> A)
FROM Acteur
Remarque :
ORDER BY Actnom desc
ORDER BY: clause de Tri
Requête 4 :
select distinct k7typ,k7loc,k7pri Affiche la liste des k7 (k7typ,k7loc,k7pri) en
éliminant les doublants.
from k7
Les lignes identiques ne sont affichées qu’une
seule fois.
Remarque : distinct # all
distinct, all sont des prédicats.
Requête 5 :
select distinct k7typ,k7loc,k7pri
from k7 Affiche la liste des 3 cassettes les plus chères.
order by k7pri desc
limit 0,3
Langage SQL 4 M.GUEROIHI
b- Expression des restrictions
Une restriction consiste à sélectionner les lignes satisfaisant à une condition logique effectuée sur leurs attributs.
En SQL, les restrictions s’expriment à l’aide de la clause WHERE suivie d’une condition logique exprimée à l’aide
des opérateurs de comparaison et logiques :
Opérateurs de comparaison arithmétiques
= Egalité
!= ou <> Différent
> Strictement supérieur
< Strictement inférieur
>= ou !< Supérieur ou égale
<= ou !> inférieur ou égale
Opérateurs de comparaison des ensembles
IN Dans
BETWEEN Entre
LIKE Comme
Opérateurs logiques
AND ET
OR OU
NOT NON
RESTRICTIONS SIMPLES
Requête 6 :
select *
from k7
WHERE k7pri>=200 Affiche la liste des k7 dont le prix est >= 200.
RESTRICTIONS sur une comparaison des chaînes :
Le prédicat LIKE permet de faire des comparaisons des chaînes grâce à des caractères appelés caractères génériques
ou jokers :
% : remplace une séquence de caractères.
_ : remplace un caractère.
Exemples :
Requête 7 :
select * Affiche la liste des films dont le titre commence
from FILM par A.
WHERE FILMTIT LIKE 'A%’
Requête 8 :
select * Affiche la liste des Acteur dont le deuxième
from Acteur caractère du Nom est O.
WHERE Actnom LIKE '_O%'
Requête 9 :
select * Affiche la liste des films dont le titre commence
from FILM par B et se termine par (Le)
WHERE FILMTIT LIKE 'B%(Le)'
Langage SQL 5 M.GUEROIHI
RESTRICTIONS sur un ensemble :
Le prédicat BETWEEN et IN permettent de vérifier respectivement qu’une valeur se trouve dans un intervalle ou
qu’une valeur appartient à une liste de valeurs.
Exemples
Requête 10 :
select * Affiche la liste des K7 dont le prix est compris
from K7 entre 100 et 200
WHERE k7pri BETWEEN 100 AND 200
Equivalent à :
select *
from K7
WHERE k7pri >= 100 AND k7pri <=200
Requête 11 :
select * Affiche la liste des films dont la nationalité est
from FILM 'FRA' ou 'USA'
WHERE FILMNAT IN ('FRA' , 'USA')
Equivalent à :
select *
from FILM
WHERE FILMNAT ='FRA' or FILMNAT ='USA'
RESTRICTIONS sur les valeurs manquantes :
Requête 12 :
select * Affiche la liste des Acteurs dont le prénom n’est
from ACTEUR pas saisi.
WHERE Actpre is null
Requête 13:
select * Affiche la liste des Acteurs dont le prénom est
from ACTEUR saisi.
WHERE Actpre is not null
2- Tri des Résultats
a- Tri des données : Clause ORDER BY
Requête 14 :
select * Affiche la liste des FILMS dans l’ordre
from FILM alphabétique croissant des titres
ORDER BY Filmtit Asc
Requête 15 :
select * Affiche la liste des ACTEURS dans l’ordre
from ACTEUR alphabétique croissant des noms et ordre
ORDER BY Actnom Asc, Actpre Desc décroissant des prénoms
Langage SQL 6 M.GUEROIHI
b- Regroupement des données : Clause GROUPE BY
il peut être intéressant de regrouper des résultats afin de faire des opérations par groupe (opérations statistiques par
exemple). Cette opération sera réalisée à l’aide de la clause GROUPE BY suivie du nom de chaque colonne sur la quelle
on veut effectuer des regroupements.
Les principales fonctions pouvant être effectuées par groupe sont :
- AVG : calcule la moyenne d’une colonne.
- COUNT : compte le nombre de ligne.
- MAX : calcule la valeur maximale.
- MIN : calcule la valeur minimale.
- SUM : calcule la somme des valeurs d’une colonne.
Exemples :
Requête 16 :
select COUNT(*) AS "Nombre Acteurs"
from ACTEUR
Requête 17 :
Calculer la somme des prix des cassettes de local
select SUM(K7pri) AS "Somme A" ‘A’
from K7
WHERE K7loc = 'A'
Requête 18 :
select SUM(K7pri) AS "Somme Prix",
AVG(K7pri) AS "Moyenne Prix",
count(K7pri) AS "Nombre K7",
MAX(K7pri) AS "Prix Maximum",
MIN(K7pri) AS "Prix Minimum"
from K7
Requête19 :
Select CATCOD, count (CATCOD) as "nombre de
FILM"
from FILM
group by CATCOD
- Ecrire la requête qui calcule le nombre de films joués par chaque acteur ?
Requête 20 :
select ACTCOD, count (ACTCOD) as "Nombre de Film"
from JOUE
group by ACTCOD
Langage SQL 7 M.GUEROIHI
- Ecrire la requête qui calcule le nombre de d’acteurs principaux qui ont joué dans chaque film ?
select FilmCod, count (FILMCOD) as "Nombre d’Acteurs"
from JOUE
group by FilmCod
Remarque :
La clause HAVING va de pair avec GROUP BY, il permet d’indiquer une restriction sur les groupes crées grâce à la
clause GROUP BY.
EX :
- Ecrire la requête qui affiche les codes des acteurs qui ont joués dans plus qu’un film?
Requête 21 :
select ACTCOD, count (FILMCOD) as "Nombre de Film"
from JOUE
group by ACTCOD
having count (FILMCOD)>1
Requête 22 :
- Ecrire le code SQL permettant d’afficher le nombre de K7 et le prix maximum et le prix minimum des K7 de
type «VHS » ?
select count (K7COD) as "nombre de K7 de type VHS",
max(K7PRI) as "prix maximum",
min(K7PRI) as "prix minimum"
from K7
where K7TYP='VHS'
-----ou bien --------
select count (K7COD) as "nombre de K7 de type VHS",
max(K7PRI) as "prix maximum",
min(K7PRI) as "prix minimum"
from K7
group by K7TYP
having K7TYP='VHS'
-------ou bien ------
select count (K7COD) as "nombre de K7 de type VHS",
max(K7PRI) as "prix maximum",
min(K7PRI) as "prix minimum"
from K7
where K7TYP='VHS'
group by K7TYP
Langage SQL 8 M.GUEROIHI
Ecrire le code sql qui permet d’afficher le nombre de films et la durée moyenne par catégorie sous le format suivant :
Catlib NombreFilms Durée Moyenne
……. ……… …...
……. ……… …...
……. ……… …...
……. ……… …...
3- Les jointures
Une jointure est un produit cartésien de deux tables.
Soient les tables suivantes :
L’affichage des libellés des catégories des films se fait par le code SQL :
Requête 23 :
Select filmcod, filmtit, catlib
from film,categ Liste des tables
where film.catcod=categ.catcod
Condition de jointure
Langage SQL 9 M.GUEROIHI
Ecrire le code SQL qui affiche le nombre de films de chaque catégorie :
Requête 24 :
Select catlib, count(filmcod)"Nombre de films"
from film,categ
where film.catcod=categ.catcod
group by catlib
- Ecrire le code SQL qui affiche la liste suivante :
K7cod Filmcod Filmtit catlib
…. …….. ……. ……..
…. …….. ……. ……..
…. …….. ……. ……..
…. …….. ……. ……..
Requête 25 :
Select K7cod,k7.Filmcod,Filmtit,catlib
from k7,film,categ
where k7.filmcod=film.filmcod and film.catcod=c
ateg.catcod
Requête 26 :
- Ecrire le code SQL qui affiche la liste suivante :
K7cod Filmcod Filmtit catlib Réalisateur
…. …….. ……. …….. …………..
…. …….. ……. …….. …………..
…. …….. ……. …….. …………..
…. …….. ……. …….. …………..
select K7cod,film.Filmcod,Filmtit,catlib,reanom+reapre "Réalisateur"
from k7,film,categ,realisa
where k7.filmcod=film.filmcod and film.catcod=categ.catcod and
realisa.reacod=film.reacod
Langage SQL 10 M.GUEROIHI
4- les sous-requêtes
Effectuer une sous-requête consiste à effectuer une requête à l’intérieure d’une autre requête, ou en d’autre terme
d’utiliser une requête afin de réaliser une autre.
Une sous-requête doit être placée à la suite d’une clause WHERE ou HAVING et doit remplacer une constante ou un
groupe de constantes qui permettraient d’exprimer la qualification.
Lorsque la sous-requête remplace une constante utilisée dans une expression avec des opérateurs
classiques (=, >, <, >=, <=, <>), elle doit obligatoirement renvoyer une seule réponse (une seule valeur)
SELECT …….. FROM …. WHERE…… < ( SELECT ….. FROM ……)
Lorsque la sous-requête remplace une constante mettant en jeu les opérateurs IN, EXISTS, ALL ou
ANY, elle doit obligatoirement renvoyer une seule ligne ou une seule colonne.
SELECT …….. FROM …. WHERE…… IN ( SELECT ….. FROM ……)
Exemples :
Requête 27 :
Ecrire le code SQL permettant d’afficher la liste des films dont la durée est supérieure ou égale à la moyenne des durées
de tous les films.
select * from film
where filmdur >=(select avg(filmdur) from film)
Requête 28 :
Quel est le résultat de cette requête ? Réécrire la requête d’une autre façon.
Select * from film
Where catcod in (select catcod from categ where catlib='Aventure' or
catlib='comique' or catlib like 'Dr%')
Cette requête affiche la liste des films dont la catégorie est Aventure, comique ou commence
par Dr.
Select * from film,categ
where categ.catcod=film.catcod
and (catlib='Aventure' or catlib='comique' or catlib like 'Dr%')
Requête 29 :
Ecrire de le code SQL permettant d'afficher le code, le titre et la durée du film ayant la
durée maximum.
select filmcod, filmtit, filmdur
from film
where filmdur = (select max (filmdur) from film)
Langage SQL 11 M.GUEROIHI
5- Mise à jour des données
a- Insertion des données (Ajout) : instruction INSERT
Syntaxe:
INSERT INTO Nom_Table (colonne1,colonne2,colonne3,… )
VALUES(Valeur1, Valeur2, valeur3,…)
Exemples:
Requête 30 :
insert into acteur (actcod,actnom,actpre)
values(200,'alaoui','ahmed')
Insère l'acteur: 200 alaoui ahmed
dans la table acteur.
Remarque:
Si actcod est un compteur la requête précédente va engendrer une erreur : Impossible d'insérer une
valeur explicite…
Correction:
insert into acteur (actnom,actpre)
values('alaoui','ahmed')
ou
insert into acteur
values('alaoui', 'ahmed')
Remarque:
Pour insérer le contenu d'une table dans une autre table ayant la même structure:
Requête 31 :
insert into ArchiveFilm
select * from film where filman<=1964
Film et Archive film ont la même structure.
b- Modification des données : instruction UPDATE
La modification des données consiste à modifier des tuples (lignes) dans une table grâce à l'ordre UPDATE, la
modification à effectuer est précisée après la clause SET.
Syntaxe:
UPDATE Nom_Table
SET colonne=Expression
Where Condition
Ex :
Requête 32 :
Ecrire le code SQL permettant de modifier la durée du film dont le code est 66 (remplacer la durée 110 par 100).
Update film
Set filmdur=100
Where filmcod=66
Langage SQL 12 M.GUEROIHI
Requête 33 :
Ecrire le code SQL permettant de soustraire 5 mn de la durée des films dont l'année est < 1964
Update film
Set filmdur= filmdur - 5
Where filman <= 1964
C- Suppression des données : instruction DELETE
Syntaxe:
DELETE from Nom_Table
Where Condition
Ex:
Requête 34 :
Supprimer l'acteur dont le nom est 'FONDA'
DELETE from Acteur
Where actnom = 'FONDA'
Que fait le code suivant :
DELETE from Acteur
Supprimer tous les Acteurs de la table Acteur. (Table Acteur devient vide)
TP :
VOIR CAS VIDEOSCAR.
Langage SQL 13 M.GUEROIHI