Vous êtes sur la page 1sur 64

SQL: Trois langages

Langage de dfinition de donnes (LDD/DDL)


cration

de relations : CREATE TABLE modification de relations: ALTER TABLE suppression de relations: DROP TABLE vues, index . : CREATE VIEW ...

Langage de requtes (LMD/DML)


SELECT

.... FROM ....... WHERE ..........

Langage de manipulation de donnes (LMD /DML)


insertion

de tuples: INSERT mise jour des tuples: UPDATE suppression de tuples: DELETE
2

Structure gnrale dune requte : le BLOC

Structure d'une requte forme de trois clauses:


SELECT <liste-attributs> FROM <liste-tables> WHERE <condition>

SELECT dfinit le format du rsultat cherch FROM dfinit partir de quelles tables le rsultat est calcul WHERE dfinit les prdicats de slection du rsultat
4

Exemple de requte
SELECT * FROM country

->

tous les attributs de tous les tuples dans la

table country table Country country Ireland Austria Utd Kingdom Switzerland capital Dublin Vienna London Berne population 3 8 56 7 area 70 83 244 41
5

SQL / Algbre

SQL/Algbre

Passage de l algbre relationnelle au langage de requtes de SQL Traduction de chacun des 9 oprateurs en un bloc SQL

SQL / Algbre Identit

En SQL : SELECT * FROM R

SQL / Algbre Slection

En algbre : [condition] R

En SQL : SELECT * FROM R WHERE condition

Exemple de requte de slection


algbre: [population < 20] Pays
PAYS
nom Irlande Autriche
Royaume-Uni

SELECT FROM WHERE


surface 70 83 244 41 441

* Pays population < 20 ;

capitale Dublin Vienne Londres Berne Washington

population 3 8 36 7 189

Suisse USA

* = toutes les colonnes


10

SQL / Algbre Projection

En algbre :

En SQL : SELECT A1,A2,An FROM R

[ A1, A2,, An] R

11

Exemple de requte de projection


SELECT FROM
PAYS
nom Irlande Autriche
Royaume-Uni

nom, capitale Pays;


capitale Dublin Vienne Londres Berne Washington population 3 8 36 7 189 surface 70 83 244 41 441

Suisse USA

algbre: [nom, capitale] Pays


12

Requte de slection + projection


SELECT nom, capitale, population
PAYS
nom Irlande Autriche
Royaume-Uni

FROM Pays WHERE population < 20 ;


capitale Dublin Vienne Londres Berne Washington population 3 8 36 7 189 surface 70 83 244 41 441 nom Irlande Autriche capitale Dublin Vienne

Suisse USA

rsultat
population 3 8 7

Suisse Berne algbre: 13 [nom, capitale, population] ( [population < 20] Pays)

SQL / Algbre Produit cartsien

En algbre : RS

En SQL : SELECT * FROM R, S

15

SQL / Algbre Jointure

En algbre : R S

En SQL : SELECT * FROM R, S WHERE R.A1 = S.A1 AND R.A2 = S.A2 AND R.An = S.An Avec A1, , An tous les attributs communs R et S
16

Jointure de 2 relations
JO
anne 1896 1900
1904

lieu Athnes Paris St.Louis Londres

pays Grce France USA


Royaume-Uni

SELECT anne, lieu, pays, capitale FROM JO, PAYS WHERE JO.pays = PAYS.nom;

1908

PAYS
nom Irlande Autriche
Royaume-Uni

capitale Dublin Vienne Londres Berne Washington

population 3 8 36 7 189

surface 70 83 244 41 441


17

Suisse USA

Jointure de 2 relations: rsultat


JO
anne 1896 1900
1904

PAYS
lieu Athnes Paris St.Louis Londres pays Grce France USA
Royaume-Uni

nom Irlande Autriche


Royaume-Uni

capitale population surface Dublin Vienne Londres Berne


Washington

1908

Suisse USA

3 8 36 7 189

70 83 244 41 441

Rsultat
anne
1904

lieu St.Louis Londres

pays USA
Royaume-Uni

capitale Washington
Londres

