Vous êtes sur la page 1sur 26

Chapitre II :

Structured Query Language (SQL)


Chapitre II : Structured Query Language (SQL)

1. Introduction
Une BD est conçu pour servir de support à une application informatique. Ainsi,
l’interrogation d'une telle source de données avec un langage de données constitue l’objectif de
son développement. Un langage de données est un langage informatique permettant de décrire
et de manipuler les schémas et les données d'une base. SQL (Structured Query Language) est
le langage de données le plus utilisé pour l’exploitation des BD, ce langage normalisé (ISO89)1,
(ISO92)2 constitue le standard d’accès aux BD relationnelles. Ainsi, il représente le point
d’entrée obligatoire des SGBD relationnels. Il permet de définir, interroger, manipuler,
contrôler et communiquer avec une BD. Pour cela, il utilise des critères de recherche
(qualifications) construits à partir de l'algèbre relationnelle.

SQL fournit plusieurs niveaux de normalisation :


- SQL1 : représente la norme de base
- SQL2 : extension de SQL1 qui offre :
o Un meilleur support des règles du langage algébrique
o Un ensemble plus variés des types de données, varchar2 par exemple.
- SQL3 : extension de SQL2 qui offre :
o Une prise en charge du modèle objet,
o Utilisation des trigger pour la gestion des événements,
o Utilisation des rôles pour la gestion de la sécurité
o ...
- PL/SQL : un langage fondé sur l'intégration du paradigme de programmation
procédurale avec la gestion des données.

2. Oracle
En 1977, Larry Ellison, Bob Miner et Ed Oates fondent la société Software
Development Laboratories (SDL). Les associés de SDL avec le mathématicien Edgar Frank
Codd 3 se lancent dans le développement de leur logiciel Oracle. En 1979, SDL devient
Relational Software Inc. (RSI) qui donnera naissance à la société Oracle Corp. En 1983 la
première version du SGBD s’appelle RSI-1 et utilise SQL comme langage de données. Le
tableau suivant résume la chronologie des différentes versions du SGBD Oracle.

Tableau II. 1. Différentes versions du SGBD Oracle


Année Version Description
1979 Oracle 2 - Première version commerciale
- Ecrite en C/assembleur pour Digital
1983 Oracle 3 - Réécrite en C – verrous.
1984 Oracle 4 - Portage sur IBM/VM, MVS, PC
- Intégration du mode transactionnel.
1985 Oracle 5 - Architecture client-serveur avec SQL*Net
- Portage sur Apple.

1
[ISO89] International Organization for Standardization, « Information Processing Systems – Database Language
SQL with Integrity Enhancement », International Standard ISO/IEC JTC1 9075 : 1989(E), 2e édition, avril 1989.
2
[ISO92] International Organization for Standardization, « Database Language SQL », International Standard
ISO/IEC JTC1/SC21 Doc. 9075 N5739, 1992.
3
Apres avoir proposé le Modèle Relationnel.

Dr. Djellal. A 13
Chapitre II : Structured Query Language (SQL)

1988 Oracle 6 - Verrouillage niveau ligne


- Avec sauvegarde/restauration
- Intégration de PL/SQL
1992 Oracle 7 - Contraintes référentielles
- Procédures cataloguées
- Déclencheurs
- Portage sur Windows en 1995.
- Serveur de données vidéo
- Connexions sur le Web.
1997 Oracle 8 - Objet-relationnel
- Partitionnement
- LOB
- Support de Java
1999 Oracle 8i - i comme Internet
- SQLJ
- Portage sur Linux
- Support XML
2001 Oracle 9 i - Services Web
- Serveur d’applications
- Architectures sans fil
2004 Oracle 10g - g comme Grid computing (ressources en clusters)
2007 Oracle 11g - Auto-configuration
2013 Oracle 12c R1 - Architecture multitenant
- Cloud et Big Data.
2017 Oracle 12c R2 - Data Recovery
- Cloud Service
2018 Oracle 18c - BD autonome
- Redo Apply
- Data Guard
2019 Oracle 19c - Indexation Automatique
- Statistique en temps réel.
2021 Oracle 21c - Support des fichiers JSON dans les tables
- Nouveau type de tables : « Blockchain Tables »
- SQL Macros
- Utilisation des algorithmes de « Machine Learning »
- In-Database JavaScript

À partir de 2018, la société Oracle a proposé un rythme annuel pour ces nouvelles
versions. Avec ce nouveau rythme, le numéro de version rappellera l'année de son lancement,
comme le montre la figure suivante. Ainsi, en juillet 2018 la version Oracle 18c a vu le jour.
Elle ajoute quelques nouvelles fonctionnalités et améliore d’autres précédemment introduites
dans Oracle 12c. La dernière version consiste en Oracle 21c lancée en 2021.

Dr. Djellal. A 14
Chapitre II : Structured Query Language (SQL)

Figure II. 1. Différentes versions d'Oracle (jusqu'à 19c)4

3. Oracle SQL Developer


Oracle SQL Developer est un IDE 5 multiplateforme, fourni gratuitement par Oracle
Corp. C'est un outil graphique utilisant la technologie JDK (Java Development Kit). Il est
disponible sur le site d’Oracle6 sous différentes versions : Windows 32 et 64 bits, Mac, Linux
et autres. Sa première version 1.0 est lancée en Mars 2006. Il a ensuite considérablement
évoluer pour prendre en charge PL/SQL, de nouveaux constructeurs de requêtes, des
fonctionnalités DBA (Data Base Administration) plus avancées ainsi que des outils de
reporting7. Sa dernière version 21.4.3 est lancée en Mars 2022

