Cours SQL
Cours SQL
Cours SQL
INTRODUCTION
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…
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) ;
11
Le Langage SQL (12)
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
13
Le Langage SQL (14)
(Ou bien )
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) */
17
Le Langage SQL (18)
I. Requête SELECTION
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
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 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*/
24
Le Langage SQL (9)
/* Afficher le totale des salaires de la table ACTEURS et nommer le champ
retourné Totale des salaires */
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" */
29
Le Langage SQL (14)
Les éléments de la clause FROM
/* Afficher tous les produits (Réf, Nompr) qui ont été vendus*/
ON PRODUITS.Réf = DETAILS.Réf ;
(Ou bien )
30
Le Langage SQL (14)
Les jointures
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)
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%*/
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*/
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*/
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