Vous êtes sur la page 1sur 79

Cours de Bases de

Donnes
Hamid HRIMECH
EST de Berrechid

1 Introduction aux BD et aux SGBD

Les trois dimensions d'une application

Stations de travail
Interface

Langages de programmation /
manipulation de donnes
Traitements

SGBD
Donnes

Bases de Donnes

Classification des commandes du langage SQL


L= langage (language)

D= Donne (Data)
SQL

interactif
LDD (DDL)
Dfinition

LMD (DML)
Manipulation

intgr

dynamique

LCD (DCL)
Contrle

CREATE

INSERT

GRANT

DECLARE

PREPARE

DROP

DELETE

REVOKE

CURSOR

DESCRIBE

ALTER

UPDATE

CONNECT

FETCH

EXECUTE

COMMIT

Interrogation
SELECT

ROLLBACK
SET

Principales commandes du SQL

Slection de champs/lignes

SELECT
FROM
WHERE ;

Suppression de lignes

DELETE
FROM
WHERE ;

Mise jour de donnes

UPDATE
SET
WHERE ;

Insertion de lignes

INSERT
INTO
VALUES ...;

Cration de table

CREATE (

Suppression de table

DROP ;

Modification de structure

ALTER . ;

);

Exemple de table : etud


num

nom

prenom

dateN

note dep licence

Martin

Vra

85-10-31 13.5

77

Martin

Annie

85-12-31 15.5

75

Dupont Sylvie

83-02-03 15.0

77

Martin

83-10-22 05.7

93

Dupond Laurent

92

Lefvre Laurent

Annie

11.5

Syntaxe du SQL

Sparateur d'instructions : point virgule


Sparateur de mots-cls : espace, tab, fin de ligne
Mots-cls du SQL non sensibles la casse
-> Convention : mots-cls en majuscules
Noms d'objets (table, champ) sensibles la casse
Eviter les mots rservs pour les noms d'objets :
-> action, as, date, from, is, section, session, table, union, work, zone
Entourer de '' ou "" les noms d'objets comportant un espace
ex : 'moyenne des tudiants'
Valeurs de chanes et date entre ' ' ou " " dans les expressions
Des commentaires sont possibles sous plusieurs formes :
/* commentaire sur plusieurs lignes */
-- espace puis commentaire sur une ligne
# commentaire sur une ligne

Cration de table avec CREATE

Exemple
CREATE TABLE etud (
num INT UNSIGNED NOT NULL PRIMARY KEY,
nom VARCHAR(30) NOT NULL,
prenom VARCHAR(25) NOT NULL,
dateN DATE,
note DECIMAL(3,1) UNSIGNED ZEROFILL,
dep CHAR(2),
licence TINYINT(1)
);

Suppression de table avec DROP

Syntaxe gnrale
DROP TABLE nom_table ;

Suppression d'enregistrements : DELETE

Syntaxe gnrale
DELETE FROM nom_table
WHERE condition ;
Suppression de toutes les lignes de la table (-> table vide) !
DELETE FROM etud ;
Suppression des lignes d'tudiants de licence 3
DELETE FROM etud
WHERE licence=3 ;
Suppression des lignes d'tudiants nomms Jean Dupont
DELETE FROM etud
WHERE nom='Dupont' AND prenom='Jean' ;

10

Insertion d'enregistrements : INSERT

Syntaxe gnrale n1
INSERT INTO nom_table
VALUES (val1, val2,,val7) ;
Exemple de syntaxe n1
INSERT INTO etud
VALUES (7,'Martin','Vra' ,'1988-01-01',13.5,75,1) ;
Syntaxe gnrale n2
INSERT INTO nom_table (champ3, champ2,champ7)
VALUES (val3, val2, val7) ;
Exemple de syntaxe n2
INSERT INTO etud (licence, nom, prenom )
VALUES (1, 'Martin', 'Vra') ;

11

Mise jour : UPDATE SET

Changer une note :


UPDATE etud SET note=18
WHERE num=6;
Changer le prnom :
UPDATE etud SET prenom='Vro'
WHERE nom='Martin' AND prenom='Vra' ;
Changer le prnom et le dpartement :
UPDATE etud SET prenom='Vro', dep=NULL
WHERE num=4 ;
Augmenter toutes les notes de 2 :
UPDATE etud SET note=note+2 ;

12

Interroger une base de donnes : SELECT

SELECT permet d'interroger une base de donnes


Le rsultat est une nouvelle table (temporaire)
Slection de colonnes (projection) dans l'ordre indiqu
Slection de lignes (restriction / slection)
Des clauses supplmentaires permettent de :
- faire des calculs sur des regroupements de lignes
- trier les lignes
- afficher un certain nombre de lignes de rsultats

13

Quelques exemples simples de SELECT

SELECT * FROM table1;


On obtient toute la table
SELECT champ3 FROM table1;
On obtient uniquement le champ3 de la table
SELECT champ4, champ3, champ1 FROM table1;
champ1

champ2

champ3

champ3

champ1

champ4

champ4

champ5

14

Syntaxe du SELECT

