Vous êtes sur la page 1sur 40

Le Langage SQL (1)

 INTRODUCTION

 Le sigle SQL signifie "Structured Query Language", soit en français


"Langage de recherche structuré".

 Le SQL est un langage structuré de requêtes qui permet de


créer, de modifier et gérer des informations dans des BDR

 Il a été développé par IBM au cours des années 70 et son


nom était SEQUEL, abréviation de Structured English
QUEry Language
1
Le Langage SQL (2)

 SQL a été normalisé par l'ANSI (American National Standards

Institute) et par l'ISO (International Organization for


Standardization).

 Cette normalisation a donné naissance à une 1ère version


(SQL1) en 1987 puis à une 2ème version (SQL2) en 1992

 Une troisième norme (SQL3) est en cours de rédaction depuis 1999


par l'ANSI et l'ISO,
2
Le Langage SQL (3)
 Malgré la normalisation ISO, il existe plusieurs variantes de

SQL sur le marché car chaque éditeur de SGBDR tente d’étendre


le standard pour accroître l’attrait commercial de son produit
 Une requête en SQL commence par les mots clés: SELECT,
DELETE, UPDATE, INSERT INTO, CREATE et DROP
 Chaque requête SQL doit obligatoirement se terminer par un
Point Virgule

 On distingue 2 types de requêtes: Actions et Sélections


3
Le Langage SQL (4)

I. Requêtes Actions
 Sont des requêtes qui permettent de créer des tables, d’ajouter, de
supprimer des enregistrements d’une table, d’ajouter une colonne…

 L’instruction CREATE TABLE permet de créer une nouvelle table


Syntaxe
1. Création d’une table avec un seul champ comme clé primaire

CREATE TABLE Nom_table (champ1 type CONSTRAINT


nom_contrainte PRIMARY KEY, champ2 type [NOT NULL], …,
champN type [NOT NULL]);
4
Le Langage SQL (5)
2. Création d’une table avec plusieurs champs comme clé primaire

CREATE TABLE Nom_table (champ1 type [NOT NULL],


champ2 type [NOT NULL], …, champN type, CONSTRAINT
nom_contrainte PRIMARY KEY (champ1, champ2,…)) );
/* Créez une requête SQL permettant de créer la table EMPLOYES ( Nemployé,
Nom, Prénom, Fonction, Adresse, Codeville) tels que le 1er champ est de type entier
les autres de type texte ayant respectivement une taille de: 25, 20, 15 et 50.
Tandis que le champ Codeville est de type Entier long */
CREATE TABLE EMPLOYES ( Nemployé INTEGER CONSTRAINT nom_index
PRIMARY KEY, Nom TEXT(25), Prénom TEXT(20), Fonction TEXT(15),
Adresse TEXT(50), Codeville LONG) ) ;
5
Le Langage SQL (6)

 Les conventions relatives aux noms des tables et des champs varient quelque
