LANGAGE SQL
1.
Qu'est-ce
que SQL ?
Définition : SQL est un langage de manipulation de bases
de données mis au point dans les années 70 par IBM. Il permet, pour résumer,
trois types de manipulations sur les bases de données :
- La maintenance des tables : création, suppression,
modification de la structure des tables.
- Les manipulations des bases de données : Sélection,
modification, suppression des enregistrements.
- La gestion des droits d'accès aux tables : Contrôle des
données, droits d'accès, validation des modifications.
Intérêt : L'intérêt de SQL est que c'est un langage de
manipulation de bases de données standard, vous pourrez l'utiliser sur
n'importe quelle base de données. Ainsi, avec SQL, vous pouvez gérer une base
de données Access, mais aussi Paradox, dBase, SQL Server, Oracle ou Informix
par exemple (les bases de données les plus utilisées).
Attention : Le langage SQL a souvent été implémenté de
façon différente. Les commandes de base sont toujours les mêmes mais ont
parfois des variantes ou des extensions. La version de SQL implémentée dans
Access peut parfois être un peu différente de la version ANSI qui est la
version standardisée.
2.
La
maintenance des bases de données
La première série de commandes sert à la maintenance de la
base de données : création des tables et des indexes, modification de la
structure d'une table ou suppression d'une table ou d'un index.
Attention : La maintenance des bases de données
dépend étroitement des base de données utilisées, notamment en ce qui concerne
les types de données, vérifiez donc toujours les types de données supportés par
votre SGBD avant de créer une table avec SQL. Il se peut qu'il en supporte plus
que ceux indiqués plus bas.
SQL dispose pour cela des instructions suivantes :
- CREATE TABLE à Création de table
- ALTER TABLE à Modification de la structure
d’une table
- DROP TABLE à Suppression d’une table
- CREATE INDEX à Création d’un index
- DROP INDEX à Suppression d’un index
2.1 La commande CREATE TABLE
La
première opération consiste à créer d'abord une base de données vide. Le
logiciel réclame un nom de fichier et un seul, car toutes les informations
relatives à la BDD seront stockées dans le même fichier. Ce dernier comporte
l'extension ".mdb" pour le SGBD Acesse, et sa taille initiale est
voisine de 96-100 ko.
Après
avoir crée la base de données on pourra ainsi créer des tables qui vont
consommer de l’espace dans cette base de donnes ; La commande CREATE TABLE
permet de créer une table dans la base de données courante.
Sa
syntaxe est la suivante :
CREATE TABLE Nom_de_la_table (Champ1 type_de_donnée
CONSTRAINT champ1 Propriété, champ2
Type_de_donnée CONSTRAINT champ2 Propriété …);
Où
CREATE TABLE Nom_de_la_table (Champ1 type_de_donnée
Propriété, champ2 Type_de_donnée Propriété …);
Champ :
Nom du champ ou de la colonne de la table.
Type : type de données pour la colonne en
question.
Propriété : Propriété ou contrainte que les
données et les colonnes doivent respecter.
Les types de données Access :
Tous les SGBD
offrent la possibilité de stocker du texte,
de l'information numérique, et des dates (avec ou sans les heures). Le type
"monétaire" est un cas particulier d'information numérique, et le
lien hypertexte un cas particulier de texte. Lorsque l'on utilise Access, une
liste déroulante propose les types de données suivants :
Texte (type par défaut); mémo ; numérique ; date/heure ;
monétaire ; numéroauto ; oui/non ; objet OLE;
lien hypertexte.
Le tableau
ci-dessous précise les propriétés de ces différents types. Il est nécessaire, à
ce stade, d'effectuer les bons choix. Si l'on modifie ultérieurement le type de
données d'un champ, alors que la table contient déjà des informations, ces
dernières risquent d'être tronquées ou perdues.
Type
|
Propriétés
|
Taille
|
Texte
|
Le
champ peut contenir n'importe quel caractère alphanumérique (chiffre, lettre,
signe de ponctuation). Ce type de données est utilisé pour le texte, mais
aussi pour les nombres sur lesquels on n'effectue pas de calculs (code
postal, numéro de téléphone)
|
<
256 caractères
|
Mémo
|
Le
champ peut contenir n'importe quel caractère alphanumérique. Le type mémo est
réservé aux champs de type texte susceptibles de contenir plus de
255 caractères
|
<
65.536 caractères
|
Numérique
|
Données
numériques (non monétaires) susceptibles d'être utilisées dans des opérations
mathématiques
|
1
à 16 octets
|
Date/heure
|
Données
de type date et/ou d'heure (pour les années comprises entre 100 et 9999)
|
8
octets
|
Monétaire
|
Données
monétaires, présentées avec deux chiffres après la virgule.
|
8
octets
|
NuméroAuto
|
Numérotation
automatique, séquentielle (commençant à 1) ou aléatoire. Souvent
utilisée pour générer le code des enregistrements
|
4
octets (entier long)
|
Oui/non
|
Variable
booléenne (deux valeurs possibles uniquement)
|
1
bit
|
Objet
OLE
|
Pour
lier un objet extérieur, ou incorporer un objet dans la base. Souvent utilisé
pour les données multimédia. Peut servir pour tout fichier binaire (document
Word, feuille de calcul Excel, etc.)
|
<
1 Go
|
Lien
hypertexte
|
Permet
d'enregistrer des URL de sites web et des adresses de courrier électronique
|
<
2049 caractères
|
Types
numériques chez Access :
Paramètre
|
Description
|
Taille
|
Byte
|
Nombres entre 0 et 255
(sans décimales).
|
1 octet
|
Decimal
|
Stocke les nombres compris
entre –10^38–1 et 10^38–1 (.adp)
Stocke les nombres compris entre –10^28–1 et 10^28–1 (.mdb) |
12 octets
|
Integer
|
Nombres entre –32 768
et 32 767 (sans décimales).
|
2 octets
|
Long Integer
|
(Valeur par défaut) Nombres
entre –2 147 483 648 et 2 147 483 647 (sans
décimales).
|
4 octets
|
Single
|
Nombres entre
–3,402823E38 et –1,401298E–45 pour les valeurs négatives et entre 1,401298E–45 et 3,402823E38 pour les valeurs positives. |
4 octets
|
Double
|
Nombres entre
–1,79769313486231E308 et –4,94065645841247E–324 pour les valeurs négatives et entre 4,94065645841247E–324 et 1,79769313486231E308 pour les valeurs positives. |
8 octets
|
Propriétés du champ :
La partie inférieure de la fenêtre du mode création chez
Access est intitulée "Propriétés du champ". Ces propriétés se
trouvent rassemblées dans l'onglet "Général".
La liste des propriétés d'un champ dépend du type de
données choisi, mais une propriété donnée peut apparaître pour des types de
données différents. Exemple : la propriété "Taille du champ" apparaît
pour les types de données "Texte", "Numérique"et
"NuméroAuto".
Les principales propriétés chez Access sont :
Taille du champ : fixer la taille max du champ
Format : définit
la manière dont les informations s'affichent. Exemple : le format monétaire
affiche deux chiffres après la virgule, puis un espace et le symbole de l'euro
;
Masque de saisie :
guide la saisie des données et exerce un contrôle. Exemple : un code postal
marocain est composé de cinq chiffres ;
Légende : définit
le nom de l'étiquette dans le formulaire associé à la table. Il est préférable
d'implémenter cette propriété au niveau du formulaire lui-même ;
Valeur par défaut :
valeur qui s'affiche dans le champ avant saisie par l'utilisateur ;
Valide si :
condition de validité du champ. Exemple : une notation sur 20 doit être
comprise entre 0 et 20 ;
Message si erreur :
ce message s'affiche si la condition de validité précédente n'est pas
satisfaite ;
Null interdit : le
champ correspondant ne peut rester vide lors de la saisie d'un
enregistrement ;
Chaîne vide autorisée : le champ peut contenir une chaîne ne comportant aucun
caractère ;
Indexé : un
fichier index est associé au champ de telle sorte que les recherches
d'information s'effectuent plus rapidement.
Primary key :
permet de préciser que le champ est une clé primaire dans la table.
Exemple
1 :
Créer
la nouvelle table "table_test" contenant deux champs : un champ avec
un entier qui doit toujours être saisi et un champ contenant une chaîne de 5
caractères :
Solution:
CREATE TABLE table_test (champ1
integer NOT NULL, champ2 char (5));
Exemple
2 :
Un
client est définit par son identifiant (Nombre), son nom, son adresse et sa
date d’anniversaire
Solution:
Create
table client (Id_client integer constraint Id_client primary key, nom char(20),
adresse text, naissance date ) ;
Les clés étrangères :
Nous
allons créer une table facture qui contiendra le champ Id_client comme clé
etrangère pour attacher chaque client à ces factures.
CREATE
TABLE Facture
(Num_facture
Long, Libellé char(30), Id_client LONG,
CONSTRAINT
client_facture FOREIGN KEY
(Id_client) REFERENCES client);
Pour
supprimer une clé étrangère
ALTER
TABLE Facture DROP CONSTRAINT client_facture;
2.2 La commande ALTER TABLE
La
commande ALTER TABLE permet de modifier la structure d'une table, sa syntaxe
est la suivante :
Syntaxe : ALTER TABLE table Action (spécifications
des champs);
ALTER
TABLE permet les trois actions suivantes :
ADD
Ajoute un champ à une table
DROP
Supprime un champ d'une table
ALTER
Modifie les caractéristiques d'un champ dans une table
Après
l'action, on indique, entre parenthèses, les spécifications du champ de la même
façon que pour la commande CREATE TABLE. On ne peut faire qu'une action à la
fois (ajout, suppression ou modification dans la même commande) en peut aussi
ne pas préciser le mot clé COLUMN comme l’explique l’exemple suivant :
Exemples
:
Ajout
d'un champ Date :
ALTER TABLE table_test ADD champ3
Date;
OU
ALTER TABLE table_test ADD COLUMN
champ3 Date;
Suppression
du champ2 :
ALTER
TABLE table_test DROP champ2;
OU
ALTER
TABLE table_test DROP COLUMN champ2;
Modification
d’un champ :
ALTER
TABLE table_test ALTER nom char(60);
OU
ALTER
TABLE table_test ALTER COLUMN nom char(60) NOT NULL;
2.3 La commande DROP TABLE
La
commande DROP TABLE permet de supprimer une table de la base de données
Syntaxe : DROP TABLE nom_table;
Exemple :
Pour
supprimer la table client, la requête est :
DROP
TABLE client ;
3. Les manipulations des bases de données
Une
fois les tables créées, on peut commencer à y insérer des données, les mettre à
jour, les supprimer ou y faire des requêtes. Toutes ces opérations sont des
opérations de manipulation des bases de données.
Pour
effectuer ces manipulations, SQL dit pose de 5 instructions :
-
INSERT
-
UPDATE
-
DELETE
- SELECT
3.1 La commande INSERT
3.1.1 Présentation & syntaxe
La
commande INSERT est utilisée pour ajouter des enregistrements ou des parties
d'enregistrements dans des tables. Elle est utilisée généralement sous deux
formes :
1ère forme
INSERT INTO table (champ1, champ2, ...) VALUES
('valeur1','valeur2',...);
Cette
forme est utilisée lorsqu'on veut insérer un seul enregistrement ou une partie
d'un seul enregistrement. On créera un nouvel enregistrement dont le contenu du
champ1 sera valeur1, le contenu du champ2 sera valeur2, etc.
2ème forme
INSERT INTO table (champ1, champ2, ...) (Requête);
Dans
cette seconde forme, le résultat de la requête va être inséré dans les champs
indiqués de la table.
Cette
méthode est utilisée lorsque plusieurs enregistrements sont ajoutés
simultanément. Dans les deux cas, les valeurs insérées doivent correspondre au
type de données du champ dans lequel l'insertion va être faite, on ne peut pas,
par exemple demander l'insertion d'une chaîne de caractères dans un champ de
type numérique ou monétaire. Les chaînes de caractères doivent être placées
entre apostrophes ( ' ), les champs numériques ou vides (NULL) ne doivent pas
être placés entre apostrophes.
3.1.2 Insérer tout ou une partie d'un enregistrement
Si
des valeurs doivent être insérées dans tous les champs de l'enregistrement de
la table, la liste des noms des champs n'a pas besoin d'être explicitement
indiquée dans la commande. Les valeurs des champs à insérer doivent cependant
apparaître dans le même ordre que les noms des champs lors de la création de la
table, sans oublier un seul champ.
Faites
attention en utilisant cette syntaxe, si la structure de la table change plus
tard, la commande qui était bonne risque de ne plus fonctionner correctement.
Il vaut mieux toujours indiquer explicitement le nom des champs sur lesquels on
veut agir.
La
syntaxe est alors :
INSERT
INTO table VALUES ('valeur1','valeur2','valeur3',...);
Exemple :
Soit
la table client suivant :
Id_Client
|
Sexe
|
Nom
|
Prénom
|
Adresse
|
Code_postal
|
Ville
|
99
|
M
|
Alami
|
Anas
|
11 BD tanger
|
20100
|
Casablanca
|
Dans
notre table Client, si nous voulons insérer un nouveau client, la commande
ci-dessus va insérer un enregistrement dans la table 'clients' avec les
informations suivantes : Le client 100, dont le titre est 'M.', dont le nom est
'Dupond', dont le prénom est 'Jean', l'adresse est 'Rue de la paix', le code
postal est 75000 et la ville est 'Paris'.
Notez
que le numéro de client, qui est un champ de type 'NuméroAuto' a été indiqué
explicitement. Lors d'une création d'un enregistrement avec une commande SQL,
le numéro automatique n'est pas toujours généré automatiquement, vérifiez les
possibilités offertes par votre SGBD.
INSERT
INTO Clients VALUES (100,'M','Dupond','Jean','rue de la paix',’75000’,
,'Paris');
Notez
aussi l'utilisation de NULL : Si on insère moins de valeurs de champ qu'il y a
de champs dans la table, soit on écrit explicitement le nom des champs à
insérer, soit on insère la valeur NULL dans le champ où il n'y a rien à mettre,
à condition que la propriété du champ "NULL interdit" soit à NON, sinon,
il y aura une erreur lors de la création de l'enregistrement.
La
syntaxe est : INSERT INTO table (champ1, champ3) VALUES ('valeur1','valeur 3');
Ou
INSERT INTO table VALUES ('valeur1',NULL,'valeur3');
3.1.3 Insérer plusieurs enregistrements ou plusieurs parties
d'enregistrements
On
peut insérer simultanément plusieurs enregistrements ou parties d'enregistrements
dans une table. Dans ce cas, les données insérées vont être récupérées dans une
ou plusieurs autres tables.
Par
exemple, si nous voulons placer dans une table nommée "Clients_casa"
les clients habitant Casablanca, nous allons procéder ainsi :
1)
Créer une table "Clients_casa" avec Access, nous allons supposer que
cette table comporte 3 champs: le nom, le prénom et l'adresse.
2)
Taper la commande :
INSERT
INTO Clients_casa (nom,prénom,adresse)
(SELECT
nom, prénom, adresse FROM Clients WHERE ville='Casablanca')
La
partie entre ( ) est une requête SQL, qui va sélectionner les champs nom,
prénom et adresse de la table Client pour les enregistrements dont la ville est
"Casablanca". Le résultat de cette requête va être inséré dans la
table Clients_casa.
La
commande INSERT INTO avec requête ne déplace pas les enregistrements de la
table "Clients" vers la table "Clients_casa", elle se
contente de faire une copie. Pour effacer les enregistrements de la table
Clients, nous utiliserons la commande DELETE.
3.2 La commande UPDATE
La
commande UPDATE est utilisée pour changer des valeurs dans des champs d'une
table.
Sa
syntaxe est :
UPDATE table SET champ1 = nouvelle_valeur1, champ2 =
nouvelle_valeur2,
champ3 = nouvelle_valeur3 WHERE condition;
La
clause SET indique quels champs de la table vont être mis à jour et avec
quelles valeurs ils vont l'être. Les champs non spécifiés après la clause SET
ne seront pas modifiés.
Par
exemple, si nous voulons, dans la table produit, modifier le prix d'un produit
dont le nom est "prod1", nous taperons :
UPDATE
produit SET prix_unitaire = 1000 WHERE libelle = 'prod1';
La
commande UPDATE affecte tous les enregistrements qui répondent à la condition
donnée dans la clause WHERE. Si la clause WHERE est absente, tous les
enregistrements de la table seront affectés.
Par
exemple, si nous tapons :
UPDATE
produit SET prix_unitaire = 1000;
Le
prix unitaire de TOUS les produits de la table produit va être modifié. Tout
comme la commande INSERT, la commande UPDATE peut contenir une requête. Dans ce
cas la, sa syntaxe est la suivante :
UPDATE table SET champ1 = nouvelle_valeur1, champ2 =
nouvelle_valeur2,
champ3 = nouvelle_valeur3 WHERE condition = (requête);
La
requête est une requête faite avec la commande SELECT.
3.3 La commande DELETE
Pour
supprimer des enregistrements d'une table, on utilise la commande DELETE. La
syntaxe est la suivante :
DELETE FROM nom_table WHERE condition;
On ne
peut pas supprimer seulement le contenu de quelques champs des enregistrements.
La commande DELETE supprime des enregistrements entiers, c'est pour cela qu'il
n'est pas nécessaire d'indiquer ici des noms de champs. La condition spécifiée
après WHERE va déterminer quels sont les enregistrements à supprimer.
Par
exemple, pour supprimer tous les clients dont la ville est Casablanca :
DELETE from client where ville =
‘Casablanca’;
Pour
supprimer tous les enregistrements d'une table, n'indiquez pas de clause WHERE
:
DELETE FROM table; ou DELETE * FROM
table
Cette
variante de la commande DELETE ne supprime pas la table, elle supprime
seulement les enregistrements contenus dans cette table et laisse une table
vide.
On
peut aussi, comme précédemment utiliser une requête qui servira à déterminer la
condition de la suppression. La syntaxe est la suivante :
DELETE FROM table WHERE condition = (requête);
3.4 La commande SELECT
Présentation & Syntaxe
La
commande SELECT est la commande la plus complexe de SQL. Cette commande va
servir à faire des requêtes pour récupérer des données dans les tables. Elle
peut être associée à une des commandes de manipulation de tables vues avant
pour spécifier une condition.
Sa
syntaxe est :
SELECT champ1, champ2, champ3, … FROM table where (condition);
S'il
y a plus d'un champ spécifié après SELECT, les champs doivent être séparés par
des virgules. Les champs sont retournés dans l'ordre spécifié après la clause
SELECT, et non pas dans l'ordre qu'ils ont été créés dans la table.
Par
exemple :
Pour
sélectionner les champs "prénom" et "nom" de tous les
enregistrements de la table Clients :
SELECT prénom, nom from
clients ;
Si on
veut récupérer tous les champs des enregistrements sélectionnés, la syntaxe est
la suivante :
SELECT
* FROM table;
Les
clauses SELECT et FROM doivent obligatoirement apparaître au début de chaque
requête, on peut, ensuite, indiquer des critères de sélection avec la clause
WHERE :
SELECT * FROM table WHERE condition;
Par
exemple, pour sélectionner tous les Clients de la table "Clients"
dont le code postal est 75000 : SELECT * FROM client WHERE Code_postal=75000 ;
4- Les conditions
Les
conditions sont souvent utilisées pour préciser l’ensemble des enregistrements
auxquels l’opération sera effectuée.
Précédemment
on utiliser des conditions après la clause where
dans des requêtes de sélection, de mise à jour et de suppression.
Les
conditions sont utilisées avec des opérateurs de condition, des opérateurs
logiques ou avec d’autres clauses qu’on va détailler dans les paragraphes qui
suivent.
4.1 Les opérateurs de condition
On
peut utiliser les opérateurs suivants dans les conditions :
= Egale
<>
Différent
< Inférieur
> Supérieur
>=
Supérieur ou égale
<=
Inférieur ou égale
Pour
sélectionner tous les articles dont le prix est supérieur à 100 DH :
SELECT * FROM produit WHERE
prix_unitaire > 100;
4.2 Opérateurs logiques
Il
est possible de combiner plusieurs conditions avec des opérateurs logiques :
L'opérateur
AND réunit deux ou plusieurs
conditions et sélectionne les enregistrements satisfaisant TOUTES les
conditions listées. (C'est-à-dire que toutes les conditions séparées par AND
sont vraies). Par exemple, pour sélectionner tous les clients nommés 'Dupond' et
qui habitent Casablanca :
SELECT * FROM Clients WHERE nom =
'Alami' AND ville = 'Casablanca';
L'opérateur
OR réunit deux conditions mais
sélectionne des enregistrements si UNE des conditions listées est satisfaite.
Par exemple, pour sélectionner tous les clients nommés 'Alami' ou 'Alaoui' :
SELECT * FROM Clients WHERE nom =
'Alami' OR nom = 'Alaoui';
AND
et OR peuvent être combinés :
Nous
sélectionnons ici les clients nommés "Alami" qui habitent soit à
Casablanca, soit à Paris.
SELECT * FROM Clients WHERE nom =
'Alami' AND (ville = 'Casablanca' OR ville =
'Paris');
Pourquoi
avons-nous placé des parenthèses ? Pour résumer, on peut dire que l'opérateur
AND a une plus grande priorité que l'opérateur OR. Ce qui signifie que SQL va
d'abord sélectionner les conditions séparées par des AND, puis celles séparées
par des OR, si on avait omis les parenthèses ici, SQL aurait cherché les clients
nommés "Alami" vivant à Casablanca ou les clients habitant à Paris,
ce qui n'est pas le but recherché. Pour généraliser, mettez toujours des
parenthèses pour bien séparer vos conditions.
4.3 Les Clauses IN et BETWEEN
Pour
sélectionner des enregistrements dont la valeur d'un champ peut être comprise
dans une liste où entre deux valeurs, on utilise les clauses IN et BETWEEN.
Par
exemple : Pour sélectionner les clients vivant à Casablanca ou Paris :
SELECT * FROM Clients WHERE ville IN
('Casablanca', 'Paris');
Ou
pour sélectionner les produits dont le prix est compris entre 100 et 1000 DH :
SELECT * FROM Produits WHERE
prix_unitaire BETWEEN 100 AND 1000;
Pour
sélectionner les produits dont le prix n'est pas dans cet intervalle :
De la
même façon, NOT IN sélectionne les
enregistrements exclus de la liste spécifiée après IN.
SELECT * FROM Produits WHERE
prix_unitaire NOT BETWEEN 100 AND 1000;
Notez
que NOT a une priorité plus grande que AND :
NOT
Condition1 AND Condition2 sélectionnera les enregistrements ne satisfaisant pas
la condition1 et satisfaisant la condition2, alors que NOT (Condition1 AND
Condition2) sélectionnera les enregistrements ne satisfaisant pas les deux
conditions 1 et 2. Une fois de plus, n'hésitez pas à mettre des parenthèses !
4.4 La clause LIKE
La
clause LIKE permet de faire des recherches approximatives sur le contenu d'un
champ. Par exemple, pour sélectionner les clients dont le nom commence par la
lettre D :
Tout
comme dans les requêtes Access, le symbole * remplace un ensemble de
caractères, pour représenter tous les noms commençant par S, on utilisera 'S*',
tous ceux se terminant par S, on utilisera '*S', et tous ceux comportant la
lettre S : '*S*'. Le symbole ? ne remplace qu'un seul caractère. Si on a deux
clients nommés Dupond et Dupont, on utilisera 'Dupon?'.
Attention
: certaines versions de SQL n'utilisent pas les caractères * et ? mais d'autres
caractères spécifiques, certaines versions utilisent notamment le caractère % à
la place de *. Consultez donc la documentation du SGBD.
SELECT
* FROM Clients WHERE nom LIKE 'S*';
5. Le tri simple ou multiple
Nous
pouvons demander que le résultat de la requête soit trié sur un ou plusieurs
champs. Exemple : si nous souhaitons récupérer les noms et les prénoms de
tous nos clients triés par nom et puis par prénom nous procédons de la manière
suivante :
SELECT Nom, Prénom FROM Client ORDER BY Nom, Prénom;
Nous
voyons que le tri (dans l'ordre croissant) s'obtient grâce à la clause ORDER
BY, suivi des noms des champs. Le tri multiple est effectué dans l'ordre
d'énumération des champs.
Le
tri d'un champ dans l'ordre décroissant s'obtient en faisant suivre le nom de
ce champ par l'opérateur DESC. L'exemple suivant effectue un tri croissant sur
les noms, suivi d'un tri décroissant sur les prénoms :
SELECT Nom, Prénom FROM Client ORDER BY Nom, Prénom DESC;
Remarque : L’ordre est par défaut croissant
6. L'élimination des doublons
L'élimination des doublons s'obtient à
l'aide de l'opérateur DISTINCT placé
juste après la clause SELECT.
SELECT
DISTINCT Nom FROM Client;
Cette requête permet de récupérer les
noms des clients en éliminant les doubles, autrement dit, si on a deux clients
qui ont le nom Alami, nous n’aurons le nom Alami qu’une seule fois dans le
résultat de la requête.
7. Les
fonctions d'ensemble
SQL a
cinq fonctions importantes : SUM, AVG, MAX, MIN et COUNT. On les appelle
fonctions d'ensemble parce qu'elles résument le résultat d'une requête plutôt
que de renvoyer une liste d'enregistrements.
Exemple
:
SELECT
MIN(prix_unitaire),MAX(prix_unitaire),AVG(prix_unitaire)
Va
retourner le prix le plus petit de la table Produit, le prix le plus élevé et
le prix moyen.
SELECT COUNT (*) FROM Produits WHERE
libelle LIKE 'P*';
Va
retourner le nombre de produits dont le libellé commence par la lettre 'P'.
7.1 La clause GROUP BY
Une
des utilisations les plus courantes de la clause GROUP BY est son association
avec une fonction d'ensemble (le plus souvent COUNT, pour compter le nombre
d'enregistrements dans chaque groupe).
Par
exemple, si nous voulons la liste des vendeurs, avec pour chaque vendeur le
nombre de ventes qu'il a fait :
SELECT
num_vendeur,COUNT (*)FROM Commandes GROUP BY num_vendeur;
On
peut ajouter une condition à la requête, par exemple, la liste des vendeurs
avec leur nombre de vente pour les produits ayant le prix unitaire supérieur à
1000 DH.
SELECT num_vendeur,COUNT (*)FROM
Commandes GROUP BY num_vendeur
HAVING prix_unitaire >1000;
On
utilisera pour cela la clause HAVING.
8. Les opérations ensemblistes
8.1 L’union
Lorsqu'on
veut que les résultats de plusieurs requêtes soient combinés entre eux, on
utilise la clause UNION. UNION va fusionner les résultats des requêtes.
Par
exemple, supposons que nous ayons une table pour les clients habitant
Casablanca (cette table s'appellera clients_casa) et une table pour les clients
habitant Paris (clients_Paris). Pour obtenir les numéros des clients des deux
tables, on tapera :
SELECT num_client FROM clients_casa UNION SELECT num_client FROM
clients_paris;
Exemple
:
Table 1
Num
|
Prénom
|
Tél
|
Ville
|
20
|
Ahmad
|
022 88 55 22
|
Casa
|
21
|
Kamal
|
037 12 69 74
|
Rabat
|
22
|
Mehdi
|
022 52 36 47
|
Casa
|
Table 2
Num
|
Prénom
|
Tél
|
Ville
|
100
|
Jamal
|
022 88 55 55
|
Casa
|
101
|
Hamid
|
037 38 69 59
|
Rabat
|
102
|
Mounir
|
037 66 36 14
|
Meknes
|
La table 3 = Table 1
U Table 2 est la suivante :
Num
|
Prénom
|
Tél
|
Ville
|
Ville
|
20
|
Ahmad
|
022 88 55 22
|
Casa
|
Casa
|
21
|
Kamal
|
037 12 69 74
|
Rabat
|
Rabat
|
22
|
Mehdi
|
022 52 36 47
|
Casa
|
Casa
|
100
|
Jamal
|
022 88 55 55
|
Casa
|
Casa
|
101
|
Hamid
|
037 38 69 59
|
Rabat
|
Rabat
|
102
|
Mounir
|
037 66 36 14
|
Meknes
|
Meknes
|
Notez que SQL requiert que le type des champs
sélectionnés dans les clauses SELECT corresponde, colonne par colonne (le
premier champ du premier SELECT doit avoir le même type que le premier champ du
deuxième SELECT, etc...). Notez aussi que SQL supprime automatiquement les
doubles lorsque UNION est utilisé, là où il aurait fallu utiliser la clause
DISTINCT pour une requête simple.
8.2 La différence
A-B Consiste à récupérer les enregistrements qu’on dans la
relation A et qui ne figurent pas dans la relation B
Soit la relation A = Client 1
Num
|
Prénom
|
Tél
|
Ville
|
20
|
Ahmad
|
022 88 55 22
|
Casa
|
21
|
Kamal
|
037 12 69 74
|
Rabat
|
22
|
Mehdi
|
022 52 36 47
|
Casa
|
Soit la relation B= Client 2
Num
|
Prénom
|
Tél
|
Ville
|
100
|
Jamal
|
022 88 55 55
|
Casa
|
20
|
Ahmad
|
022 88 55 22
|
Casa
|
22
|
Mehdi
|
022 52 36 47
|
Casa
|
Le résultat de l’opération A-B est :
Num
|
Prénom
|
Tél
|
Ville
|
22
|
Mehdi
|
022 52 36 47
|
Casa
|
8.3 Le produit cartésien
C’est le croisement des enregistrements de deux tables qui
peuvent avoir des structures différentes.
Soit la relation 1 :
Num
|
Nom
|
Ville
|
1
|
Jamal
|
Casa
|
2
|
Ahmad
|
Rabat
|
Et Soit la relation 2
Fonction
|
Age
|
Etudiant
|
19
|
Directeur
|
35
|
Informaticien
|
25
|
L’opération Relation1 X Relation2 donne le résultat
suivant :
Num
|
Nom
|
Ville
|
Fonction
|
Age
|
1
|
Jamal
|
Casa
|
Etudiant
|
19
|
1
|
Jamal
|
Casa
|
Directeur
|
35
|
1
|
Jamal
|
Casa
|
Informaticien
|
25
|
2
|
Ahmad
|
Rabat
|
Etudiant
|
19
|
2
|
Ahmad
|
Rabat
|
Directeur
|
35
|
2
|
Ahmad
|
Rabat
|
Informaticien
|
25
|
9. La mise à jour
10. Modification de la structure d’une
table
Pour
optimiser les temps de recherche dans les tables, Access (et d’ailleurs tous
les SGBD) ont besoin d’index. L’index permet à Access de retrouver plus
rapidement les enregistrements concernés ; il accélère aussi les opérations de
tri.
Comment
? Les index fonctionnent avec une table comme la table des matières avec un
livre. Lorsqu’on indexe un champ, Access stocke hors de la table les valeurs de
ce champ. Lorsqu’on effectue une recherche sur ce champ, plutôt que de le
chercher dans la table, Access va faire sa recherche dans l’index, une fois
qu’il aura trouvé, il affichera le contenu de l’enregistrement associé à cet
index.
Lorsqu’on
cherchera un enregistrement de la table albums à partir du titre de l’album,
Access parcourra l’index et affichera l’enregistrement correspondant à l’index
qu’il aura trouvé.
Un
index peut être composé d’un ou de plusieurs champs, on aurait pu indexer la
table albums sur un index « titre + année » par exemple (si ça peut servir à
quelque chose), de même, on peut utiliser plusieurs index pour une table, par
exemple, on aurait pu indexer la table album sur les champs Titre, Genre et
Support.
Pourquoi
alors ne pas tout indexer ? L’idée peut sembler bonne, cela accélérerait les
recherches et les tris mais ralentirait toutes les mises à jour de la table, en
effet, à chaque fois qu’un champ index est modifié dans la table, il faut le
modifier également dans l’index, ce qui peut coûter très cher en temps. On
utilisera donc les index avec parcimonie et uniquement si ils s’avèrent utiles.
2.4 La commande CREATE INDEX
La
commande CREATE INDEX permet de créer un index sur une table, sa syntaxe est :
CREATE
INDEX nom_index ON table (liste de champs);
Nom_index
est le nom de l'index, table est le nom de la table.
Exemple
: création d'un index sur le champ1
Solution :
craete index index1 on table1 (champ1) ;
Aucun commentaire:
Enregistrer un commentaire