Syntaxe minimale
SELECT FROM table;
Syntaxe complte (respecter l'ordre des clauses)
SELECT
[DISTINCT | ALL ] {* | champ [[AS] alias], ... }
FROM table [[AS] alias], ...
[WHERE { condition | sous condition} ]
[GROUP BY champ , ...]
[HAVING condition]
[ORDER BY {champ | num}{ASC | DESC}, ...]
[LIMIT [deb,] nb];

15

Slection de plusieurs colonnes

Note, nom et prnom de tous les tudiants


SELECT note, nom, prenom
FROM etud;
note
nom
prenom
13.5

Martin

Vra

15.5

Martin

Annie

15.0

Dupont

Sylvie

05.7

Martin

Annie

Dupond Laurent
11.5

Lefvre Laurent

16

Oprateur * : toutes les colonnes


Liste de toutes les colonnes de la table
SELECT * FROM etud;
Identique :
SELECT num, nom, prenom, date_n, note, dep, licence FROM etud;

num

nom

prenom

dateN

note dep licence

Martin

Vra

85-1031

13.5

77

Martin

Annie

85-1231

15.5

75

Dupont

Sylvie

83-0203

15.0

77

Martin

Annie

83-1022

05.7

93

Dupond Laurent

92

Lefvre Laurent

11.5

17

Alias de noms de colonnes

Prnom

...
En utilisant AS
SELECT prenom AS Prnom,
nom AS 'Nom de famille'
FROM etud;
Sans utiliser AS (facultatif)
SELECT prenom Prnom,
nom 'Nom de famille'
FROM etud;

Nom de famille
...

18

Grer les doublons : ALL (facultatif) et DISTINCT


SELECT *
FROM etud ;

SELECT dep
FROM etud ;

SELECT DISTINCT dep


FROM etud ;

prenom ... dep

dep

dep

Martin

Vra

...

77

77

77

Martin

Annie

...

75

75

75

Dupont Sylvie

...

92

92

92

Martin

...

77

77

null

Dupond Laurent ...

75

75

93

Lefvre Laurent ... null

null

Nom

Annie

...

...

...

93

93

...

...

...

77

77

...

...

...

92

92

...

...

... null

null

19

Grer les doublons : DISTINCT s'applique par ligne


SELECT ALL dep,licence
FROM etud;

SELECT DISTINCT dep,licence


FROM etud;

dep

licence

dep

licence

93

93

75

75

75

75

77

77

75

75

75

75

null

null

93

93

93

93

20

Tri par ordre croissant (ascendant)

SELECT * FROM etud ORDER BY note;


SELECT * FROM etud ORDER BY note ASC;

num

nom

prenom

dateN

note

dep

licence

92

93

Dupond Laurent

Martin

Lefvre Laurent

Martin

Vra

85-1031

13.5

77

Dupont

Sylvie

83-0203

15.0

77

Martin

Annie

85-1231

15.5

75

Annie

83-1022

05.7
11.5

21

Tri par ordre dcroissant

SELECT * FROM etud ORDER BY note DESC;


num

nom

prenom

dateN

note

dep

licence

Martin

Annie

85-1231

15.5

75

Dupont

Sylvie

83-0203

15.0

77

Martin

Vra

85-1031

13.5

77

Lefvre Laurent

Martin

Dupond Laurent

Annie

11.5
83-1022

05.7

3
93

92

22

Tri sur colonnes multiples

SELECT * FROM etud


ORDER BY nom, prenom, dateN DESC;

num

nom

prenom

dateN

note

dep

licence

92

77

Dupond Laurent

Dupont

Lefvre Laurent

Martin

Annie

85-12-31

15.5

75

Martin

Annie

83-10-22

05.7

93

Martin

Vra

85-10-31

13.5

77

Sylvie

83-02-03

15.0
11.5

23

Tri des lignes : ORDER BY


Tri numrique, alphabtique ou chronologique
SELECT * FROM t1 ORDER BY note;
<=>
SELECT * FROM t1 ORDER BY note ASC;
SELECT * FROM t1 ORDER BY note DESC;
SELECT * FROM t1 ORDER BY nom, prenom,note;
SELECT * FROM t1 ORDER BY 1, 2, 4;
SELECT * FROM t1 ORDER BY note DESC, nom;
SELECT nom, note, dep FROM t1 ORDER BY 3, 1;

24

Limiter le nombre d'enregistrements affichs

SELECT * FROM etud ORDER BY note DESC LIMIT 2;


quivalent :
SELECT * FROM etud ORDER BY note DESC LIMIT 0,2 ;
nom

prenom

dateN

note dep

Annie

85-1231

15.5

75

Dupont Sylvie

83-0203

15.0

77

Martin

85-1031

13.5

77

Martin

Vra

Lefvre Laurent
Martin

Annie

Dupond Laurent

11.5
83-1022

05.7

licence

3
93

92

25

Prlever n ligne(s) partir de la ligne i + 1

SELECT * FROM etud LIMIT i,n ;

SELECT * FROM etud ORDER BY note DESC LIMIT 3,2


Les lignes sont notes partir de i=0 et non de i=1 !

rang

nom

0 1 Martin
1 2
2 3

Dupont

3 4 Martin
4 5
5 6

prenom

dateN

note dep licence

Annie

85-1231

15.5

75

Sylvie

83-0203

15.0

77

Vra

85-1031

13.5

77

Lefvre Laurent
Martin

Annie

Dupond Laurent

11.5
83-1022

05.7

3
93

92

2
enregistrements

26

SELECT . FROM .WHERE .

SELECT -> slection de colonnes (projection)


WHERE -> slection de lignes (slection = restriction)
Exemples :
SELECT * FROM t1 WHERE nom='Martin';
SELECT * FROM t1 WHERE note >=10;
SELECT * FROM t1 WHERE note >10 AND dep=77;
champ1

champ2

champ3

champ4

champ5

27

Slection avec comparaison de valeurs

Quels sont les tudiants dont le nom est Martin ?


SELECT * FROM etud WHERE nom='Martin' ;
nom

prenom

dateN

note dep licence

Martin

Vra

85-1031

13.5 77

Martin

Annie

85-1231

15.5 75

Dupont Sylvie

83-0203

15.0 77

Martin

83-1022

05.7 93

92

Annie

Dupond Laurent
Lefvre Laurent

11.5

28

Expression des valeurs constantes

Chane : valeur entre guillemets simples ' ' ou doubles " "
Date : valeur entre guillemets en prsence de sparateur sans sparateur : guillemets facultatifs
Echappement de l'apostrophe dans la valeur
Exemples :
Chane
Date avec sparateur
Nombre
... nom='Martin'
(comme une chane)
... num=3
... date_n='1980-12-31'
... note=13.5 ... nom='Martin'
... nom="Martin"
... date_n='1980/12/31'
... num='3'
... nom='L''Hote'
Date sans sparateur
... note='13.5' ... nom='L\'Hote'
... date_n='19801231'
... nom="L'Hote"
... date_n=19801231

29

Slection avec connecteur logique AND

Liste des tudiants de licence 2 dont le nom est Martin


SELECT * FROM etud
WHERE nom='Martin' AND licence = 2 ;
nom

prenom

dateN

note dep licence

Martin

Vra

85-1031

13.5

77

Martin

Annie

85-1231

15.5

75

Dupont

Sylvie

83-0203

15.0

77

Martin

Annie

83-1022

05.7

93

92

Dupond Laurent
Lefvre Laurent

11.5

30

Slection avec connecteur logique OR

Liste des tudiants de nom Dupont ou Dupond


SELECT * FROM etud
WHERE nom='Dupont' OR nom='Dupond' ;
nom

prenom

dateN

note dep licence

Martin

Vra

85-1031

13.5

77

Martin

Annie

85-1231

15.5

75

Dupont

Sylvie

83-0203

15.0

77

Martin

Annie

83-1022

05.7

93

92

Dupond Laurent
Lefvre Laurent

11.5

31

Ajout de parenthses si besoin

SELECT * FROM etud


WHERE (licence=2 OR
AND (note < 10 OR
SELECT * FROM etud
WHERE licence=2 OR
AND note < 10 ) OR
nom

licence=1)
note IS NULL) ;
( licence=1
note IS NULL ;

-> 2 enregistrements

-> 4 enregistrements

prenom

dateN

note dep licence

Martin

Vra

85-1031

13.5 77

Martin

Annie

85-1231

15.5 75

Dupont

Sylvie

83-0203

15.0 77

Martin

Annie

83-1022

05.7 93

32

Slection et valeur Null

SELECT * FROM etud


WHERE note >= 10 OR note < 10 ;
-> Les lignes de valeurs NULL ne sont pas comptes !
nom
prenom
dateN
note dep licence
Martin

Vra

85-10-31

13.5

77

Martin

Annie

85-12-31

15.5

75

Dupont

Sylvie

83-02-03

15.0

77

Martin

Annie

83-10-22

05.7

93

Dupond

Laurent

92

Lefvre

Laurent

11.5

SELECT * FROM etud


WHERE note >= 10 OR note < 10 OR note IS NULL ;
-> pour retrouver toutes les valeurs, y compris NULL

33

Tables de vrit 3 valeurs (dont NULL)


E1 E2 AND

E1 E2 OR

NOT

Oprations algbriques avec NULL


E

Calcul sur E : + - * /

34

Slection avec comparaison de colonnes

Quels tudiants ont des rsultats identiques en maths et en bio ?


SELECT * FROM etud1
WHERE note_m = note_b ;

nom

prenom

dateN

note_m

note_b

Martin

Vra

85-10-31

13.5

15.0

Martin

Annie

85-12-31

15.5

10.0

Dupont

Sylvie

83-02-03

15.0

15.0

Martin

Annie

83-10-22

Dupond

Laurent

Lefvre

Laurent

02.0
11.5

35

Slection avec opration sur les colonnes

Quels tudiants ont des rsultats meilleurs en maths (+ 2 pts) qu'en bio ?
SELECT * FROM etud1
WHERE note_m >= (note_b + 2) ;
nom

prenom

dateN

note_m

note_b

Martin

Vra

85-10-31

13.5

15.0

Martin

Annie

85-12-31

15.5

10.0

Dupont

Sylvie

83-02-03

15.0

15.0

Martin

Annie

83-10-22

Dupond

Laurent

Lefvre

Laurent

02.0
11.5

36

Liste de valeurs avec IN


Pour les chanes de caractres,
SELECT * FROM etud
('val1','val2','val3')
WHERE dep IN (77,92,93);
quivalent :
SELECT * FROM etud
WHERE dep= 77 OR dep= 92 OR dep= 93;

nom

prenom

dateN

note dep licence

Martin

Vra

85-1031

13.5 77

Martin

Annie

85-1231

15.5 75

Dupont

Sylvie

83-0203

15.0 77

Martin

Annie

83-1022

05.7 93

92

Dupond Laurent

37

Liste de valeurs avec NOT IN


SELECT * FROM etud
WHERE dep NOT IN (77,92,93);
quivalent :
SELECT * FROM etud
WHERE dep<> 77 AND dep<>92 AND dep<> 93;

nom

prenom

dateN

note dep licence

Martin

Vra

85-1031

13.5 77

Martin

Annie

85-1231

15.5 75

Dupont

Sylvie

83-0203

15.0 77

83-1022

05.7 93

92

Martin

Annie

Dupond Laurent

Null
non compt

38

Intervalle avec BETWEEN (nombre)


SELECT * FROM etud
WHERE note BETWEEN 11.5 AND 15 ;
quivalent :
SELECT * FROM etud
WHERE note >= 11.5 AND note <=15 ;

nom

prenom

dateN

note dep licence

Martin

Vra

85-1031

13.5

77

Martin

Annie

85-1231

15.5

75

Dupont

Sylvie

83-0203

15.0

77

Martin

Annie

83-10- 05.7 93
1
22
Respecter l'ordre des bornes (infrieure puis suprieure)
Dupond Laurent
92
2
Lefvre Laurent

11.5

39

Intervalle avec BETWEEN (chane)

SELECT * FROM etud


WHERE nom BETWEEN 'D' AND 'M' ;

nom

prenom

dateN

note dep licence

Martin

Vra

85-1031

13.5 77

Martin

Annie

85-1231

15.5 75

Dupont

Sylvie

83-0203

15.0 77

Martin

Annie

83-1022

05.7 93

92

Dupond Laurent
Lefvre Laurent

11.5

40

Intervalle avec BETWEEN (date)

SELECT * FROM etud


WHERE date_n BETWEEN '83-02-01' AND '83-02-15' ;
Ne pas oublier les '...'
nom

prenom

dateN

note dep licence

Martin

Vra

85-1031

13.5

77

Martin

Annie

85-1231

15.5

75

Dupont

Sylvie

83-0203

15.0

77

Martin

Annie

83-1022

05.7

93

92

Dupond Laurent
Lefvre Laurent

11.5

41

Caractre _ pour un caractre et un seul

SELECT * FROM etud


WHERE nom LIKE 'Dupon_' ;
nom

prenom

Attention LIKE
au lieu de =

dateN

note dep licence

Martin

Vra

85-1031

13.5

77

Martin

Annie

85-1231

15.5

75

Dupont

Sylvie

83-0203

15.0

77

Martin

Annie

83-1022

05.7

93

Dupond

Laurent

92

Lefvre

Laurent

Dupontel Anne
Mattel

Laurenc

11.5

42

Caractre % pour 0, 1 ou n caractre(s)

SELECT * FROM etud


WHERE nom LIKE 'Dupon%' ;
nom

prenom

Attention LIKE
au lieu de =

dateN

note dep

licence

Martin

Vra

85-1031

13.5

77

Martin

Annie

85-1231

15.5

75

Dupont

Sylvie

83-0203

15.0

77

Martin

Annie

83-1022

05.7

93

Dupond

Laurent

92

Lefvre

Laurent

Dupontel Anne
Mattel

Laurenc

11.5

43

Exemples de filtres avec LIKE

WHERE prenom LIKE 'Ann_' ;


-> Anne, Anna mais pas Annie, Annette
WHERE prenom LIKE 'Laure _ _ _' ;
-> Laurence, Laurette mais pas Laurent, Laure
WHERE prenom LIKE 'Ann%' ;
-> Ann, Anne, Annie, Annette
WHERE prenom LIKE '%e' ;
-> Laurence, Sylvie, Anne, Annie,

44

Caractres Joker et valeur Null


Table de vrit du NULL

NOT NULL -> NULL


SELECT * FROM etud WHERE dep LIKE '%' ;
-> Les NULL ne sont pas slectionns
-> Les valeurs vides sont affiches
SELECT * FROM etud WHERE dep NOT LIKE '%' ;
-> Les NULL ne sont pas slectionns
-> Les valeurs vides ne sont pas slectionns
SELECT * FROM etud WHERE dep IS NULL ;
-> Les NULL sont slectionns
-> Les valeurs vides ne sont pas slectionns

45

Oprateurs
Oprateurs arithmtiques

% (MOD)

Oprateurs de comparaison
galit

/ non galit

=
<

<>

!=

>=

<=

supriorit / infriorit

>

appartenance une liste de valeurs

IN ('val1','val2','val3')

intervalle de valeurs

BETWEEN val1 AND val2

motif de chane

LIKE

valeur Null

IS NULL

IS NOT NULL

Oprateurs logiques
et
non ou ou exclusif

&&

||

Connecteurs logiques

AND

Gestion de la priorit

Caractre d'chappement (avant ' " %)

% _

!
)

