1
Le Langage SQL(1)
Le Langage SQL (1)
INTRODUCTION
Le SQL est un langage structuré de requêtes qui permet de
créer, de modifier et gérer des informations dans des BDR
Le sigle SQL signifie "Structured Query Language", soit en français
"Langage de recherche structuré".
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
2.
2
Le Langage SQL(2)
Le Langage SQL (2)
SQL a été normalisé par l'ANSI (American National Standards
Institute) et par l'ISO (International Organization for
Standardization).
Une troisième norme (SQL3) est en cours de rédaction depuis 1999
par l'ANSI et l'ISO,
Cette normalisation a donné naissance à une 1ère version
(SQL1) en 1987 puis à une 2ème version (SQL2) en 1992
3.
3
Le Langage SQL(3)
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
4.
4
Le Langage SQL(4)
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
CREATE TABLE Nom_table (champ1 type CONSTRAINT
nom_contrainte PRIMARY KEY, champ2 type [NOT NULL], …,
champN type [NOT NULL]);
1. Création d’une table avec un seul champ comme clé primaire
5.
5
Le Langage SQL(5)
Le Langage SQL (5)
CREATE TABLE Nom_table (champ1 type [NOT NULL],
champ2 type [NOT NULL], …, champN type, CONSTRAINT
nom_contrainte PRIMARY KEY (champ1, champ2,…)) );
2. Création d’une table avec plusieurs champs comme clé primaire
/* 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) ) ;
6.
6
Le Langage SQL(6)
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 ;
7.
7
Le Langage SQL(7)
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.
Booléen (Oui / Non) : BIT ;
Nombre entier : SHORT (entier), SMALLINT (entier), LONG (entier long),
INTEGER (entier long), BYTE (octet) ;
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 :
Nombre réel : SINGLE (réel simple), DOUBLE (réel double), NUMERIC
(réel double) ;
8.
8
Le Langage SQL(8)
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.
9.
9
Le Langage SQL(9)
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.
10.
10
Le Langage SQL(10)
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 .*/
11.
11
Le Langage SQL(11)
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;
12.
12
Le Langage SQL(12)
Le Langage SQL (12)
L’instruction DROP TABLE permet de supprimer une table d’une base
de données
/* Créez une requête SQL permettant de supprimer le champ Codecli de la table
DETAILS.
ALTER TABLE DETAILS DROP COLUMN Codecli ;
Syntaxe
DROP TABLE Nom_table ;
13.
13
Le Langage SQL(13)
Le Langage SQL (13)
Soit la table ACTEURS créée sous ACCESS:
ACTEURS (N_act, Nom, Prénom, Nationalité, Salaire, Age, Films)
/* Créez une requête SQL permettant de supprimer la table DETAILS
définitivement de la base de données
DROP TABLE DETAILS ;
L’instruction DELETE permet d’effacer des enregistrements d’une
table
/* Effacez tous les enregistrements de la table ACTEURS*/
14.
14
Le Langage SQL(14)
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 ;
15.
15
Le Langage SQL(15)
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
16.
16
Le Langage SQL(16)
Le Langage SQL (16)
1. Requête ajout d’un seul enregistrement
INSERT INTO Nom_table [(champ1, champ2, …)]
VALUES (valeur1, valeur2, …) ;
Syntaxe
2. Requête ajout de plusieurs enregistrements
INSERT INTO Nom_table 1 [IN externaldatabase] (Champ1, Champ2, …)
SELECT (Champ1, Champ2, …)
FROM Nom_table 2 ;
17.
17
Le Langage SQL(17)
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 ;
18.
18
Le Langage SQL(18)
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.
19.
19
Le Langage SQL(3)
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]
20.
20
Le Langage SQL(4)
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
21.
21
Le Langage SQL(5)
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
22.
22
Le Langage SQL(6)
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;
23.
23
Le Langage SQL(7)
Le Langage SQL (7)
/* Afficher 50% des acteurs de la table ACTEURS*/
SELECT TOP 50 PERCENT * FROM ACTEURS;
/* Afficher les 3 premiers acteurs de la table ACTEURS */
SELECT TOP 3 * 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
24.
24
Le Langage SQL(8)
Le Langage SQL (8)
/* 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 totale d’enregistrement de la table ACTEURS */
SELECT COUNT(*) 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;
25.
25
Le Langage SQL(9)
Le Langage SQL (9)
/* 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 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 le salaire le plus élevé de la table ACTEURS et nommer le champ
retourné
Salaire maximal*/
SELECT MAX(Salaire) As [Salaire maximal] FROM ACTEURS;
26.
26
Le Langage SQL(10)
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)
27.
27
Le Langage SQL(11)
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;
28.
28
Le Langage SQL(12)
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 );
29.
29
Le Langage SQL(13)
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)
30.
30
Le Langage SQL(14)
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 ;
SELECT PRODUITS.Réf, Nompr FROM PRODUITS, DETAILS
WHERE PRODUITS.Réf = DETAILS.Réf ;
(Ou bien )
31.
31
Le Langage SQL(14)
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 ;
32.
32
Le Langage SQL(15)
Le Langage SQL (15)
/* 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 )
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.
33.
33
Le Langage SQL(16)
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;
34.
34
Le Langage SQL(17)
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 );
35.
35
Le Langage SQL(18)
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
36.
36
Le Langage SQL(19)
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;
38
Le Langage SQL(20)
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 ;
39.
39
Le Langage SQL(21)
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 ;
40.
40
Le Langage SQL(21)
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 ;