Chapitre 4 : SQL A.Lasfar () - EST - Salé Département Informatique - ESTS

La page est créée André Guyot
 
CONTINUER À LIRE
EST – Salé
     Département Informatique
       Filière Génie Logiciel

Base de Données Relationnelles (BDR)

          Chapitre 4 : SQL
           A.Lasfar (ali.lasfar@gmail.com)

                      1
Table des matières
Notions générales sur SQL .................................................................................................. 4
   Langage ....................................................................................................................................... 4
   Historique.................................................................................................................................... 4
   SQL une norme et standard ......................................................................................................... 5
   Les composants de SQL ................................................................................................................ 5
   Les propriétés ACID ..................................................................................................................... 6
   Implémentation physique des SGBDR .......................................................................................... 6
   Type de données ......................................................................................................................... 7
   Les domaines, ou la création de types spécifiques ....................................................................... 8
   Contraintes de données ............................................................................................................... 8

Langage de définition de données .....................................................................................10
   Création de tables : CREATE TABLE ............................................................................................ 10
      Les contraintes ............................................................................................................................................. 10
      NOT NULL ..................................................................................................................................................... 10
      UNIQUE......................................................................................................................................................... 11
      CHECK ........................................................................................................................................................... 11
      Clé primaire .................................................................................................................................................. 11
      Clé étrangère ............................................................................................................................................... 12

Langage de manipulation de données : select ..................................................................17
   L'opérateur AS ........................................................................................................................... 18
      Where ........................................................................................................................................................... 18
      And, Or.......................................................................................................................................................... 19

   BETWEEN .................................................................................................................................. 19
      IN .................................................................................................................................................................. 20
      LIKE ............................................................................................................................................................... 20
      Les fonctions ................................................................................................................................................. 21
      Group by : fonctions d’agrégation. ............................................................................................................... 22
      HAVING ......................................................................................................................................................... 22
      Alias .............................................................................................................................................................. 22

   Les jointures .............................................................................................................................. 24
   Syntaxe normalisée des jointures .............................................................................................. 25
   Opérateur de jointure naturelle ................................................................................................. 25
   Les jointures internes ................................................................................................................ 25

Les Sous-requête ...............................................................................................................32
   Sous-requêtes renvoyant une seule valeur ................................................................................ 32
      Dans la clause SELECT ................................................................................................................................... 32
      Dans les filtres WHERE et HAVING ............................................................................................................... 33

   Sous-requêtes renvoyant une liste (Opérateurs IN, ALL et ANY(SOME) ) .................................... 33
      Dans le prédicat IN ....................................................................................................................................... 33

                                                                                    2
3
Notions générales sur SQL

Langage

SQL est un langage de type " déclaratif ". On spécifie ce que l'on veut sans décrire la manière
de l'obtenir et c'est la machine qui décide comment elle doit l'exécuter. Il permet la
communication avec une base de données (lecture, écriture, suppression de données …).
Créé en 1974 et normalisé depuis 1986, ce langage est reconnu par la grande majorité des
systèmes de gestion de bases de données relationnelles (SGBDR).

Les instructions SQL s'écrivent d'une manière qui ressemble à celle de phrases ordinaires en
anglais.

Historique
Premiers pas: 1970 publication d'un article : A Relational Model of Data for Large Shared Data
Banks.
Ce référentiel relationnel fondé sur la logique des prédicats a été reconnu comme un modèle
théorique, pour l'interrogation des bases de données, et a donné le langage Structured English
QUEry Language (SEQUEL) renommé ultérieurement SQL.

En 1979 est apparue la première version de SQL.
SQL a été adopté comme recommandation par l'Institut de normalisation américaine (ANSI)
en 1986, puis comme norme internationale par l'ISO en 1987 sous le nom de ISO/CEI 9075 -
Technologies de l'information - Langages de base de données - SQL.

La norme internationale SQL est passée par un certain nombre de révisions :
 Année Appellation        Commentaires
 1986     SQL-86     ou Édité par l'ANSI puis adopté par l'ISO en 1987.
          SQL-87
 1989     SQL-89     ou Révision mineure.
          SQL-1
 1992     SQL-92 alias Révision majeure.
          SQL2
 1999     SQL-99 alias Expressions rationnelles, requêtes récursives, déclencheurs, types
          SQL3         non-scalaires et quelques fonctions orientées objet.

                                               4
2003     SQL:2003         Introduction de fonctions pour la manipulation XML, « window
                           functions », ordres standardisés et colonnes avec valeurs auto-
                           produites (y compris colonnes d'identité).
 2008     SQL:2008         Ajout de quelques fonctions de fenêtrage (ntile, lead, lag, first
                           value, last value, nth value), limitation du nombre de ligne (OFFSET
                           / FETCH), amélioration mineure sur les types distincts, curseurs et
                           mécanismes d'auto incréments.
 2011     SQL:2011

SQL une norme et standard
SQL a des standards, il est utilisé sur plusieurs SGBDR et se trouve sous différents aspects.
La raison est que :
-   Le standard SQL est complexe et il n’est pas pratique d’implémenter le standard entier
-   Chaque fournisseur de bases de données a le besoin de différencier ses produits parmi
    d’autres.
La syntaxe de SQL fait l'objet de la norme ISO 9075. Cette norme laisse la possibilité aux
producteurs de SGBD d'y ajouter des instructions spécifiques et non normalisées.
La norme a évolué au cours des années en vue de s'adapter aux demandes, et les éditeurs de
SGBD ont souvent ajouté des possibilités à leurs produits ce qui provoque des variations dans
la compréhension et l'interprétation qui est faite d'un code source en SQL par les différents
logiciels de SGBD.
Ces différences font qu'un code source écrit sans précautions pour un SGBD donné ne
fonctionnera pas forcément avec un autre SGBD.

Les composants de SQL
SQL comporte 5 grandes parties
    -   La définition des éléments d'une base de données (tables, colonnes, clefs, index,
        contraintes...) noté souvent DDL,
    -   La manipulation des données (insertion, suppression, modification, extraction…),
    -   La gestion des droits d'accès aux données (acquisition et révocation des droits),
    -   La gestion des transactions
    -   SQL intégré.

    •   DDL : " Data Definition Language "