OR

XOR
NOT

46

Ordre de priorit des oprateurs


NOT
- (ngatif)
^
*

<>

% MOD
!=

BETWEEN
AND
OR

&&
||

>

<

>=

<=

IS

LIKE

REGEXP

IN

47

Concatnation : CONCAT(exp1, exp2, exp3)

SELECT nom, prenom, CONCAT(nom,' ', prenom)


FROM etud ;
nom

prenom CONCAT(nom,' ',prenom)

Martin

Vra

Martin Vra

Martin

Annie

Martin Annie

Dupont

Sylvie

Dupont Sylvie

Martin

Annie

Martin Annie

Dupond

Laurent

Dupond Laurent

Lefvre

Laurent

Lefvre Laurent

48

Fonction de concatnation et alias

SELECT nom, prnom,


CONCAT(nom, ' ', prenom) as 'Nom complet'
FROM etud ;
nom

prenom

Nom complet

Martin

Vra

Martin Vra

Martin

Annie

Martin Annie

Dupont Sylvie

Dupont Sylvie

Martin

Martin Annie

Annie

Dupond Laurent Dupond


Laurent
Lefvre Laurent Lefvre Laurent

49

Exemples avec fonction et calcul

SELECT upper(nom), prenom, note, note*2 FROM etud;