Oracle SQL Developer permet de créer, mettre à jours, gérer et interroger


différentes BD en utilisant le langage SQL. Il supporte les produits Oracle ainsi que
des plugins qui permettent de se connecter à des BD non Oracle. En effet, il fonctionne
avec IBM DB2, Ms Access, Ms SQL Server, MySQL, Sybase Adaptive Server et les bases de
données Teradata.

4. Différentes familles du langage SQL


SQL représente le point d’entrée obligatoire des SGBD relationnels. Avec les
instructions SQL, appelées requêtes, il est possible de créer et de gérer les BD. Les requêtes du
langage SQL se répartissent en quatre familles fonctionnellement distinctes. Le tableau II.2
représente une classification des principales commandes SQL.

4
Source : https://www.claremont.co.uk/insights/upgrade-oracle-database-19c
5
Integrated Development Environment
6
www.oracle.com/technetwork/developer-tools/sql-developer
7
Oracle Forms and Reports

Dr. Djellal. A 15
Chapitre II : Structured Query Language (SQL)

i. Langage de Définition de Données (LDD) : les commandes de cette famille permettent de


décrire la structure de la BD (tables, attributs, contraintes, vues, index, ...).

ii. Langage de Manipulation de Données (LMD) : les commandes de cette famille permettent
de d'insérer les données dans les différentes tables. Elles permettent aussi de manipuler et
d'interroger les tables et les vues.

iii. Langage de Contrôle des Données (LCD) : les commandes de cette famille contiennent les
primitives de gestion des utilisateurs et des privilèges d'accès aux données.

iv. Langage de Contrôle de Transaction (LCT) : les commandes de cette famille permettent
la gestion des transactions (validation/annulation des m à j des données de la base)

Tableau II. 2. Classification des principales commandes SQL.

SQL
LDD LMD LCD LCT
CREATE SELECT GRANT COMMIT
DROP INSERT REVOKE ROLLBACK
ALTER DELETE
RENAME UPDATE
Dans ce qui suit, nous allons présenter en détails les commandes des deux premières familles,
à savoir : LDD et LMD

5. Langage de Définition de Données


Le LDD correspond à la partie SQL qui permet de décrire le schéma d’une BD
relationnelle qui sera manipulée par un SGBD. Dans ce cours, le schéma d'une BD est définit
par (i) la description des tables et (ii) la définition des contraintes portant sur les données de
ces tables.

5.1. Description des données

La description des données (Tables ou autres objets SQL) se fait à l'aide des commandes
suivantes : CREATE, ALTER, RENAME et DROP.

A retenir !! Une table est créée via SQL avec la commande CREATE TABLE,
renommée avec RENAME, sa structure est modifiée avec ALTER TABLE et est
supprimée avec DROP TABLE.

Dans ce qui suit, une présentation de ces commandes :

5.1.1. Création d'une tables

Avec la commande Create, on peut créer un objet SQL (BD, table, type, utilisateur…). La
commande CREAETE TABLE permet de créer des relations sous forme de tables. Ceci est fait
en définissant la liste de ses colonnes avec leurs types selon la syntaxe suivante :

Dr. Djellal. A 16
Chapitre II : Structured Query Language (SQL)

CREATE TABLE <Nom_Table> (Nom_Col1 type,


Nom_Col2 type,
… … ) ;

Exemple 1. L'exécution de la requête suivante 8 permet de créer la table Client de la BD Cours


(Cf. Chapitre I).

5.1.2. Renommer une table

La commande RENAME permet de renommer une table déjà crée. Pour cela, il faut respecter la
syntaxe suivante :
RENAME <nom_table> TO <nouv_nom_table>;

Exemple 2. La requête suivante permet de modifier le nom de la table Client en Vente_Client

5.1.3. Destruction d'une table

Pour supprimer un objet SQL, il faut utiliser la commande DROP. Cette commande est à utiliser
avec beaucoup d’attention car l’objet en question sera détruit définitivement (suppression
physique). Pour supprimer une Table avec ses enregistrements, il faut utiliser la commande
DROP TABLE, selon la syntaxe suivante :
DROP TABLE <nom_Table> ;

Exemple 3. La requête suivante permet de supprimer la table Client précédemment créée.

5.1.4. Modification du schéma d'une table

La commande ALTER permet de modifier la définition d'une table en ajoutant, en changeant ou


bien en supprimant des colonnes (attributs), selon la syntaxe suivante :
ALTER TABLE <nom_Table> CLAUSE description_CLAUSE ;

8
Ceci est une capture d’écran de l'IDE Oracle SQL Developer

Dr. Djellal. A 17
Chapitre II : Structured Query Language (SQL)

Où CLAUSE peut être ADD, MODIFY ou DROP column et description_CLAUSE est la


description de modification associée à la CLAUSE choisie.

A retenir!! Il est possible de modifier d'autres éléments de la table


(contraintes, trigger, par exemple), ceci sera abordé dans les prochaines
sections.

i. Ajout d’une colonne:


La syntaxe suivante permet d’ajouter une colonne à la structure d’une table :
ALTER TABLE <nom_Table> ADD <new_COLUMN> <Type>;

Exemple 4. On peut ajouter la colonne Email à la table Client, via la requête suivante :

ii. Modification d’une colonne:


Pour cela, il faut associer à la commande ALTER la clause MODIFY. Cela permet de modifier
le type de données d'une colonne existante.
ALTER TABLE <nom_Table> MODIFY <COLUMN> <Type>;

Exemple 5. La requête suivante permet d’agrandir la taille de la colonne Email à 50 caractères :

A retenir !! La modification du type de données d’une colonne peut poser des


problèmes si le nouveau type est incompatible avec le contenu existant, par
exemple le passage de VARCHAR à INTEGER. Le résultat sera, ainsi,
imprévisible. De plus, la diminution de la taille d’une colonne provoque le
risque de perte d’information.

iii. Suppression d’une colonne:

La possibilité de supprimer des colonnes d'une table est apparue avec Oracle 8.1. Pour ce faire,
il faut associer à la commande ALTER la clause DROP COLUMN selon la syntaxe suivante:
ALTER TABLE <nom_Table> DROP COLUMN <COLUMN>;

Exemple 6. La requête suivante permet de supprimer la colonne Email de la table Client :

Dr. Djellal. A 18
Chapitre II : Structured Query Language (SQL)

Activité. Utiliser la connexion TPBDA avec l'utilisateur TPBDA (crées durant la séance de
TP) et exécuter le script SQL suivant. Examiner le script output pour voir le résultat.

5.2. Nommage et types de données SQL

Comme tout langage informatique, le nommage des objets SQL (tables, colonnes...) est soumis
à un certain nombre de règles. Ainsi, le nom d’un objet SQL:

- Se compose des lettres {A…Z, a…z}, des chiffres {0…9} et le symbole {_}.
- Commence obligatoirement par une lettre.
- Sa taille ne dépasse pas 128 caractères.
- Différent des mots réservés de SQL (table, int, date...).
- Insensible à la casse.
- Unique au sein de l’objet qui le contient (exemple : le nom d’une table au sein de la base
ou bien le nom d’une colonne au sein d’une table).

Pour décrire les colonnes d’une table, la norme SQL fournit un ensemble très important de types
de données prédéfinis. Dans ce qui suit, une présentation des types de données les plus utilisés,
à savoir : les types caractères, numériques et temporels.

5.2.1. Types de données Caractères

Les deux principaux types caractères, disponibles dans la plupart des SGBD relationnels, sont
Char(M) et Varchar(M). Ils permettent de stocker des chaînes de caractères d’une taille
maximale fixée par un paramètre M. Varchar2(M) est un type de données utilisé depuis
Oracle 9. Il permet de stocker des chaines de caractères de tailles variables. La différence
essentielle entre celui-ci et les deux premiers types est qu’une valeur Char/Varchar a une
taille fixée, et se trouve donc complétée avec des blancs (nul) si sa taille est inférieure au
paramètre M. En revanche, une valeur Varchar2 a une taille variable et est donc tronquée
après le dernier caractère non blanc.

Ces trois types de données ne sont pas suffisants en cas de stockage des chaînes de caractères
très longues (des livres, par exemple). Par conséquent, la norme SQL propose d’autres types
qui correspondent à de très longues chaînes de caractères, par exemple le type Clob.

Dr. Djellal. A 19
Chapitre II : Structured Query Language (SQL)

Tableau II. 3. Les types de données Caractère

Type Description Taille


CHAR(M) Chaine fixe de M caractères 1-2000 caractères
VARCHAR(M) Chaine fixe de M caractères 1-4000 caractères
VARCHAR2(M) Chaine de longueur variable 1-4000 caractères
CLOB Chaine de longueur très grande Jusqu’à 4 G octet

5.2.2. Types de données numériques


Les principaux types numériques proposés par la norme SQL tournent autours les nombres
entiers et décimaux. Les types qui acceptent des nombres entiers comme valeur sont désignés
par le mot-clé INT (TinyInt, SmallInt, MediumInt, BigInt). La différence
entre eux revient à la taille mémoire réservées au champ. Le type Number(t, d) sert à
stocker des nombres décimaux. Les deux paramètres précisent la taille (t) du nombre et le
nombre de décimales (d). Dans un champ NUMBER(5,3), on peut stocker des nombres de 5
chiffres significatifs maximum, dont 3 chiffres sont après la virgule. Par exemple : 22.435, -
14.861. NUMBER (4) équivaut à écrire NUMBER(4, 0). Ce type est surtout utile pour
manipuler des valeurs dont la précision est connue, comme les valeurs monétaires.

Tableau II. 4. Les types de données Numériques

Type Description Taille


TinyInt Nombre entier appartenant à [-128, 127] 1 octet
SmallInt Nombre entier appartenant à [-32768, 32767] 2 octets
MediumInt Nombre entier appartenant à [-8388608, 8388607] 3 octets
Int Nombre entier appartenant à 4 octets
[-2147483648, 2147483647]
Bigint Nombre entier appartenant à 8 octets
[- 9223372036854775808, 9223372036854775807]
Number(T, D) Nombre de t chiffres dont d décimales. 21 octets
t : 1- 38. d : [–84, +127].

5.2.3. Types de données temporels

