2. Historique
1970 IBM => System-R, a implanté le modèle relationnel au
travers du langage SEQUEL (Stuctured English as QUEry
Language), rebaptisé par la suite SQL (Structured Query
Language).
1979 Relational Software, Inc (Oracle corp.) : première version
commerciale
1986 recommandation AINSI
ISO/CEI 9075:1987 => SQL1 : compromis entre constructeurs
ISO/CEI 9075:1992 => SQL2 : entry – transitional –
intermediate – full level
ISO/CEI 9075:1999 => SQL3 : concepts objets, collections,
entrepôts de données, séries temporelles, accès à des sources
non SQL, réplication des données, etc..
3. Caractéristiques
Depuis 1986
N’est pas complet : Impedance mismatch
Peut être embedded : interfacé avec des
langages de 3ème génération (c, cobol ..) ou plus
(c++, java, c# ..)
Langage déclaratif : décrire les résultats
attendus sans se soucier de la manière de les
obtenir
9. DDL : Index
CREATE INDEX
{ UNIQUE | BITMAP } [schéma.]nomIndex
ON [schéma.]nomTable ( {colonne1 |
expressionColonne1 } [ASC |DESC ] …) ;
10. Index
Un index ralentit les rafraîchissements de la base
(conséquence de la mise à jour de l’arbre ou des
bitmaps). En revanche il accélère les accès ;
Il est conseillé de créer des index sur des colonnes
(majoritairement des clés étrangères) utilisées dans
les clauses de jointures;
Les index bitmaps sont conseillés quand il y a peu de
valeurs distinctes de la (ou des) colonne(s) à indexer.
Dans le cas inverse, utilisez un index B-tree.
Les index sont pénalisants lorsqu’ils sont définis sur
des colonnes très souvent modifiées ou si la table
contient peu de lignes.
13. Modification comportementales
ALTERTABLE [schéma.]nomTable
ADD [CONSTRAINT nomContrainte] typeContrainte;
ALTERTABLE [schéma.]nomTable DROP CONSTRAINT
nomContrainte [CASCADE];
ALTERTABLE [schéma.]nomTable
DISABLE CONSTRAINT nomContrainte
[CASCADE] [ { KEEP | DROP } INDEX ] ;
ALTERTABLE [schéma.]nomTable
ENABLE [VALIDATE | NOVALIDATE ] CONSTRAINT
nomContrainte
[USING INDEX ClauseIndex] [EXCEPTIONS INTO tableErreurs];
ALTERTABLEAvion ENABLE CONSTRAINT pk_Avion
USING INDEX (CREATE UNIQUE INDEX pk_Avion ON Avion (immat));
ALTERTABLEAvion ENABLE CONSTRAINT nn_proprio;
14. Modification comportementales
ENABLE vérifie les mises à jour à venir (insertions et nouvelles
modifications de la table) ;
DISABLE autorise toute mise à jour ;
VALIDATE vérifie que les données courantes de la table respectent la
contrainte ;
NOT DEFERRABLE INITIALLY IMMEDIATE.
DEFERRABLE INITIALLY DEFERRED
DEFERRABLE INITIALLY IMMEDIATE
SET CONSTRAINT fk_Avion_comp_Compag DEFERRED;
SET CONSTRAINTSALL DEFERRED;
ALTER SESSION SET CONSTRAINTS = { IMMEDIATE | DEFERRED
| DEFAULT }
15. Manipulation : Insertion
INSERT INTO table VALUES (val1,...,valn )
INSERT INTO table (col1,..., coln )
VALUES (val1,...,valn )
INSERT INTO table (col1,..., coln )
SELECT ...
16. Manipulation : Modification
UPDATE table
SET col1 = exp1, col2 = exp2, ...
WHERE prédicat
UPDATE table
SET (col1, col2,...) = (SELECT ...)
WHERE prédicat
18. Interrogation des données
SELECT projection
FROM jointure
WHERE prédicat
GROUP BY agrégation
HAVING prédicat
ORDER BY champs asc|desc
19. Select : projection
Liste des champs (schema.table.colonne)
séparé par des virgules
Select client.nom, produit.nom, prix
Expression (calcul, conversion, appel de
fonction …)
Select prix * qte as montant, to_char(date_achat,’YYYY-MM-DD’) as « date d’achat »
Une constante (valeur)
select nom, ‘dirigeant’ as role
20. From : Jointure
Après la clause from on met une liste de
tables
Par défaut le SGBD effectuera le produit
cartésien (cross join) de toutes les tables
Il faut indiquer la jointure join/ natural join /
inner join / left|right outer join
On utilisera des alias de tables (synonymes)
pour une jointure réflexive (table ayant
plusieurs sens: employé =subordonné et
supérieur, membre = acheteur et vendeur … )
21. Where : prédicat
=, <>, <, >, <=, >=
and , or , not
expression between val1 and val2
Is NULL, is not NULL
In (val1, val2 , val3, …., valn)
not in (…)
Like ,% , _
22. Agrégation
Fonctions : SUM, COUNT, MIN, MAX, AVG
Mettre les champs de groupement dans la
clause GROUP BY
Les conditions sur les fonctions d’agrégation
dans la clause HAVING
La fonction COUNT compte le nombre
d’enregistrements et non le nombre de valeur
du champs en paramètre
23. Extensions SQL
La pseudo-colonne ROWNUM
La pseudo-table DUAL
Sysdate
Concaténation ||
Les Conversions
TO_NUMBER
TO_CHAR
TO_DATE (to_date('11/07/1997 19:13:00','DD/MM/YYYY HH24:MI:SS'))
NVL(exp1,exp2) -prend lexp2 si exp1 est nulle
24. Date et Heure
MM Numeric month (e.g., 07)
MON Abbreviated month name (e.g., JUL)
MONTH Full month name (e.g., JULY)
DD Day of month (e.g., 24)
DY Abbreviated name of day (e.g., FRI)
YYYY 4-digit year (e.g., 1998)
YY Last 2 digits of the year (e.g., 98)
RR
LikeYY, but the two digits are ``rounded'' to a year in the range
1950 to 2049.Thus, 06 is considered 2006 instead of 1906
AM (or PM) Meridian indicator
HH Hour of day (1-12)
HH24 Hour of day (0-23)
MI Minute (0-59)
SS Second (0-59)
25. Extensions SQL : les fonctions
abs(nombre) valeur absolue de nombre
ceil(nombre) plus petit entier plus grand ou égal à nombre
floor(nombre) plus grand entier inférieur ou égal à nombre
mod(nombre1,nombre2) reste de la division entière (le quotient est
entier) de nombre1 par nombre2
power(nombre1,nombre2) nombre1 élevé à la puissance nombre2
qui doit être entier
round(nombre1,nombre2) arrondit nombre1 à nombre2 chiffres
après la virgule si nombre2>0, à -nombre2 chiffres avant la virgule
si nombre2<0.
sign(nombre) -1 si nombre<0 0 si nombre=0 +1 si nombre>0
sqrt(nombre) racine carrée de nombre si nombre>=0 NULL si
nombre<0
trunc(nombre1,nombre2) nombre1 est tronqué à nombre2 chiffres
après la virgule si nombre2>0 ou à -nombre2 chiffres avant la
virgule si nombre2<0.
26. Extensions SQL : les fonctions
chr(nombre) caractère de code ASCII nombre
initcap(chaine) Met tous les mots de chaîne en minuscules sauf la
première lettre mise en majuscule
lower(chaine) met chaine en minuscules (<>upper)
lpad(chaine1,n,chaine2) met chaine1 sur n positions, chaine1 étant
cadrée à droite. Les caractères restant à gauche sont remplis par
chaine2.
ltrim(chaine1,chaine2) Les caractères de gauche de chaine1 sont
supprimés jusqu'à rencontrer un caractère qui ne se trouve pas
dans chaine2.
replace(chaine1,chaine2,chaine3) remplace chaine2 par chaine3
dans chaine1.
rpad(chaine1,n,chaine2) idem lpad mais à droite
trim(chaine1,chaine2) idem ltrim mais à droite
27. Extensions SQL : les fonctions
substr(chaine,p,nombre) sous-chaîne de chaine de nombre
caractères commençant en position p.
translate(chaine,texte,traduction) remplace dans chaîne tout
caractère se trouvant dans texte par le caractère correspondant se
trouvant dans
ascii(caractère) code ASCII de caractère
instr(chaine1,chaine2,p,o) position de la o ième occurrence de
chaine2 dans chaine1, la recherche commençant à la position p de
chaine1.
length(chaine) nombre de caractères de chaine
28. addate(date,n) date augmentée de n mois. Le résultat est une
date.
addate('01-jan-91',3)='01-apr-91'
last_day(date) date du dernier jour du mois contenu dans date
last_day('01-jan-91')='31-jan-91'
months_between(date1,date2) nombre de mois entre date1 et
date2. La partie décimale représente le pourcentage d'un mois de
31 jours. Si date1<date2 le résultat est >0 sinon il est <0.
month_between('01-jan-91','14-feb-91')=-1.4193548
next_day(date,jour) donne la date du jour indiqué dans la semaine
qui suit date. next_day('01-jan-91','monday')='07-jan-91'
Extensions SQL : les fonctions
29. trunc(date,[format]) tronque date selon le format
indiqué. Par défaut, c'est la composante heure qui
est supprimée.
Formats :
year : tronque au 1er janvier de l'année de date
month : tronque au 1er du mois de date
day : tronque au dimanche qui précède date.
round(date,format) date arrondie selon le format
précisé
Formats :
year : arrondit au 1er janvier le plus proche
month : arrondit au 1er du mois le plus proche
day : arrondit au dimanche le plus proche
Extensions SQL : les fonctions