1908

SELECT anne, lieu, pays, capitale FROM JO, PAYS WHERE JO.pays = PAYS.nom ;
18

Jointure sur la mme table


Comment comparer les populations des pays? ?? Toutes les paires de pays telles que le premier pays a une population plus grande que le deuxime pays
SELECT P1.nom, P1.population, P2.nom, P2.population FROM PAYS as P1, PAYS as P2 WHERE P1.population > P2.population; NB: La table PAYS est renomme en P1 et P2 (alias)
19

Jointure sur la mme table


PAYS
nom Irlande Autriche
Royaume-Uni

capitale Dublin Vienne Londres Berne Washington

population 3 8 36 7 189

surface 70 83 244 41 441

Suisse USA

PAYS
nom Irlande Autriche
Royaume-Uni

capitale Dublin Vienne Londres Berne Washington

population 3 8 36 7 189

surface 70 83 244 41
20

Suisse USA

PAYS-P1 nom Irlande Autriche RU Suisse USA PAYS-P2 nom Irlande Autriche RU Suisse USA

population 3 8 36 7 Washington 189 population 3 8 36 7 Washington 189 capitale Dublin Vienne Londres Berne

capitale Dublin Vienne Londres Berne

surface 70 83 244 41 441 surface 70 83 244 41 441

SELECT P1.nom, P1.population, P2.nom, P2.population FROM PAYS P1, PAYS P2 WHERE P1.population > P2.population

rsultat
nom-P1 Autriche Autriche
RU RU RU

P1.population > P2.population


nom-P2 Irlande Suisse Irlande Autriche Suisse pop-P2 3 7 3 8 7
21

pop-P1 8 8 36 36 36

Jointure externe

Jointure classique: on supprime les tuples qui ne vrifient pas la condition de jointure Jointure externe:

Dfinition dune table dominante et dune table subordonne On garde toutes les lignes de la table dominante quon joint avec null

SELECT From A, B Where A.x = B.y A : table dominante

SELECT From A LEFT OUTER JOIN B On A.x = B.y

Retourne tous les tuples de A

Jointure externe

Right outer join: SELECT From A, B Where A.x= B.y Full outer join: SELECT From A FULL OUTER JOIN B On A.x = B.y
23

SELECT From A RIGHT OUTER JOIN B On A.x = B.y

Jointure externe
JO
anne 1896 1900
1904

PAYS
nom Irlande Autriche
Royaume-Uni

lieu Athnes Paris St.Louis Londres

pays Grce France USA


Royaume-Uni

capitale population surface Dublin Vienne Londres Berne


Washington

1908

Suisse USA

3 8 36 7 189

70 83 244 41 441

Rsultat
anne 1896 1900 1904 lieu pays Grce
France USA Royaume-Uni

capitale NULL
NULL Washington Londres

Athnes Paris St Louis Londres

Table

1908

dominante

SELECT anne, lieu, JO.pays, capitale FROM JO LEFT OUTER JOIN PAYS ON JO.pays = PAYS.nom;
24

SQL / Algbre union

En algbre : RS

En SQL : BlocR UNION BlocS SELECT * FROM R UNION SELECT * FROM S


25

Les tuples en double sont limins du rsultat

SQL / Algbre intersection

En algbre : RS

En SQL : BlocR INTERSECT BlocS SELECT * FROM R INTERSECT

Les tuples en double sont limins du rsultat

SELECT * FROM S

26

SQL / Algbre diffrence

En algbre : RS

En SQL : BlocR MINUS BlocS SELECT * FROM R MINUS SELECT * FROM S


27

Les tuples en double sont limins du rsultat

Diffrences

En SQL :

Le rsultat d'une requte peut contenir plusieurs occurrences dun n-uplet,


pour avoir une seule occurrence de chaque n-uplet dans une relation : DISTINCT z Exemple : select distinct nom from Personne
z

Le rsultat d'une requte peut tre tri, Il existe une valeur spciale dite indfinie (NULL) utilise pour remplir un champ dont on ne connat pas la valeur.

28

Remarques