La norme SQL fournis un ensemble de types temporel pour stocker des valeurs représentants
des moments. Le type DATE permet de stocker des moments avec une précision de siècle,
année, mois, jour, heure, minutes et secondes. Le type TIMESTAMP est plus précis dans la
définition d’un moment (fraction de seconde). Le type INTERVAL YEAR TO MONTH permet
d’acquérir une différence entre deux valeurs temporelles avec une précision mois/année. Le
type INTERVAL DAY TO SECOND permet d’acquérir cette différence avec plus de précision
(de l’ordre de la fraction de seconde)

Dr. Djellal. A 20
Chapitre II : Structured Query Language (SQL)

Tableau II. 5. Types de données Temporels

Type Description Taille


DATE du 1er janvier 4712 avant J.-C. 7 octets
au 31 décembre 4712 après J.-C.
TIMESTAMP Date et heure incluant des fractions de 7 à 11 octets
secondes
INTERVAL YEAR (a) Période représentée en années et mois. 5 octets
TO MONTH La précision de a est de 0 à 9.
INTERVAL DAY (a) TO Période représentée en j/h/m/s. 11 octets
SECOND (s) Les précisions a et s est de 0 à 9

5.3. Description des contraintes

La création d’une table, telle qu’on l’a vue précédemment dans la section 5.1 sous forme
d'un ensemble de colonnes, décrit le contenu de la BD. Cependant, ce contenu doit
respecter quelques règles de gestion. Pour cela, il faut inclure des contraintes dans le
schéma de la table pour assurer l’intégrité et la cohérence de la BD. Par exemple, on peut
demander au SGBD de garantir que :
- Une colonne doit toujours avoir une valeur concrète (différente de nulle).
- Une ou plusieurs colonnes constituent la clé primaire de la table.
- Une colonne dans une table peut référencer la clé primaire d’une autre table.
- La valeur d’une colonne doit être unique au sein de la table.
- La valeur d'une colonne doit être supérieure à 18, par
exemple

Pour garantir ce genre de contrôle, des règles de gestion doivent être définies au sein des
schémas des tables de la BD, il s'agit des contraintes. L’intégration de ces contraintes peut
alléger les applications du côté client. En effet, si on définie que la valeur du stock des produits
doit obligatoirement être un nombre strictement positif (stock > 0), les applications de saisie
n’ont plus à tester les valeurs en entrée, ça sera le rôle des contraintes portant sur les colonnes
en question.

Deux types de contraintes peuvent être utilisés: des contraintes de domaines et des contraintes
d'intégrité. Les deux types peuvent être définis selon deux mode : en ligne et hors ligne.

i. Le mode en ligne (Inline constraints) : avec cet premier mode, la déclaration des contraintes
est faite au sein de la commande create (en même temps que la description de la colonne
ou bien après mais toujours dans Create), comme suit:

Dr. Djellal. A 21
Chapitre II : Structured Query Language (SQL)

Create table <nom_table> (


<nom_col> type <description de la contrainte>,
<nom_col> type,
....
<Description de la contrainte>);

ii. Le mode hors ligne (Out-of-line constraints): avec cet deuxième mode, la définition des
contraintes est faite après la création de la table. Ceci est fait via la commande de
modification ALTER, selon la syntaxe suivante:

Alter table <nom_table> ADD Constraint <description de la


contrainte>

A retenir !! La définition des contraintes hors ligne représente une


modification du schéma de la table, ce qui explique l'utilisation de la commande
ALTER.

5.3.1. Contraintes de domaine

Il s’agit d’un ensemble de règles appliquées sur quelques colonnes à fin de restreindre leurs
domaines de définition. Les contraintes de domaine les plus utilisées sont:

- NOT NULL : Cette contrainte précise que pour toute occurrence, la colonne correspondante
doit avoir une valeur concrète. Ainsi, la saisie de ce champ est obligatoire.
- DEFAULT : Cette contrainte précise que la saisie de la colonne correspondante n’est pas
obligatoire, le SGBD s'en charge de la remplir par une valeur par défaut. Il est à noter que,
la valeur par défaut doit avoir le même type que la colonne en question.
- UNIQUE : Cette contrainte précise que les valeurs de la colonne correspondante sont
distinctes, à l’exception de la valeur NULL. Donc, une valeur ne doit pas être dupliquée
dans deux (ou plus) occurrences (pas de doublon).
- CHECK (condition): Cette contrainte spécifie une condition (simple ou composée)
portant sur une colonne. Cette condition est vérifiée au moment de l’insertion / la
modification de la valeur de la colonne en question par le SGBD. Un message d'erreur est
généré en cas de condition non vérifiée.

La figure II.2 représente la requête SQL permettant la création de la table Client. La requête
spécifie cinq contraintes de domaine définies en mode en ligne :

1- L’attribut CodCli doit être saisi,


2- Le client doit être majeur (Age > 18),
3- Le numéro de registre doit être unique (chaque client possède un numéro de registre
distinct),

Dr. Djellal. A 22
Chapitre II : Structured Query Language (SQL)

4- Une valeur par défaut "Particulier" est attribuée à la colonne TypeCli, si elle n’est pas
renseignée par l'utilisateur
5- En fin, le mode de payement du client doit être soit par espèce ou bien par cheque.

Il est possible de définir toutes ces contraintes après la création de la table (le mode hors ligne)
via la commande ALTER (Cf. Figure II.6)