mise en
majuscule

upper(nom) prenom

note note*2

MARTIN

Vra

13.5

27.0

MARTIN

Annie

15.5

31.0

DUPONT

Sylvie

15.0

30.0

MARTIN

Annie

05.7

11.4

DUPOND

Laurent

LEFVRE

Laurent

11.5

23.0

Autres exemples de champs calculs :


SELECT salaire + prime
SELECT prix * 19.6 / 100
SELECT prix - remise

pour obtenir une


note sur 40

50

Fonctions de groupe (d'agrgat ou d'ensemble)

COUNT
nombre d'enregistrements
nombre d'tudiants total
nombre d'tudiants dont la note est connue
SUM
somme
somme des prix dans une facture
MAX
maximum
liste des tudiants qui ont la meilleure note
MIN
minimum
liste des tudiants qui ont la note la plus basse
AVG
moyenne (average) pour des nombres
moyenne des notes de licence 1

51

Que comptent les fonctions d'agrgation ?


COUNT(*)

SELECT COUNT(*) FROM etud ;


6
Compte les enregistrements (mme Null)
SELECT COUNT(nom) FROM etud ;
COUNT(nom)
Nb d'enregistrements de nom "non Null"
6
SELECT COUNT(dep) FROM etudiant ;
COUNT(dep)
Nb d'enregistrements de dpartement "non Null"
5
SELECT COUNT(DISTINCT dep) FROM etud ;
Les doublons ne sont compts qu'une fois
COUNT(DISTINCT dep)

