Documente Academic
Documente Profesional
Documente Cultură
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
CREATE TABLE ALTER TABLE DROP TABLE INSERT INTO UPDATE DELETE FROM SELECT FROM WHERE ...
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
cration de relations : CREATE TABLE modification de relations: ALTER TABLE suppression de relations: DROP TABLE vues, index . : CREATE VIEW ...
insertion de tuples: INSERT mise jour des tuples: UPDATE suppression de tuples: DELETE SELECT .... FROM ....... WHERE ..........
5
Terminologie
Relation
Tuple Attribut
Table
Ligne Colonne
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 :
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
Numriques
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
FLOAT : 4 octets par dfaut. Possibilit dcrire FLOAT(P) REAL : 8 octets DOUBLE PRECISION : 8 octets
11
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
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
Chanes
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
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
NOT NULL UNIQUE PRIMARY KEY REFERENCES nom_table [(nom-col)] [action] CHECK ( condition)
UNIQUE (nom-col)* PRIMARY KEY (nom-col)* FOREIGN KEY (nom-col)* REFERENCES nom_table [(nom-col)*] [action] CHECK ( condition)
16
NOT NULL
Aprs une colonne CREATE TABLE Pays (nom VARCHAR(20) NOT NULL,
UNIQUE
Exemples :
CREATE TABLE Etudiant ( no_etudiant INT UNIQUE, CREATE TABLE Etudiant ( no_etudiant INT CONSTRAINT no_etu_u UNIQUE,
17
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
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
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.
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
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
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
28
Exemple :
ALTER TABLE country ADD ( duty DECIMAL(2,2) DEFAULT 1 CHECK (duty < 10), visa_needed VARCHAR(3) );
29
31
32
33
ALTER TABLE employes ADD CONSTRAINT check_comp CHECK (salaire +(commission*salaire) <= 5000); ALTER TABLE pays ADD CONSTRAINT pk_pays PRIMARY KEY (nom);
34
DROP { PRIMARY KEY | UNIQUE ( nom-colonne)* | CONSTRAINT nom-contrainte } [CASCADE CONSTRAINTS] Exemple :
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
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
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)
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 :
Syntaxe :
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
48
49
Capitale
Dublin Vienne
Population
5 10
Surface
70 83
Royaume-Uni
Suisse USA
Londres
Berne Washington
50
7 350
244
41 441
50
51
Capitale
Dublin Vienne
Population
5 10
Surface
70 83
Royaume-Uni
Suisse USA
Londres
Berne Washington
50
7 350
244
41 441
52
Autriche
Royaume-Uni Suisse USA
Vienne
Londres Berne Washington
10
50 7 350
83
244 41 441
53
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 .
En algbre : R S
55
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
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
=> 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
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
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
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
En algbre : R S En SQL : BlocR UNION BlocS Exemple : SELECT * FROM R UNION SELECT * FROM S
62
En algbre : R S En SQL : BlocR INTERSECT BlocS Exemple : SELECT * FROM R INTERSECT SELECT * FROM S
63
En algbre : R - S En SQL : BlocR MINUS BlocS Exemple : SELECT * FROM R MINUS SELECT * FROM S
64
Remarques
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.
66
Oprateurs de comparaison
gal
WHERE surface = 200
<>
diffrent
>
>=
<
<=
Oprateurs logiques
AND
OR
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
71
NOT BETWEEN
72
% : un ou plusieurs caractres
_ : 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
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
( 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 ) ?
76
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.
77
BD exemple
79
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
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
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
Test si lensemble nest pas vide (E ) Exemple : Noms des fournisseurs qui fournissent
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
86
Attributs calculs
Oprateurs d'agrgation
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
Donne le rsultat :
Europe Amrique
90
ORDER BY
pays
SELECT continent, nom, population FROM Pays WHERE surface > 60 ORDER BY continent, nom ASC
Population 350 10 5 7 50
91
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
max_pop
50
avg_pop
18
sum_surface
438
count
4
93