Figure II. 2. Définition des contraintes de domaine en mode en ligne

5.3.2. Contraintes d’intégrité


Il s’agit de quelques règles définissant les règles d’intégrités de la BD, comme par exemple la
définition de la clé primaire et la clé étrangère. Ces contraintes garantissent l'unicité des
occurrences la cohérence des données.

- PRIMARY KEY : Cette contrainte défini la clé primaire de la table. L’ajout de cette
contrainte pour une ou plusieurs colonnes impose des valeurs concrètes (NOT NULL) et
distinctes (UNIQUE).
La contrainte PRIMARY KEY peut être définie en mode en ligne selon deux manières:
avec la définition de la colonne ou bien après (Cf. Figure II. 3). Elle peut être, aussi, définie
en mode hors ligne (Cf. Figure II. 6).

A retenir !! Quand la clé primaire est constituée de plusieurs colonnes, la


contrainte PRIMARY KEY utilisée en mode en ligne doit être ajoutée après la
définition de toutes les colonnes en question.

Figure II. 3. Contrainte Primary Key en mode en ligne

Dr. Djellal. A 23
Chapitre II : Structured Query Language (SQL)

- REFERENCES : C’est une contrainte utilisée en mode en ligne, elle déclare une colonne
comme clé étrangère et référence la table correspondante (cf. Figure II. 4).
- FOREIGN KEY : On peut utiliser cette contrainte pour le même objectif, à savoir la
définition de la clé étrangère en mode en lige (cf. Figure II.5) ou bien en mode hors ligne
(Cf. Figure II.6).
Figure II. 4. Contrainte References en mode en ligne

Figure II. 5. Contrainte Foreign key en mode en ligne

Le scripte de la figure suivante représente la création de la table Client ensuite une modification
de son schéma en lui ajoutant des contraintes d'intégrité et de domaine en mode hors ligne.

Figure II. 6. Contraintes de domaine / d'intégrité en mode hors ligne

A retenir !! La définition des contraintes impose un ordre de création des


tables. Evidemment, la contrainte de la clé étrangère impose la création des
tables référentes, puis les tables qui en dépendent (la suppression des tables
sera dans l’ordre inverse).

De plus de ce qui à été présenté dans la section 5.1.4, avec la commande ALTER, il est possible
de modifier le schéma d'une table en lui :

Dr. Djellal. A 24
Chapitre II : Structured Query Language (SQL)

- Ajoutant une contrainte via la clause ADD Constraint (Cf. Figure II.6),
- Désactivant une contrainte via la clause DISABLE constraint (Cf. Figure II.7),
- Réactivant une contrainte via la clause ENABLE constraint (Cf. Figure II.7) et
- Supprimant une contrainte via la clause DROP constraint (Cf. Figure II.6, II.7).

Figure II. 7. Manipulation des contraintes

6. Langage de Manipulation de Données


Dans ce qui suit, une description d’une partie de l’aspect DML (Data Manipulation
Language) du langage SQL sous la syntaxe d’Oracle. SQL propose quatre instructions de base
pour manipuler les données des tables:

i. INSERT : pour l’insertion d’enregistrements


ii. UPDATE : pour la modification de données
iii. DELETE : pour la suppression d’enregistrements
iv. SELECT : pour la recherche de données

6.1. Insertion d’enregistrements


A l’aide de la commande INSERT INTO, on peut insérer un nouvel enregistrement dans une
table. Cette commande est utilisée selon deux formes:

- Première forme : Avec cette première forme, il faut indiquer explicitement les noms des
colonnes à remplir et fournir les valeurs dans le même ordre, selon la syntaxe suivante:
INSERT INTO <nom_Table> (colonne1, colnne2…)
VALUES (valeur1, valeur2…);

Avec cette forme d’insertion, il est possible de ne pas indiquer toutes les colonnes. Comme
conséquence, les colonnes manquantes prendront la valeur NULL (cf. les colonnes ville et
email, dans la figure II.8) ou bien la valeur par défaut (en cas de présence de la contrainte
Default) (cf. la colonne TypeCli).

Exemple 1. La requête suivante est une insertion du client num 512, le résultat est représenté
dans la figure II.8 9

9
Le contenu de chaque table est accessible depuis l'onglet Données de la table correspondante

Dr. Djellal. A 25
Chapitre II : Structured Query Language (SQL)

Figure II. 8. Insertion d'enregistrement (1ere forme)

Il est à noter qu'avec cette première forme, l’ordre de colonnes à remplir n’est pas important,
mais il est à respecter avec les valeurs à indiquer.

Exemple 2. La requête suivante est une insertion dont l'ordre de création n'a pas été respecté:

- Deuxième forme : Avec cette deuxième forme, il ne faut pas indiquer les noms des colonnes
à remplir. Cependant, il faut, absolument, respecter l’ordre de la création des colonnes, selon
la syntaxe suivante:
INSERT INTO <nom_Table> VALUES (valeur1, valeur2…);

Exemple 3. La requête suivante est une insertion dont les valeurs sont toutes connues, le
résultat est représenté sur la figure II.9 –A-

Figure II. 9. Insertion d'enregistrement (2ème forme)-A-

Avec cette deuxième forme, il faut donner une valeur pour chacune des colonnes de la table.
Ainsi, en cas de manque d’information, il faut fournir la valeur nulle pour la colonne
correspondante

