Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Hiver 2011
C. Desrosiers
Sortie
– une table
– permet la composition
Origine de SQL (« SQUARE de IBM, San Jose »)
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 8
Sélection (σ)
Table Artic le
noArticle description prixUnitaire quantitéEnStock
10 Cèdre en boule 10.99 10
20 Sapin 12.99 10
40 Epinette bleue 25.99 10
50 Chêne 22.99 10
60 Erable argenté 15.99 10
70 Herbe à puce 10.99 10
80 Poirier 26.99 10
81 Catalpa 25.99 10
90 Pommier 25.99 10
95 Génévrier 15.99 10
Table Co m m an d e
noCommande dateCommande noClient
1 01/06/2000 10
2 02/06/2000 20
3 02/06/2000 10
4 05/07/2000 10
5 09/07/2000 30
6 09/07/2000 20
7 15/07/2000 40
8 15/07/2000 40
Table Co m m an d e
noCommande dateCommande noClient
1 01/06/2000 10
2 02/06/2000 20
3 02/06/2000 10
4 05/07/2000 10
5 09/07/2000 30
6 09/07/2000 20
7 15/07/2000 40
8 15/07/2000 40
Client × Commande
Client.noClient nomClient noTéléphone noCommande dateCommande Commande. noClient
10 Luc Sansom (999)999-9999 1 01/06/2000 10
10 Luc Sansom (999)999-9999 2 02/06/2000 20
10 Luc Sansom (999)999-9999 3 02/06/2000 10
10 Luc Sansom (999)999-9999 4 05/07/2000 10
10 Luc Sansom (999)999-9999 5 09/07/2000 30
10 Luc Sansom (999)999-9999 6 09/07/2000 20
10 Luc Sansom (999)999-9999 7 15/07/2000 40
10 Luc Sansom (999)999-9999 8 15/07/2000 40
20 Dollard Tremblay (888)888-8888 1 01/06/2000 10
20 Dollard Tremblay (888)888-8888 2 02/06/2000 20
20 Dollard Tremblay (888)888-8888 3 02/06/2000 10
… … … … … …
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 12
Exemple. Produire les informations au sujet des Clients
et de leurs Commandes
Client × Commande
Client.noClient nomClient noTéléphone noCommande dateCommande Commande. noClient
10 Luc Sansom (999)999-9999 1 01/06/2000 10
10 Luc Sansom (999)999-9999 2 02/06/2000 20
10 Luc Sansom (999)999-9999 3 02/06/2000 10
10 Luc Sansom (999)999-9999 4 05/07/2000 10
10 Luc Sansom (999)999-9999 5 09/07/2000 30
10 Luc Sansom (999)999-9999 6 09/07/2000 20
10 Luc Sansom (999)999-9999 7 15/07/2000 40
Colonne redondante
π Client.noClient, nomClient, noTéléphone, noCommande, dateCommande (…))
Client.noClient nomClient noTéléphone noCommande dateCommande
10 Luc Sansom (999)999-9999 1 01/06/2000
10 Luc Sansom (999)999-9999 3 02/06/2000
10 Luc Sansom (999)999-9999 4 05/07/2000
20 Dollard Tremblay (888)888-8888 2 02/06/2000
20 Dollard Tremblay (888)888-8888 6 09/07/2000
30 Ye San Le Sou (777)777-7777 5 09/07/2000
40 Jean Leconte (666)666-6666 7 15/07/2000
40 Jean Leconte (666)666-6666 8 15/07/2000
<<Table>>
<<Table>>
Article
Client
{Clé prim aire : noArticle}
{Clé prim aire : noClient}
noArticle : INTEGER
noCl ien t : INT EGER
des cription : VARCHAR
nom Client : VARCHAR
prixUnitaire : DECIMAL
noTéléphone : VARCHAR
quantitéEnStock : INTEGER
<<Table>> <<Table>>
Com m ande LigneCom m ande
{Clé pr im aire : no Co m m ande} {Cl é pri maire : no Co mm ande, noArticl e}
noComm ande : INTEGER noComm ande : INTEGER
date Co mm ande : DATE noArticle : INTEGER
noClient : INTEGER quantité : INT EGER
<<Table>>
<<Table>> DétailLivrais on
Livrais on {Clé prim aire : noLivrais on, noCom m ande, noArticle}
{Clé prim aire : noLivrais on} noLivrai son : INTEGER
noLivrais on : INTEGER noCom m a nde : INTEGER
dateLivrais on : DATE noArticle : INT EGER
quantitéLivrée : INTEGER
<<Table>> <<Table>>
Com m ande LigneCom m ande
{Clé pr im aire : no Co m m ande} {Cl é pri maire : no Co mm ande, noArticl e}
noComm ande : INTEGER noComm ande : INTEGER
date Co mm ande : DATE noArticle : INTEGER
noClient : INTEGER quantité : INT EGER
<<Table>>
<<Table>> DétailLivrais on
Livrais on {Clé prim aire : noLivrais on, noCom m ande, noArticle}
{Clé prim aire : noLivrais on} noLivrai son : INTEGER
noLivrais on : INTEGER noCom m a nde : INTEGER
dateLivrais on : DATE noArticle : INT EGER
quantitéLivrée : INTEGER
π nomClient
Article
LigneCommande
Client Commande
Client = Commande
noClient nomClient noTéléphone noCommande dateCommande
10 Luc Sansom (999)999-9999 1 01/06/2000
10 Luc Sansom (999)999-9999 3 02/06/2000
10 Luc Sansom (999)999-9999 4 05/07/2000
20 Dollard Tremblay (888)888-8888 2 02/06/2000
20 Dollard Tremblay (888)888-8888 6 09/07/2000
30 Lin Bô (777)777-7777 5 09/07/2000
40 Jean Leconte (666)666-6666 7 15/07/2000
40 Jean Leconte (666)666-6666 8 15/07/2000
50 Hafedh Alaoui (555)555-5555 null null
60 Marie Leconte (666)666-6666 null null
70 Simon Lecoq (444)444-4419 null null
80 Dollard Tremblay (333)333-3333 null null
Client Commande
Schémas compatibles
Table T 1 Table T 2
A B A B
1 1 2 2
2 2 3 3
T1 ∪ T2
A B T1 ∩ T2 T1 - T2 T2 – T1
1 1 A B A B A B
2 2 2 2 1 1 3 3
3 3
Hiver 2011
C. Desrosiers
Structured
Query Language
Norme établie pour SGBD relationnel
Partie LDD (DDL)
– Conceptuel : CREATE SCHEMA, TABLE,...
– Externe : CREATE VIEW, GRANT,…
– Interne : CREATE INDEX, CLUSTER,...
Partie LMD (DML)
– SELECT, INSERT, DELETE, UPDATE
Niveau conceptuel
– Schéma des tables (TABLE)
CREATE TABLE.
– Domaines (DOMAIN)
SQL2 intermédiaire : CREATE DOMAIN
– Contraintes d'intégrité
PRIMARY KEY, FOREIGN KEY, UNIQUE KEY,
CHECK, ASSERTION, TRIGGER
Niveau interne
– non standardisé (e.g. CREATE INDEX)
Environnement SQL
Catalogue c1
Schéma c1.s1
Table Table Schéma c1.s2
c1.s1.t1 c1.s1.t2
Table
View c1.s2.t1
c1.s1.v1
Catalogue c2
Schéma c2.s1
Identificateur d ’utilisateur
– authorizationID
– non standardisé
Mécanisme d ’authentification
– e.g. mot de passe
Utilisateur possède privilèges
DATABASE ~ catalogue
– une instance Oracle monte une DATABASE à la fois
Nom du SCHEMA
– = authorizationID du propriétaire
CLUSTER Oracle
– ≠ cluster de l ’environnement SQL2
– = méthode d ’organisation de données par grappe
Forme simple
CREATE TABLE Client
(noClient INTEGER,
nomClient VARCHAR(15),
noTéléphone VARCHAR(15)
)
Transmise à l ’interprète du LDD
– vérification
– création de la table
schéma stocké dans dictionnaire de données
allocation des structures physiques
– clause non standardisée pour organisation primaire
DATE
– ~TIMESTAMP SQL2
Mécanisme d ’internationalisation
– Paramètre de configuration NLS_LANG
CHARACTER SET
DATE_FORMAT
...
ALTER SESSION
– pour modifier
ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY'
LOB : taille max 4G
BFILE : fichier externe
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 40
Suppression d’une table (DROP TABLE)
Syntaxe
ALTER TABLE nomTable
{ADD COLUMN spécificationColonne|
DROP COLUMN nomColonne [RESTRICT|CASCADE]|
ADD spécificationContrainte|
DROP nomContrainte [RESTRICT|CASCADE]|
ALTER nomColonne SET DEFAULT valeurDéfaut|
ALTER nomColonne DROP DEFAULT}
Syntaxe de requêteSQL
selectSQL |
(requêteSQL) {UNION|INTERSECT|EXCEPT} (requêteSQL)
Syntaxe du selectSQL
SELECT {[ALL|DISTINCT] expression [AS nomColonne]
[,expression [AS nomColonne]]…}|*
FROM table [AS nomTable [(nomColonne[,nomColonne])]]]
[,table [AS nomTable [(nomColonne[,nomColonne])]]]]…
[WHERE conditionSQL]
[GROUP BY nomColonne [,nomColonne]…
[HAVING conditionSQL]
[ORDER BY nomColonne [ASC|DESC] [,nomColonne[ASC|DESC]]…]
...
{conditionSimple
(conditionSQL)|
NOT(conditionSQL)|
conditionSQL AND conditionSQL |
conditionSQL OR conditionSQL}
SELECT *
FROM Client NATURAL JOIN Commande {SQL2}
Client Commande
SELECT *
FROM Client JOIN Commande ON
Client.noClient = Commande.numéroCLient {SQL2}
~ renommer (ρ)
SELECT Client.noClient, nomClient, noTéléphone, noCommande,
dateCommande
FROM Client, Commande
WHERE Client.noClient = Commande.noClient
Client = Commande
SELECT *
FROM Client NATURAL LEFT OUTER JOIN Commande {SQL2}
Oracle
– « + » après colonne pour inclure la valeur NULL
SELECT *
FROM Client,Commande
WHERE Client.noClient = Commande.noClient(+)
Table Clie n t
noClient nomClient noTéléphone
10 Luc Sansom (999)999-9999
20 Dollard Tremblay (888)888-8888
Table Em p lo y é
30 Lin Bô (777)777-7777
codeEmployé nomEmployé noTéléphone
40 Jean Leconte (666)666-6666
CASD1 Dollard Tremblay (888)888-8888
50 Hafedh Alaoui (555)555-5555
PIOY1 Yan Piochuneshot 911
60 Marie Leconte (666)666-6666
LAFH1 Yvan Lafleur (111)111-1111
70 Simon Lecoq (444)444-4419
HASC1 Jean Leconte (666)666-6666
80 Dollard Tremblay (333)333-3333
nomPersonne noTéléphone
Dollard Tremblay (888)888-8888
Jean Leconte (666)666-6666
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 50
Opérateurs
Symbole Signification
+ Somme
- Différence
* Produit
/ Division
|| Concaténation de chaîne (SQL2)
CURRENT TIME
CURRENT TIMESTAMP
– SYSDATE Oracle
CURRENT_USER (ou USER)
SESSION_USER
SELECT
CASE
WHEN SUM(quantitéLivrée) IS NULL THEN 0
ELSE SUM(quantitéLivrée)
END AS quantitéTotaleLivrée
FROM DétailLivraison
WHERE noArticle = 50 AND noCommande = 4
quantitéTotaleLivrée
0
POSITION(patron IN chaîne)
CHARACTER_LENGTH(chaîne)
OCTET_LENGTH (chaîne)
BIT_LENGTH(chaîne)
EXTRACT(champ FROM dateOuTime)
SUBSTRING (chaîne FROM indiceDébut FOR nombreCaractères)
UPPER | LOWER (chaîne)
TRIM ([LEADING|TRAILING|BOTH] caractère FROM chaîne)
CAST(expression AS type)
…
Voir documentation du SGBD
SYSDATE
--------
02-02-05
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-YYYY HH24:MI:SS';
Session altered.
SYSDATE
-------------------
05-02-2002 09:08:26
TO_DATE('05/02/2000
-------------------
05-02-2000 00:00:00
TO_CHAR(SY
----------
22/01/2002
SYSDATE+INTERVAL'1'
-------------------
23-01-2002 16:02:18
SYSDATE-INTERVAL'1'
-------------------
21-01-2002 16:02:18
SYSDATE+1
-------------------
23-01-2002 16:02:18
SYSDATE+1/24
-------------------
22-01-2002 17:02:18
SYSDATE+INTERVAL'30
-------------------
22-01-2002 16:02:48
nombreArticles prixMoyen
10 19.49
nombrePrix
6
nombrePrixNonNull
10
SELECT *
FROM Client
ORDER BY nomClient DESC, noTéléphone ASC
Client Commande
SELECT DISTINCT Client.noClient, nomClient, noTéléphone
FROM Client, Commande
WHERE Client.noClient = Commande.noClient
SELECT *
FROM Client
WHERE EXISTS
(SELECT *
FROM Commande
WHERE noClient = Client.noClient)
Insert
Delete
Update
Table Artic le
noArticle description prixUnitaire quantitéEnStock
10 Cèdre en boule 10.99 10
20 Sapin 12.99 10
40 Epinette bleue 25.99 10
50 Chêne 22.99 10
60 Erable argenté 15.99 10
70 Herbe à puce 10.99 10
80 Poirier 26.99 10
81 Catalpa 25.99 10
90 Pommier 25.99 10
95 Génévrier 15.99 10
CREATE VIEW ArticlePrixModique AS
SELECT noArticle, description, prixUnitaire
FROM Article
WHERE prixUnitaire < 15
VIEW Artic le PrixMo d iqu e
noArticle description prixUnitaire
SELECT *
10 Cèdre en boule 10.99
FROM ArticlePrixModique 20 Sapin 12.99
70 Herbe à puce 10.99
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 74
Implémentation des tables virtuelles
SELECT *
FROM ArticlePrixModique
SELECT *
FROM (
SELECT noArticle, description, prixUnitaire
FROM Article
WHERE prixUnitaire < 15)
Table stockée
Redondance
Maintenance de la cohérence
Meilleure performance du SELECT
Moins bonne performance des mises à jour
Entrepôts de données
Hiver 2011
C. Desrosiers
SQL incomplet
Défaut d'impédance (impedance mismatch)
– modèle de données BD ≠
– modèle de données du langage de programmation
– non portable
API normalisée
– standard de facto ODBC
développé par Microsoft pour le C
SQL +
– structures de contrôle
– procédures, fonctions, packages
– support direct des types SQL pour les variables
– exécution au niveau serveur de BD
Oracle
– PL/SQL
[DECLARE
déclaration [déclaration] ...]
BEGIN
séquenceEnoncés
[EXCEPTION
exception_énoncé [exception_énoncé] ...]
END
SQL> DECLARE
2 laQuantitéEnStock Article.quantitéEnStock%TYPE;
3 BEGIN
4 SELECT quantitéEnStock INTO laQuantitéEnStock
5 FROM Article
6 WHERE noArticle = 10;
7 IF laQuantitéEnStock = 0 THEN
8 DBMS_OUTPUT.PUT_LINE('L article est en rupture de stock');
9 ELSE
10 DBMS_OUTPUT.PUT('Quantité en stock :');
11 DBMS_OUTPUT.PUT_LINE(laQuantitéEnStock);
12 END IF;
13 EXCEPTION
14 WHEN NO_DATA_FOUND THEN
15 DBMS_OUTPUT.PUT_LINE('Numéro d article inexistant');
16 WHEN OTHERS THEN
17 RAISE_APPLICATION_ERROR(-20001,'Erreur soulevée par le SELECT');
18 END;
19 /
Quantité en stock :20
leNoClient Client.noClient%TYPE;
leNoClient INTEGER;
LOOP
séquenceEnoncés
END LOOP ;
Déclarer
nomException EXCEPTION;
Soulever
RAISE nomException
Attraper
WHEN nomException THEN
séquenceÉnoncés
OPEN lignesCommande(leNoCommande);
-- Le OPEN ouvre le CURSOR en lui passant les paramètres
LOOP
FETCH lignesCommande INTO leNoArticle, laQuantitéCommandée;
-- Le FETCH retourne la ligne suivante
END LOOP;
DBMS_OUTPUT.PUT('noArticle :');
DBMS_OUTPUT.PUT(uneLigne.noArticle);
DBMS_OUTPUT.PUT(' quantité commandée:');
DBMS_OUTPUT.PUT(uneLigne.quantité);
Function created.
SQL> select fQuantitéEnStock(10) from dual;
FQUANTITÉENSTOCK(10)
--------------------
10
Procedure created.
class ClientInsertJDBC
{
public static void main (String args [])
throws SQLException, ClassNotFoundException, java.io.IOException
{
// Charger le pilote JDBC d'Oracle
Class.forName ("oracle.jdbc.driver.OracleDriver");
// Connexion à une BD
Connection uneConnection =
DriverManager.getConnection ("jdbc:oracle:oci8:@", "godin", "oracle");
CallableStatement
CallableStatement unCall =
uneConnection.prepareCall("{call pModifierQuantitéEnStock(?,?)}");
Pardéfaut : auto-commit
Pour modifier
uneConnection.setAutoCommit(false);
Pour un commit explicite :
uneConnection.commit();
Pour un rollback :
uneConnection.rollback();
Hiver 2011
C. Desrosiers
– procédural
TRIGGER (SQL:1999)
Types SQL
– INTEGER
– CHAR
– ...
NOT NULL
CHECK
CREATE DOMAIN
Options
– NO ACTION
– CASCADE
– SET NULL
– SET DEFAULT
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 114
Oracle
Défaut
– ON DELETE NO ACTION
– ON UPDATE NO ACTION
Supporte aussi
– ON DELETE CASCADE
– ON DELETE SET NULL (version 8i)
Procédure
– déclenchée par événement pré-déterminé (INSERT, DELETE, UPDATE)
– exécutée au niveau serveur de BD
BD active
Utilité
– maintien de contraintes d ’intégrité
statique
dynamique
alternative aux mécanismes déclaratifs (CHECK, ASSERTION, ...)
– préférer mécanisme déclaratif
– maintien d ’éléments dérivés
colonnes dérivées
copies dans BD répartie
...
– historique des mises à jour
AUDIT
– sécurité
Oracle
– RAISE_APPLICATION_ERROR
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 121
Utilisation d'un TRIGGER pour le
maintien d'une contrainte d'intégrité
statique
REFERENCING
OLD TABLE AS nomAvant
NEW TABLE AS nomAprès
UPDATE Statistiques
SET nombreClients = total
WHERE idStat = ID_STAT_NB_CLIENTS;
END
Solution 1: AUTONOMOUS_TRANSACTION!
CREATE TRIGGER AIMettreAJourNbClients
After INSERT ON Client
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
total INTEGER;
BEGIN
SELECT COUNT(*) INTO total
FROM Client;
UPDATE Statistiques
SET nombreClients = total
WHERE idStat = ID_STAT_NB_CLIENTS;
COMMIT;
! END
Considère la transaction comme indépendante
La mise-à-jour peut être erronée car la nouvelle insertion n’est
pas considérée
Département de génie logiciel et des TI © R. Godin, C. Desrosiers - Hiver 2011 132
Problème des tables en mutation
Solution 2: TRIGGER de niveau STATEMENT
CREATE TRIGGER AIMettreAJourNbClients
After INSERT ON Client
DECLARE
total INTEGER;
BEGIN
SELECT COUNT(*) INTO total
FROM Client;
UPDATE Statistiques
SET nombreClients = total
WHERE idStat = ID_STAT_NB_CLIENTS;
END
!
On supprime le FOR EACH ROW
La mise à jour est faite une seule fois à la fin