Le langage SQL

Le SQL (Structured Query Language) est un langage informatique normalisé qui sert à effectuer des opérations sur des bases de données. La partie langage de manipulation de données de SQL permet de rechercher, d’ajouter, de modifier ou de supprimer des données dans les bases de données.

En plus du langage de manipulation de données, la partie langage de définition de données permet de créer, et de modifier l’organisation des données dans la base de données, la partie langage de contrôle de transaction permet de commencer et de terminer des transactions, et la partie langage de contrôle de données permet d’autoriser ou d’interdire l’accès à certaines données à certaines personnes.

Dans le concret, comment ça marche ?

Reprenons notre exemple :

Nous allons modéliser ces données dans ce que l’on appel un modèle logique des données (MLD) :

COMMANDE (NCOM,DATECOM,#NCLI)

CLIENT (NCLI,NOM,ADRESSE,LOCALITE)

DETAILS (#NCOM,#NPRO,QCOM)

PRODUITS (NPRO,LIBELLE,PRIX)

Le modèle logique des données sert à modéliser par ligne une table d’une base de données comme ci-dessus, vous n’avez pas besoin de construire une base de données donc ne nous attardons pas là-dessus. Par contre, on va regarde en détails les champs (cette fois ci ce son des champs car nous sommes en base de données cf commentaire de charlotte).

Les champs soulignés sont les clés primaires de la table : la clé primaire est unique et fait référence à une table.
Les champs avec un # sont des clés étrangères : elles sont référence à une autre table (une clé étrangère est une clé primaire d’une autre table)

Ces clés lient les tables entres elles et vont nous permettre d’utiliser le langage de requête SQL.

Les commandes :

La commande la plus basique en SQL est la commande SELECT. Elle permet de pouvoir sélectionner les données de tables d’une base de données.

Syntaxe : SELECT « nom de colonne » FROM « nom de table »
En Français : Sélectionner « telle colonne » DE « telle table »

Exemple : Nous allons sélectionner tous les noms de clients contenus dans la table client.

SELECT NOM FROM CLIENT ;

Le résultat que nous aurons sera la liste des noms classés par nom dans un tableau simple :

NOM
GILLET
xxxxxx
xxxxxx

C’est une commande simple, basique du SQL qu’il est impératif de bien comprendre !

Ensuite, le DISTINCT, très simple. Comment devons-nous procéder pour ne sélectionner que des éléments distincts?
Tout ce dont nous avons besoin est d’ajouter DISTINCT après SELECT.

Syntaxe : SELECT DISTINCT « nom de colonne » FROM « nom de table »
En Français : Sélectionner de façon distinct « telle colonne » DE « telle table »

Exemple : Nous allons sélectionner la liste des dates de bons de commande dans la table COMMANDE. Pour une entreprise il n’est pas nouveau, au contraire, d’avoir plusieurs commande par jour, la commande DISTINC va regrouper les dates pour éviter les doublons.
Imaginons donc que nous avons 4 commandes en date du 02/01/2009 :

Avec un select simple nous aurons :

SELECT DATECOM FROM COMMANDE ;

DATECOM
02/01/2009
02/01/2009
02/01/2009
02/01/2009
05/10/2009

Avec un DISTINCT :

SELECT DISTINCT DATECOM FROM COMMANDE ;

DATECOM
02/01/2009
05/10/2009

Autre commande très importante : la clause WHERE.

Il est aussi possible et très courant de sélectionner conditionnellement les données d’une table. En utilisant la clause WHERE, nous allons pouvoir ajouter une condition à la sélections des données comme par exemple sélectionner les produits dont le prix de vente est supérieur à 200€ pour notre exemple.

Syntaxe : SELECT « nom de colonne » FROM « nom de table » WHERE « condition »
En Français : Sélectionner « telle colonne » DE « telle table » (quand, pour laquelle la valeur est) « condition »

Exemple : nous allons les produits par nom et prix dont le prix de vente est supérieur à 200 €

SELECT LIBELLE,PRIX FROM PRODUITS
WHERE PRIX > 200;

LIBELLE PRIX
CHEV.SAPIN 400x6x4 220
PL.HETRE 200x20x2 230

Puisque nous avons commencé à utiliser des chiffres, la question qui nous vient à l’esprit naturellement est de nous demander s’il est possible d’effectuer des calculs arithmétiques avec ces chiffres, tels que l’addition ou le calcul de la moyenne. La réponse est oui ! SQL dispose des fonctions arithmétiques suivantes :

AVG = Moyenne
COUNT = Compte chaque enregistrement du champ specifié
MAX = Donne la valeur maximale du champ spécifié
MIN = Donne la valeur minimale du champ spécifié
SUM = Exécute une somme des valeurs du champ spécifié

Bien sur, nous avons les signes classiques arithmétiques :

– =

– <

– >

– <> (different)

Complément à ces conditions :

Nous avons vu que le mot-clé WHERE peut s’utiliser pour sélectionner conditionnellement des données d’une table. Cette condition peut être une condition simple (comme celle de la section précédente), ou combinée. Les conditions combinées se constituent de plusieurs conditions simples connectées par AND ou OR. Une seule instruction SQL peut contenir un nombre illimité de conditions simples.

Syntaxe : SELECT « nom de colonne » FROM « nom de table » WHERE AND / OR « condition »

En Français : Sélectionner « telle colonne » DE « telle table » (quand, pour laquelle la valeur est) « condition » ET « condition »

Exemple : Nous allons sélectionner le champ nom de la table client pour le client GILLET.

SELECT NOM FROM CLIENT
WHERE NOM=’GILLET’;

NOM
GILLET

Le mot clé IN.

Deux utilisations du mot-clé IN sont possibles dans SQL, et cette section décrit celle qui est relative à la clause WHERE. Utilisé dans ce contexte, ce mot clé nous permet de connaître exactement la valeur des valeurs retournées que nous souhaitons voir au moins pour l’une des colonnes.

On peut la traduire en Français par « fait partie de »

Syntaxe : SELECT « nom de colonne » FROM « nom de table » WHERE « nom de colonne » IN (‘valeur1’, ‘valeur2’, …)

En Français : Sélectionner « telle colonne » DE « telle table » (quand, pour laquelle la valeur est) « nom de colonne » (fait parti de) (‘valeur1’, ‘valeur2’, …)

Exemple : Nous allons utiliser un autre exemple car, le peu de données dans notre base d’exemple se prête difficilement au jeu.

Sélectionner tous les enregistrements des magasins de Los Angeles et de San Diego dans la Table Store_Information,

Table Store_Information

store_name Sales Date
Los Angeles

1500 €

05-Jan-1999
San Diego

250 €

07-Jan-1999
San Francisco

300 €

08-Jan-1999
Boston

700 €

08-Jan-1999

il faut saisir :

SELECT * FROM Store_Information WHERE store_name IN (‘Los Angeles’, ‘San Diego’);

Résultat :

store_name Sales Date
Los Angeles

1500 €

05-Jan-1999
San Diego

250 €

07-Jan-1999

Alors que le mot-clé IN aide les utilisateurs à limiter le critère de sélection à une ou plusieurs valeurs distinctes, le mot-clé BETWEEN permet de sélectionner un intervalle.

Syntaxe :SELECT « nom de colonne » FROM « nom de table »WHERE « nom de colonne » BETWEEN ‘valeur1’ AND ‘valeur2’

Sélectionner « telle colonne » DE « telle table » (quand, pour laquelle la valeur est comprise entre) « valeur 1 » ET « valeur2 »

Cette instruction sélectionnera toutes les lignes dont les colonnes ont une valeur comprise entre ‘valeur1’ et ‘valeur2’.

Exemple :

pour visualiser toutes les informations de vente comprises entre le 6 janvier 1999 et le 10 janvier 1999 dans la Table Store_Information,

SELECT * FROM Store_Information WHERE Date BETWEEN ’06-Jan-1999′ AND ’10-Jan-1999′

Résultat :

store_name Sales Date
San Diego

250 €

07-Jan-1999
San Francisco

300 €

08-Jan-1999
Boston

700 €

08-Jan-1999

Le LIKE est un autre mot-clé utilisé dans la clause WHERE.LIKE permet d’effectuer une recherche basée plutôt sur un modèle qu’une spécification exacte de ce qui est souhaité (comme dans IN) ou une définition d’un intervalle (comme dans BETWEEN). On peut la traduire en Français par « ressemble à » :

Syntaxe : SELECT « nom de colonne » FROM « nom de table » WHERE « nom de colonne » LIKE {modèle}

{modèle} représente souvent des caractères de remplacement. Voici quelques exemples :

  • ‘A_Z’ : toutes les chaînes commençant par ‘A’, ou un autre caractère, et terminant par ‘Z’. Par exemple, ‘ABZ’ et ‘A2Z’ satisferaient la condition, alors ‘AKKZ’ ne le ferait pas (car il y a deux caractères entre A et Z au lieu d’un).
  • ‘ABC%’ : toutes les chaînes commençant par ‘ABC’. Par exemple, ‘ABCD’ et ‘ABCABC’ satisferaient la condition.
  • ‘%XYZ’ : toutes les chaînes terminant par ‘XYZ’. Par exemple, ‘WXYZ’ et ‘ZZXYZ’ satisferaient la condition.
  • ‘%AN%’ : toutes les chaînes contenant le modèle ‘AN’ quelle que soit sa position. Par exemple, ‘LOS ANGELES’ et ‘SAN FRANCISCO’ satisferaient la condition.

Toujours sur notre table Store_Information

store_name Sales Date
LOS ANGELES

1500 €

05-Jan-1999
SAN DIEGO

250 €

07-Jan-1999
SAN FRANCISCO

300 €

08-Jan-1999
BOSTON

700 €

08-Jan-1999

Pour rechercher tous les magasins dont le nom contient ‘AN’, il faut saisir :

SELECT *
FROM Store_Information
WHERE store_name LIKE ‘%AN%’;

Résultat :

store_name Sales Date
LOS ANGELES

1500 €

05-Jan-1999
SAN DIEGO

250 €

07-Jan-1999
SAN FRANCISCO

300 €

08-Jan-1999

Nous allons maintenant voir la clause ORDER BY.
Jusqu’à présent, nous avons vu comment extraire des données d’une table à l’aide des commandes SELECT et WHERE. Il convient souvent de lister les résultats dans un ordre particulier. Le classement peut se faire dans un ordre ascendant ou descendant, ou peut être établi par des valeurs saisies en chiffres ou en lettres. Dans de tels cas, il est possible d’utiliser le mot-clé ORDER BY pour atteindre notre objectif.

La syntaxe d’une instruction ORDER BY est comme suit :

Syntaxe : SELECT « nom de colonne » FROM « nom de table » [WHERE « condition »] ORDER BY « nom de colonne » [ASC, DESC]

Les crochets [] signifient que l’instruction WHERE est optionnelle. Toutefois, si une clause WHERE est déjà présente, elle se trouvera devant la clause ORDER BY. La clause ASC ou DESC provoque respectivement un tri des résultats dans un ordre ascendant ou descendant. En cas d’omission de l’une d’elles, la clause ASC est implicitement appelée, provoquant donc un tri en ordre ascendant par défaut.

Il est possible d’ordonner par plusieurs colonnes. Dans ce cas, la clause ORDER BY ci-dessus devient :

ORDER BY « nom de colonne 1 » [ASC, DESC], « nom de colonne 2 » [ASC, DESC]

Supposons que nous avons choisi l’ordre ascendant pour les deux colonnes, la colonne de sortie sera classée dans un ordre ascendant selon la colonne 1. S’il y a une liaison pour la valeur de la colonne 1, le tri se fera dans un ordre ascendant selon la colonne 2.

Par exemple, pour trier les contenus de la Table Store_Information par montant en dollar, dans un ordre descendant :

Table Store_Information

store_name Sales Date
Los Angeles

1500 €

05-Jan-1999
San Diego

250 €

07-Jan-1999
San Francisco

300 €

08-Jan-1999
Boston

700 €

08-Jan-1999

Il faut saisir :

SELECT store_name, Sales, Date
FROM Store_Information
ORDER BY Sales DESC;

Résultat :

store_name Sales Date
Los Angeles

1500 €

05-Jan-1999
Boston

700 €

08-Jan-1999
San Francisco

300 €

08-Jan-1999
San Diego

250 €

07-Jan-1999

En plus du nom de colonne, il est également possible d’utiliser une position de colonne (basée sur la requête SQL) pour indiquer la colonne à laquelle nous souhaitons appliquer la clause ORDER BY. La première colonne est 1, la seconde 2, et ainsi de suite. Dans l’exemple précédent, il serait possible d’obtenir les mêmes résultats en utilisant la commande suivante :

SELECT store_name, Sales, Date
FROM Store_Information
ORDER BY 2 DESC;

Nous passons maintenant aux fonctions d’agrégation. Vous souvenez-vous que nous avons utilisé le mot-clé SUM pour calculer les ventes totales de tous les magasins ? Comment pouvons-nous calculer les ventes totales de chaque magasin ? Bien, il y a deux manières : tout d’abord, il est nécessaire de s’assurer d’avoir sélectionné le nom de magasin, ainsi que les ventes totales. Ensuite, tous les chiffres d’affaires doivent êtregroupés par (grouped by) par par magasin. La syntaxe SQL correspondante est :

Syntaxe : SELECT « nom de colonne 1 », SUM(« nom de colonne 2 »)
FROM « nom de table »
GROUP BY « nom de colonne 1 »

Illustrons ce cas de figure à l’aide de la table suivante :

Table Store_Information

store_name Sales Date
Los Angeles 1500 € 05-Jan-1999
San Diego 250 € 07-Jan-1999
Los Angeles 300 € 08-Jan-1999
Boston 700 € 08-Jan-1999

Pour retrouver les ventes totales de chaque magasin, il faut saisir :

SELECT store_name, SUM(Sales) FROM Store_Information
GROUP BY store_name;

Résultat :

store_name SUM(Sales)
Los Angeles 1800 €
San Diego 250 €
Boston> 700 €

Le mot-clé GROUP BY s’utilise lorsque diverses colonnes d’une ou de plusieurs tables sont sélectionnées et qu’un opérateur arithmétique au moins apparaît dans l’instruction SELECT. Nous devons, le cas échéant, regrouper (GROUP BY) toutes les autres colonnes sélectionnées, c’est-à-dire, toutes les colonnes sauf celle(s) utilisée(s) par l’opérateur arithmétique.

Point Très important, les jointures ! Il faut, comme le SELECT, le maitriser et le comprendre.

Pour définir correctement des jointures sous SQL, il faudra se reporter à la plupart des éléments que nous avons exposés jusqu’à présent. Supposons que nous avons les deux tables suivantes :

Table Store_Information

store_name Sales Date
Los Angeles

1500 €

05-Jan-1999
San Diego

250 €

07-Jan-1999
Los Angeles

300 €

08-Jan-1999
Boston

700 €

08-Jan-1999

Table Geography

region_name store_name
East Boston
East New York
West Los Angeles
West San Diego

Nous souhaitons connaître les ventes par région. La table Geography comprend des informations sur des régions et magasins, et la table Store_Information contient des données relatives aux ventes de chaque magasin. Afin d’obtenir les informations sur les ventes par région, il faut combiner les informations des deux tables. En examinant les deux tables, nous constatons qu’elles sont mises en relation par le champ commun « store_name » (qui est clé primaire et etrangere). Nous allons d’abord décrire l’instruction SQL, puis expliquer l’utilisation de chaque segment :

SELECT A1.region_name REGION, SUM(A2.Sales) SALES
FROM Geography A1, Store_Information A2
WHERE A1.store_name = A2.store_name
GROUP BY A1.region_name

Résultat :

REGION SALES
East

700 €

West

2050 €

Les deux premières lignes permettent à SQL de sélectionner deux champs : le premier est le champ « region_name » de la table Geography (dont l’alias est REGION), et le second est la somme du champ « Sales » de la table Store_Information (dont l’alias est SALES). Notez comment les alias de tables sont utilisés ici : A1 est l’alias de Geography et A2 de Store_Information. Sans l’alias, la première ligne deviendrait :

SELECT Geography.region_name REGION, SUM(Store_Information.Sales) SALES

ce qui n’est pas très concis. Par essence, les alias de table sont destinés à faciliter la compréhension des instructions SQL, surtout en présence de plusieurs tables.

Nous passons maintenant à la ligne 3 (à l’instruction WHERE). C’est là où se spécifie la condition de la jointure. Dans ce cas, pour nous assurer que le contenu dans « store_name » de la table Geography corresponde à celui de la table Store_Information, il faut les définir comme valeur égale. L’instruction WHERE est essentielle pour obtenir une requête correcte. Sans l’instruction WHERE appropriée, nous obtiendrons une jointure cartésienne. Les jointures cartésiennes retournent toute combinaison possible des deux tables (ou tout nombre de tables indiqué dans l’instruction FROM). Une jointure cartésienne retournerait donc un résultat d’un total de 4 x 4 = 16 lignes.

Voila ! C’est fini pour la partie SQL ! J’imagine que tout n’est pas bien clair donc vous pouvez poser vos questions.
Dans le prochain article, je vais reprendre tout une série d’exemples à partir de vos cours.

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :