1. La base de données...2 2. L algèbre relationnelle...3 2.1. La projection... 3 2.2. La sélection (ou restriction)... 3 2.3. La jointure... 4 2.4. L union... 4 2.5. L intersection... 5 2.6. La différence... 6 2.7. La division... 6 Le langage SQL...7 2.8. La projection... 7 2.9. La sélection (ou restriction)... 7 2.10. La jointure... 8 2.11. Les expressions et fonctions... 9 2.11.1. les opérateurs arithmétiques : +, -, *, /... 9 2.11.2. les fonctions arithmétiques... 9 2.11.3. Les fonctions sur les chaînes de caractères... 9 2.11.4. Les fonctions sur les dates... 9 2.11.5. Les fonctions de conversion... 10 2.12. Les fonctions d agrégat :... 10 2.13. Les requêtes imbriquées... 11 2.14. La clause GROUP BY...Erreur! Signet non défini. 2.15. La clause HAVING...Erreur! Signet non défini. Rappels : Un système de gestion de bases de données relationnel (SGBDR) rassemble une ou plusieurs bases de données ainsi que l ensemble des outils nécessaires à la manipulation des données. Il permet de : - décrire les données et leur structure (type de données) grâce à un langage de définition de données (LDD), - manipuler les données par des requêtes d interrogation et des instructions de mise à jour grâce au langage de manipulation de données (LMD). Le langage SQL est pratiquement devenu une norme dans le cadre de la gestion des données. 1
1. La base de données La base de données EMP-DEPT utilisée en exemple dans ce cours décrit les caractéristiques des employés d une entreprise : Table EMP : les employés empno ename job mgr hiredate sal comm deptno 7369 SMITH CLERK 7902 17/12/80 800 20 7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30 7521 WARD SALESMAN 7698 22/02/81 1250 500 30 7566 JONES MANAGER 7839 02/04/81 2975 20 7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30 7698 BLAKE MANAGER 7839 01/05/81 2850 30 7782 CLARK MANAGER 7839 09/06/81 2450 10 7788 SCOTT ANALYST 7566 09/11/81 3000 20 7839 KING PRESIDENT 17/11/81 5000 10 7844 TURNER SALESMAN 7698 08/09/81 1500 0 30 7876 ADAMS CLERK 7788 23/09/81 1100 20 7900 JAMES CLERK 7698 03/12/81 950 30 7902 FORD ANALYST 7566 03/12/81 3000 20 7934 MILLER CLERK 7782 23/01/82 1300 10 Signification des colonnes: - empno : numéro identifiant un employé, - ename : nom d employé, - job : fonction, - mgr : numéro du responsable (manager) d un employé, - hiredate : date d embauche, - sal : salaire, - comm : commissions perçues (uniquement pour les vendeurs, les représentants), - deptno : numéro de département. Table DEPT: les départements (au sens service) deptno dname loc 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON Signification des colonnes: - deptno : numéro identifiant un département, - dname : nom du département, - loc : localisation (la ville). Contraintes d intégrité référentielle : - deptno de emp référence deptno de dept - mgr de emp référence empno de emp 2
2. L algèbre relationnelle L algèbre relationnelle est un outil mathématique permettant de réaliser des calculs (appelés requêtes) sur des relations. 2.1. La projection L opération de projection permet de retenir uniquement certaines colonnes (champs) d une relation. R = Proj (<nom relation> ; <nom des attributs>) résultat = proj(emp, {ename, empno}) ename empno SMITH 7369 ALLEN 7499 WARD 7521 JONES 7566 MARTIN 7654 BLAKE 7698 CLARK 7782 SCOTT 7788 KING 7839 TURNER 7844 ADAMS 7876 JAMES 7900 FORD 7902 MILLER 7934 empno ename job mgr hiredate sal comm deptno 7369 SMITH CLERK 7902 17/12/80 800 20 7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30 7521 WARD SALESMAN 7698 22/02/81 1250 500 30 7566 JONES MANAGER 7839 02/04/81 2975 20 7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30 7698 BLAKE MANAGER 7839 01/05/81 2850 30 7782 CLARK MANAGER 7839 09/06/81 2450 10 7788 SCOTT ANALYST 7566 09/11/81 3000 20 7839 KING PRESIDENT 17/11/81 5000 10 7844 TURNER SALESMAN 7698 08/09/81 1500 0 30 7876 ADAMS CLERK 7788 23/09/81 1100 20 7900 JAMES CLERK 7698 03/12/81 950 30 7902 FORD ANALYST 7566 03/12/81 3000 20 7934 MILLER CLERK 7782 23/01/82 1300 10 2.2. La sélection (ou restriction) La restriction permet d'extraire d'une table les lignes qui satisfont une ou plusieurs conditions. R = Resctrict (<nom relation> ; <condition>) résultat = restrict(emp, deptno=20) 3
empno ename job mgr hiredate sal comm deptno 7369 SMITH CLERK 7902 17/12/80 800 20 7566 JONES MANAGER 7839 02/04/81 2975 20 7788 SCOTT ANALYST 7566 09/11/81 3000 20 7876 ADAMS CLERK 7788 23/09/81 1100 20 7902 FORD ANALYST 7566 03/12/81 3000 20 empno ename job mgr hiredate sal comm deptno 7369 SMITH CLERK 7902 17/12/80 800 20 7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30 7521 WARD SALESMAN 7698 22/02/81 1250 500 30 7566 JONES MANAGER 7839 02/04/81 2975 20 7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30 7698 BLAKE MANAGER 7839 01/05/81 2850 30 7782 CLARK MANAGER 7839 09/06/81 2450 10 7788 SCOTT ANALYST 7566 09/11/81 3000 20 7839 KING PRESIDENT 17/11/81 5000 10 7844 TURNER SALESMAN 7698 08/09/81 1500 0 30 7876 ADAMS CLERK 7788 23/09/81 1100 20 7900 JAMES CLERK 7698 03/12/81 950 30 7902 FORD ANALYST 7566 03/12/81 3000 20 7934 MILLER CLERK 7782 23/01/82 1300 10 2.3. La jointure La jointure agit sur deux tables ou plus. Elle permet de rapprocher les informations issues de 2 tables ayant un attribut commun (qui ne porte pas forcément le même nom dans les deux tables). R = Join (<relation1>, <relation2>, <condition de jointure>) résultat = join(emp, dept, emp.deptno = dept.deptno) empno ename job mgr hiredate sal comm deptno Deptno Dname loc 7369 SMITH CLERK 7902 17/12/80 800 20 20 RESEARCH DALLAS 7499 ALLEN SALESMAN 7698 20/02/81 1600 300 30 30 SALES CHICAGO 7521 WARD SALESMAN 7698 22/02/81 1250 500 30 30 SALES CHICAGO 7566 JONES MANAGER 7839 02/04/81 2975 20 20 RESEARCH DALLAS 7654 MARTIN SALESMAN 7698 28/09/81 1250 1400 30 30 SALES CHICAGO 7698 BLAKE MANAGER 7839 01/05/81 2850 30 30 SALES CHICAGO 7782 CLARK MANAGER 7839 09/06/81 2450 10 10 ACCOUNTING NEW YORK 7788 SCOTT ANALYST 7566 09/11/81 3000 20 20 RESEARCH DALLAS 7839 KING PRESIDENT 17/11/81 5000 10 10 ACCOUNTING NEW YORK 7844 TURNER SALESMAN 7698 08/09/81 1500 0 30 30 SALES CHICAGO 7876 ADAMS CLERK 7788 23/09/81 1100 20 20 RESEARCH DALLAS 7900 JAMES CLERK 7698 03/12/81 950 30 30 SALES CHICAGO 7902 FORD ANALYST 7566 03/12/81 3000 20 20 RESEARCH DALLAS 7934 MILLER CLERK 7782 23/01/82 1300 10 10 ACCOUNTING NEW YORK 2.4. L union L'union de deux tables R et S, notée R U S ou UNION(R,S), est une table T de même schéma (les domaines associés aux colonnes de R sont identiques aux domaines associés aux colonnes de S), contenant les enregistrements appartenant à R ou à S ou aux deux tables. R = Union (<relation1>, <relation2>) 4
Relation R1 : 7839 KING 10 7934 MILLER 10 Relation R2 : 7788 SCOTT 20 7876 ADAMS 20 7902 FORD 20 résultat = union(r1, R2) 7839 KING 10 7934 MILLER 10 7788 SCOTT 20 7876 ADAMS 20 7902 FORD 20 2.5. L intersection L'intersection de deux tables R et S, notée R S ou INTERSECT(R,S), est une table T de même schéma, contenant les enregistrements appartenant à la fois à R et S. Relation R1 : R = Intersect (<relation1>, <relation2>) Relation R2 : 7839 KING 10 7934 MILLER 10 7788 SCOTT 20 7876 ADAMS 20 7902 FORD 20 résultat = intersect(r1,r2) 5
2.6. La différence La différence de deux tables R et S, notée R - S ou MINUS(R,S), est une table T de même schéma, contenant les enregistrements appartenant à R mais pas à S. Relation R1 : R = Minus (<relation1>, <relation2>) Relation R2 : 7839 KING 10 7934 MILLER 10 7788 SCOTT 20 7876 ADAMS 20 7902 FORD 20 Résultat = minus(r1, R2) 7839 KING 10 7934 MILLER 10 2.7. La division La division agit sur deux tables R et S ayant un attribut commun (qui ne porte pas forcément le même nom dans les deux tables). Elle est constituée des enregistrements de R qui sont accouplés à chacune des valeurs de S. Relation Conduit : R = <nom relation> (<attribut 1> / <attribut 2>) <nom relation> Relation Avions : npilote numavion 1 1 1 2 1 3 2 1 2 2 3 1 navion description 1 Boeing 747 2 Airbus A320 3 Tupolev Résultat = Conduit(numavion / navion) Avions Npilote 1 On obtient dans la relation résultat les numéros des pilotes qui conduisent tous les avions répertoriés dans la relation Avions. 6
Le langage SQL Le langage SQL est un outil d interrogation des SGBDR qui s appuie sur l algèbre relationnelle. Les mots réservés du langage sont écrits en majuscule. 2.8. La projection SELECT [DISTINCT] (<nomattribut1>, [<nomattribut2, ] ) * FROM <nom de table> ; La clause DISTINCT permet d éliminer les doublons : si dans le résultat plusieurs lignes sont identiques, une seule sera conservée. Le symbole * permet d obtenir tous les attributs sans avoir à tous les citer. Exemples : Liste des numéros et noms d employés Select ename, empno from emp ; Liste de tous les employés Select * from emp ; Liste des fonctions occupées dans l entreprise Select job from emp ; Remarque : la requête renvoie plusieurs lignes identiques. Liste des fonctions occupées dans l entreprise (avec suppression des lignes identiques) Select distinct job from emp ; La clause ORDER BY : Elle permet de trier les résultats suivant différentes expressions (souvent des noms de colonnes) par ordre croissant (ASC) ou décroissant (DESC). L option ASC est prise par défaut pour chacune des expressions citées. Liste des employés par salaires décroissants Select ename, sal from emp order by sal desc; 2.9. La sélection (ou restriction) SELECT [DISTINCT] (<nomattribut1>, [<nomattribut2, ] ) * FROM <noms des tables> WHERE <condition de recherche> [ AND <condition de recherche> ]; Une condition de recherche est de la forme : argument1 opérateur argument2 7
Les différents opérateurs d une condition de recherche : Opérateur Description = Egal!= Différent <> Différent > Supérieur >= Supérieur ou Egal < Inférieur <= Inférieur ou Egal Between... AND... Entre... et... In Dans Like Comme Is Null Est indéfini Any Au moins 1 All Tout Exemples : Liste des employés appartenant au département 20 Select ename, empno from emp where deptno = 20 ; Liste des employés occupant la fonction de vendeur ou analyste Select ename, empno from emp where job in ("SALESMAN", "ANALYST") ; Liste des employés embauchés au mois de septembre 1981 Select ename, empno, hiredate from emp where hiredate between "01/09/81 and "30/09/81 ; Liste des employés dont le salaire est compris entre 2000 et 3000 Select * from emp where sal between 2000 and 3000 ; Liste des employés dont le nom commence par un J Select * from emp where ename like "J%"; 2.10. La jointure SELECT [DISTINCT] (<nomattribut1>, [<nomattribut2, ] ) * FROM <noms des tables> WHERE <condition de recherche> [ AND <condition de recherche> ]; Liste des employés ainsi que le nom de leur département Select ename, dname from emp, dept where emp.deptno = dept.deptno Il est possible d utiliser un alias pour renommer les tables. Select ename, dname 8
from emp E, dept D where E.deptno = D.deptno 2.11. Les expressions et fonctions Elles sont utilisables après les clauses SELECT, WHERE, HAVING et ORDER BY. 2.11.1. les opérateurs arithmétiques : +, -, *, / Select ename, sal + com from emp where comm is not null and comm > 0.25*sal; 2.11.2. les fonctions arithmétiques ABS(n) valeur absolue CEIL(n) le plus petit entier inférieur qui dépasse n FLOOR(n) le plus grand entier inférieur à n MOD(n,m) reste de la division de m par n POWER(n,m) m est élevé à la puissance n ROUND(n, [m]) n est arrondi à m décimales (m=0 si omis) TRUNC(n, [m]) n est tronqué à m décimales (m=0 si omis) SQRT(n) racine carrée LEAST(n1,n2 ) la plus faible valeur parmis n1, n2 GREATEST(n1,n2 ) la plus forte valeur parmis n1, n2 Select ename, greatest(sal, comm) from emp; Select empno, ename, least(round(sal), round(comm)) From emp Where round(sal) > 2000; 2.11.3. Les fonctions sur les chaînes de caractères LENGTH(c) longueur de la chaîne UPPER(c), LOWER(c) conversion en majuscules, minuscules SUBSTR(c,p [,l]) extrait la sous-chaine de c à partir du p-ième caractère, ayant pour longueur l GREATEST(c1,c2 ) LEAST(c1,c2 ) c1 c2 concatène les chaînes c1 et c2 2.11.4. Les fonctions sur les dates Deux dates peuvent être comparées entre elles avec les opérateurs de comparaison (<, > ). Une date peut être cherchée dans un intervalle (d between d1 and d2). Le nombre de jours entre deux dates peut être obtenu par : d1-d2. 9
LEAST(d1,d2 ) GREATEST(n1,n2 ) ADD_MONTHS(d,n) MONTHS_BETWEEN(d1,d2) NEXT_DAY(d, jour) ajoute n mois à la date d et renvoie une date exprime la différence de mois entre d1 et d2 donne la première date qui suit la date d et qui Correspond au jour de la semaine donné Ex : next_day(d, Monday ) SYSDATE est une variable donnant la date système (la date courante). select * from emp Where sysdate-hiredate < 30; Elle peut être affichée par : select sysdate from dual; 2.11.5. Les fonctions de conversion Le format par défaut d une date est : DD/MON/YY qui correspond à 2 chiffres (jours), 3 lettres (mois), 2 chiffres (année), les champs étant séparés par le symbole / Par exemple : 20/AUG/93 La fonction TO_CHAR(d, format) convertit une date ou une expression de type date en une chaîne dont le format est précisé. Par exemple : to_char(d, dd/mm/yy ) renvoie 20/08/93 select ename, to_char(hiredate, DD/MONTH ) from emp Where to_char(hiredate, yyyy ) = 1993 ; La fonction TO_DATE(c, format) convertit une chaîne associée à une date dont le format est précisé en un objet de type date. Par exemple : to_date( 89/16/07, YY/DD/MM ) retourne la date du 16 juillet 1989. La fonction TO_NUMBER(c) convertit une chaîne de caractères numériques en un objet de type numérique. 2.12. Les fonctions d agrégat : Les fonctions d agrégat permettent d'obtenir des informations relatives à un ensemble de données. Elles s appliquent à un ensemble de lignes et renvoient une valeur. count avg sum min max dénombre les occurrences d'un attribut calcule la moyenne d'un attribut calcule la somme sur un attribut détermine la plus petite occurrence d'un attribut détermine la plus grande occurrence d'un attribut Toutes ces fonctions d'agrégats ignorent les valeurs nulles mais peuvent avoir des valeurs qui se répètent. Pour préciser qu'il faut tenir compte de toutes les valeurs ou 10
seulement de celles qui sont distinctes, il faut préciser ALL ou DISTINCT ( par défaut, c'est ALL). Nombre d employés appartenant au département 20 Select count(*) from emp where deptno = 20 ; Salaire le plus élevé Select max(sal) from emp ; Nombre de fonctions Select count(distinct job) from emp; Select ename, max(sal) Requête mal construite! From emp; 2.13. Les requêtes imbriquées Exemple de requête ; Liste des employés appartenant au département des Ventes Select ename from emp, dept where emp.deptno = dept.deptno and dept.dname = "SALES" Un requête imbriquée est composée de deux ou plusieurs select. Le premier est appelé requête principale, le ou les suivants, sous-requêtes. L exécution se fait en deux temps : - d abord les sous-requêtes qui extraient les valeurs intermédiaires - puis la requête principale s exécute sur les valeurs intermédiaires Le lien entre deux Select est réalisé par : - IN si la sous-requête fournit plusieurs valeurs - = si la sous-requête ne fournit qu une seule valeur Exemples ; Liste des employés appartenant au département des Ventes Select ename from emp where deptno = ( select deptno from dept where dname = "SALES"); Liste des départements comportant au-moins un employé Select dname from dept where deptno in (select deptno from emp); 11