Langage SQL ENCG-Tanger 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 A. ELKHARRAZ
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,
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
Le Langage SQL (4) I. Requêtes Actions Syntaxe 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]);
Le Langage SQL (5) champ2 type [NOT NULL], …, champN type, CONSTRAINT 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 PRIMARY KEY, Nom TEXT(25), Prénom TEXT(20), Fonction TEXT(15), Adresse TEXT(50), Codeville LONG) ) ;
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 ;
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) ;
Le Langage SQL (8) Remarque: 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.
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, 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.
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 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 .*/
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;
Le Langage SQL (12) Syntaxe /* 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 ;
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*/
Le Langage SQL (14) (Ou bien ) 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 ;
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
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 ;
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 ;
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.
Le Langage SQL (19) SELECT [Prédicat] 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]
Le Langage SQL (20) 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, 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
Le Langage SQL (21) 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
Le Langage SQL (22) 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;
Le Langage SQL (23) /* 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
Le Langage SQL (24) /* 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;
Le Langage SQL (25) /* 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;
Le Langage SQL (26) Les éléments de la clause WHERE /* 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)
Le Langage SQL (27) /* 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;
Le Langage SQL (28) /* 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 );
Le Langage SQL (29) Exemple 2 /* 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 VENDEURS créées sous ACCESS: PRODUITS (Réf , Design, Nfournisseur, Pu) COMMANDES(Ncommande, Codecli, Nvend, Date commande) DETAILS(Ncommande, Réf , Quantité, Remise) VENDEURS(Nvend, Nom, Prénom, Fonction, Adresse, Ville)
Le Langage SQL (30) Les éléments de la clause FROM (Ou bien ) /* Afficher tous les produits (Réf, Design) qui ont été vendus*/ SELECT PRODUITS.Réf, Design FROM PRODUITS INNER JOIN DETAILS ON PRODUITS.Réf = DETAILS.Réf ; (Ou bien ) SELECT PRODUITS.Réf, Design FROM PRODUITS, DETAILS WHERE PRODUITS.Réf = DETAILS.Réf ;
Le Langage SQL (31) 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 ;
Le Langage SQL (32) (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. /* Afficher tous les produits (Réf, Design, Mois de vente) qui ont été vendus pendant le mois 6*/ SELECT PRODUITS. Réf, Design, 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 )
Le Langage SQL (33) SELECT PRODUITS.Réf, Design, 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;
Le Langage SQL (34) /* 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, Design, FROM PRODUITS WHERE Pu >= ANY ( SELECT Pu FROM DETAILS Inner Join PRODUITS ON PRODUITS.Réf=DETAILS.Réf WHERE Remise = 0.25 );
Le Langage SQL (35) Remarque /* Afficher tous les produits (Réf, Design) qui ont été vendus par ordre décroissant selon le champ Réf*/ SELECT PRODUITS. Réf, Design 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
Le Langage SQL (36) 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, Design) qui ont été vendus par ordre décroissant selon le champ Réf*/ SELECT T1.Réf, Design FROM PRODUITS AS T1 , DETAILS AS T2 WHERE T1.Réf = T2.Réf ORDER BY T1.Réf DESC;
Le Langage SQL (37) Ncommande Réf Quantité Remise 1 R1 10 0.6 R2 20 2 15 0.5 R3 R6 25 0.9 3 5 R7 65 0.1 R8 DETAILS
Le Langage SQL (38) /* 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 ;
Le Langage SQL (39) /* 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 7% et tel que ce totale est > 60 */ SELECT Ncommande, SUM([Quantité]) AS [Totale quantités vendues] FROM DETAILS WHERE Remise=0,07 GROUP BY Ncommande HAVING SUM([Quantité]) > 60 ;
Le Langage SQL (40) /* Afficher les vendeurs qui ont passé plus de 4 commandes*/ SELECT Nvend, COUNT(Ncommande) AS [Nombre de commandes passées] FROM COMMANDES GROUP BY Nvend HAVING COUNT(Ncommande) > 4 ; /* Afficher les vendeurs de la ville d’Asilah qui ont passé plus de 4 commandes*/ SELECT VENDEURS.Nvend, COUNT(Ncommande) AS [Nombre de cdes passées] FROM COMMANDES, VENDEURS WHERE VENDEURS.Nvend=COMMANDES.Nvend AND Ville ="Asilah" GROUP BY VENDEURS.Nvend HAVING COUNT(Ncommande) > 4 ;