peu d'un SGBD à l'autre. En ce qui concerne plus particulièrement les champs:
 Le nombre de caractères ne doit pas être trop grand (64 dans Access, 18 à 30
dans d'autres SGBD) ;

 Seuls les lettres, les nombres et le caractère de soulignement sont autorisés.


Access admet les caractères accentués. Il admet aussi l'espace, mais le nom du
champ doit alors être écrit entre crochets ;
 Certains SGBD requièrent que le nom d'un champ commence par une lettre,
mais ce n'est pas le cas d'Access ;
6
Le Langage SQL (7)
 Les termes faisant partie du vocabulaire du langage SQL sont interdits ("date"
par exemple). Ce sont les mots réservés.
 Voici un échantillon représentatif des différentes façons d'exprimer un type
de données lors de la création d'une table en SQL dans Access :

 Booléen (Oui / Non) : BIT ;


 Nombre entier : SHORT (entier), SMALLINT (entier), LONG (entier long),
INTEGER (entier long), BYTE (octet) ;

 Nombre réel : SINGLE (réel simple), DOUBLE (réel double), NUMERIC


(réel double) ;
7
Le Langage SQL (8)
 Monétaire : CURRENCY, MONEY ;
 Date/Heure : DATE, TIME, DATETIME ;

 Texte : VARCHAR (255 caractères), CHAR(n) ou TEXT(n) (n caractères),


LONGTEXT (mémo, 65 535 caractères =32K max.) ;
 Fichier binaire : LONGBINARY (Objet OLE) ;
 Compteur : COUNTER (NuméroAuto).
Remarque:
On notera qu'il n'est pas possible de créer un champ de type hypertexte via
une commande SQL dans Access. Même remarque en ce qui concerne les
listes de choix.
8
Le Langage SQL (9)
/* Créez une requête SQL permettant de créer la table DETAILS ( Ncommande,
Réf, Pu,Quantité, Remise) tels que les champs sont de type respectivement:
entier long, texte de taille 30, monétaire, entier et réel simple et tel que aussi les
champs Pu & Quantité sont non nuls*/

CREATE TABLE DETAILS ( Ncommande Integer, Réf Char(30),


Pu Currency NOT NULL, Quantité Smallint NOT NULL, Remise Single,
CONSTRAINT nom_index PRIMARY KEY ( Ncommande, Réf ) ) ;
 L’instruction ALTER TABLE permet d’ajouter ou de supprimer
un seul champ à une table. Elle permet aussi la création et la suppression
des liens entre les tables d’une base de données.
9
Le Langage SQL (10)
/* Créez une requête SQL permettant de créer la table VILLES ( Codeville, Ville)
tels que le 1er champ est de type NuméroAuto et le deuxième est de type texte
ayant une taille de 20*/

CREATE TABLE VILLES ( Codeville Counter CONSTRAINT nom_index


PRIMARY KEY, Ville Text(20) ) ;

/* Modifiez la table EMPLOYES en déclarant le champ "CodeVille" comme


clé étrangère, puis créez un lien nommé lien_ville sur le champ
CodeVille, en précisant que le côté 1 du lien est le champ Code_Ville
de la table VILLES .*/
10
Le Langage SQL (11)

ALTER TABLE EMPLOYES ADD CONSTRAINT Lien_ville


FOREIGN KEY (Code_Ville) REFERENCES VILLES (Code_Ville);

/* Supprimer le lien nommé lien_ville existant entre la table EMPLOYES et


la table VILLES selon le champ Codeville.*/

ALTER TABLE EMPLOYES DROP CONSTRAINT Lien_ville;

/* Créez une requête SQL permettant d’ajouter le champ Codecli à la table


DETAILS. Ce champ est de type texte, de taille 20 caractères et il est non nulle

ALTER TABLE DETAILS ADD COLUMN Codecli TEXT(20) NOT NULL;

11
Le Langage SQL (12)

/* Créez une requête SQL permettant de supprimer le champ Codecli de la table


DETAILS.

ALTER TABLE DETAILS DROP COLUMN Codecli ;

 L’instruction DROP TABLE permet de supprimer une table d’une base


de données

Syntaxe
DROP TABLE Nom_table ;

12
Le Langage SQL (13)
/* Créez une requête SQL permettant de supprimer la table DETAILS
définitivement de la base de données

DROP TABLE DETAILS ;

Soit la table ACTEURS créée sous ACCESS:


ACTEURS (N_act, Nom, Prénom, Nationalité, Salaire, Age, Films)

 L’instruction DELETE permet d’effacer des enregistrements d’une


table

/* Effacez tous les enregistrements de la table ACTEURS*/

13
Le Langage SQL (14)

DELETE * FROM ACTEURS ;

(Ou bien )

DELETE N_act FROM ACTEURS ;

/* Effacez tous les acteurs de nationalité marocaine*/

DELETE * FROM ACTEURS WHERE Nationalité= "marocaine";

 L’instruction UPDATE permet la mise à jour d’une table

 Syntaxe : UPDATE table SET nouvellesvaleurs WHERE critères ;


14
Le Langage SQL (15)
/* Créez une requête permettant de modifier l’adresse de l'employé numéro 10
tout en sachant que la nouvelle adresse sera "10 Avenue Mohamed VI, Tanger"*/

UPDATE EMPLOYES SET Adresse = "10 Avenue Mohamed VI, Tanger"


WHERE Nemployé = 10 ;

/* Créez une requête permettant d’augmenter de 3% le salaire de tous les


acteurs */

UPDATE ACTEURS SET Salaire = Salaire * 1.03 ;

 L’instruction INSERT INTO permet d’ajouter un ou plusieurs


enregistrements à une table
15
Le Langage SQL (16)

Syntaxe
1. Requête ajout d’un seul enregistrement
INSERT INTO Nom_table [(champ1, champ2, …)]
VALUES (valeur1, valeur2, …) ;
2. Requête ajout de plusieurs enregistrements
INSERT INTO Nom_table 1 [IN externaldatabase] (Champ1, Champ2, …)
SELECT (Champ1, Champ2, …)
FROM Nom_table 2 ;

16
Le Langage SQL (17)
/* Créez une requête permettant d’ajouter l’enregistrement suivant dans
la table EMPLOYES: (100, BEN AZOUZ, Aziz, Ingénieur, 90050) */

INSERT INTO EMPLOYES (Nemployé, Nom, Prénom, Fonction, Codeville)


VALUES (100, "BEN AZOUZ", "Aziz", "Ingénieur", 90050) ;
/* Soit la table NOUVEAUX_EMPLOYES (Nemployé, Nom, Prénom, Fonction, Adr,
Codeville) Supposons que cette table contient des enregistrements. Question:
Ajoutez tous les enregistrements de la table ci-dessus dans la table EMPLOYES*/
INSERT INTO EMPLOYES
SELECT * FROM NOUVEAUX_EMPLOYES ;

17
Le Langage SQL (18)

I. Requête SELECTION

 Une requête de type SELECTION permet d'interroger une base


de données En la laissant intacte (sans la modifier)

 Le résultat d’une telle requête est renvoyé sous forme d’une table
formée d’un ou plusieurs attributs.

18
Le Langage SQL (3)
Syntaxe

SELECT [Prédicat]
{* / table.* /[table.attribut1 As alias1], [table.attribut2 As alias2], …}
FROM Liste de table [IN externaldatabase]
[WHERE Critère de sélection]
[GROUP BY Liste des attributs]
[HAVING Critère de sélection]
[ORDER BY Critère d’ordre]
19
Le Langage SQL (4)
Remarques
 [ ] signale une clause optionnelle, c.à.d on peut utiliser la requête SELECT
sans cette clause
 Chaque instruction SQL doit se terminer par un point-virgule

Elément Description
Prédicat L’un des prédicats suivants: ALL, DISTINCT,
DISTINCTROW ou TOP. Les prédicats permettent de limiter le
nombre d’enregistrement renvoyés. ALL est choisi par défaut
* Indique que tous les champs de la ou des tables spécifiées seront
sélectionnés
20
Le Langage SQL (5)

Elément Description

table Nom de la table contenant les champs dans lesquels les


enregistrements sont sélectionnés

attribut1, attribut2 Noms des champs contenant les données à extraire.

alias1, alias2 Utilisés pour renommer un attribut

externaldatabase Nom de la base de données contenant les tables si

elles ne se trouvent pas dans la base de données en cours

21
Le Langage SQL (6)
Exemple 1
Soit la table ACTEURS créée sous ACCESS:
ACTEURS (N_act, Nom, Prénom, Nationalité, Salaire, Age, Films)

/* Afficher tous les champs et tous les enregistrements de la table ACTEURS*/

SELECT * FROM ACTEURS;


/* Afficher uniquement le Nom et Prénom de chaque Acteur */

SELECT Nom, Prénom FROM ACTEURS;


/* Afficher les différentes nationalités sans doublons même si plusieurs acteurs
ont la même nationalité */

SELECT DISTINCT Nationalité FROM ACTEURS;


22
Le Langage SQL (7)
/* Afficher les 3 premiers acteurs de la table ACTEURS */

SELECT TOP 3 * FROM ACTEURS;


/* Afficher 50% des acteurs de la table ACTEURS*/

SELECT TOP 50 PERCENT * FROM ACTEURS;

 Avec l’instruction SELECT, il est possible d’utiliser les fonctions


suivantes pour effectuer des calculs:
SUM () renvoie la somme d’un champ
AVG () renvoie la moyenne d’un champ
MAX () renvoie la valeur maximale d’un champ
MIN () renvoie la valeur minimale d’un champ
COUNT (*) renvoie le nombre d’enregistrements de la table
23
Le Langage SQL (8)
/* Afficher le nombre totale d’enregistrement de la table ACTEURS */

SELECT COUNT(*) FROM ACTEURS;


/* Afficher le nombre totale d’enregistrement de la table ACTEURS et nommer
le champ retourné Nombre totale*/

SELECT COUNT(*) As [Nombre Totale] FROM ACTEURS;

/* Afficher le nombre d’enregistrement de la table ACTEURS qui ont une entrée dans
le champ Nom et nommer le champ retourné Nombre d’entrée*/

SELECT COUNT(Nom) As [Nombre d’entrée] FROM ACTEURS;

24
Le Langage SQL (9)
/* Afficher le totale des salaires de la table ACTEURS et nommer le champ
retourné Totale des salaires */

SELECT SUM(Salaire) As [Totale des salaires] FROM ACTEURS;


/* Afficher la moyenne des salaires de la table ACTEURS et nommer
le champ retourné Moyenne des salaires*/

SELECT AVG(Salaire) As [Moyenne des salaires] FROM ACTEURS;

/* Afficher le salaire le plus élevé de la table ACTEURS et nommer le champ retourné


Salaire maximal*/

SELECT MAX(Salaire) As [Salaire maximal] FROM ACTEURS;

25
Le Langage SQL (10)
/* Afficher l’âge de l’acteur le plus jeune et nommer le champ retourné Age minimal */
SELECT MIN(Age) As [Age minimal] FROM ACTEURS;
Les éléments de la clause WHERE
 Ils permettent de définir la condition dans cette clause. La clause peut
être accompagnée des opérateurs logiques AND, OR ou NOT
Comparaison à une valeur (=, <, >, >=, <=, <>)
Comparaison à une fourchette de valeurs (BETWEEN … AND)
Comparaison à une liste de valeur ( IN (. , . ,...) )
Comparaison à un filtre (LIKE)
Test "tous" ou "au moins" (ALL, ANY/SOME)
Test existentiel (EXISTS)
26
Le Langage SQL (11)
/* Afficher tous les noms d’acteur dont l’âge est supérieur à 25*/
SELECT Nom FROM ACTEURS WHERE Age >= 25;
/* Afficher tous les noms d’acteur dont la nationalité est américaine et l’âge est
supérieur à 25*/
SELECT Nom FROM ACTEURS
WHERE (Nationalité="américaine") AND (Age >= 25);
/* Afficher tous les noms d’acteur dont la nationalité est américaine ou l’âge est
supérieur à 25*/
SELECT Nom FROM ACTEURS
WHERE (Nationalité="américaine") OR (Age >= 25);
/* Afficher les acteurs dont l’âge est entre 35 et 50 */
SELECT * FROM ACTEURS WHERE Age BETWEEN 35 AND 50;
27
Le Langage SQL (12)
/* Afficher tous les acteurs dont la nationalité est américaine, française ou marocaine*/
SELECT * FROM ACTEURS
WHERE Nationalité IN ("américaine","française", "marocaine");
/* Afficher tous les noms d’acteurs qui commencent par "DE" */

SELECT Nom FROM ACTEURS WHERE Nom LIKE "DE*";


/* Afficher tous les noms d’acteur ne commençant pas par D et ayant 4 lettres */
SELECT Nom FROM ACTEURS
WHERE Nom NOT LIKE "D*" AND Nom LIKE "????";
/* Afficher le nom d’acteur le plus âgé */
SELECT Nom FROM ACTEURS
WHERE Age >= ALL (SELECT Age FROM ACTEURS );
28
Le Langage SQL (13)
/* Afficher le nom d’acteur le plus jeune*/
SELECT Nom FROM ACTEURS
WHERE Age <= ALL (SELECT Age FROM ACTEURS);
Exemple 2
Soit les tables PRODUITS, COMMANDES, DETAILS et EMPLOYES créées sous
ACCESS:
PRODUITS (Réf , Nompr, Nfournisseur, Pu)
COMMANDES(Ncommande, Codecli, Nemployé, Date commande)
DETAILS(Ncommande, Réf , Quantité, Remise)
EMPLOYES(Nemployé, Nom, Prénom, Fonction, Adresse, Ville)

29
Le Langage SQL (14)
Les éléments de la clause FROM

/* Afficher tous les produits (Réf, Nompr) qui ont été vendus*/

SELECT PRODUITS.Réf, Nompr FROM PRODUITS INNER JOIN DETAILS

ON PRODUITS.Réf = DETAILS.Réf ;

(Ou bien )

SELECT PRODUITS.Réf, Nompr FROM PRODUITS, DETAILS

WHERE PRODUITS.Réf = DETAILS.Réf ;

30
Le Langage SQL (14)
Les jointures

La clause INNER JOIN a fait son apparition avec la version 2 de SQL,


parce que le besoin s'était de préciser à quel type de jointure
appartenait une relation. Plus précisément, on distingue :

la jointure interne, qui utilise INNER JOIN. Ne sont incluses dans le


résultat final que les lignes qui se correspondent dans les deux tables. Ce
cas est celui que nous avons traité précédemment ;

la jointure externe gauche, dans laquelle INNER JOIN est remplacé par
LEFT JOIN. Toutes les lignes de la première table sont incluses dans le
résultat de la requête, même s'il n'existe pas de ligne correspondante
dans la seconde table ;

31
Le Langage SQL (15)
la jointure externe droite, dans laquelle INNER JOIN est remplacé par
RIGHT JOIN. Toutes les lignes de la seconde table sont incluses dans le
résultat de la requête, même s'il n'existe pas de ligne correspondante dans la
première table.
/* Afficher tous les produits (Réf, Nompr, Mois de vente) qui ont été
vendus pendant le mois 6*/
SELECT PRODUITS. Réf, Nompr, Month ([Date commande]) AS [Mois de vente]
FROM PRODUITS INNER JOIN (DETAILS INNER JOIN COMMANDES
ON DETAILS. Ncommande = COMMANDES . Ncommande )
ON PRODUITS . Réf = DETAILS . Réf,
WHERE Month ([Date commande]) =6 ;

(Ou bien )
32
Le Langage SQL (16)

SELECT PRODUITS.Réf, Nompr, Month ([Date commande]) AS [Mois de vente]

FROM PRODUITS, DETAILS, COMMANDES

WHERE PRODUITS.Réf = DETAILS .Réf AND

DETAILS.Ncommande = COMMANDES . Ncommande

AND Month ([Date commande]) =6;

33
Le Langage SQL (17)

/* Afficher tous les produits dont le prix unitaire est supérieur au prix d’au
moins d’un produit vendu avec une remise de 25%*/

SELECT Réf, Nompr FROM PRODUITS


WHERE Pu >= ANY ( SELECT Pu FROM DETAILS Inner Join PRODUITS
ON PRODUITS.Réf=DETAILS.Réf
WHERE Remise = 0.25 );

34
Le Langage SQL (18)

/* Afficher tous les produits (Réf, Nompr) qui ont été vendus par ordre
décroissant selon le champ Réf*/

SELECT PRODUITS. Réf, Nompr


FROM PRODUITS , DETAILS
WHERE PRODUITS. Réf = DETAILS . Réf
ORDER BY PRODUITS.Réf DESC;

Remarque
 Par défaut, le résultat d’une requête sélection est trié selon l’ordre
croissant du premier attribut qui figure dans la clause SELECT
35
Le Langage SQL (19)
 On pourra changer temporairement les noms des tables et de travailler
avec lors de création d’une requête de type sélection

Exemple
/* Afficher tous les produits (Réf, Nompr) qui ont été vendus par ordre
décroissant selon le champ Réf*/

SELECT T1.Réf, Nompr


FROM PRODUITS AS T1 , DETAILS AS T2

WHERE T1.Réf = T2.Réf


ORDER BY T1.Réf DESC;
36
Le Langage SQL (20)

Ncommande Réf Quantité Remise


1 R1 10 0.6
1 R2 20 0.6
2 R1 15 0.5 DETAILS
2 R3 10 0.6
2 R6 25 0.9
3 R3 5 0.6
3 R7 65 0.1
3 R8 10 0.6
37
Le Langage SQL (20)
/* Afficher pour chaque commande le totale de quantités des produits vendus*/

SELECT Ncommande, SUM(Quantité) AS [Totale quantités vendues]


FROM DETAILS
GROUP BY Ncommande ;
/* Afficher pour chaque commande le totale de quantités des produits vendus
et tel que ce totale est > 60 */

SELECT Ncommande, SUM(Quantité) AS [Totale quantités vendues]


FROM DETAILS
GROUP BY Ncommande
HAVING SUM(Quantité) > 60 ;

38
Le Langage SQL (21)
/* Afficher les commandes qui contiennent plus que 3 produits (>=3)*/
SELECT Ncommande, COUNT(Réf) AS [Nombre de produits]
FROM DETAILS
GROUP BY Ncommande
HAVING COUNT(Réf) >=3 ;
/* Afficher pour chaque commande le totale de quantités des produits vendus avec
une remise de 6% et tel que ce totale est > 60 */
SELECT Ncommande, SUM(Quantité) AS [Totale quantités vendues]
FROM DETAILS
WHERE Remise=0.6
GROUP BY Ncommande
HAVING SUM(Quantité) > 60 ; 39
Le Langage SQL (21)
/* Afficher les employés qui ont vendu plus de 100 commandes*/
SELECT Nemployé, COUNT(Ncommande) AS [Nombre de commandes vendues]
FROM COMMANDES
GROUP BY Nemployé
HAVING COUNT(Ncommande) > 100 ;
/* Afficher les employés de la ville d’Asilah qui ont vendu plus de 100 commandes*/
SELECT EMPLOYES.Nemployé, COUNT(*) AS [Nombre de commandes vendues]
FROM COMMANDES, EMPLOYES
WHERE EMPLOYES.Nemployé=COMMANDES.Nemployé AND Ville ="Asilah"
GROUP BY EMPLOYES.Nemployé
HAVING COUNT(*) > 100 ;
40