LANGAGES SQL
Oracle
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:198 7 => 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..
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
Utilisation
Programme => middleware => sgbd
Programme + embedded sql =>
sgbd
Programme => sgbd + stored proc,
triggers ..
Un langage plusieurs aspects
Ordres SQL Aspect du langage
CREATE – ALTER – DROP - COMMENT – RENAME – TRUNCATE
Définition des données (LDD)
INSERT – UPDATE – DELETE – MERGE –
LOCK TABLE Manipulation des données
(LMD)
SELECT Interrogation des données
(LID) GRANT – REVOKE – COMMIT –
ROLLBACK – SAVEPOINT – SET TRANSACTION
Contrôle des données (LCD)
DDL : Tables
Création de table
CREATE TABLE [schéma.]nomTable (
colonne1 type1 [DEFAULT valeur1] [NOT NULL]
[, colonne2 type2 [DEFAULT valeur2] [NOT NULL] ] [CONSTRAINT nomContrainte1 typeContrainte1]…
) ;
DDL : Tables
● caractères (CHAR, NCHAR, VARCHAR2, NVARCHAR2, CLOB, NCLOB, LONG) ;
● valeurs numériques NUMBER ;
● date/heure (DATE, INTERVAL DAY TO SECOND, INTERVAL YEAR TO MONTH, TIMESTAMP, TIMESTAMP WITH TIME ZONE,
TIMESTAMP WITH LOCAL TIME ZONE) ;
● données binaires (BLOB, BFILE, RAW, LONG RAW) ;
DDL : contraintes
CONSTRAINT nomContrainte
• UNIQUE (colonne1 [,colonne2]…)
• PRIMARY KEY (colonne1 [,colonne2]…)
• FOREIGN KEY (colonne1 [,colonne2]…)
REFERENCES [schéma.]nomTablePere (colonne1 [,colonne2]…)
[ON DELETE { CASCADE | SET NULL }]
• CHECK (condition)
DDL : Index
CREATE INDEX
{ UNIQUE | BITMAP } [schéma.]nomIndex
ON [schéma.]nomTable ( {colonne1 | expressionColonne1 } [ASC |DESC ]
…) ;
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.
Les Vues
CREATE VIEW nom_vue AS
SELECT colonne1, colonne2, ...
FROM table WHERE condition [ WITH CHECK OPTION ]
Modifications
structurelles
DROP TABLE [schéma.]nomTable [CASCADE CONSTRAINTS]; RENAME ancienNom TO nouveauNom;
ALTER TABLE ancienNom RENAME TO nouveauNom;
ALTER TABLE Pilote ADD (compa VARCHAR2(4) DEFAULT 'AF',ville VARCHAR2(30) DEFAULT 'Paris' NOT NULL);
ALTER TABLE Pilote RENAME COLUMN ville TO adresse;
ALTER TABLE Pilote MODIFY compa CHAR(4) NOT NULL;
ALTER TABLE Pilote DROP COLUMN adresse;
ALTER TABLE Pilote SET UNUSED COLUMN compa;
ALTER TABLE Pilote DROP UNUSED COLUMNS;
Modification
comportementales
ALTER TABLE [schéma.]nomTable ADD [CONSTRAINT nomContrainte]typeContrainte;
ALTER TABLE [schéma.]nomTable DROP CONSTRAINT nomContrainte [CASCADE];
ALTER TABLE [schéma.]nomTable
DISABLE CONSTRAINT nomContrainte [CASCADE] [ { KEEP | DROP } INDEX ] ;
ALTER TABLE [schéma.]nomTable
ENABLE [ VALIDATE | NOVALIDATE ] CONSTRAINT nomContrainte
[USING INDEX ClauseIndex] [EXCEPTIONS INTO tableErreurs];
ALTER TABLE Avion ENABLE CONSTRAINT pk_Avion USING INDEX (CREATE UNIQUE INDEX pk_Avion ON Avion (immat));
ALTER TABLE Avion ENABLE CONSTRAINT nn_proprio;
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 CONSTRAINTS ALL DEFERRED;
ALTER SESSION SET CONSTRAINTS = { IMMEDIATE | DEFERRED | DEFAULT }
Manipulation : Insertion
INSERT INTO table VALUES (val1,...,valn )
INSERT INTO table (col1,..., coln ) VALUES (val1,...,valn )
INSERT INTO table (col1,..., coln )
SELECT ...
Manipulation : Modification
UPDATE table
SET col1 = exp1, col2 = exp2, ...
WHERE prédicat
UPDATE table
SET (col1, col2,...) = (SELECT ...)
WHERE prédicat
Manipulation : Suppression
DELETE FROM table
WHERE prédicat
Interrogation des données
SELECT projection FROM jointure
WHERE prédicat
GROUP BY agrégation HAVING prédicat
ORDER BY champs asc|desc
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
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 …
)
Where : prédicat
=, <>, <, >, <=, >=
and , or , not
expression between val1 and val2
Is NULL, is not NULL
In (val1, val2 , val3, …., valn)
not in (…)
Like ,% , _
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
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 nulleDate 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
Like YY, 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)
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.
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
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
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
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