Les Fonctions en SQL : les Index - les vues SQL - SGBD SQL requêtes

1-  Introduction

2Modèle  utilisé

3Les index
 
      3.1-  Qu'est ce qu'un index ?
      3.2Comment créer un index ?
      3.3Comment effacer un index ?
      3.4Quelques règles pour le choix d'un index

4Les vues

      4.1Qu'est ce qu'une vue ?
      4.2La création d'une vue
      4.3Créer une vue modifiable
      4.4L'option with check option
      4.5La suppression d'une vue
      4.6Quelques remarques

5Les fonctions en SQL

      5.1Les fonctions mathématiques
      5.2Fonctions sur les chaînes de caractères
      5.3Les fonctions sur les dates
            5.3.1    Date et heure courante
            5.3.2    Calcul sur les dates
            5.3.3    Extraction sur les dates
            5.3.4    Les fonctions de formatage
 
6Les requêtes de requêtes
 
  
1 - Introduction 

  
Dans les cours précédents,  nous avons vu SQL  sous ses aspects les plus courants,  il nous reste à voir d'une part  les différents outils nous permettant  d'optimiser ou  de faciliter l'accès à une base de donnée,  ainsi  que les fonctions de manipulation  ou  de conversion  de dates ou autres. 


2 - Modèle  utilisé 

Pour cette partie  nous reprendrons principalement le modèle Garage :

VEHICULE (Code, Type, M arque, Puissance) => les types de véhicule
GARAGE (Code, Nom, Adresse, Ville, Cpostal, Marque) =>  les garages
PLAQUE  (Immat,  CodeV#,  Nom,  Prenom,  Adresse,  Ville, Cpostal,  Date) =>  véhicules immatriculé

CodeV# de PLAQUE est clé étrangère et référence Code de VEHICULE. 


3 - Les index 

 
3.1 Qu'est ce qu'un index ? 

Un  index  correspond  à  un  moyen  d'accéder  plus  rapidement  à  une  information. Imaginons une table adresse ayant cette structure :

Dans la table GARAGE,  Code est  clé primaire,  ce qui  fait  que la table est  triée par code et donc toute recherche à partir du code sera très rapide (méthode de tri dichotomique, par arbre ou toute autre technique). 

De façon automatique, un index est créé sur une clé primaire (simple ou composé), ce qui fait que toute recherche à partir d'une clé est  très rapide.  Ceci  n'est  pas vrai  à partir des autres champs, puisque dans ce cas, il faudra parcourir l'ensemble de la table pour trouver la ou les bonnes informations. Une technique consiste à créer un index supplémentaire sur la table afin d'accélérer les recherches. 

Dans notre exemple, un index pourra être créé sur les champs ville si des recherches fréquentes sont sur ce champ. 

Attention, néanmoins créer des index à deux inconvénients :

  • Les accès à la table sont  ralentis en  cas de  mise à jour de  données (Mise à jour, insertion ou effacement de données),  puisque dans ce cas,  non seulement la table est mise à jour, mais également les "tables d'index". 
  • La base grossit en fonction des index, puisque les index sont stockés dans la base, dans des tables supplémentaires

La création  d'index  doit  donc être réfléchie,  et  se réalise généralement  sur des champs de petite taille afin  de minimiser à la fois la taille de la base et  les accès. Il  s'agit  donc d'un compromis. 

  
3.2       Comment créer un index ?

La création d'un index correspond à une modification sur une table. La commande est

CREATE [ UNIQUE ] INDEX 
<nom  de l'index>
ON <TABLE> ( nom  du  champ)

UNIQUE permet d'ajouter une clause d'unicité (ce qui est le cas pour une clé)

Exemple: création d'un index sur le champ Ville:
  
CREATE INDEX  index_garage_ville
ON GARAGE (Ville);


3.3       Comment effacer un index ? 

De la même manière que pour effacer une contrainte, à l'aide de la commande DROP

DROP INDEX <nom de l'index>

Ex :     DROP INDEX  index_garage_ville 
  
3.4       Quelques règles pour le choix d'un index 
  
  • Ne pas créer d'index pour de petites tables (< 300 enregistrements)
  • Ne pas créer d'index sur un champ qui ne possède que quelques valeurs différentes (ex : le nombre d'étoiles des restaurants
  • Indexer les colonnes intervenant souvent dans des clauses Where ou Order By
  • Indexer les colonnes de jointure

De manière générale, La création d'Index répond à des choix d'optimisation des accès sur la base. On y fait appel à partir du moment où des lenteurs excessives sont constatées.


4 - Les vues 


4.1       Qu'est ce qu'une vue ?

Le concept  de vue revêt  une importance particulière dés que l'on  envisage des notions de facilité d'accès à la base et de sécurité des données. 

Une vue est  une table virtuelle construite à partir des tables d‘une base de données existante. Elle n‘a pas d‘existence physique permanente, mais est construite dynamiquement, en cas d'utilisation, à partir des données figurant dans la base.

Par contre une vue s‘utilise,  à quelques conditions près,  avec les mêmes instructions qu‘une table (SELECT, DELETE, INSERT, UPDATE).

Une vue peut être :

  • La table GARAGE limitée au département de la Meuse. 
  • La  table  GARAGE  ne  comprenant  comme  champs que  le  code,  le  nom  et l'adresse e-mail
  • Le  propriétaire  avec  ses  coordonnées  associées  aux  caractéristiques  de  sa voiture. (Dans ce cas, la vue provient de 2 tables)

En synthèse, une vue est une table dynamique permettant de montrer à l'utilisateur le contenu d'une table limitée à ce que le créateur de la vue désire.  L'utilisateur en manipulant  une vue aura l'impression d'intervenir sur une table à part entière. 


4.2       La création d'une vue 

Créer une vue consiste à identifier sous un nom une requête SQL qui définit la vue.

CREATE VIEW  nom_vue (liste_colonne)
AS  commande SELECT
WITH (optons)…
 
  • nom_vue correspond au nom de la vue (table virtuelle) créée
  • liste_colonne  est  facultatif.  Dans le  cas où  les noms de  champ  ne  sont  pas donnés, ils héritent des noms du SELECT
  • commande correspond à une commande SELECT sur une ou plusieurs table 
  • WITH permet d'ajouter des contraintes sur la vue
 
Ex :   Vue sur les clients du département de la Meuse :

CREATE VIEW  GARM EUSE
AS SELECT FROM  GARAGE WHERE Cpostal LIKE '55%';
 
Dans le cas ci-dessus :
 
  • Tout ajout de Garage peut se faire sur la table. 
  • Une mise à jour d'un garage de la Meuse peut se faire sur la table ou la vue 
  • La mise à jour d'un garage hors Meuse ne peut se faire que sur la table
Vue uniquement sur les garages (noms et marque)

CREATE VIEW  GARMARQUE
AS SELECT Code, Nom, Marque FROM  GARAGE;

Dans ce cas,
 
  • Les mises à jour sur la vue ne peuvent se faire que sur les champs de la vue. 
  • L'insertion d'un client dans la vue sera limitée aux champs visibles. 
  • Si  des  champs  non  présents  dans  la  vue  ont  une  contrainte  NOT  NUL, l'insertion ne pourra se faire à partir de la vue.
Vue associant la voiture avec son propriétaire 

CREATE VIEW  VOITNAME
AS SELECT Immat, Nom, Marque, Type, Adresse, Vill  Cpostal
FROM  PLAQUE, VEHICULE 
WHERE Code = CodeV;

Dans ce cas, les mises à jours sont difficiles, voire impossibles puisque l'on n'a qu'une partie des informations des 2 tables. Ce type de vue est essentiellement pour faciliter les recherches de données. 


4.3       Créer une vue modifiable 

Pour qu'une vue soit  modifiable,  indépendamment  des contraintes d'intégrité sur les tables, il faut respecter un certain nombre de règles :
 
  • Pas de directives distinct
  • Pas de fonctions d'agrégat (AVG, COUNT …)
  • PAS de GROUP BY, ORDER BY, HAVING
  • La vue ne doit pas être déclarée en lecture seule (WITH READ ONLY)

 
4.4       L'option with check option 

Nous avons vu précédemment qu'il est possible de modifier ou d'ajouter des enregistrements n'appartenant  pas à  la  vue  (ajout  d'un  garagiste  n'appartenant  pas à la Meuse  dans la  vue GARMEUSE). 

La directive WITH CHECK OPTION empêche un ajout ou une modification non conforme à la définition de la vue. 

EX :

CREATE VIEW  GARMEUSE
AS SELECT FROM  GARAGE WHERE Cpostal LIKE '55%'
WITH CHECK OPTION;


4.5       La suppression d'une vue 

Important  :  la  suppression  d'une  table  ne  supprime  pas  la  déclaration  de  la  vue correspondante.  Il  est  donc dans ce cas nécessaire si  on  veut  garder une cohérence dans la base de supprimer la vue correspondante. 

La commande utilisée est :

DROP VIEW   nom_vue


4.6       Quelques remarques 

La notion de vue est implémentée différemment suivant les bases de données. 

Si  toutes les grandes bases du  marché  implémentent  la  notion  de  vue,  les accès,  et  plus particulièrement les mises à jour sont autorisées différemment. 

Postgresql ne supporte pas de manière native la mise à jour des données à travers une vue. Il faut créer des fonctions pour assurer les mises à jour.


5 - Les fonctions en SQL 

Dans le  cours précédent,  nous avons vu  un  certain  nombre  de  fonctions de  base  (Month, year…).  Il  existe en SQL  une multitude de fonctions permettant  de manipuler toutes sortes d'informations. 

Les exemples ci-après sont ressortis de la doc de Postgresql. 


5.1       Les fonctions mathématiques 

Toutes les principales fonctions existent. Ci-joint un extrait
  

D'autres fonctions permettent également de mettre en forme les résultats :
 
  

5.2       Fonctions sur les chaînes de caractères 

Précédemment nous avons vu les fonctions UPPER et LOWER. D'autres fonctions courantes existent comme :
 
  • La concaténation de chaînes de caractères : string1 || string2
  • La conversion d'une chaîne avec la première lettre en majuscule : initcap (text)
  • Le remplacement d'une chaîne par une autre :
  • L'extraction d'une partie d'une chaîne de caractère : substring
  • La longueur d'une chaîne de caractère : length
  • … 
   

5.3       Les fonctions sur les dates 

Comme nous avons vu,  la date n'est  pas nécessairement  représentée dans le format  que l'on désire. De plus, la date renvoyée peut être codée de différentes façons. Un certain nombre de fonctions permettent de manipuler ces dates :

Suivant la base, et le paramétrage, les dates sont exprimées en format anglo-saxon (mois, jour, année) ou français.  De plus,  certains paramètres permettent  de changer les paramètres et  de manipuler ces dates. Attention, ces différentes fonctions ne sont pas les même en fonction des bases, et il sera nécessaire de consulter l' de afin de voir leur syntaxe précise. 


5.3.1 Date et heure courante 

current_date,  current_time,  current  time_stamp  permettent  de  récupérer  les  informations courantes  now() est équivalent à current_timestamp (date et heure courante)

Ex : récupération de la date courante :

SELECT current_date ;

requête de mise à jour du champ date à la date du jour 

UPDATE <TABLE>
SET date = current_date  W HERE … ;


5.3.2 Calcul sur les dates 

Il est possible également de faire des calculs sur les dates:

UPDATE <TABLE>
SET date = current_date +5 WHERE … ;

Cette requête initialisera le champ date à date du jour + 5 jours

UPDATE COMPETITION
SET datcomp = datcomp + INTERVAL '1 month'
WHERE refcomp = 'comp9';

Dans ce cas tiré de la base SKI, le mois de datcomp sera augmenté de 1, indépendamment du nombre de jours du mois. 


5.3.3 Extraction sur les dates 

Il est possible à partir d'une date de récupérer certaines informations de celles-ci :

DAY, MONTH, YEAR, WEEK (no de la semaine), DOY (nombre de jour depuis le début de l'année), Hour, Minute

Ces fonctions doivent être exécutées sur des champs date ou heure. 

Certaines bases de données les implémentent de façon native 
      MONTH (date) => le mois de la date passée en paramètre. 

Postgresql utilise la fonction EXTRACT :

EXTRACT (MONTH FROM  DATE)

ex : SELECT Refcomp, EXTRACT  (MONTH from datcomp) from COMPETITION;

  
5.3.4 Les fonctions de formatage 

Les  fonctions  de  formatage  fournissent  un  ensemble  d'outils  puissants  pour  convertir différents types de données (date/heure, entier, nombre à virgule flottante, numérique) en des chaînes  formatées  et  pour  convertir  des  chaînes  formatées  en  des  types  de  données spécifiques.  Ces  fonctions  suivent  toute  une  convention  d'appels  commune : le  premier argument est la valeur à formater et le second argument est un modèle définissant le format de sortie ou d'entrée.

Tableau de formatage sous Postgresql  (ces fonctions existent aussi sous Oracle):
  
  

Modèle les plus courants pour les formats de type date/heure :
  
  
    
Exemple d'utilsation :

SELECT refcomp, to_CHAR (datcomp,'Day,Month,YYYY') from competition;

Permet de lister les dates sous forme jour (littéral), mois (littéral) et année

UPDATE COMPETITION
SET datcomp = TO_DATE ('05 Dec 2000' 'DD M on YYYY')
WHERE refcomp = 'comp9';

Cette requête permet de mettre à jour suivant le format donné en paramètre

Il est possible également de formater la date pour toutes les requêtes :

             SET datestyle TO dmy;


6 - Les requêtes de requêtes 

Important, le résultat  d'une requête est une table. 
Cette table résultante peut donc être une table appelée dans une requête 

Exemple, reprenons la requête du TP Postgresql :


Donnez le nombre moyen de participants aux compétitions se déroulant à tignes. 

Si on découpe la requête, il faut dans un premier temps considérer le nombre de participants concernant les compétitions de Tignes Cette requête s'exprime sous la forme :

select count(nomski) as compteur
      from classement cl, competition co
      where co.refcomp=cl.refcomp
      and nomstat='tgnes'
      group by co.refcomp


Il faut ensuite prendre la moyenne des nombres renvoyés par la requête, ce qui donne :

select avg(compteur)
      from (
            select count(nomski) as compteur
            from classement cl, competition co
            where co.refcomp=cl.refcomp
            and nomstat='tignes'
            group by co.refcomp
            ) as req2;

La requête précédente constitue la table REQ2  qui  est  utilisée comme table dans la requête principale. 

Ce type de requête est utilisée dés lors où un résultat  d'un résultat est nécessaire. 

Important, la table créée n'a d'existence que pendant la requête. 
     

Article plus récent Article plus ancien

Leave a Reply