LE LANGAGE SQL



 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é …);
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



2.3 Définition des Index 

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