En SQL, le produit cartsien est possible sans renommer les attributs communs.
Ex

S).

: schma(RS) = A (de R), B (de R), B (de S), C (de

En SQL, si plusieurs attributs ont le mme nom, pour rsoudre lambigut, on spcifie la relation auquel lattribut appartient.
Ex

: select A, R.B, C from R, S


29

Ecriture des conditions

Oprateurs de comparaison

= gal <> diffrent > plus grand que >= plus grand ou gal < plus petit que <= plus petit ou gal

WHERE surface = 200 WHERE capitale <> Paris WHERE population > 8 WHERE population >= 8 WHERE surface < 83 WHERE surface <= 83

31

Oprateurs logiques

Tous les prdicats : AND Un des prdicats : OR

ex: WHERE population<10 AND surface<500 ex: WHERE population<10 OR surface<500

Ngation de la condition : NOT ex:

SELECT P1.nom, P2.nom, P1.capitale FROM PAYS P1, PAYS P2 WHERE P1.capitale = P2.capitale AND NOT P1.nom = P2.nom ;
32

Expressions logiques

Combinaisons:
WHERE ( ensoleillement > 80% AND pluviosit < 200 ) OR temprature > 30 WHERE ensoleillement > 80% AND ( pluviosit < 200 OR temprature > 30 )

33

Appartenance un ensemble: IN
WHERE monnaie = Pound monnaie = Schilling monnaie = Franc OR OR

quivalent : WHERE monnaie IN (Pound, Schilling, Franc)

NOT IN: non appartenance un ensemble


34

Comparaison un ensemble: ALL

SELECT * FROM Employee WHERE salary >= 1400 AND salary >= 3000); quivalent : SELECT * FROM Employee WHERE salary >= ALL ( 1400, 3000);
35

Valeur dans un intervalle: BETWEEN

WHERE population >= 50 population <= 60 quivalent :

AND

WHERE population BETWEEN 50 AND 60

NOT BETWEEN
36

Conditions partielles
% : zro ou nimporte quel caractre

WHERE pays LIKE %lande

-> Irlande, Islande, Finlande, Hollande -> Iran, France

WHERE pays LIKE %ran%

_ : exactement un caractre

WHERE pays LIKE I_lande

-> Irlande, Islande

NOT LIKE

37

Valeurs calcules

SELECT nom, population, surface, natalit FROM PAYS AND (population * natalit / surface) > 0 SELECT nom, ( population * 1000 / surface ) FROM PAYS Valeurs numriques: + - * /
38

WHERE (population * 1000 / surface) < 50

NULL <> 0 !!!

Null = valeur inconnue ou non dfinie:

Pays ( nom , montagne )


SELECT nom FROM PAYS WHERE montagne IS NULL

-> Pays Bas NULL = Pas de valeur


39

Operations sur NULL

NULL dans conditions:

( population > 0 ) ?
z

si population est NULL, le rsultat est "unknown" donc "false"

( population = NULL ) ?
z

le test retourne toujours "false":

La

syntaxe correcte est: ( population IS NULL )

NULL dans expression arithmtique:

( population + NULL ) retourne NULL


40

Oprations sur NULL

NULL dans fonction SQL


Concat
z

(nom, '-', prnom) retourne NULL si prnom null


Concat ( nom, '-', NVL(prenom,' ')) retourne 'dupont-' z NVL(attribut,valeur de remplacement): retourne la valeur de remplacement lorsque que la valeur de lattribut est NULL.

Fonctions
z

d'agrgation ignorent les NULL:

Moyenne(1000, null, null, null, and 2000) = (1000+2000)/2


41

Rsum

If A is:
10 10 10 10 NULL NULL NULL NULL NULL NULL

Condition
a a a a a a a a a a IS NULL IS NOT NULL = NULL != NULL IS NULL IS NOT NULL = NULL != NULL = 10 != 10

Evaluates to:
FALSE TRUE UNKNOWN UNKNOWN TRUE FALSE UNKNOWN UNKNOWN UNKNOWN UNKNOWN
42

Requtes avec blocs embots

BD Exemple : Livraisons
P ( np , nomp , couleur , poids , prix ) les produits U ( nu , nomu , ville , pays ) F ( nf , nomf , type , ville , pays ) PUF ( np, nu, nf , quantit ) les usines les fournisseurs les livraisons

np, nu, nf dans PUF sont des identifiants externes sur P, U et F (respectivement)

44

Jointure par blocs embots : IN ()


Nom et couleur des produits livrs par le fournisseur 1 Solution 1 : la jointure dclarative
SELECT nomp, couleur FROM P, PUF WHERE PUF.np = P.np AND nf = 1 ;

Solution 2 : la jointure procdurale (par embotement)


SELECT nomp, couleur Outer query FROM P WHERE np IN ( SELECT np Nested FROM PUF query WHERE nf = 1) ;
2. Nom et couleur des produits du fournisseur 1

1. Ensemble des produits livrs par le fournisseur 1

45

Jointure par blocs embots : IN ()

SELECT nomp, couleur FROM P WHERE np IN ( SELECT np FROM PUF WHERE nf = 1) ; IN compare chaque valeur de np avec l'ensemble (ou multi-ensemble) de valeurs retourn par la sous-requte IN peut aussi comparer un tuple de valeurs:
SELECT

nu FROM U WHERE (ville, pays) IN (SELECT ville, pays FROM F)


46

Composition de conditions
Nom des fournisseurs qui approvisionnent une usine de Londres ou de Paris en un produit rouge SELECT nomf FROM F WHERE nf IN (SELECT nf FROM PUF WHERE np IN (SELECT np FROM P
SELECT nomf FROM PUF, P, F, U WHERE couleur = 'rouge' AND PUF.np = P.np AND PUF.nf = F.nf AND PUF.nu = U.nu

AND (U.ville = 'Londres' WHERE couleur = 'rouge') OR U.ville = 'Paris'); AND nu IN (SELECT nu FROM U WHERE ville = 'Londres' OR ville = 'Paris') ) ;
47

Quantificateurs : ANY (ou SOME)


Numro des fournisseurs de produits rouges: SELECT nf FROM PUF WHERE np = ANY ( SELECT np FROM P WHERE couleur = 'rouge' ) ; Equivalent au IN: Existe t'il dans l'ensemble au moins un lment qui vrifie la condition? Numro des fournisseurs fournissant des produits dont le numro est infrieur au numro des produits pesant plus dune tonne: SELECT nf FROM PUF WHERE np < ANY ( SELECT np FROM P WHERE poids > 1000 ) ;

48

Quantificateurs : ALL
Numros des fournisseurs qui ne fournissent que des produits rouges ALL: tous les lments de l'ensemble doivent vrifier la condition SELECT nf FROM F WHERE 'rouge' = ALL
( SELECT couleur FROM P WHERE np IN

La requte imbrique est r-value pour chaque tuple de la requte (ici pour chaque nf)

( SELECT np FROM PUF WHERE PUF.nf = F.nf ) ) ;


49

Conditions sur des ensembles: EXISTS


Test si lensemble nest pas vide (E )

Noms des fournisseurs qui fournissent au moins un produit rouge SELECT nomf FROM F ce fournisseur WHERE EXISTS ( SELECT * FROM PUF, P WHERE PUF.nf = F.nf AND PUF.np = P.np Produit fourni AND P.couleur = 'rouge' ) ; est rouge 50

Recapitulation: blocs embots


attr IN requte
condition vrai si vrifie pour une des valeurs retourne par la requte

attr NOT IN requte

attr oprateur ANY requte

condition vrai si vrifie pour au moins une des valeurs retourne par la requte

attr oprateur ALL reqete

condition vrai si vrifie pour toutes les valeurs retournes par la requte Teste si lensemble nest pas vide

EXISTS requte

NOT EXISTS requte


51

Traitement des rsultats

Fonctions sur des colonnes

Attributs calculs
Ex:

SELECT nom, population*1000/surface FROM PAYS somme des valeurs des tuples slectionns moyenne

Oprateurs sur attributs numriques