52

Alias pour les noms de champs : AS

SELECT COUNT(*)
FROM etud ;
SELECT COUNT(*) AS 'Nb d\'tudiants'
FROM etud ;
-> s'il y a des espaces, entourer de '' ou ""
SELECT dep AS Dpartement,
Dpartement
nom AS Nom,

prenom AS Prnom
FROM etud;
AS est facultatif (selon les implmentations)
SELECT dep Dpartement,
nom Nom,
prenom Prnom
FROM etud;

COUNT(*)
6
Nb d'tudiants
6
Nom Prnom

53

Erreur d'utilisation des fonctions d'agrgation

AVG(note)
SELECT AVG(note) FROM etud ;
12.24
Moyenne des notes (non NULL)
SELECT MIN(note), AVG(note), MAX(note) FROM etud ;
MIN(note)

AVG(note)

MAX(note)

5.7

12.24

15.5

Incorrect :
SELECT nom, MIN(note) FROM etud ;
nom, note des tudiants ayant la note la plus basse
pas de mlange entre Agrgat et Champ !

54

Groupements de donnes : GROUP BY


Pour la lisibilit de la rponse

SELECT dep, count(*) FROM etud


GROUP BY dep ;

nom

prenom

date_n

note dep licence

Lefvre
Martin Laurent
Vra

85-1031
85-12-

13.5
11.5 77

3
2

15.5 75
15.5 75

1
1

null

75

13.5 77
15.0 77

2
2

77

15.0 77
05.7 93

2
1

92

93

92
92
05.7 93
11.5

2
2
1

Martin
Martin

Annie
Annie

Martin Vra
Dupont Sylvie
Dupont
Martin

Sylvie
Annie

Dupond Laurent
Dupond Annie
Laurent
Martin
Lefvre Laurent

31
85-1231
85-1031
83-0203
83-0203
83-1022
83-1022

dep count(*
)

55

Groupements de donnes : exercices

Par anne de licence, prsenter par moyenne croissante,


le nombre d'tudiants nots,
inscrits, la moyenne, le min, le max.
SELECT licence,
COUNT(note) AS Nb,
COUNT(*)
AVG(note)
AS Moyenne,
MIN(note)
AS Min,
MAX(note)
AS Max
FROM etud GROUP BY licence ORDER BY Moyenne ;
licence Nb Moyenne Min Max
1