C'est la partie de SQL qui permet de créer des bases de données, des tables, des index, des
contraintes …(CREATE, ALTER, DROP)

    •   DML : " Data Manipulation Language "
C'est la partie de SQL qui s'occupe de traitement des données (INSERT, UPDATE, DELETE, SELECT).
    •   DCL : "Data Control Language"

                                               5
C'est la partie SQL qui s'occupe de gérer les droits d'accès aux tables (GRANT, REVOKE).

   •   TCL : " Transaction Control Language "
C'est la partie SQL chargé de contrôler la bonne exécution des transactions (SET
TRANSACTION,                           COMMIT,                          ROLLBACK).
Ces commandes permettent de gérer les propriétés ACID des transactions.

   •   SQL intégré : "Embedded SQL"
Il s'agit d'éléments procéduraux que l'on intègre à un langage hôte (SET, DECLARE CURSOR,
OPEN, FETCH...)

Les propriétés ACID
Le terme "ACID" fait référence aux termes suivants :

A - Atomicité : une transaction s'effectue ou pas (tout ou rien). Par exemple l'augmentation
des prix de 10% de tous les articles d'une table des produits ne saurait être effectuée
partiellement, même si le système connaît une panne en cours d'exécution de la requête.

C - Cohérence : le résultat ou les changements induits par une transaction doivent
impérativement préserver la cohérence de la base de données. Par exemple lors d'une fusion
de société, la concaténation des tables des clients des différentes entités ne peut entraîner la
présence de plusieurs clients ayant le même identifiant. Il faudra résoudre les conflits portant
sur le numéro de client avant d'opérer l'union des deux tables.

I - Isolation : les transactions sont isolées les unes des autres. Par exemple la mise à jour des
prix des articles ne sera visible pour d'autres transactions que si ces dernières ont démarré
après la validation de la transaction de mise à jour des données. Il n'y aura donc pas de vue
partielle des données pendant toute la durée de la transaction de mise à jour.

D - Durabilité : une fois validée, une transaction doit durer, c'est à dire que les données sont
persistantes même s'il s'ensuit une défaillance dans le système. Par exemple, dès lors qu'une
transaction a été validée, comme la mise à jour des prix, les données modifiées doivent être
physiquement stockées pour qu'en cas de panne, ces données soient conservées dans l'état
où elles ont été spécifiées à la fin de la transaction.

Implémentation physique des SGBDR
Il existe deux types d'implémentation physique des SGBD relationnels. Ceux qui utilisent un
service de fichiers associés à un protocole afin d'accéder aux données (SGBDR "fichier") et
ceux qui utilisent une application centralisée dite serveur de données (SGBDR client/serveur).

SGBDR "fichier"

                                                6
Le service est simple, il s'agit de placer dans une unité de stockage partagée (en général un
disque d'un serveur de réseau) un ou plusieurs fichiers partageables.

SGBDR "Client/Serveur"
Le service consiste à faire tourner sur un serveur physique, un moteur qui assure une
indépendance entre les données et les demandes de traitement de l'information venant des
différentes applications.
En effet, un poste client envoie, à l'aide d'un protocole de réseau, un ordre SQL. Le moteur
répond par l'envoie des données.
De plus le SGBDR assure des fonctions de gestions d'utilisateurs de manière indépendante aux
droits gérés par l'OS.