SUM: AVG:

Oprateurs sur tous types dattributs


MIN:

Oprateur agrgation

minimum MAX: maximum COUNT: nombre de tuples slectionns


53

PAYS nom capitale population surface continent Irlande Dublin 3 70 Europe Autriche Vienne 8 83 Europe R-Uni Londres 36 244 Europe Suisse Berne 7 41 Europe USA Washington 189 441 Amerique
Retourne un tuple avec: - la pop. du plus petit pays dEurope, - la pop. du plus grand, - la moyenne des pop. de tous les pays dEurope, - la somme des surfaces des pays dEurope - le nombre de pays dEurope
54

SELECT MIN(population), MAX(population), AVG(population), SUM(surface), COUNT(*) FROM PAYS WHERE continent = Europe

DISTINCT
PAYS nom capitale population surface 3 8 36 7 189 70 83 244 41 441 continent Europe Europe Europe Europe Amerique

Irlande Dublin Autriche Vienne R-Uni Londres Suisse Berne USA Washington

Suppression des doubles: SELECT DISTINCT continent FROM PAYS


Europe Amerique

55

PAYS

ORDER BY
Tri des tuples du rsultat

nom Irlande Autriche R-Uni Suisse USA

capitale population surface continent Dublin Vienne Londres Berne Washington 3 8 36 7 189 70 83 244 41 441 Europe Europe Europe Europe Amerique

SELECT continent, nom, population FROM PAYS WHERE surface > 60 ORDER BY continent, nom DESC ASC/DESC

rsultat
continent population Europe Europe Europe Amerique 36 3 8 189 nom
Royaume-Uni

Irlande Autriche USA

56

PAYS

GROUP BY

nom Irlande Autriche


Royaume-Uni

capitale Dublin Vienne Londres Berne Washington

population surface 3 8 36 7 189 70 83 244 41 441

continent Europe Europe Europe Europe Amerique

Suisse USA

Partition de lensemble des tuples en groupes homognes


continent, MIN(population), MAX(population), AVG(population), SUM(surface), COUNT(*) FROM PAYS GROUP BY continent ; SELECT

Condition HAVING

SELECT FROM WHERE GROUP BY HAVING <condition> Partition de lensemble des tuples en groupes homognes

SELECT continent, SUM(population) FROM PAYS GROUP BY continent HAVING SUM(surface) > 439 ;

Attention la condition ne porte pas sur chaque tuple de la table comme pour le where mais sur lensemble des tuples dun groupe:

On retourne la population totale par continent, tel que chaque continent a une superficie > 439
rsultat
continent SUM(pop) Europe Amerique 54 189
58

un tuple par continent

Renommage du nom des attributs: AS


SELECT MIN(population) AS min_pop, MAX(population) AS max_pop, AVG(population) AS avg_pop, SUM(surface) COUNT(*) FROM PAYS WHERE continent = Europe ;
60

AS sum_surface, AS count

Langage de Manipulation de donnes

Manipulation des donnes

INSERT INTO: ajouter un tuple dans une table ou vue

UPDATE: changer les tuples dune table ou vue

DELETE FROM: liminer les tuples dune table ou vue


62

INSERT INTO

INSERT INTO olympics VALUES (1996, Atlanta, U.S.A)


1996 Atlanta U.S.A.

INSERT INTO olympics (year, location) VALUES (1996, Atlanta)


1996 Atlanta null
63

INSERT

INSERT INTO {nom_table nom_vue} [ (nom_col)* ] { VALUES (valeur)* sous-requte };

64

UPDATE

UPDATE country SET capital = Londres WHERE country = Ireland

65

UPDATE
UPDATE {nom_table nom_vue} SET { (nom_col)* = (sous-requte) nom_col = { valeur (sous-requte)} }* WHERE condition;

66

DELETE FROM

DELETE FROM country WHERE population > 50

-> liminer les pays dont la population est > 50

DELETE FROM country

-> la fin du Monde


67

DELETE

DELETE FROM {nom_table nom_vue} WHERE condition;

68

Vous aimerez peut-être aussi