Introduction au Langage SQL et ses Fonctions
Introduction au Langage SQL et ses Fonctions
Bases de données :
« Le Langage SQL »
1 Introduction
UFR SAT/UGB
3 SQL comme LMD
4 novembre 2021
Introduction Introduction
SQL comme LDD SQL comme LDD
SQL comme LMD SQL comme LMD
SQL comme Langage de Requêtes SQL comme Langage de Requêtes
David Célestin FAYE Bases de données David Célestin FAYE Bases de données
Présentation de SQL 5 SQL : Quelques repères historiques 6
Z SQL : Structured Query Langage Z 1974 SEQUEL (Structured English Query Language) ancêtre
de SQL
Z Langage textuel aux règles syntaxiques précises et intégré au
sein du SGBD relationnel et composé de plusieurs parties Z 1979 premier SGBD basé sur SQL par Relational Software Inc.
un langage de définition de données (LDD) (rebaptisé Oracle)
un langage de d’interrogation de la base de données Z 1986 SQL1 1ière norme ISO
un langage de manipulation de données(LMD) Z 1989 ajout des contraintes d’intégrité de base (clé primaire et
clé étrangère)
un langage de contrôle de l’accès aux données de données
(LCD) Z 1992 SQL2 2ième norme extension de SQL1 (nouveaux types
et nouveaux opérateurs
un langage de contrôle des transactions (LCT)
Z 1999 SQL3 extension de SQL2 (introduction des types
SQL procedural qui est un ensemble d’outils pour que SQL
orientés objet)
s’interface avec des langages hôtes.
Clients(codeClient, nomClient ,prenomClient, age,ville) Pour créer un schéma de bases de données (sous MySQL,
Produits(codeProduit ,designation ,prixUnitaire ,tauxTVA, poids, PostgreSQL ...) et l’interroger en ligne :
stock,couleur) [Link]
Commandes(numCommande, dateCommande, commandeReglee,codeClient) Pour exécuter des requêtes en ligne sur une base exemple :
LignesCommande(numCommande,codeProduit, quantite)
[Link]
Fournisseurs(codeFournisseur, nomFourn, prenomFourn, ville,
telephone) Rappels des commandes SQL : [Link]
Livraison(codeFournisseur, codeProduit,quantite)
Introduction Introduction
SQL comme LDD SQL comme LDD
SQL comme LMD SQL comme LMD
SQL comme Langage de Requêtes SQL comme Langage de Requêtes
Booléen BIT
Nombre entier SHORT (entier), SMALLINT (entier), LONG (entier long), Chaînes de caractères Temporel Nombres Chaînes de bits
INTEGER (entier long), BYTE (octet)
Nombre réel SINGLE (réel simple), DOUBLE (réel double), NUMERIC (réel double)
DATE TIME BIT BIT VARYING
Monétaire CURRENCY, MONEY
Date/Heure DATE, TIME, DATETIME , TIMESTAMP TIMESTAMP Réels Entiers
Texte VARCHAR (255 caractères), CHAR(longueur) ou TEXT(longueur)
(longueur caractères), LONGTEXT (mémo, 32K max.) ASCII ASCII
Fichier binaire LONGBINARY (Objet OLE) INTEGER SMALLINT
Exact Approchés
Compteur COUNTER (NuméroAuto).
NUMBER(n, m) (décimaux à n chiffres au total, m après la CHAR VARCHAR NCHAR NCHAR VARYING DOUBLE PRECISION
virgule) ,CHAR(n) (chaîne de longueur fixe) , VARCHAR(n) Attention : Les types CHAR(N) et NCHAR(N) complètent les données
(chaîne de longueur variable) , DATE (généralement au format par des blancs si la taille réelle est inférieure à N
’DD-MM-YY HH:MM:SSam’)
<contrainte-table>:=
[[CONSTRAINT nom-contrainte]{UNIQUE|PRIMARY KEY}({nom-colonne}◦ )]
[[CONSTRAINT nom-contrainte] FOREIGN KEY ({nom-colonne}◦ )
REFERENCES <nom-table>[(nom-colonne◦ )][ON DELETE CASCADE]]
[[CONSTRAINT nom-contrainte] CHECK (<condition>)]
<contrainte-colonne>:=
<contrainte-colonne>:= [[CONSTRAINT nom-contrainte]{UNIQUE}]
[ [CONSTRAINT nom-contrainte] CHECK (<condition>) ]
ZExemple (SQL Standard)
ZExemple CREATE TABLE Clients(
On restreint les valeurs possibles de l’attribut commandeReglee codeClient INTEGER,
dans la table Commandes. nomClient CHAR(20) UNIQUE,
prenomClient CHAR(20),
CREATE TABLE Commandes( ville CHAR(16));
numCommande INTEGER,
dateCommande CHAR(20) CREATE TABLE Clients(
commandeReglee CHAR(5) CHECK (commandeReglee IN (’oui’, ’non’) codeClient INTEGER,
); nomClient CHAR(20) CONSTRAINT nomContrainte UNIQUE,
prenomClient CHAR(20),
ville CHAR(16));
Clé primaire : clause PRIMARY KEY 27 Clé primaire : clause PRIMARY KEY 28
<contrainte-colonne>:=[[CONSTRAINT nom-contrainte]{PRIMARY KEY}]
<contrainte-colonne>:=[[CONSTRAINT nom-contrainte]PRIMARY KEY
(nom-colonne)
Pour appliquer la clé à deux champs, nous utilisons la syntaxe
ZExemple suivante :
ZExemple
CREATE TABLE Clients(
codeClient INTEGER PRIMARY KEY, CREATE TABLE ligneCommandes(
nomClient CHAR(20) NOT NULL, numCommande INTEGER ,
prenomClient CHAR(20) codeProduit CHAR(20),
ville CHAR(20)); quantite INTEGER,
CONSTRAINT pk PRIMARY KEY(numCommande, codeProduit));
CREATE TABLE Clients(
codeClient INTEGER CONSTRAINT clePrimaire PRIMARY KEY,
nomClient CHAR(20) NOT NULL,
prenomClient CHAR(20)
ville CHAR(20));
Un index est une table à deux champs. Le premier est le champ sur Un index sur un champ permet un accès rapide sur les valeurs
lequel porte l’index. Le second est le numéro d’enregistrement de ce champ.
correspondant dans la table. La table d’index est triée sur les
En effet, le temps moyen d’accès à un élément est de N/2 sans
valeurs du premier champ
index à comparer avec log2 N avec un index
Soit une table CLIENTS(numclient, nom, prénom, ...). Un Les index permettent d’accélérer les calculs de requêtes.
index sur le cham [Link] est une table : Cependant
1 ils doivent être mis à jour (par le SGBDR) lors de toute mise à
... ... jour de la table,
ba 235487 2 ils prennent de la place car c’est une nouvelle table. On parle
fall 3378 de compromis temps-espace.
sarr 457302
... ...
Syntaxe
ZExemple
ALTER TABLE Clients MODIFY nomClient CHAR(25);
Plan 42
Z Suppression de contraintes dans une table
Introduction
SQL comme LDD Ajout (ou insertion) d’un enregistrement 44
SQL comme LMD
SQL comme Langage de Requêtes
ZExemple
UPDATE Clients
COMMIT
SET adresse=’dakar’
WHERE nom=’Modou’ ; pour rendre permanents les résultats des mises-à-jours
dans un programme (C, java...) :
UPDATE lignedeCommande EXEC SQL COMMIT;
SET quantite=quantite+10
ROLLBACK
WHERE codPrdouit=’P01’ ;
pour annuler les résultats des mises-à-jour
dans un programme :
Remarque :
EXEC SQL ROLLBACK;
Si la clause WHERE n’est pas indiquée, le champ précisé après
SET sera modifié pour toutes les lignes de la table La sémantique de ces commandes est supportée par les
transactions.
Chaque nom de colonne doit appartenir à la table précitée
Un même nom de colonne ne peut pas apparaître plus d’une
fois dans l’instruction SQL.
Introduction Introduction
SQL comme LDD SQL comme LDD
SQL comme LMD SQL comme LMD
SQL comme Langage de Requêtes SQL comme Langage de Requêtes
David Célestin FAYE Bases de données David Célestin FAYE Bases de données
ville
Dakar
Louga
Thies
Conditions sur l’ensemble des lignes regroupées Z Quels sont les produits dont le total des quantités
Z Permet de sélectionner des groupes de la requête de commandées est supérieure à 150 ?
regroupement. SELECT codeProduit
SELECT liste_d_expressions FROM lignesCommande
FROM nom de table GROUP BY codeProduit ;
[ WHERE condition ] HAVING SUM(quantite) >150 ;
GROUP BY liste_d_expressions2 Z Combien de produits différents ont été commandées pour
HAVING condition_sur_lignes ; chaque commande, tels que la quantité totale de produits
Z les expressions de liste_ d_expressions et condition_ commandées pour cette commande soit supérieure à 1000 ?
sur_lignes doivent être formees uniquement : SELECT numCommande, COUNT( DISTINCT codeProduit)
d’expressions de liste_d_expressions2 FROM LignesCommandes
de fonctions de groupe GROUP BY numCommande
de constantes litérales HAVING SUM(quantite)>1000 ;
La requête de regroupement 69 Différence entre WHERE et HAVING 70
La jointure 71 La jointure 72
θ-jointure :
permet d’exprimer des requêtes portant sur les données SELECT *
FROM R1, R2
réparties dans plusieurs tables.
WHERE [Link] θ [Link]
On précise la liste des tables concernées dans la clause FROM, et
θ ∈ {<=>=! =}.
on exprime les critères de rapprochement dans la clause WHERE.
Jointure naturelle :
Syntaxe
SELECT *
SELECT * FROM R1, R2
FROM <liste_de_relations> WHERE [Link] = [Link]
WHERE <prédicat_de_jointure> Ai est un attribut commun à R1 et R2.
types de jointure : jointure naturelle, la θ-jointure et Auto-Jointure :
l’auto-jointure.
SELECT *
FROM R RA, R RB
WHERE [Link]θ [Link]
Ai ∈ R, Bj ∈ R
Jointure naturelle 73 74
S’il n’y a pas d’ambiguïté sur les noms des attributs, on peut
Z donner les noms, prénoms et villes des clients ayant commandé ne pas préfixer le nom de l’attribut par le nom de la table le
SELECT [Link],[Link],[Link] contenant.
FROM Clients ,Commandes
jointures non-équi : remplacer ’=’ par (<, <=, >, >=).
WHERE [Link] = [Link];
jointure interne : clause INNER JOIN. . Ne sont incluses dans
Z Nom des clients habitant Dakar, leurs commandes avec la date le résultat final que les lignes qui se correspondent dans les
de lancement deux tables.
SELECT nomClient, numCommande , dateCommande ZQuels sont les noms, prénoms et villes des clients ayant
FROM Clients , Commandes commandé ?
WHERE ville=’dakar’ SELECT [Link],[Link],[Link]
AND [Link] = [Link]; FROM Clients
INNER JOIN Commandes ON [Link]=[Link];
Il peut être utile de rassembler les informations venant d’une La norme SQL propose une syntaxe pour exprimer les jointures
ligne d’une table avec les informations venant d’une autre ligne dans la clause FROM avec CROSS JOIN.
de la même table. Le CROSS JOIN retourne le produit cartésien de deux tables.
Dans ce cas, on renomme au moins l’une des deux tables en lui SELECT ...
donnant un synonyme (voir slide ), afin de pouvoir préfixer FROM Commandes
sans ambiguïté chaque colonne. CROSS JOIN Clients;
Z Donner les couples de fournisseurs habitant dans la même ville.
est équivalent à
SELECT [Link], [Link]
FROM Fournisseurs f1, Fournisseurs f2 SELECT ...
WHERE [Link] = [Link] FROM Commandes,Clients
AND [Link]!=[Link]
79 Requêtes imbriquées 80
Pour répondre à la requête, le SGBD Où exp est toute expression légale et op ∈ {<=, >=, ! =}.
Exemple
exécute la requête interne ( calcul de l’ensemble des code des
’savons’) Soit le schéma relationnel suivant :
exécute la requête externe SELECT numFournisseur FROM Employe(numEmp„nomEmp,prenomEmp,poste,sal,nomDept)
Livraison WHERE codeProduit IN (...) en balayant Departement(nomDept,nomChef)
Livraison et en testant pour chaque tuple si son
codeProduit appartient à l’ensemble des codes de produits
’savon’
Sous interrogation à une ligne et une colonne 85 Sous interrogation ramenant plusieurs lignes 86
Z Liste des employés travaillant dans le même département que l’opérateur de comparaison admet à sa droite un ensemble de
l’employé n◦ 1 valeurs. Opérateurs de comparaison :
SELECT nomEmp t IN R où t est un tuple dont le type est celui de R. True si
FROM Employe t appartient à R, False sinon.
WHERE nomDept = ( SELECT nomDept
FROM Employe v cmp ANY R, où cmp ∈ {<=, >=, ! =}. Renvoie True si la
WHERE numEmp = 1) comparaison avec au moins un des tuples de la relation unaire
R renvoie True.
Z Liste des employés du département finances ayant même poste
que quelqu’un du département études v cmp ALL R, où cmp ∈ {<=, >=, ! =}. Renvoie True si la
comparaison avec tous les des tuples de la relation unaire R
SELECT nomEmp, poste
renvoie True.
FROM Employe
WHERE nomDept=’finances’ IN est équivalent à " = ANY " , "NOT IN" est équivalent à "
AND poste IN(SELECT poste !=ALL "
FROM Employe Le mot clé ALL ne permet pas d’exprimer toutes les requêtes
WHERE nomDep = ( SELECT nomDep
contenant un quantificateur du type quelque soit.
FROM Departement
WHERE nomDept=’études’ ))
Sous interrogation ramenant plusieurs lignes 87 Sous interrogation ramenant plusieurs lignes 88
Z La condition
Z Caractéristiques de chaque pièce ayant un poids inférieur à la x θ ANY (SELECT Ri.y FROM R1 ,..., Rn WHERE p)
moyenne des poids des pièces de leur couleur : est équivalente à
SELECT * EXISTS ( SELECT * FROM R1 ,..., Rn WHERE p AND x
FROM Produits P
θ Ri.y)
WHERE poids <( SELECT AVG(poids)
FROM Produit Z La condition
WHERE couleur = [Link] x θ ALL ( SELECT Ri .y FROM R1 ,..., Rn WHERE p)
est équivalente à
Note : Pour chaque ligne de la question d’appel, la sous-question
NOT EXISTS( SELECT * FROM R1 ,..., Rn WHERE p AND
est réévaluée.
NOT ( x θ Ri .y))
Z expr NOT BETWEEN expr1 AND expr2 Z expr BETWEEN expr1 AND expr2
⇔ expr < expr1 OR expr > expr2 ⇔ expr >= expr1 AND expr<= expr2
Z expr IN (expr1 · · · exprN ) Z expr NOT IN (expr1 . . . exprN )
⇔ expr = expr1 OR . . . OR expr = exprN ⇔ expr <> expr1 AND . . . AND expr <> exprN
Z expr op ANY (expr1 · · · exprN ) Z expr op ALL (expr1 . . . exprN )
⇔ expr op expr1 OR . . .OR expr op exprN ⇔ expr op expr1 AND . . . AND expr op exprN
Traitement de l’absence de valeur 97 Traitement de l’absence de valeur 98
Cette requête recherche les depôt pour qui il n’existe pas de type
de produit qu’ils ne peuvent pas fournir
La division 113 La division 114
Expressions et fonctions sur les chaînes de caractères 123 Expressions et fonctions sur les chaînes de caractères 124
Z LTRIM(chaîne, car) supprime les caractères à l’extrémité
gauche de la chaîne chaîne tant qu’ils appartiennent à Z TO_CHAR (n, format) permet de convertir un nombre ou
l’ensemble de caractères car. Si l’ensemble des caractères une date n en chaîne de caractère en fonction d’un
n’est pas donné, ce sont les espaces qui sont enlevés. [Link] indique le format sous lequel sera affichée la
Z RTRIM(chaîne, car) : fonction analogue à LTRIM, les date ou le nombre.
caractères étant supprimés à l’extrémité droite de la chaîne. Si Z TO_NUMBER (chaîne) convertit une chaîne de caractères en
l’ensemble car n’est pas donné, les espaces sont enlevés. nombre (quand la chaîne de caractères est composée de
Z REPLACE(chaîne, ch1, ch2 ) remplace ch1 par ch2 dans caractères numériques.
chaîne. Z ASCII(chaîne) donne le code ASCII du premier caractère de
Z TRANSLATE(chaîne, avant, après) remplace chaque chaîne.
caractère de chaîne présent dans avant par le caractère situé Z CHR(n) donne le caractère de code ASCII n.
à la même position dans après. Les caractères de chaîne non Z TO_DATE(chaîne, format) permet de convertir une chaîne
présents dans avant ne sont pas modifiés. avant peut de caractères en donnée de type date. Le format est identique
contenir plus de caractères que après, dans ce cas les à celui de la fonction TO_CHAR.
caractères de avant sans correspondants dans après seront
supprimés de chaîne .
Expressions et fonctions sur les dates 125 Expressions et fonctions sur les dates 126
Z Opérateurs sur les dates Z NEXT_DAY(date, nom_du_jour)
date +/- nombre : le résultat est une date obtenue en Renvoie la date du prochain jour de la semaine dont le nom
ajoutant le nombre de jours nombre à la date date.
est nom_de_jour.
date2 - date1 : le résultat est le nombre de jours entre les
deux dates. Z ROUND(date[,précision])
Z Opérateurs sur les dates Renvoie date arrondie à l’unité spécifiée dans précision. L’unité
ADD_MONTHS(date, n) : Renvoie la date obtenue en ajoutant de précision est indiquée en utilisant un des masques de mise
n mois à date. n peut être un entier quelconque. Si le mois en forme de la date. On peut ainsi arrondir une date à l’année,
obtenu a moins de jours que le jour de date, le jour obtenu est au mois, à la minute,... Par défaut la précision est le jour.
le dernier du mois. Z SYSDATE
LAST_DAY(date) Renvoie la date du dernier jour du mois de
Renvoie la date et l’heure courantes du système d’exploitation
date.
MONTHS_BETWEEN(date2, date1) hôte.
Renvoie le nombre de mois entre date2 et date1, si date2 est Z TRUNC(date[,précision])
après date1 le résultat est positif, sinon le résultat est négatif. Renvoie date tronquée à l’unité spécifiée dans précision. Les
Si les jours date2 et date1 sont les mêmes, ou si ce sont les paramètres sont analogues à ceux de la fonction ROUND.
derniers jours du mois, le résultat est un entier.