Type de données
 Type                       Description
 Type alphanumérique
 CHARACTER             (ou Chaîne de caractères de longueur fixe n (n
Types " BLOBS " (hors du standard SQL 2)
TEXT : suite longue de caractères de longueur indéterminé
IMAGE : stockage d'image dans un format déterminé
OLE : stockage d'objet OLE (Windows)

Remarque
Pour les types réels NUMERIC, DECIMAL, DEC et FLOAT, on doit spécifier le nombre de chiffres
significatifs et la précision des décimales après la virgule.
Les constantes chaînes de caractères sont entourées par des apostrophes ('). Si la chaîne
contient une apostrophe, celle-ci doit être doublée. Exemple : 'aujourd''hui'.

Exemple
NUMERIC (15,2)
BOOLEAN (ou LOGICAL) : absent de la norme sql.
On peut par exemple implémenter un tel type de données, en utilisant une colonne de type
caractère longueur 1, non nul et restreint à deux valeurs (V / F ou encore T / F).

MONEY : est un sous type du type NUMERIC avec une précision de deux chiffres après la
virgule.

BYTES (ou BINARY) : Type binaire (octets) de longueur devant être précisée. Permet par
exemple le stockage d'un code barre.

AUTOINC : entier à incrément automatique par trigger.

Les domaines, ou la création de types spécifiques
Il est possible de créer de nouveau types de données à partir de types pré existants en utilisant
la notion de DOMAINE.
Dans ce cas, avant d'utiliser un domaine, il faut le recenser dans la base à l'aide d'un ordre
CREATE : CREATE DOMAIN nom_du_domaine AS type_de_donnée

CREATE DOMAIN car AS CHAR(5)
L'utilisation des domaines possède de nombreux avantages : ils peuvent être modifiés (ce qui
modifie le type de toutes les colonnes de table utilisant ce domaine d'un seul coup).

Contraintes de données
Dans la plupart des SGBDR il est possible de contraindre le formatage des données à l'aide de
différents mécanismes.

                                               8
Parmi les contraintes les plus courantes sur les données des tables on trouve :
   •   valeur minimum
   •   valeur maximum
   •   valeur par défaut
   •   valeur obligatoire
   •   valeur unique
   •   clef primaire
   •   index secondaire
   •   format ou modèle (par exemple 3 caractères majuscules suivi de 2 caractères
       numériques)
   •   table de référence (recopie d'une valeur d'une table dans un champ d'une autre table
       en sélectionnant par la clef) aussi appelé CHECK en SQL

Intégrité référentielle
Entre deux tables liées, il est souvent nécessaire de définir une contrainte de référence qui
oblige un enregistrement référencé par sa clef à être présent ou détruit en même temps que
l'enregistrement visé est modifié, inséré ou supprimé. Ce mécanisme est appelé INTÉGRITÉ
RÉFÉRENTIELLE.

                                              9
Langage de définition de données
Création de tables : CREATE TABLE
CREATE TABLE "nom de table"
("colonne 1" "type de données pour la colonne 1",
"colonne 2" "type de données pour la colonne 2",
 ... )

Exemple
CREATE TABLE customer
(First_Name char(50),
Last_Name char(50),
Address char(50),
City char(50),
Country char(25),
Birth_Date date)

Il est aussi possible d’attribuer une valeur par défaut à chaque colonne.
Pour spécifier une valeur par défaut, ajoutez Default [value] après la définition du type de
données.

CREATE TABLE customer
(First_Name char(50),
Last_Name char(50),
Address char(50) default 'Unknown',
City char(50) default 'Mumbai',
Country char(25),
Birth_Date date)

Les contraintes
On peut limiter le type d’informations que doit contenir une table ou une colonne à l'aide de
CONSTRAINT.
Les contraintes les plus communes sont :
- NOT NULL
- UNIQUE
- CHECK
- Clé primaire
- Clé étrangère

NOT NULL
Une colonne accepte par défaut une valeur NULL. Pour rejeter la valeur NULL dans une
colonne, il faut définir une contrainte sur cette colonne.

                                              10
CREATE TABLE Customer
(SID integer NOT NULL,
Last_Name varchar (30) NOT NULL,
First_Name varchar(30));

UNIQUE
La contrainte UNIQUE garantit que toutes les valeurs d’une colonne ne peuvent comporter de
doublons.

CREATE TABLE Customer
(SID integer Unique,
Last_Name varchar (30),
First_Name varchar(30));

CHECK
La contrainte CHECK garanti que toutes les valeurs d’une colonne satisfont des conditions
données.
CREATE TABLE Customer
(SID integer CHECK (SID > 0),
Last_Name varchar (30),
First_Name varchar(30));
La colonne "SID" ne peut accepter que des entiers supérieurs à 0.

Clé primaire
La clé primaire peut représenter une partie d’un enregistrement concret, ou être un champ
artificiel. Elle peut représenter un ou plusieurs champs d’une table.
Lorsque la clé primaire représente plusieurs champs, elle est appelée « clé composite ».
Il est possible de spécifier les clés primaires au moment de la création de la table (à l’aide de
CREATE TABLE) ou de la modification de la structure de la table existante (par le biais de ALTER
TABLE).

Avec CREATE TABLE
MySQL:
CREATE TABLE Customer
(SID integer,
Last_Name varchar(30),
First_Name varchar(30),
PRIMARY KEY (SID));

Oracle, SQL Server:
CREATE TABLE Customer

                                               11
(SID integer PRIMARY KEY,
Last_Name varchar(30),
First_Name varchar(30));

Avec ALTER TABLE
ALTER TABLE Customer ADD PRIMARY KEY (SID);

Remarque : avant d’utiliser la commande ALTER TABLE pour ajouter une clé primaire, le
champ doit être 'NOT NULL', ce champ n’accepte pas de valeur NULL.

Clé étrangère
La clé étrangère représente un champ (ou des champs) qui pointe vers la clé primaire d’une
autre table. L’objectif de la clé étrangère est d’assurer l’intégrité référentielle des données.

Par exemple, nous avons deux tables, l’une appelée CUSTOMER qui inclut toutes les données
du client, et l’autre ORDERS qui comprend ses commandes.
La contrainte ici est que toutes les commandes doivent être associées à un client qui se trouve
déjà référencé dans la table CUSTOMER.
La structure de ces deux tables sera comme suit :

Table CUSTOMER

nom de colonne caractéristique

SID               Clé primaire

Last_Name

First_Name

Table ORDERS

nom de colonne caractéristique

Order_ID          Clé primaire

Order_Date

Customer_SID      Clé étrangère

Dans l’exemple ci-dessus, la colonne Customer_SID de la table ORDERS représente une clé
étrangère pointant vers la colonne SID de la table CUSTOMER.

                                              12
Avec CREATE TABLE
MySQL:
CREATE TABLE ORDERS
(Order_ID integer,
Order_Date date,
Customer_SID integer,
Primary Key (Order_ID),
Foreign Key (Customer_SID) references CUSTOMER(SID));

Oracle:
CREATE TABLE ORDERS
(Order_ID integer primary key,
Order_Date date,
Customer_SID integer references CUSTOMER(SID),
);

SQL Server:
CREATE TABLE ORDERS
(Order_ID integer primary key,
Order_Date datetime,
Customer_SID integer references CUSTOMER(SID),
);

Avec ALTER TABLE
MySQL:
ALTER TABLE ORDERS
ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(SID);

Oracle:
ALTER TABLE ORDERS
ADD (CONSTRAINT fk_orders1) FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(SID);

SQL Server:
ALTER TABLE ORDERS
ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(SID);

   •   ALTER TABLE
- Ajouter une colonne
- Supprimer une colonne
- Changer un nom de colonne
- Changer les types de données d’une colonne

                                           13
La syntaxe SQL de ALTER TABLE est :
ALTER TABLE "nom de table"
[alter spécifications]

[alter spécifications] dépend du type de modification à effectuer. Pour les utilisations
mentionnées ci-dessus, les instructions [alter specification] sont :
   •   Ajouter une colonne : ADD "colonne 1" "type colonne 1"
   •   Supprimer une colonne : DROP "colonne 1"
   •   Changer un nom de colonne : CHANGE "vieux column" "nouveau nom" "type"
   •   Changer le type de données d’une colonne : MODIFY "colonne 1" "nouveau type de
       données"

Pour ajouter une colonne appelée "Gender" (genre) à cette table, il faut saisir :
ALTER table customer add Gender char(1)

Pour renommer "Address" en "Addr", il suffit de saisir :
ALTER table customer change Address Addr char(50)

Pour changer le type de données pour "Addr" de char(50) à char(30):
ALTER table customer modify Addr char(30)

Finalement, pour supprimer la colonne "Gender", il suffit de saisir :
ALTER table customer drop Gender

La commande DROP TABLE
DROP TABLE "nom de table"

Pour supprimer les données tout en conservant la table on utilise la commande TRUNCATE
TABLE.
TRUNCATE TABLE "nom de table"

   •   INSERT INTO
Il existe deux manières pour INSÉRER des données dans une table : l’une consiste à insérer
des données une ligne à la fois, et l’autre plusieurs lignes à la fois.

Pour INSÉRER une ligne à la fois :

                                              14
INSERT INTO "nom de table" ("colonne 1", "colonne 2", ...)
VALUES ("valeur 1", "valeur 2", ...)

Ajout de plusieurs lignes à une table.

INSERT INTO "table1" ("column1", "column2", ...)
SELECT "column3", "column4", ...
FROM "table2"

Exemple
INSERT INTO vente (ville, montant, Date)
SELECT ville, montant, Date
FROM vente
WHERE Year(Date) = 1998

   • La commande UPDATE
UPDATE "nom de table"
SET "colonne 1" = [nouvelle valeur]
WHERE {condition}

Exemple
UPDATE vente
SET montant = 500
WHERE ville = "Los Angeles"
AND Date = "08-Jan-1999"

Il est aussi possible de mettre à jour plusieurs colonnes à la fois.
UPDATE "nom de table"
SET colonne 1 = [valeur 1], colonne 2 = [valeur 2]
WHERE {condition}

   •   La commande DELETE

DELETE FROM "nom de table"
WHERE {condition}

DELETE FROM vente
WHERE ville = "Los Angeles"

                                                15
16
Langage de manipulation de données : select
La commande SELECT permet d’extraire les informations d’une BD ou de calculer de nouvelles
données à partir d'existantes...

Syntaxe générale d'une commande SELECT :
SELECT [options] colonnes
FROM tables ou vues
[WHERE prédicats] (conditions)
[GROUP BY ordre des groupes]
[HAVING condition]
[ORDER BY ] liste de colonnes

       SELECT        Spécification des colonnes
       FROM          Spécification des tables sur lesquelles porte l'ordre
       WHERE         Filtre (critères) portant sur les données (colonnes)
       GROUP BY      Définition d'un groupe (sous ensemble)
       HAVING        Filtre portant sur les résultats
       ORDER BY      Tri des données du résultat

Remarque
Pour spécifier une valeur de type texte il faut l'entourer de guillemets simples ( 'texte' ).

   •    DISTINCT
Les résultats de la commande SELECT retourneront souvent des redondances. Pour ne
sélectionner que des éléments distinct on ajoute DISTINCT après SELECT.

SELECT DISTINCT "nom de colonne"
FROM "nom de table"

   •    ORDER BY : classement
Le classement peut se faire dans un ordre ascendant ou descendant, ou peut être établi par
des valeurs saisies en chiffres ou en lettres. Pour cela il est possible d’utiliser le mot-clé ORDER
BY.

SELECT "nom de colonne"
FROM "nom de table"
[WHERE "condition"]
ORDER BY "nom de colonne" [ASC, DESC]

                                                17
si la clause WHERE est présente, elle se trouvera avant la clause ORDER BY. La clause ASC ou
DESC provoque respectivement un tri des résultats dans un ordre ascendant ou descendant.
Par défaut, la clause ASC est implicitement appelée.

Il est possible d’ordonner par plusieurs colonnes. ORDER BY "nom de colonne 1" [ASC, DESC],
"nom de colonne 2" [ASC, DESC]

Remarque
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.

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

SELECT store_name, Sales, Date
FROM Store_Information
ORDER BY 2

L'opérateur AS
L'opérateur AS sert à donner un nom à de nouvelles colonnes créées par la requête.
On   peut   ajouter     autant   de   colonnes   qu'on   veut   en   utilisant   le   mot   clef   AS.

SELECT CLI_NOM as NOM, pre_cli as prenom
FROM     T_CLIENT

Where
SELECT "nom de colonne"
FROM "nom de table"
WHERE "condition"

                                                 18
Afficher tous les étudiants dont les numéros sont supérieurs à 100
SELECT *
FROM etudiant
WHERE numero > 100

And, Or
La condition de la clause where peut être une condition simple ou combinée. Les conditions
combinées se constituent de plusieurs conditions simples connectées par
AND ou OR.

SELECT "nom de colonne"
FROM "nom de table"
WHERE "condition simples"
[AND|OR] "condition simples"

Exemple
SELECT nom
FROM etudiant
WHERE ville ='casa' OR ville='Rabat'

BETWEEN
Le mot-clé BETWEEN permet de sélectionner un intervalle.
SELECT "nom de colonne"
FROM "nom de table"
WHERE "une colonne" BETWEEN valeur1 AND valeur2

Exemple
SELECT *
FROM Store_Information
WHERE Date BETWEEN '06-Jan-1999' AND '10-Jan-1999'

Pour access
select numero, nom, prenom
from etudiant
where date_nais BETWEEN #06-Jan-1999# AND #10-Jan-1999#

                                             19
IN
SELECT "nom de colonne"
FROM "nom de table"
WHERE "nom de colonne" IN ('valeur1', 'valeur2', ...)

Exemple
SELECT *
FROM etudiant
WHERE ville IN ('Los Angeles', 'San Diego')

Opérateurs mathématiques de base
On, peut utiliser les opérateurs mathématiques de base(,+,-, *, /,) pour combiner différentes
colonnes.

Exemple
SELECT ID, PRIX * 1.2 AS TARIF_TTC
FROM      produit

LIKE
LIKE permet d’effectuer une recherche basée sur un modèle qu’une spécification exacte de ce
qui est souhaité.

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 :
'AZ?Z' : toutes les chaînes commençant par 'AZ' et se terminant par 'Z'. Par exemple, 'AZIZ' et
'AZOZ' satisferaient la condition.
     •   'ABC*' : toutes les chaînes commençant par 'ABC'.
     •   '*XYZ' : toutes les chaînes terminant par 'XYZ'.
     •   '*AN*' : toutes les chaînes contenant le modèle 'AN' quelle que soit sa position.

Exemple
Pour rechercher tous les magasins dont le nom contient 'AN', il faut saisir :
SELECT *
FROM etudiant
WHERE ville LIKE '*AN*'

                                                20
Les fonctions
Utiliser des nombres :
        - AVG
        - COUNT
        - MAX
        - MIN
        - SUM
La syntaxe pour utiliser ces fonctions est :
SELECT "nom de fonction" ("nom de colonne") as nom
FROM "nom de table"

Par exemple, pour obtenir la somme de toutes les ventes de la table suivante :

Table vente

ville         montant Date

Los Angeles 1500 €       05-Jan-1999

San Diego     250 €      07-Jan-1999

Los Angeles 300 €        08-Jan-1999

Boston        700 €      08-Jan-1999

SELECT SUM(montant) as somme
FROM vente

Pour les données à type de caractères, plusieurs fonctions de chaînes sont disponibles, telles
que les fonctions de concaténation, de Trim et de sous-chaîne. Chaque fournisseur SGBDR
dispose de sa propre implémentation de fonctions de

   •    COUNT
Permet de compter le nombre de lignes incluses dans une table.
SELECT COUNT("nom de colonne")
FROM "nom de table"

Exemple
SELECT COUNT(ville)
FROM vente

Les clauses COUNT et DISTINCT peuvent être utilisées ensemble dans une instruction pour
obtenir le nombre d’entrées distinctes d’une table.

                                               21
Par exemple, pour déterminer le nombre des magasins différents, il faut saisir :

SELECT COUNT(DISTINCT ville)
FROM vente

Group by : fonctions d’agrégation.
SELECT "nom de colonne 1", SUM("nom de colonne 2")
FROM "nom de table"
GROUP BY "nom de colonne 1"

Pour retrouver les ventes totales de chaque magasin :
SELECT ville, SUM(montant)
FROM vente
GROUP BY ville

HAVING
Si on souhaite limiter la sortie basée sur les calculs correspondants (sur toute fonction
d’agrégation) on fait appel à la clause HAVING.
SELECT "nom de colonne 1", fonction("nom de colonne 2")
FROM "nom de table"
GROUP BY "nom de colonne 1"
HAVING (condition fonction)

Exemple
Visualiser uniquement les magasins dont le total des ventes est supérieur à 1 500 €.
SELECT ville, SUM(montant) as aaa
FROM vente
GROUP BY ville
HAVING aaa > 1500

Généralement, la clause HAVING est placée pratiquement en fin d’instruction SQL, avec
présence ou non de la clause GROUP BY.

Alias
Il existe deux types d’alias qui sont utilisés, alias de colonne et alias de table.

Les alias de colonne visent à améliorer la lisibilité d’une requête.

                                                 22
Dans l’exemple précédent, les ventes totales sont listées comme SUM(montant). Cette
procédure est facile à comprendre, mais lors des cas où l’en-tête de colonne peut être
compliqué (provoquant plusieurs opérations arithmétiques), l’utilisation d’un alias de colonne
permet de rendre le résultat beaucoup plus lisible.

Les alias de table s’obtiennent en plaçant directement un alias après le nom de table dans la
clause FROM.
Les alias sont très utiles lorsque vous souhaitez obtenir des informations de deux tables
séparées (le terme technique est 'perform joins').
SELECT "table alias"."nom de colonne 1" "colonne alias"
FROM "nom de table" "table alias"

Les deux types d’alias sont directement placés après les éléments qu’ils représentent, séparés
par un espace blanc.

Exemple
SELECT A1.ville, SUM(A1.montant) as T
FROM vente A1
GROUP BY A1.ville
Having T>1000

                                             23
Les jointures
Les jointures sont faites pour mettre en relation deux (ou plusieurs) tables visant à rechercher la
réponse à des interrogations. Une jointure permet donc de combiner les colonnes de plusieurs tables.
La plupart des jointures entre tables s'effectuent en imposant l'égalité des valeurs d'une colonne d'une
table à une colonne d'une autre table. On parle alors de jointure naturelle ou équi-jointure. On trouve
aussi des jointures d'une table sur elle-même. On parle alors d'auto-jointure.

On trouve aussi des jointures externes, c'est-à-dire joindre une table à une autre, même si la valeur de
liaison est absente dans une table ou l'autre.
Enfin, dans quelques cas, on peut procéder à des jointures hétérogènes, c'est-à-dire que l'on remplace
le critère d'égalité par un critère d'inégalité ou de différence.

Une jointure entre tables peut être mise en oeuvre, soit à l'aide des éléments de syntaxe SQL, soit à
l'aide de la clause JOIN (une clause spécifique du SQL).

Supposons que nous avons les deux tables suivantes :
 Table vente                                  Table Géographie

  ville        montant Date                   region ville

  Los                                         East     Boston
               1500 €    05-Jan-1999
  Angeles
                                              East     New York
  San Diego 250 €        07-Jan-1999
                                              West Los Angeles
  Los
               300 €     08-Jan-1999          West San Diego
  Angeles

  Boston       700 €     08-Jan-1999

    •     Afficher les ventes par région.
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 "ville "
SELECT A1.region REGION, A2.montant montant
FROM Geographie A1, vente A2
WHERE A1.ville = A2.ville

SELECT A1.num_etudiant, A1.nom, A2.note
FROM etudiant A1, notes A2
WHERE A1.num_etudiant = A2.num_etudiant;

Joindre plusieurs tables
Afficher le nom de l'étudiant et sa note par matière.

                                                  24
Remarque
Il est conseillé d'utiliser un opérateur de jointure normalisé (mot clef JOIN) que d'utiliser la
jointure dans where.

    Les jointures faites dans la clause WHERE (ancienne syntaxe) ne permettent pas de faire la
distinction, à première vue, entre ce qui relève du filtrage et ce qui relève de la jointure.

  La lisibilité des requêtes est plus grande en utilisant la syntaxe à base de JOIN, en isolant ce
qui est du filtrage et de la jointure.

Syntaxe normalisée des jointures
Les jointures normalisées s'expriment à l'aide du mot clef JOIN dans la clause FROM.

Opérateur de jointure naturelle
SELECT ...
FROM 
    NATURAL JOIN 
               [USING (colonne1 [, colonne2 ...])]

L'opérateur NATURAL JOIN permet d'éviter de préciser les colonnes concernées par la jointure.

Exemple
Afficher les noms et les notes des étudiants

Les jointures internes
Il s'agit de la plus commune des jointures et c'est cette jointure qui s'exerce par défaut si on
ne précise pas le type de jointure. On doit préciser le critère de jointure après le mot clef ON.

SELECT …
FROM table1 T1
    INNER JOIN table2 T2
        ON T1.colonne1=T2.colonne2

    •   SQL CROSS JOIN
Dans le langage SQL, la commande CROSS JOIN est un type de jointure sur 2 tables SQL qui permet
de retourner le produit cartésien.

                                                 25
Pour effectuer un jointure avec CROSS JOIN, il convient d’effectuer une requête SQL respectant la
syntaxe suivante:
SELECT *
FROM table1
CROSS JOIN table2

Méthode alternative pour retourner les mêmes résultats :
SELECT *
FROM table1, table2

    •    Jointures externes
Les jointures externes sont extrêmement pratiques pour rapatrier le maximum d'informations
disponible, même si des lignes de table ne sont pas renseignées entre les différentes tables
jointes.
La syntaxe de la jointure externe est la suivante :
SELECT ...
FROM 
    LEFT | RIGHT | FULL OUTER JOIN 
        ON 

Les mots clefs LEFT, RIGHT et FULL indiquent la manière dont le moteur de requête doit effectuer la
jointure externe.
Ils font référence à la table située à gauche (LEFT) du mot clef JOIN ou à la table située à droite (RIGHT).
Le mot FULL indique que la jointure externe est bilatérale.

SELECT …
FROM TGauche LEFT OUTER JOIN TDroite ON condition de jointure.

On recherche toutes les valeurs satisfaisant la condition de jointure précisée dans le prédicat, puis on
rajoute toutes les lignes de la table TGauche qui n'ont pas été prises en compte au titre de la
satisfaction du critère.

En général, la syntaxe dépend du SGBD utilisée.

Par exemple, dans Oracle, il faut placer un "(+)" dans la clause WHERE de l’autre côté de la
table dans laquelle nous souhaitons inclure toutes les lignes.

Pour trouver le montant des ventes de tous les magasins. Dans le cas d’une jointure régulière,
il n’est pas possible d’obtenir le critère de recherche souhaité étant donné que "New York"
n’apparaîtra pas dans la table Store_Information.

                                                    26
Par conséquent, il est nécessaire d’exécuter une jointure externe sur les deux tables ci-dessus
:

Table Geography

region_name Store_name

East           Boston

East           New York

West           Los Angeles

West           San Diego

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

Remarque
à défaut d’une correspondance dans la deuxième table, la valeur NULL sera retournée. Dans
ce cas, "New York" n’apparaîtra pas dans la table Store_Information, sa colonne "SALES"
correspondante contient une valeur NULL.

   •   Concaténation
Il est parfois nécessaire de combiner (concaténer) les résultats de plusieurs champs différents.
Chaque SGBD a sa propre méthode de concaténation:
   •   MySQL: CONCAT( )
   •   Oracle: CONCAT( ), ||
   •   SQL Server: +

Syntaxe :
CONCAT(str1, str2, str3, ...)

Remarque
Dans Oracle, la fonction CONCAT( ) ne permet que deux arguments. Mais '||', permet de
concaténer plus de deux chaînes.

                                              27
Exemple 1: MySQL/Oracle
SELECT CONCAT(region, ville) FROM Geographie
WHERE ville = 'Boston';

Exemple 2: Oracle
SELECT region || ' ' || ville FROM Geographie
WHERE ville = 'Boston';

Exemple 3: SQL Server
SELECT region+ ' ' + ville FROM Geographie
WHERE ville = 'Boston';

   •   Substring
La fonction de sous-chaîne en SQL est utilisée pour extraire une partie des données stockées.
Le nom de cette fonction diffère selon la base de données utilisée :
   •   MySQL: SUBSTR( ), SUBSTRING( )
   •   Oracle: SUBSTR( )
   •   SQL Server: SUBSTRING( )

Les utilisations les plus fréquentes :
SUBSTR(str,pos): sélectionne tous les caractères de  en commençant par position .

SUBSTR(str,pos,N): en commençant par le caractère  dans la chaîne , sélectionne
les N caractères suivants.

Exemple 1 :
SELECT SUBSTR(ville, 3)
FROM Geographie
WHERE ville= 'Los Angeles';

Exemple 2 :
SELECT SUBSTR(ville,2,4)
FROM Geographie
WHERE ville = 'San Diego';

   •   TRIM
La fonction TRIM permet de supprimer des préfixes ou suffixes spécifiques d’une chaîne de
caractères. Les modèles les plus fréquemment supprimés sont les espaces blancs.
Le nom de cette fonction diffère selon la base de données (SGBD) utilisée :

                                             28
•   MySQL: TRIM( ), RTRIM( ), LTRIM( )
   •   Oracle: RTRIM( ), LTRIM( )
   •   SQL Server: RTRIM( ), LTRIM( )

La syntaxe de ces fonctions Trim est :
TRIM([[LOCATION] [remstr] FROM ] str)

[LOCATION] (LEADING, TRAILING ou BOTH) : Cette fonction efface le modèle précisé par
[remstr] à partir du début ou de la fin de la chaîne de caractères, ou des deux. Si [remstr] n’est
pas spécifié alors les espaces blancs seront effacés.
LTRIM(str): Efface tous les espaces blancs situés en début de chaîne.
RTRIM(str): Efface tous les espaces blancs situés en fin de chaîne.

Exemples
SELECT TRIM(' Sample ');
SELECT LTRIM(' exemple ');
SELECT RTRIM(' exemple ');

Le retour de cette fonction permet d’obtenir uniquement le mot "Exemple" sans les espaces de
début et de fin.

   •   UNION
L’objectif de la commande UNION de SQL est de combiner les résultats de deux requêtes.
La commande UNION est similaire à la Jointure du fait qu’elles sont utilisées pour mettre en
liaison des informations provenant de plusieurs tables.

Remarque
Une restriction de UNION est que toutes les colonnes correspondantes doivent inclure le
même type de données.
Aussi, lors de l’utilisation de UNION, seules les valeurs distinctes sont sélectionnées (similaire
à SELECT DISTINCT).

La syntaxe est comme suit :
[instructions SQL 1]
UNIO
[instructions SQL 2]

Soit la table suivante vente_Internet

                                               29
Date          montant

07-Jan-1999 250 €

10-Jan-1999 535 €

11-Jan-1999 320 €

12-Jan-1999 750 €

Pour retrouver toutes les dates où il y a des ventes, il faut utiliser l’instruction SQL suivante :
SELECT Date FROM vente
UNION
SELECT Date FROM vente_Internet

Remarque
Avec «SELECT DISTINCT Date» pour les deux instructions SQL, nous obtiendrons le même jeu
de résultats.

   •   UNION ALL
L’objectif de la commande UNION ALL est aussi de combiner les résultats de deux requêtes
en sélectionnant toutes les valeurs (pas seulement des valeurs distinctes).

[instructions SQL 1]
UNION ALL
[instructions SQL 2]

Exemple
SELECT Date FROM vente
UNION ALL
SELECT Date FROM vente_Internet

   •   Intersection : INTERSECT
UNION agit comme un opérateur OR (la valeur est sélectionnée si elle apparaît dans la
première ou la deuxième instruction),

INTERSECT agit comme un opérateur AND (la valeur est sélectionnée seulement si elle
apparaît dans les deux instructions).

[instructions SQL 1]
INTERSECT
[instructions SQL 2]

                                                30
Trouver toutes les dates où il y a les deux types de ventes : au magasin et sur Internet.

SELECT Date FROM vente
INTERSECT
SELECT Date FROM vente_Internet

   •   MINUS
MINUS opère sur deux instructions SQL. Elle prend tous les résultats de la première instruction
SQL, puis soustrait ceux de la deuxième instruction SQL pour obtenir la réponse finale.

[instructions SQL 1]
MINUS
[instructions SQL 2]

Exemple :

Trouver toutes les dates où il y a des ventes au magasin, mais pas sur Internet.

SELECT Date FROM vente
MINUS
SELECT Date FROM vente_Internet
Certains SGBD peuvent utiliser EXCEPT au lieu de MINUS.

                                              31
Les Sous-requête

Il est possible d’imbriquer une instruction SQL dans une autre.
La partie de la deuxième select est considérée comme "requête interne", alors que la partie
de la première est considérée comme "requête externe".

Une requête (requête interne) peut être imbriquée dans la clause FROM d'une autre requête
(requête externe).

SELECT *
FROM
(
SELECT …
FROM MaTable
) TableReponse
TableReponse est le renommage en table du résultat de la requête, car la clause FROM doit
porter sur des tables nommées.

Exemple
select nom, prenom
from (
select * from etudiant
)T

Sous-requêtes renvoyant une seule valeur
Dans le cas des sous-requêtes ne renvoyant qu'une valeur unique, on peut l'utiliser comme
champ.

A la place de colonnes, on peut placer des sous-requêtes dans la clause SELECT, voir même
combiner par une opération, une colonne et une sous-requête.

Dans la clause SELECT
Afficher l'écart du montant par rapport à la moyenne des montants par date.

SELECT date, montant - (
           SELECT AVG(montant)
         FROM vente) AS MOYENNE
FROM vente

                                             32
GROUP BY date
Dans les filtres WHERE et HAVING
C'est l'endroit le plus classique pour placer une sous-requête.
Quelles sont les ventes au 01/01/2000 qui ont un prix voisin à + 10 ou - 10 € de la moyenne
des                                                                                     prix.
SELECT ville, montant
   FROM vente
   WHERE montant - (
       SELECT AVG(montant)
            FROM vente) BETWEEN -10 AND 10
   AND DATE = '2000-01-01'

   •    Afficher les étudiants dont la note est supérieure à la moyenne.

Sous-requêtes renvoyant une liste (Opérateurs IN, ALL et
ANY(SOME) )
Une liste de valeurs ne peut être utilisée comme critère de comparaison que par des
opérateurs                                                                      spécialisés.
C'est le cas de l'opérateur IN, mais aussi des opérateurs ALL et ANY (ou SOME).

SELECT " colonne 1", "nom de colonne 2",..
FROM " table 1"
WHERE "nom de colonne" [opérateur de comparaison: IN, ALL, ANY]
(SELECT "nom de colonne"
FROM "nom de table 2"
WHERE [condition])

Dans le prédicat IN
Une requête renvoyant une seule colonne avec plusieurs valeurs peut être imbriquée dans le
prédicat IN de la première requête, mais aussi dans les prédicats ALL, SOME(ANY).

SELECT *
FROM Matable
WHERE uneColonne IN (SELECT colonne FROM MaTable )

Exemple
En utilisant une sous-requête, trouver le total des ventes de tous les magasins dans la région
West (Ouest).

                                              33
SELECT SUM(montant) FROM vente
WHERE ville IN
(SELECT ville FROM Geographie
WHERE region = 'West')

Une requête renvoyant une valeur unique peut être imbriquée partout où une constante peut
figurer...
SELECT *
FROM MaTable
WHERE MaColonne =
(SELECT AVG(colonne)
FROM UneTable)

SELECT COUNT(*), MaColonne
FROM MaTable
GROUP BY MaColonne
HAVING COUNT(*) = (SELECT …FROM UneTable)

Exemple
Afficher les étudiants dont la note est inférieure à la moyenne.
select *
from notes
where note> ( SELECT avg(note) FROM notes )

Une requête renvoyant des valeurs ou pas peut être imbriquée dans un prédicat EXISTS,
UNIQUE et MATCH.

EXISTS
Cet opérateur teste si la requête interne retourne une ligne au moins.
Si elle le fait, la requête externe peut s’exécuter. Sinon, elle ne s’exécutera pas, et l’instruction
SQL entière ne retournera aucun résultat.

SELECT "nom de colonne 1"
FROM "nom de table 1"
WHERE EXISTS
(SELECT *
FROM "nom de table 2"
WHERE [condition])

                                                 34
Exemple
SELECT SUM(montant) FROM vente
WHERE EXISTS
(SELECT * FROM Geographie
WHERE region = 'West')

   •   Sous-requête corrélée
Si la requête interne dépend de la requête externe, nous aurons une sous-requête corrélée.

Trouver les clients qui ont un prénom en commun. Autrement dit pour qu'un client soit
sélectionné, il faut qu'un autre client porte le même prénom.

Une première idée consiste à faire :
SELECT ID, NOM, PRENOM
FROM CLIENT
WHERE PRENOM IN
       (SELECT PRENOM
              FROM CLIENT)

La réponse donne tous les clients
Pour avoir une réponse correcte il faut retirer dans la sous-requête la référence au client que
l'on scrute dans la requête principale.

SELECT ID, NOM, PRENOM
FROM CLIENT C1
WHERE PRENOM IN
       (SELECT PRENOM
              FROM CLIENT C2
              WHERE C1.ID  C2.ID)

Ou avec l'opérateur exists :

       SELECT ID, NOM, PRENOM
       FROM CLIENT C1
       WHERE EXISTS (
              SELECT *

                                              35
FROM CLIENT C2
                          WHERE C1. ID  C2. ID
                          AND C1. PRENOM = C2. PRENOM )

Remarque
Remplacer exists par UNIQUE

    •   CASE
SELECT CASE ("nom de colonne")
WHEN "condition1" THEN "résultat1"
WHEN "condition2" THEN "résultat2"
...
[ELSE "résultatN"]
END
FROM "nom de table"

La "condition" peut être une valeur ou une expression statique. La clause ELSE est optionnelle.

Exemple
Pour multiplier le montant des ventes de 'Los Angeles' par 2 et le montant des ventes de 'San
Diego' par 1,5, il faut saisir :

SELECT ville, CASE (ville)
WHEN 'Los Angeles' THEN montant * 2
WHEN 'San Diego' THEN montant * 1.5
ELSE montant
END
"Nouvelles Ventes",
Date
FROM vente

"Nouvelles Ventes" est le nom donné à la colonne avec l’instruction CASE.

SELECT id, nom, prix_unitaire, quantite,
 CASE
  WHEN quantite=1 THEN prix_unitaire
  WHEN quantite >1 THEN prix_unitaire*2
  ELSE prix_unitaire/2
 END
FROM achat

                                               36
37
38
39
Vous pouvez aussi lire