Exemple 4. La requête suivante est une insertion avec des valeurs manquantes, le résultat est
représenté sur la figure II.10 -B-

Dr. Djellal. A 26
Chapitre II : Structured Query Language (SQL)

Figure II. 10. Insertion d'enregistrement (2ème forme)-B-

A retenir !! Pour insérer la date courante (date du système), SQL offre la


fonction SYSDATE, elle renvoie la date du système sur lequel la BD est
installée, comme le montre la requête suivante dont le résultat est représenté
dans la figure II.11

Figure II. 11. Utilisation de la fonction Sysdate

Vérification des contraintes:


Avant l’insertion des valeurs dans les différentes colonnes, le SGBD vérifie les contraintes (de
domaine et d'intégrité) définies sur les colonnes concernées. En cas de violation de ces
contraintes, un message d’erreur apparaîtra. Le tableau suivant représente une description de
quelques exemples de violation de contraintes.
Tableau II. 6. Exemples de Violation des contraintes

Requête Message d’erreur Description


unique constraint violated La table contient déjà un
insert into Commande
enregistrement dont la clé
values (1, 300, 1, 20);
primaire est égale à 1
integrity constraint violated L’enregistrement
insert into Commande
- parent key not found référence un client
values (2, 300, 1, 20);
introuvable (300)
insert into Commande Cannot insert NULL into La clé primaire de la table
values (null, 512, 1, ("sys"."commande"."num) ne peut pas être nulle
20);
check constraint violated La colonne Qte est définie
insert into Commande
comme > 0 avec une
values (3, 512, 1, 0);
contrainte CHECK

Dr. Djellal. A 27
Chapitre II : Structured Query Language (SQL)

6.2. Mise à jour d’enregistrements

A l’aide de la commande UPDATE, on peut modifier le contenu d’une ou plusieurs colonnes


d'une ou plusieurs lignes dans une table. La syntaxe de cette commande est la suivante :
UPDATE <nom_table> SET <nom_colonne> = valeur
WHERE condition;

A retenir !! La requête ne modifie que la (les) ligne(s) qui vérifie(nt) la


condition indiquée après la clause Where.

Exemple 1. La requête suivante augmente le prix du produit « rame papier » de 1%.

Pour mettre à jour les valeurs d’une colonne pour toutes les lignes, il suffit de ne pas indiquer
une condition.

Exemple 2. La requête suivante augmente les prix de touts les produits de la BD

Vérification des contraintes :

Comme pour les insertions, il faut respecter les contraintes définies au niveau des colonnes.
Dans le cas contraire, une erreur est renvoyée en signalant le nom de la contrainte violée, ainsi
la mise à jour ne sera pas effectuée. Par exemple, la modification de la quantité commandée
avec une valeur épuisant le stock.

6.3. Destruction d’enregistrements

La destruction d’un ou plusieurs enregistrements s’effectue avec la clause DELETE dont la


syntaxe est la suivante :
DELETE FROM <nom_table> WHERE condition;

La condition sélectionne les lignes à supprimer. Si aucune condition n’est précisée, toutes les
lignes de la table seront supprimées. Si l’expression ne sélectionne aucune ligne, rien ne sera
supprimé et aucune erreur n’est renvoyée.
Exemple 1. La requête suivante supprime tout employé dont le nom est Salhi Ahmed

Dr. Djellal. A 28
Chapitre II : Structured Query Language (SQL)

Vérification des contraintes

La suppression d’un enregistrement peut provoquer une violation d'une contrainte d'intégrité.
En effet, la suppression d'une ligne dont la clé primaire est utilisée dans une autre table en tant
que clé étrangère engendre une incohérence dans la BD.

Exemple 2. Dans cet exemple, une requête de suppression du client num 512 sachant qu’il a
effectué au moins une commande (il figure dans la table commande)

Le résultat sera une erreur renvoyée par le SGBD (CF. Figure II.12) indiquant la violation de
la contrainte et le client ne sera pas supprimé tant qu’il est utilisé (comme référent) dans une
autre table.

Figure II. 12. Violation de la contrainte d'intégrité

7. Interrogation d’une BD
Cette section représente une partie très importante du LMD de SQL. En effet, interroger
une BD est un des grands objectifs de sa création. Interroger une BD revient à chercher et
retrouver des données stockées. Cette opération se résume dans la commande SELECT. Avec
cette commande plusieurs types de sélection peuvent être effectuées :

- Sélectionner quelques colonnes d'une table


- Sélectionner quelques lignes d'une table en fonction de leur contenu
- Sélectionner des données (ligne(s) et colonne(s)) provenant de plusieurs tables

7.1. Sélection de colonnes

L'objectif de cette commande consiste à retourner le contenu d'une ou plusieurs colonnes d'une
certaine table. Ceci se fait via la commande Select selon la syntaxe suivante :
Select <column1>, < column2>… from <nom_table>;

Exemple 1. La requête suivante retourne la liste des "nom et prénom" des clients. Le output de
la requête est représenté dans la figure II.13

Dr. Djellal. A 29
Chapitre II : Structured Query Language (SQL)

Select nom, prénom from Client;

Figure II. 13. Output d'une requête de sélection

A retenir!! Si on veut retourner toutes les colonnes de la table, il faut utiliser


le symbole "*" comme suit : Select * from Client;

La clause DISTINCT ajoutée après SELECT permet d’éliminer les dupliquant dans le résultat
de la requête :
Select distinct typeCli from Client;

7.2. Sélection de lignes

La clause Where ajoutée à la commande Select permet de spécifier les lignes à sélectionner.
Cette clause est suivie d'une condition qui sera testée pour chaque ligne. La syntaxe est la
suivante:
SELECT column(s) FROM <nom_table> WHERE condition;

La condition peut être simple (Cf. exemple 1) ou bien composée (Cf. exemple 2). Les lignes
pour lesquelles la condition est vérifiée seront sélectionnées.

Exemple 1. La requête suivante retourne la liste (toutes les colonnes) des clients habitant à la
ville de Constantine
SELECT * FROM Client WHERE Ville =’Constantine’;

Exemple 2. La requête suivante retourne la liste des produits dont le prix est compris entre
1000 et 5000 DA
SELECT * FROM produit WHERE prix <= 5000 and prix >= 1000;

7.3. Requêtes avancées

Dans la plus part des cas, les données à rechercher sont le résultat d'une jointure de deux ou
plusieurs tables. Avec une opération de jointure (une SELECT avancée), on peut combiner
plusieurs tables puis sélectionner les données demandées. Afin d’éviter l’ambigüité, il est

Dr. Djellal. A 30
Chapitre II : Structured Query Language (SQL)

recommandé préciser le nom de la table avec le nom de la colonne, comme le montre la syntaxe
suivante :
Select <tab1.col1>, <tab1.col2>, <tab2.col1> …
from table1, table2 …
Where condition;

Exemple 1. La requête suivante retourne la liste des clients (nom, prénom) qui ont commandés
plus de 50 unités de nos produits pendant les mois de janvier et février.
Select Client.nom, client.Prénom from client, commande
Where commande.codcli = client.codcli
And Commande.qte >50
And commande.datecomm BETWEEN '01/02/2018' and '31/03/2018';

A retenir!! Pour simplifier l'écriture des requêtes, il est possible de renommer


les tables et procéder comme suit:
Select <A.col1>, <A.col2>, <B.col1> …
from table1 A, table2 B … Where condition;

La requête de l'exemple 1 devient:


Select C.nom, C.Prénom from client C, commande M
Where M.codcli = c.codcli
And M.qte >50
And M.datecomm BETWEEN '01/02/2018' and '31/03/2018';

7.4. Requêtes en cascade

Une requête en cascade consiste à effectuer une requête à l'intérieur d'une autre (sous requêtes).
La sous requête doit être placée à la suite d'une clause WHERE. Comme le montre la syntaxe
suivante:
Select column(s) from table(s)
where <column> op (select column(s) from table(s)
where <column> op (select ... ));

La condition de la requête est exprimée à l'aide d'un opérateur "op". Celui-ci peut être un
opérateur booléen (<, >, =..) ou bien un opérateur ensembliste (in, not in...).
Selon le type de l'opérateur de la condition, deux cas sont envisagés:
i. La sous requête renvoie obligatoirement une constante (une et une seule valeur). Cette
dernière sera comparée avec la valeur d'une colonne via un opérateur booléen (Cf. exemple
1)
ii. La sous requête renvoie une table (une ou plusieurs lignes). Ainsi, la valeur de la colonne
utilisée dans la condition sera comparée avec l'ensemble de lignes retourné à l'aide d'un
opérateur ensembliste (Cf. exemple 2)

Dr. Djellal. A 31
Chapitre II : Structured Query Language (SQL)

Exemple 1. La requête suivante retourne la liste des produits (désignation) dont le prix est
supérieur à celui du produit numéro 2. Pour cela, une sous requête, retournant le prix du produit
num 2, à été utilisée.
Select désignation from produit
Where prix > (select prix from produit
Where CodPro =2);

Exemple 2. La requête suivante retourne la liste des clients (nom, prénom) qui ont effectués au
moins une commande. Pour cela, une sous requête, retournant la liste des clients figurant dans
la table commande, à été utilisée.

Select nom, prénom from Client


Where codCli in (Select distinct codCli from Commande);

Activité. Formuler une autre requête équivalente à celle de l'exemple 2.

8. Fonctions d'agrégation
Les fonctions d’agrégation utilisées dans les requêtes SQL permettent d’effectuer des
opérations statistiques sur une table ou bien une sélection d’enregistrements et retournent
toujours une seule valeur. On peut, par exemple, demander de retourner le nombre de ligne dans
une table ou bien le max/min/moyenne des valeurs d'une certaine colonne. La syntaxe générale
des requêtes utilisant ces fonctions est la suivante:
Select function (column) from table;

8.1. Fonction COUNT ( )

COUNT( ) est une fonction qui sert à compter le nombre de lignes d’une table ou d'une
sélection. Pour compter le nombre total de ligne d’une table, il convient d’utiliser le symbole
étoile "*" selon la syntaxe suivante :
SELECT COUNT(*) FROM table

Le résultat de cette requête sera un entier indiquant le nombre des enregistrements de la table
(0, si la table est vide)

Exemple 1. La requête suivante retourne le nombre de produits insérés dans la table Produit:

SELECT COUNT(*) FROM Produit;

Nous pouvons aussi utiliser la fonction COUNT pour compter le nombre d’enregistrement non
vide dans une colonne. Pour cela, il faut appliquer la fonction Count sur une colonne.

Exemple 2. La requête suivante retourne le nombre total des produits ainsi que le nombre de
produits dont le prix a été renseigné dans la table Produit. Le résultat de la requête s'affiche
dans la partie Query Result comme le montre la figure suivante:

Dr. Djellal. A 32
Chapitre II : Structured Query Language (SQL)

Figure II. 14. La fonction statistique COUNT

8.2. Fonctions Min ( )/Max ( )

Les fonctions Min( )/MAX( ) retournent la valeur la plus grande / la valeur la plus petite
d’une colonne dans une table ou dans une sélection

Exemple 3. La requête suivante retourne le prix le plus élevé de nos produits:

SELECT Max(Prix) FROM Produit ;

A retenir!! Les colonnes nulles sont ignorées dans ces fonctions. De plus, si
elles sont appliquées sur une colonne dont toutes les valeurs sont nulles alors
le résultat sera aussi nul

8.3. Fonction SUM ( )

Cette fonction Retourne la somme des valeurs d’une colonne d’une table ou d’une sélection.

Exemple 4. La requête suivante retourne la somme des quantités commandées par le client
numéro 512.
Select sum (Qte) from Commande
Where CodCli=512;

A retenir!! Cette fonction ne peut être appliquée qu’avec des colonnes


numériques

8.4. Fonction AVG ( )

La fonction AVG() renvoie la moyenne des valeurs d’une colonne.

Exemple 5. La requête suivante retourne la moyenne des prix des différents produits:
Select AVG (prix) from Produit;

A retenir!! Tout comme SUM, La fonction AVG ne peut être appliquée que sur
des colonnes numériques

Dr. Djellal. A 33
Chapitre II : Structured Query Language (SQL)

8.5. Les Alias

Utiliser une fonction statistique résulte à une colonne dont le nom peut-être un peu complexe
(Cf. Figure II.14). SQL offre la possibilité d'utiliser un Alias pour renommer temporairement la
colonne sur laquelle il y a une fonction SQL ce qui facilite la lecture du résultat. Les Alias de
SQL peuvent être utilisés comme le montre la syntaxe suivante:
SELECT function (column) AS column-name FROM table

Exemple 1. La requête suivante retourne le nombre de produits ayant un prix qui dépasse 10000
DA, le résultat a été renommé en "Procduits_chers"

Figure II. 15. Utilisation des Alias

9. Organisation du résultat d'une requête


9.1. La clause group by

Dans une requête de sélection, la clause GROUP BY est utilisée pour regrouper plusieurs lignes
ayant une colonne identique à l'aide d'une fonction statistique. C'est-à-dire si une colonne
particulière contiens les mêmes valeurs dans différentes lignes, la clause Group by organisera
ces lignes dans un seul groupe. Cette clause peut être utilisée selon la syntaxe suivante:
SELECT column1, column2,...
Function (column)
FROM tables
[WHERE conditions]
GROUP BY column i;

A retenir!! Group by c'écrit toujours après la clause Where (si elle existe)

Exemple1. La requête suivante retourne, pour chaque client, la somme des quantités
commandées.

Dr. Djellal. A 34
Chapitre II : Structured Query Language (SQL)

Figure II. 16. La clause Group by (A)

La même requête, sans la clause group by, donne le résultat suivant:

Figure II. 17. La clause Group by (B)

9.2. La clause ordre by

La clause ORDER BY permet de trier le résultat d'une requête. L’ordre de


tri est par défaut croissant. Le tri peut se faire selon une ou plusieurs colonnes séparer par des
virgules. Ordre by peut être utilisé selon la syntaxe suivante:
SELECT column1, column 2...
FROM table1, table 2...
[Where condition]
[Group by column]
ORDER BY column1, column2...;

Exemple 1. La requête suivante retourne la liste des clients ordonnés selon l'Age

Figure II. 18. La clause Ordre by appliquée sur une seule colonne

Dr. Djellal. A 35
Chapitre II : Structured Query Language (SQL)

Exemple 2. La requête suivante retourne la liste des clients ordonnés selon l'Age et le Nom

Figure II. 19. La clause Ordre by appliquée sur plusieurs colonnes

A retenir!! Il est possible de définir l'ordre décroissant avec la clause ordre by


en ajoutant d'option DESC.
SELECT column FROM table
ORDER BY column Desc;

10. Conclusion
SQL est un langage de programmation très puissant, très facile à la fois. Comme on l'a
vu au cours de ce chapitre, utiliser SQL permet de définir, modifier et consulter le contenu d'une
BD avec de petites requêtes très proche au langage naturel. Ceci n'était qu'un simple aperçu des
commandes très couramment utilisées. En effet, Plus la BD est importante, plus elle vise
plusieurs groupes d'utilisateurs. Ainsi, il serait nécessaire d'effectuer d'autres opérations plus
complexes, tels que la définition des utilisateurs et l'octroi des différents droits d'accès,
l'utilisation des transactions pour la gestion des accès concourants, la définition des
procédures/fonctions pour une meilleur manipulation des données et l'automatisation de la
gestion événements déclenchés sur la BD. Ce dernier point fera le sujet du chapitre suivant.

Dr. Djellal. A 36
Chapitre II : Structured Query Language (SQL)

Dr. Djellal. A 37

Vous aimerez peut-être aussi