10.60000 05.7 15.5

11.50000 11.5 11.5

3
2

14.25000 13.5 15.0

56

Erreur d'utilisation du GROUP BY

SELECT nom, prenom FROM etud GROUP BY dep;


SELECT * FROM etud GROUP BY dep;
nom

prenom

date_n

note

dep

licence

Martin

Vra

85-10-31

13.5

77

Martin

Annie

85-12-31

15.5

75

Dupont

Sylvie

83-02-03

15.0

77

Martin

Annie

83-10-22

05.7

93

Dupond

Laurent

92

Lefvre

Laurent

11.5

57

Condition sur le regroupement : HAVING

Ressemble au WHERE mais appliqu au regroupement


Dpartements o rsident plus de 20 tudiants
dep count(num
SELECT dep, count(num)
)
FROM etud
75
500
GROUP BY dep
76
10
HAVING count(num) > 20
77

612

S'il y a une clause WHERE, elle sera applique avant le


calcul d'agrgat.

58

Mthodologie d'criture de requte SELECT

Liste ordonne des champs afficher


-> SELECT champ1,champ2, fonction de groupe
Prfixer les champs dont le nom est identique dans 2 tables
Liste des tables dont on cherche les champs
Jointure ncessaire ?
-> FROM table1,table2 WHERE condition de jointure
-> FROM table1 JOIN table2 ON condition de jointure
Conditions de recherche sur les enregistrements ?
-> WHERE condition
Fonction de groupe ?
-> GROUP BY ,
Conditions de recherche sur les groupes
-> HAVING condition
Ordre de prsentation des enregistrements ?
-> ORDER BY champ1, alias2, (alias si fonction d'agrgat )
Ajouter des alias si ncessaire (prsentation,agrgat,
autojointure)

59

Quelques fonctions

ROUND(nb,n) -> arrondi n dcimales


ROUND(24.16, 1) = 24.2
ROUND(24.16, 0) = ROUND(24.16) = 24
RAND(nb) -> nb alatoire de 0 1 (plafonn 0,n)
UPPER(col) UCASE(col) -> chane en majuscule
LOWER(col) LCASE(col) -> chane en minuscule
CONCAT(exp1,exp2) -> concatnation
LENGTH(col) -> Nb de caractres
SUBSTRING(col,n,p ) -> sous-chane (du nme, Lg=p)

61

Rcupration de date/temps

CURRENT_DATE CURRENT_DATE() CURDATE()


-> AAAA-MM-JJ
CURRENT_TIME CURRENT_TIME() CURTIME()
-> HH-MM-SS
NOW()
-> AAAA-MM-JJ HH-MM-SS
YEAR(date)
-> anne (4 chiffres)
MONTH(date)
-> mois (chiffre)
DAYOFMONTH()
-> 26 (nme jour du mois)
DAYOFYEAR()
-> 310 (nme jour de l'anne)
EXTRACT(exp FROM date)
-> exp=month, year
DATE_FORMAT(date, format)
-> date avec formatage demand
TO_DAYS(date)
-> nb jours couls entre date et an 0
FROM_DAYS(nb)
-> inverse de To_DAYS(), retourne la date
UNIX_TIMESTAMP(date)
-> nb jours couls entre date et 1970-01-01

62

Motifs de format pour DATE_FORMAT(date,'format')

%y an (2 chiffres) : 97
%m mois (01 12) : 04
%b mois (court) : Apr
%d jour (01 31) : 08
%a jour (court) : Sat
%w jour de semaine (Di=0, Lu=6)
%j N jour (1 365)
%U semaine de l'anne (dbut=di)
%r heure (12h) : 11:59:30 PM
%I heure (12h) : 11
%p AM ou PM
%i minutes (2 chiffres) : 51
%S secondes (2 chiffres) : 53

%Y an (4 chiffres) : 1997
%M mois (long) : April
%e jour (1 31) : 8
%W jour (long) : Saturday

%u idem (dbut=lu)
%T heure (24h) : 23:59:30
%H heure (24h) : 23

63

Copie totale/partielle de table avec CREATE

Syntaxe gnrale
CREATE TABLE table2
AS requte ;

Copie de la table des tudiants de licence


CREATE TABLE etud_copie
AS SELECT * FROM etud ;

Copie partielle de table : uniquement les tudiants de licence 1


CREATE TABLE etud_lic1
AS SELECT nom, prenom, date_n, note
FROM etud
WHERE licence=1 ;

64

Notation pointe des champs

Les champs peuvent tre prfixs pour le nom de la table ou de son alias
SELECT etud.nom FROM etud WHERE etud.note>10 ;
SELECT e.nom FROM etud e WHERE e.note>10 ;

Notation obligatoire quand les noms sont identiques


dans les champ de jointure
SELECT * FROM etud, departement
WHERE etud.dep=departement.dep ;
dans les champs afficher
SELECT nom, etud.dep FROM etud, departement
WHERE etud.dep=departement.dep ;
dans une auto-jointure
SELECT * FROM etud e1, etud e2
WHERE e1.num=e2.binome ;

65

Exemple de BD tables multiples


nom

etud

prenom

date_n

note

dep

licence

Martin

Vra

85-10-31

13.5

77

Martin

Annie

85-12-31

15.5

75

Dupont

Sylvie

83-02-03

15.0

77

Martin

Annie

83-10-22

05.7

93

Dupond

Laurent

92

Lefvre

Laurent

11.5
dep_num

departement

3
dep_nom

01

Ain

...

75

Paris

77

Seine-et-Marne

92

Hauts-de-Seine

93

Seine-Saint-Denis

66

Jointure de table avec WHERE (SQL1)


SELECT * FROM etud, departement
Ne pas oublier la clause WHERE
WHERE dep=dep_num ;
SELECT * FROM etud, departement
Attention aux
WHERE etud.dep=departement.dep_num ;
NULL
SELECT * FROM etud e, departement d
WHERE e.dep=d.dep_num ;
departement
etud

nom

prenom

dateN

note dep licence dep_num

dep_nom

Martin

Vra

85-10-31 13.5

77

77

Seine-et-Marne

Martin

Annie

85-12-31 15.5

75

75

Paris

Dupont

Sylvie

83-02-03 15.0

77

77

Seine-et-Marne

Martin

Annie

83-10-22 05.7

93

93

Seine-Saint-Denis

92

92

Hauts-de-Seine

null

null

null

01

Ain

Dupond Laurent
Lefvre

Laurent

null

11.5 null

null

null

null

null

null

67

Produit cartsien de table

SELECT * FROM etud, departement ;


nom

prenom

dateN

nb enregistrements =
6 tudiants x
n dpartements

note dep licence dep_num

dep_nom

Martin

Vra

85-10-31 13.5

77

01

Ain

Martin

Annie

85-12-31 15.5

75

01

Ain

Dupont

Sylvie

83-02-03 15.0

77

01

Ain

Martin

Annie

83-10-22 05.7

93

01

Ain

92

01

Ain

01

Ain

..

...

...

...

Dupond Laurent
Lefvre

Laurent

11.5

....

....

Martin

Vra

85-10-31 13.5

77

77

Seine-et-Marne

Martin

Annie

85-12-31 15.5

75

77

Seine-et-Marne

Dupont

Sylvie

83-02-03 15.0

77

77

Seine-et-Marne

Martin

Annie

83-10-22 05.7

93

77

Seine-et-Marne

92

77

Seine-et-Marne

77

Seine-et-Marne

...

...

...

...

...

Dupond Laurent
Lefvre

Laurent

....

....

11.5
...

...

..

68

Jointure avec JOIN (SQL2)

Produit cartsien
SELECT * FROM etud, departement ;
SELECT * FROM etud CROSS JOIN departement ;
SELECT * FROM etud JOIN departement ;

Jointure
SELECT *
FROM etud, departement
WHERE dep=dep_num ;
SELECT *
FROM etud
JOIN departement
ON dep=dep_num ;

Jointure avec restriction


SELECT * FROM etud, departement
WHERE dep=dep_num
AND note > 10 ;
SELECT * FROM etud JOIN departement
ON dep=dep_num
WHERE note > 10 ;

- SELECT * FROM t1, t2, t3


WHERE t1.a=t2.a AND
t2.b=t3.b;
- SELECT * FROM t1
JOIN t2
ON t1.a=t2.a
JOIN t3
ON t2.b=t3.b;

69

Jointure de table et slection d'enregistrement

SELECT * FROM etud, departement


WHERE dep=dep_num
AND (dep=77 or dep=75) AND licence=2 ;

Ne pas oublier la
clause WHERE
de jointure
departement

etud
nom

prenom

dateN

note dep licence dep_num

dep_nom

Martin

Vra

85-10-31 13.5

77

77

Seine-et-Marne

Martin

Annie

85-12-31 15.5

75

75

Paris

Dupont

Sylvie

83-02-03 15.0

77

77

Seine-et-Marne

Martin

Annie

83-10-22 05.7

93

93

Seine-Saint-Denis

92

92

Hauts-de-Seine

Dupond Laurent
Lefvre

Laurent

11.5

70

Jointure naturelle de table


Jointure avec les colonnes communes de mme nom
SELECT * FROM etud NATURAL JOIN departement
SELECT * FROM etud e, departement d
WHERE e.dep=d.dep ;
departement
etud

nom

prenom

dateN

note dep licence

dep

dep_nom

Martin

Vra

85-10-31 13.5

77

77

Seine-et-Marne

Martin

Annie

85-12-31 15.5

75

75

Paris

Dupont

Sylvie

83-02-03 15.0

77

77

Seine-et-Marne

Martin

Annie

83-10-22 05.7

93

93

Seine-Saint-Denis

92

92

Hauts-de-Seine

11.5 null

null

Dupond Laurent
Lefvre

Laurent

71

Jointure externe (FULL | LEFT | RIGHT OUTER JOIN ON)

SELECT * FROM etud LEFT OUTER JOIN departement


ON dep=dep_num ;
departement

etud
nom

prenom

dateN

note dep licence dep_num

dep_nom

Martin

Vra

85-10-31 13.5

77

77

Seine-et-Marne

Martin

Annie

85-12-31 15.5

75

75

Paris

Dupont

Sylvie

83-02-03 15.0

77

77

Seine-et-Marne

Martin

Annie

83-10-22 05.7

93

93

Seine-Saint-Denis

Dupond Laurent

null

null

92

92

Hauts-de-Seine

Lefvre

Laurent

null

11.5 null

null

null

null

null

null

null

null

01

Ardche

null

par dfaut, une jointure est une jointure interne (INNER JOIN)

72

Jointure externe droite (RIGHT OUTER JOIN ON)

SELECT * FROM etud RIGHT OUTER JOIN departement


ON dep=dep_num ;
departement

etud
nom

prenom

dateN

note

dep

licenc
e

dep_num

dep_nom

Martin

Vra

85-10-31 13.5

77

77

Seine-et-Marne

Martin

Annie

85-12-31 15.5

75

75

Paris

Dupont

Sylvie

83-02-03 15.0

77

77

Seine-et-Marne

Martin

Annie

83-10-22 05.7

93

93

Seine-Saint-Denis

Dupond Laurent

null

null

92

92

Hauts-de-Seine

null

null

null

null

null

null

07

Ain

null

null

null

null

null

null

07

Ardche

Lefvre

Laurent

null

11.5

null

null

null

73

Jointure externe et fonction d'agrgat

SELECT dep_num, count(nom)


FROM etud
RIGHT OUTER JOIN departement
ON dep=dep_num
GROUP BY dep_num ;

dep
01

07

75

77

92

93

dep

SELECT dep_num, count(nom)


FROM etud, departement
WHERE dep=dep_num
GROUP BY dep_num ;

count(*)

count(*)

01

07

75

77

92

93

74

Auto-jointure de table
Jointure de la table sur elle-mme
Utilisation de 2 alias pour la mme table
SELECT * FROM etud e1, etud e2
WHERE e1.num=e2.binome ;

e1

num

e2

nom

prenom binome num

nom

prenom binome

Martin

Vra

Martin

Annie

Martin

Annie

Martin

Vra

Dupont

Sylvie

Martin

Annie

Martin

Annie

Dupont

Sylvie

Dupond Laurent

Lefvre Laurent

Lefvre Laurent

Dupond Laurent

75

Auto-jointure de table
Etudiants dont la note est infrieure la note de l'tudiant n 4
SELECT e1.*
FROM etud e1, etud e2
WHERE e1.note < e2.note
AND e2.num=4 ;
e1
e2

num

nom

prenom

Note

num

nom

prenom binome

Martin

Vra

13.5

Martin

Annie

15.5

Martin

Annie

15.5

Martin

Vra

13.5

Dupont

Sylvie

15.0

Dupont

Sylvie

15.0

Martin

Annie

05.7

Martin

Annie

05.7

Dupond Laurent

null

Dupond Laurent

null

Lefvre Laurent

13.5

Lefvre Laurent

13.5

76

Equi-jointure et thta-jointure

Equi-jointure =

Thta-jointure

>

>=

<

<=

SELECT * FROM salarie s JOIN responsable r


ON s.salaire >= r.salaire

78

Commande ALTER : modification de structure

ALTER TABLE matable


DROP nomchamp1;
ALTER TABLE matable
ADD nomchamp1 VARCHAR(10)
ALTER TABLE matable1
ADD FOREIGN KEY (nomchamp1) REFERENCES
matable2 (nomchamp2);
ALTER TABLE matable1
MODIFY nomchamp VARCHAR(20)
ALTER TABLE matable1
CHANGE oldnomchamp newnomchamp VARCHAR(20)

85

Les contraintes

Prsence de valeur : NOT NULL


Contrainte de valeur : PRIMARY KEY
Prsence de valeur : PRIMARY KEY
Unicit de valeur : UNIQUE
Contrainte de valeur : CHECK BETWEEN 0 AND 20
Intgrit rfrentielle : FOREIGN KEY REFERENCES

86

Les contraintes

Valeur obligatoire : NOT NULL


Unicit de valeur : UNIQUE
Cl primaire (unicit + not null) : PRIMARY KEY
Prsence de valeur : PRIMARY KEY
Contrainte de domaine : CHECK (note between 0 AND 20)
Intgrit rfrentielle : FOREIGN KEY REFERENCES

Les triggers (dclencheurs, gachettes)


ON DELETE
ON UPDATE
avec leurs actions :
CASCADE
SET DEFAULT
SET NULL
RESTRICT

87

Les contraintes : exemple de SQL


Mthode 1
CREATE TABLE etudiant (
num INT PRIMARY KEY,
login VARCHAR(15) UNIQUE,
nom VARCHAR(15) NOT NULL,
codeDep CHAR(3),
note INT CHECK (note BETWEEN 0 AND 20),
FOREIGN KEY codeDep REFERENCES departement(numDep)
ON UPDATE CASCADE
);
Mthode 2
CREATE TABLE etudiant (
num INT,
,
PRIMARY KEY (num);
Mthode 3 : on peut ajouter la contrainte en la nommant
CONSTRAINT chk_Note CHECK (note between 0 AND 20)