Vous êtes sur la page 1sur 94

Franois Jacquenet

Professeur d'Informatique Facult des Sciences Laboratoire Hubert Curien UMR CNRS 5516 18 rue Benoit Lauras 42023 Saint-Etienne cedex 2 Tl : 04 77 91 58 07 e-mail : Francois.Jacquenet@univ-st-etienne.fr Web : http://eurise.univ-st-etienne.fr/~fj

Licence de Sciences et Techniques Unit denseignement BASES DE DONNEES

Langage de manipulation SQL

Information pour la semaine du 25 au 29 septembre


Cours, TD et TP aux horaires prvus sur lemploi du temps

Aujourdhui nous verrons

SQL = Langage de dfinition de donnes


CREATE TABLE ALTER TABLE DROP TABLE INSERT INTO UPDATE DELETE FROM SELECT FROM WHERE ...

SQL = Langage de manipulation de donnes


SQL = Langage de requtes

Slection Projection Jointure Produit cartsien Union Intersection Diffrence

Les agrgats
3

Introduction
SQL : Structured Query Language Invent chez IBM (centre de recherche d'Almaden en Californie), en 1974 par Astrahan & Chamberlin dans le cadre de System R Le langage SQL est normalis

SQL2: adopt (SQL 92) SQL3: adopt (SQL 99)

Standard d'accs aux bases de donnes relationnelles


4

SQL : Trois langages en un

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 manipulation de donnes (LMD /DML)


insertion de tuples: INSERT mise jour des tuples: UPDATE suppression de tuples: DELETE SELECT .... FROM ....... WHERE ..........
5

Langage de requtes (LMD/DML)

Terminologie

Relation
Tuple Attribut

Table
Ligne Colonne

SQL Un langage de dfinition de donnes

Un langage de dfinition de donnes

Commandes pour crer, modifier et supprimer les lments du schma CREATE TABLE : crer une table (une relation), CREATE VIEW : crer une vue particulire sur les donnes partir dun SELECT, DROP {TABLE VIEW } : supprimer une table ou une vue, ALTER {TABLE VIEW } : modifier une table ou une vue.
8

CREATE TABLE
Commande crant une table en donnant son nom, ses attributs et ses contraintes CREATE TABLE nom_table { ( nom-col type-col [DEFAULT val] [ [CONSTRAINT] contrainte-col] )* [ [CONSTRAINT] contrainte-table] | AS requte-SQL };

Lgende :

{a | b} : a ou b, [option]; * : applicable autant de fois que souhait; mots en capitale : mots-cl.

CREATE TABLE
CREATE TABLE nom_table { ( nom-col type-col [DEFAULT val] [ [CONSTRAINT] contrainte-col] )* [ [CONSTRAINT] contrainte-table] | AS requte-SQL };

Exemples:
CREATE TABLE Doctorant (nom VARCHAR(20), prenom VARCHAR(15), annee_insc YEAR DEFAULT 2002) ; CREATE TABLE Doctorant AS SELECT nom, prenom, annee_inscr FROM Etudiant WHERE statut='Doctorant';

10

Type des colonnes (en MySQL)

Numriques

NUMERIC : idem DECIMAL DECIMAL. Possibilit DECIMAL(M,D) M chiffre au total INTEGER


TINYINT 1 octet (de -128 127) SMALLINT 2 octets (de -32768 32767 MEDIUMINT 3 octets (de -8388608 8388607) INT 4 octets (de -2147483648 2147483647) BIGINT 8 octets (de -9223372036854775808 9223372036854775807) Possibilit de donner la taille de laffichage : INT(6) => 674 saffiche 000674 Possibilit de spcifier UNSIGNED

INT UNSIGNED => de 0 4294967296

FLOAT : 4 octets par dfaut. Possibilit dcrire FLOAT(P) REAL : 8 octets DOUBLE PRECISION : 8 octets
11

Type des colonnes (en MySQL)

Date et Heure

DATETIME

AAAA-MM-JJ HH:MM:SS de 1000-01-01 00:00:00 '9999-12-31 23:59:59 AAAA-MM-JJ de 1000-01-01 9999-12-31 Date sans sparateur AAAAMMJJHHMMSS HH:MM:SS (ou HHH:MM:SS) de -838:59:59 838:59:59 YYYY de 1901 2155
12

DATE

TIMESTAMP

TIME

YEAR

Type des colonnes (en MySQL)

Chanes

CHAR(n) VARCHAR(n)

1 n 255 1 n 255

Exemple : CHAR(4) Valeur '' 'ab' 'abcd' Stocke ' ' 'ab ' 'abcd' Taille 4 octets 4 octets 4 octets VARCHAR(4) Stocke '' 'ab' 'abcd' Taille 1 octets 3 octets 5 octets

'abcdef'

'abcd'

4 octets

'abcd'

5 octets
13

Type des colonnes (en MySQL)

Chanes

TINYBLOB BLOB MEDIUMBLOB LONGBLOB TINYTEXT TEXT MEDIUMTEXT LONGTEXT

Taille < 2^8 caractres Taille < 2^8 caractres Taille < 2^24 caractres Taille < 2^32 caractres Taille < 2^8 caractres Taille < 2^8 caractres Taille < 2^24 caractres Taille < 2^32 caractres

Les tris faits sur les BLOB tiennent compte de la casse, contrairement aux tris faits sur les TEXT.
14

Type des colonnes (en MySQL)

ENUM

Enumration ENUM("un", "deux", "trois") Valeurs possibles : "" , "un", "deux", "trois" Au plus 65535 lments

SET

Ensemble SET("un", "deux") Valeurs possibles : "" , "un", "deux", "un,deux" Au plus 64 lments

15

Contraintes

Contrainte-col : contrainte sur une colonne


NOT NULL UNIQUE PRIMARY KEY REFERENCES nom_table [(nom-col)] [action] CHECK ( condition)

Contrainte-table : contraintes sur une table


UNIQUE (nom-col)* PRIMARY KEY (nom-col)* FOREIGN KEY (nom-col)* REFERENCES nom_table [(nom-col)*] [action] CHECK ( condition)
16

Contraintes NOT NULL / UNIQUE

NOT NULL

Aprs une colonne CREATE TABLE Pays (nom VARCHAR(20) NOT NULL,

UNIQUE

Cl secondaire, pas deux lignes avec la mme valeur, ventuellement null

Exemples :

CREATE TABLE Etudiant ( no_etudiant INT UNIQUE, CREATE TABLE Etudiant ( no_etudiant INT CONSTRAINT no_etu_u UNIQUE,

17

Contraintes PRIMARY KEY

PRIMARY KEY : IDENTIFIANT de la relation


UNIQUE + NOT NULL Exemple:

CREATE TABLE Dept (dpt_id INT(4) PRIMARY KEY, CREATE TABLE Employ ( nom VARCHAR(30), prnom VARCHAR(30), adresse VARCHAR(60), , CONSTRAINT PK_emp PRIMARY KEY (nom, prnom)) ;

AUTO_INCREMENT

UNIQUE et PRIMARY KEY sont incompatibles


18

Contraintes d'intgrit rfrentielle

Foreign key : att1 REFERENCES att2


rfrence soit une primary key soit une unique key. Exemple:

CREATE TABLE Dept (dpt_id INT(4) PRIMARY KEY, manager_id INT(4) CONSTRAINT fk_mgr REFERENCES EMPLOYEE(emp_id) ,) CREATE TABLE Dept (dpt_id INT(4) PRIMARY KEY, manager_id INT(4), , CONSTRAINT fk_mgr FOREIGN KEY (manager_id) REFERENCES EMPLOYEE(emp_id),
19

Actions dclenches

REFERENCES nom_table [(nom-col)] [action]

Qu'est ce qui se passe quand on dtruit/MAJ une cl primaire ou unique qui est rfrence par un tuple (foreign key) d'une autre table?

CREATE TABLE Dept (dpt_id INT(4) PRIMARY KEY, manager_id INT(4) CONSTRAINT fk_mgr REFERENCES EMPLOYEE(emp_id),

Si on a le tuple (dpt_id=1, manager_id=21), que se passe-t-il si on dtruit ou met jour l'employ d'identifiant 21 dans la table Employ?
20

Actions dclenches

Deux circonstances

ON DELETE ON UPDATE

Trois options

SET NULL SET DEFAULT: valeur par dfaut si elle existe, sinon NULL CASCADE : on rpercute la mise jour
CREATE TABLE Dept
(dpt_id INT(4) PRIMARY KEY, manager_id INT(4) CONSTRAINT fk_mgr REFERENCES EMPLOYEE(emp_id) ON DELETE SET NULL ON UPDATE CASCADE) ;

Exemple :

21

Contrainte CHECK

Condition que chaque ligne de la table doit vrifier Si contrainte de colonne, porte uniquement sur cette colonne sinon porte sur plusieurs colonnes. Exemple:

CREATE TABLE divisions ( div_no INT CONSTRAINT check_divno CHECK (div_no BETWEEN 10 AND 99), div_name VARCHAR(9) CONSTRAINT check_divname CHECK (div_name = UPPER(div_name)), office VARCHAR(10) CONSTRAINT check_office CHECK (office IN ('BOSTON', 'PARIS','TOKYO')) );

22

Contrainte CHECK

CREATE TABLE Employee ( employe_id INT(4) PRIMARY KEY, nom VARCHAR(10), job_id VARCHAR(9), manager_id INT(4), salaire DECIMAL(7,2), Commission DECIMAL(7,2), departement_id SMALLINT(2), CONSTRAINT check_sal CHECK (salaire * commission <= 5000));

Si on cherche entrer une valeur ne vrifiant pas 23 la contrainte, elle est rejete.

Statut des contraintes

Comment et quand vrifier une contrainte?


DEFFERABLE / NOT DEFFERABLE ENABLE / DISABLE VALIDATE / NO VALIDATE

Peut tre spcifi aprs chaque contrainte (de colonne ou de la table) ENABLE / DISABLE

Activation/dsactivation d'une contrainte Si contrainte non vrifie, on ne peut pas l'activer On ne peut pas activer une contrainte FK qui rfrence une contrainte non active
24

DROP TABLE

DROP TABLE : Supprimer une table

supprime la table et tout son contenu

DROP TABLE nom_table [CASCADE CONSTRAINTS]; CASCADE CONSTRAINTS


Supprime toutes les contraintes rfrenant une cl primaire (primary key) ou une cl unique (UNIQUE) de cette table Si on cherche dtruire une table dont certains attributs sont rfrencs sans spcifier CASCADE CONSTRAINT, on a un message d'erreur.

25

ALTER TABLE

Modifier la dfinition dune table:

Changer le nom de la table mot cl : RENAME Ajouter une colonne ou une contrainte mot cl : ADD Modifier une colonne ou une contrainte mot cl : MODIFY Supprimer une colonne ou une contrainte mot cl : DROP renommer une colonne ou une contrainte mot cl : RENAME

26

ALTER TABLE
Syntaxe : ALTER TABLE nom-table { RENAME TO nouveau-nom-table | ADD (( nom-col type-col [DEFAULT valeur] [contrainte-col])*) | MODIFY (nom-col [type-col] [DEFAULT valeur] [contrainte-col])* | DROP COLUMN nom-col [CASCADE CONSTRAINTS] | RENAME COLUMN old-name TO new-name };

27

Renommer une table


... RENAME TO nouveau-nom-table

Exemple : ALTER TABLE country RENAME TO pays

28

Ajouter une colonne

ADD ( (nom-col type-col [DEFAULT valeur] [contrainte-col])* )

Exemple :
ALTER TABLE country ADD ( duty DECIMAL(2,2) DEFAULT 1 CHECK (duty < 10), visa_needed VARCHAR(3) );
29

Modifier une colonne

MODIFY ( (nom-col [type-col] [DEFAULT valeur] [contrainte-col])* )

Exemple : ALTER TABLE pays MODIFY (duty DECIMAL(3,2));


Tout ce qui n'est pas spcifi dans le MODIFY n'est pas modifi, par exemple ici default et check
30

Supprimer une colonne

DROP COLUMN nom-col [CASCADE CONSTRAINTS]

Exemple : ALTER TABLE pays DROP COLUMN visa_needed CASCADE CONSTRAINTS;

31

Renommer une colonne

RENAME COLUMN ancien_nom TO nouveau_nom Exemple :

ALTER TABLE pays RENAME COLUMN duty TO taxe;

32

ALTER TABLE sur les contraintes


ALTER TABLE nom_table { ADD contrainte_table | DROP { PRIMARY KEY | UNIQUE ( nom_colonne)* | CONSTRAINT nom_contrainte } [CASCADE CONSTRAINTS] | RENAME CONSTRAINT ancien TO nouveau | MODIFY [CONSTRAINT] nom_contrainte statut_contrainte };

33

Ajouter une contrainte

ADD contrainte-table Exemple :

ALTER TABLE employes ADD CONSTRAINT check_comp CHECK (salaire +(commission*salaire) <= 5000); ALTER TABLE pays ADD CONSTRAINT pk_pays PRIMARY KEY (nom);
34

Supprimer une contrainte

DROP { PRIMARY KEY | UNIQUE ( nom-colonne)* | CONSTRAINT nom-contrainte } [CASCADE CONSTRAINTS] Exemple :

ALTER TABLE departements DROP PRIMARY KEY CASCADE CONSTRAINTS;


35

Statut des contraintes

ENABLE

VALIDATE : la contrainte est active et contrle que les donnes de la table vrifient la contrainte NOVALIDATE : la contrainte est active, les nouvelles donnes entres dans la BD devront vrifier la contrainte.

DISABLE

VALIDATE : on cherche dsactiver la contrainte, si les donnes ne sont pas valides, erreur. Aprs DISABLE, on ne peut plus entrer, modifier ou supprimer des donnes de la table. NOVALIDATE : on peut faire n'importe quelle opration y compris entrer des donnes non conformes la contrainte

36

Exemples

MODIFY [CONSTRAINT] nom-contrainte

statut_contrainte
Exemple : ALTER TABLE pays MODIFY CONSTRAINT pkc DISABLE

quivalent :
ALTER TABLE pays DISABLE PRIMARY KEY

Exemple :

ALTER TABLE employes ENABLE VALIDATE PRIMARY KEY ENABLE NOVALIDATE CONSTRAINT nom_emp;

37

SQL Un langage de manipulation de donnes


38

Manipulation des donnes

INSERT INTO : ajouter un tuple dans une table ou une vue UPDATE : changer les tuples dune table ou d'une vue DELETE FROM : liminer les tuples dune table ou d'une vue
39

INSERT INTO
JO Anne 1896 1900 1904 1908 Lieu Athnes Paris St Louis Londres Pays Grce France USA UK JO

Anne
1896 1900 1904

Lieu
Athnes Paris St Louis

Pays
Grce France USA

1908
1996 JO Anne 1896 1900 1904 1908 1996

Londres
Atlanta

UK
USA

INSERT INTO JO VALUES (1996, Atlanta, U.S.A) INSERT INTO JO (Anne, Lieu) VALUES (1996, Atlanta)

Lieu Athnes Paris St Louis Londres Atlanta

Pays Grce France USA UK NULL


40

INSERT INTO

Syntaxe :

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

41

UPDATE

Exemples :

UPDATE Pays SET capitale = Londres WHERE nom = Ireland UPDATE Infos SET esp_vie = esp_vie+2 , poids = poids * 2 WHERE continent = Amrique' AND esp_vie < 80 UPDATE {nom_table nom_vue} SET { (nom_col)* = (sous-requte) nom_col = { valeur (sous-requte)} }* WHERE condition;

Syntaxe :

42

DELETE FROM

Exemple :

DELETE FROM Pays WHERE population > 300


pays Nom Irlande Autriche UK Suisse USA Capitale Dublin Vienne Londres Berne Washington Population Surface 5 10 50 7 350 70 83 244 41 441 Continent Europe Europe Europe Europe Amrique

Syntaxe :

DELETE FROM {nom_table nom_vue} WHERE condition;


43

SQL Un langage de requtes

Structure gnrale d'une requte

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
45

Exemple de requte
SELECT * FROM pays Afficher tous les attributs de tous les tuples dans la table pays
pays Nom Irlande Autriche Royaume-Uni Suisse USA Capitale Dublin Vienne Londres Berne Washington Population 5 10 50 7 350 Surface 70 83 244 41 441
46

SQL et Algbre relationnelle

SQL / Algbre : Identit

En algbre : Id(R) En SQL : SELECT * FROM R

48

SQL / Algbre : Slection

En algbre : s [condition] R En SQL : SELECT * FROM R WHERE condition

49

SQL / Algbre : Slection

SELECT * FROM pays WHERE population < 20


pays Nom Irlande Autriche

Capitale
Dublin Vienne

Population
5 10

Surface
70 83

Royaume-Uni
Suisse USA

Londres
Berne Washington

50
7 350

244
41 441
50

SQL / Algbre : Projection

En algbre : p [A1, A2, , An] R

En SQL : SELECT A1, A2, , An FROM R

51

SQL / Algbre : Projection


SELECT nom, capitale FROM pays ;
pays Nom Irlande Autriche

Capitale
Dublin Vienne

Population
5 10

Surface
70 83

Royaume-Uni
Suisse USA

Londres
Berne Washington

50
7 350

244
41 441
52

SQL / Algbre : Slection + Projection


p[capitale,capitale,population](s[population<20]pays)
SELECT nom, capitale,population FROM pays WHERE population < 20 Capitale Dublin Population 5 Surface 70

pays Nom Irlande

Autriche
Royaume-Uni Suisse USA

Vienne
Londres Berne Washington

10
50 7 350

83
244 41 441
53

SQL / Algbre : Renommage

En algbre : (A1:B1, ..., An:Bn) R En SQL : Impossible de renommer des attributs. Il faut faire des copies logiques des relations.
SELECT * FROM R, R R2 WHERE R.A = R2.A .

R2 peut tre vue comme une copie logique de R


54

SQL / Algbre : Produit cartsien

En algbre : R S

En SQL : SELECT * FROM R , S

55

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
56

SQL / Algbre : Jointure


JO

Anne
1896 1900 1904

Lieu
Athnes Paris St Louis

Pays
Grce France USA

Pays Nom

SELECT anne, lieu, pays, capitale FROM JO, Pays WHERE JO.pays =Pays.nom;
Capitale Population Surface

Irlande
Autriche UK Suisse USA

Dublin
Vienne Londres Berne Washington

5
10 50 7 350

70
83 244 41 441

1908

Londres

UK

rsultat
Anne Lieu Pays Capitale

1908
1904

Londres
St Louis

UK
USA

Londres
Washington
57

Jointure sur la mme table


Comment comparer les populations des pays? Exemple :


SELECT P1.nom, P1.population, P2.nom,P2.population FROM Pays AS P1, Pays AS P2 WHERE P1.population > P2.population ;

=> Toutes les paires de pays telles que le premier pays a une population plus grande que le deuxime pays NB: La table Pays est renomme en P1 et P2 (alias)
58

Jointure sur la mme table


pays Nom Capitale Population Surface

Irlande
Autriche UK Suisse

Dublin
Vienne Londres Berne

5
10 50 7

70
83 244 41

USA

Washington

350

441
pays Nom Irlande Autriche UK Suisse Capitale Dublin Vienne Londres Berne Population Surface 5 10 50 7 70 83 244 41

USA

Washington

350

441
59

Jointure sur la mme table


Pays-P1 Nom Irlande Autriche UK Suisse USA Capitale Dublin Vienne Londres Berne Washington Population Surface 5 10 50 7 350 70 83 244 41 441

Pays-P2
Nom Irlande Autriche Capitale Dublin Vienne Population Surface 5 10 70 83

UK
Suisse USA

Londres
Berne Washington

50
7 350

244
41 441

SELECT P1.nom, P1.population, P2.nom, P2.population FROM Pays AS P1, Pays AS P2 WHERE P1.population > P2.population ;

60

Jointure sur la mme table


Rsultat

P1.Nom
Autriche Autriche UK UK

P1.Population
10 10 50 50

P2.Nom
Irlande Suisse Irlande Autriche

P2.Population
5 7 5 10

UK
.

50
.

Suisse
.

7
.
61

SQL / Algbre : Union

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

Les tuples en double sont limins du rsultat

62

SQL / Algbre : Intersection

En algbre : R S En SQL : BlocR INTERSECT BlocS Exemple : SELECT * FROM R INTERSECT SELECT * FROM S

Les tuples en double sont limins du rsultat

63

SQL / Algbre : Diffrence

En algbre : R - S En SQL : BlocR MINUS BlocS Exemple : SELECT * FROM R MINUS SELECT * FROM S

Les tuples en double sont limins du rsultat

64

Remarques

Le rsultat d'une requte peut contenir plusieurs occurrences dun tuple,


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

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

Remarques

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

Exemple : schma(RxS) = A (de R), B (de R), B (de S), C (de S).

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

Exemple : SELECT A, R.B, C FROM R, S

66

Oprateurs de comparaison

gal
WHERE surface = 200

<>

diffrent

WHERE capitale <> Paris

>

plus grand que


WHERE population > 8

>=

plus grand ou gal plus petit que

WHERE population >= 8 WHERE surface < 83

<

<=

plus petit ou gal


67

WHERE surface <= 83

Oprateurs logiques

AND

WHERE population<10 AND surface<500

OR

WHERE population<10 OR surface<500

Ngation de la condition : NOT

SELECT P1.nom, P2.nom, P1.capitale FROM Pays P1, Pays P2 WHERE P1.capitale = P2.capitale AND NOT P1.nom = P2.nom ;
68

Expressions logiques
Combinaisons: WHERE ( ensoleillement > 80 AND pluviosit < 200 ) OR temprature > 30 WHERE ensoleillement > 80 AND ( pluviosit < 200 OR temprature > 30 )
69

Appartenance un ensemble : IN
WHERE monnaie = Pound OR monnaie = Schilling OR monnaie = Euro quivalent : WHERE monnaie IN (Pound, Schilling, Euro') NOT IN: non appartenance un ensemble
70

Comparaison un ensemble : ALL


SELECT * FROM Employe WHERE salaire >= 1400 AND salaire >= 3000 ; quivalent : SELECT * FROM Employe WHERE salaire >= ALL ( 1400, 3000);

71

Valeur dans un intervalle : BETWEEN


WHERE population >= 50 AND population <= 60 quivalent : WHERE population BETWEEN 50 AND 60

NOT BETWEEN

72

Conditions partielles (joker)

% : un ou plusieurs caractres

WHERE pays LIKE %lande -> Irlande, Islande, Finlande, Hollande

WHERE pays LIKE %ran% -> Iran, France


WHERE pays LIKE I_lande -> Irlande, Islande

_ : exactement un caractre

NOT LIKE
73

Valeurs calcules

SELECT nom, population, surface, natalit FROM Pays WHERE (population * 1000 / surface) < 50 AND (population * natalit / surface) > 0

SELECT nom, (population * 1000 / surface ) FROM Pays

74

Attention : NULL 0

NULL = valeur inconnue ou non dfinie: SELECT nom FROM Pays WHERE montagne IS NULL -> Pays Bas SELECT nom FROM Pays WHERE montagne IS NOT NULL -> Autriche, Suisse NULL = Pas de valeur

75

Oprations sur NULL

NULL dans les conditions:

( population > 0 ) ?

si population est NULL, le rsultat est "unknown" donc "false" le test retourne toujours "false": La syntaxe correcte est: ( population IS NULL )

( population = NULL ) ?

NULL dans une expression arithmtique:

( population + NULL ) retourne NULL

76

Oprations sur NULL

NULL dans une fonction SQL


Concat (nom, '-', prenom) retourne NULL si prnom est NULL Concat ( nom, '-', NVL(prenom,' ')) retourne 'dupont-'

NVL(attribut,valeur_de_remplacement): retourne la valeur de remplacement lorsque que la valeur de lattribut est NULL.

Fonctions d'agrgation ignorent les NULL:

Moyenne(1000, NULL, NULL, NULL, 2000) = (1000+2000)/2

77

Requtes avec blocs embots

BD exemple

Produit(np,nomp,couleur,poids,prix) les produits Usine(nu,nomu,ville,pays) les usines

Fournisseur(nf,nomf,type,ville,pays) les fournisseurs


Livraison(np,nu,nf,quantit) les livraisons

np rfrence Produit.np nu rfrence Usine.nu nf rfrence Fournisseur.nf

79

Jointure par blocs embots


Nom et couleur des produits livrs par le fournisseur 1

Solution 1 : la jointure dclarative SELECT nomp, couleur FROM Produit,Livraison WHERE (Livraison.np = Produit.np) AND nf = 1 ; Solution 2 : la jointure procdurale (embotement)
Nom et couleur des produits livrs par le fournisseur 1

SELECT nomp, couleur FROM Produit WHERE np IN


(SELECT np FROM Livraison WHERE nf = 1) ;

Numros de produits livrs par le fournisseur 1


80

Jointure par blocs embots


SELECT nomp, couleur FROM Produit WHERE np IN ( SELECT np FROM Livraison WHERE nf = 1) ; IN compare chaque valeur de np avec l'ensemble (ou multi-ensemble) de valeurs retourns par la sous-requte IN peut aussi comparer un tuple de valeurs: SELECT nu FROM Usine WHERE (ville, pays) IN (SELECT ville, pays FROM Fournisseur) 81

Composition de conditions
Nom des fournisseurs qui approvisionnent une usine de Londres ou de Paris en un produit rouge
SELECT nomf FROM Livraison, Produit, Fournisseur, Usine WHERE couleur = 'rouge' AND Livraison.np = Produit.np AND Livraison.nf = Fournisseur.nf AND Livraison.nu = Usine.nu AND (Usine.ville = 'Londres' OR Usine.ville = 'Paris');
82

Composition de conditions
Nom des fournisseurs qui approvisionnent une usine de Londres ou de Paris en un produit rouge
SELECT nomf FROM Fournisseur WHERE nf IN (SELECT nf FROM Livraison WHERE np IN (SELECT np FROM Produit WHERE couleur = 'rouge') AND nu IN (SELECT nu FROM Usine WHERE ville = 'Londres' OR ville = 'Paris') ) ;
83

Quantificateur ALL

Numros des fournisseurs qui ne fournissent que des produits rouges


SELECT nf FROM Fournisseur WHERE 'rouge' = ALL (SELECT couleur FROM Produit WHERE np IN (SELECT np FROM Livraison WHERE Livraison.nf = Fournisseur.nf ) ) ;

La requte imbrique est r-value pour chaque tuple de la requte (ici pour chaque nf) ALL: tous les lments de l'ensemble doivent vrifier la condition
84

Condition sur des ensemble : EXISTS


Test si lensemble nest pas vide (E ) Exemple : Noms des fournisseurs qui fournissent

au moins un produit rouge

SELECT nomf FROM Fournisseur ce fournisseur WHERE EXISTS ( SELECT * FROM Livraison, Produit WHERE Livraison.nf = Fournisseur.nf AND Livraison.np = Produit.np Le produit fourni AND Produit.couleur = 'rouge' ); est rouge
85

Blocs embots - rcapitulatif


SELECT FROM WHERE attr IN requte attr NOT IN requte attr oprateur ALL reqete EXISTS requte NOT EXISTS requte

86

Traitement des rsultats

Fonctions sur les colonnes

Attributs calculs

Exemple : SELECT nom, population*1000/surface FROM Pays

Oprateurs sur attributs numriques


SUM: somme des valeurs des tuples slectionns AVG: moyenne

Oprateurs sur tous types dattributs


Oprateurs d'agrgation

MIN: minimum MAX: maximum COUNT: nombre de tuples slectionns


88

Oprateurs d'agrgation
pays Nom Irlande Autriche UK Suisse USA Capitale Dublin Vienne Londres Berne Washington Population Surface 5 10 50 7 350 70 83 244 41 441 Continent Europe Europe Europe Europe Amrique

SELECT MIN(population), MAX(population), AVG(population), SUM(surface), COUNT(*) FROM Pays WHERE continent = Europe Donne le rsultat :
MIN(population) MAX(population) AVG(population) SUM(surface) COUNT(*)

50

18

438

4 89

DISTINCT
pays Nom Irlande Autriche UK Suisse USA Capitale Dublin Vienne Londres Berne Washington Population Surface 5 10 50 7 350 70 83 244 41 441 Continent Europe Europe Europe Europe Amrique

Suppression des doubles SELECT DISTINCT continent FROM Pays


Continent

Donne le rsultat :

Europe Amrique
90

ORDER BY
pays

Tri des tuples du rsultat

Nom Irlande Autriche UK Suisse USA

Capitale Dublin Vienne Londres Berne Washington

Population Surface 5 10 50 7 350 70 83 244 41 441

Continent Europe Europe Europe Europe Amrique

SELECT continent, nom, population FROM Pays WHERE surface > 60 ORDER BY continent, nom ASC

Continent Amrique Europe Europe Europe Europe

Nom USA Autriche Irlande Suisse UK

Population 350 10 5 7 50
91

2 possibilits : ASC / DESC

GROUP BY
Partition de l'ensemble des tuples en groupes homognes
pays Nom Irlande Autriche UK Suisse Capitale Dublin Vienne Londres Berne Population Surface 5 10 50 7 70 83 244 41 Continent Europe Europe Europe Europe

USA

Washington

350

441

Amrique

SELECT continent, MIN(population), MAX(population),AVG(population), SUM(surface), COUNT(*) FROM Pays GROUP BY continent ;
Continent Europe Amrique MIN(population) 5 350 MAX(population) 50 350 AVG(population) 18 350 SUM(surface) 438 441 COUNT(*) 4 1 92

Renommage des attributs : AS


SELECT MIN(population) AS min_pop, MAX(population) AS max_pop, AVG(population) AS avg_pop, SUM(surface) AS sum_surface, COUNT(*) AS count FROM Pays WHERE continent = Europe ;
min_pop
5

max_pop
50

avg_pop
18

sum_surface
438

count
4
93

Information pour la semaine du 25 au 29 septembre


Cours, TD et TP aux horaires prvus sur lemploi du temps