Introduction
SQL a été implémenté par IBM dans les années 70, et se base sur l'algèbre
relationnelle de Codd. Chaque SGBDR (DB2, Informix, Ingres, SQL
SERVER...) présente sa propre version de SQL.
ORACLE fournit un éditeur de requêtes SQL, il s'agit de SQL*PLUS. Pour
accéder à cet éditeur, il faut être un utilisateur (avoir un login et un mot de
passe). Une fois l'éditeur affiché, on peut saisir les requêtes et voir les résultats
retournés.
Les tables
La table est l'objet principal d'une base de données car c'est là ou on stocke les
données. Oracle identifie une table par son nom.
Elle peut avoir une ou plusieurs colonnes (champ, attribut, mesure etc.). Une
colonne est caractérisée par son nom et son type de données.
La table peut avoir zéro ou plusieurs lignes (enregistrements, objets, tuples
etc.).
Table Personne
CIN Nom Age
07188742 Mohamed 33
07124884 Ali 25
Les Types de données
Remarques :
Une table ne peut contenir qu'une seule colonne de type LONG.
Le type de données CLOB inclut LONG.
Il n'y a pas de type de données booléen, ce dernier peut être simulé par
NUMBER(1) ou CHAR(1).
Une colonne non renseignée porte la valeur NULL qui est différente de 0 pour les
nombres et de la chaîne vide pour les chaînes de caractères.
La sélection simple
La sélection simple
La requête SELECT nous permet d'extraire des données à partir d'une base de
données. La clause SELECT est suivie d'une ou de plusieurs colonnes, ce sont
les colonnes qu'on veut extraire. La clause FROM est suivie par le nom de la
table à partir de laquelle on veut afficher les données.
Tous les exemples qui suivent se basent sur les tables EMP, DEPT et
SALGRADE créées par défaut lors de l'installation d'Oracle pour l'utilisateur
scott/tiger.
La sélection simple
La sélection simple
La sélection simple
En réalité la clause SELECT peut inclure des expressions autres que les
colonnes. Elle peut être suivie par :
Des expressions arithmétiques.
Des alias de colonnes.
Des colonnes concaténées.
Des littéraux (constantes).
Donner les noms et les salaires annuels de tous les employés ?
REQ3 : SELECT ENAME, SAL*12 FROM EMP ;
Voici ce que nous affiche cette requête :
La sélection simple
Le traitement des valeurs NULL : Si une ligne donnée n’a pas de valeur pour
une colonne donnée, alors cette case porte la valeur NULL. Toute colonne,
quelque soit son type de données, peut avoir la valeur NULL.
Certaines contraintes appliquées sur une colonne (PRIMARY KEY, NOT
NULL...) l’empêchent d’avoir la valeur NULL.
Cette valeur est traitée différemment des autres valeurs. En effet si NULL est
impliquée dans :
Une expression arithmétique, alors le résultat de toute l’expression est NULL.
Une expression logique, alors le résultat de tout l’expression est FAUX.
La sélection simple
Le mot clé DISTINCT : Ce mot clé est introduit après SELECT, il sert à
éliminer les occurrences, ainsi pour afficher les codes de départements
(chacun une seule fois) :
REQ9 : SELECT DISTINCT DEPTNO FROM EMP ;
DISTINCT ne peut être introduite qu’une seule fois, juste après le SELECT, et
concerne toutes les colonnes qui la suivent. Le résultat est toute combinaison
distincte de ces colonnes.
Afficher les jobs dans chaque département de manière distincte.
REQ10 : SELECT DISTINCT JOB, DEPTNO FROM EMP ;
La sélection simple
La clause ORDER BY: Le résultat retourné d’une requête n’a pas d’ordre
défini. La clause ORDER BY permet de trier le résultat selon une ou plusieurs
colonnes dans un ordre croissant ou décroissant.
Cette clause doit être la dernière dans la requête et peut être suivie d’une
colonne, d’une expression ou même d’un alias.
Afficher les employés triés par leurs DEPTNO dans l’ordre décroissant et par
leurs JOB dans l’ordre croissant.
REQ11 : SELECT * FROM EMP ORDER BY DEPTNO DESC, JOB ASC ;
Chaque groupe de lignes ayant le même DEPTNO est lui-même trié selon le
JOB dans l’ordre
La sélection simple
Donner les noms et les salaires des employés dont le salaire est entre 1000 et 2000 ?
REQ 14 : SELECT ENAME, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 ;
Donner les employés dont le manager est 7902, 7566 ou 7788 ?
REQ15 : SELECT * FROM EMP WHERE MGR IN (7902, 7566, 7788) ;
Afficher les employés dont le nom commence par ‘S’ ?
REQ 16 : SELECT * FROM EMP WHERE ENAME LIKE ‘S%’ ;
Afficher les employés dont le nom est composé de 4 caractères ?
REQ 17 : SELECT * FROM EMP WHERE ENAME LIKE ‘_ _ _ _’ ;
Afficher les employés qui n’ont pas de manager ?
REQ 18 : SELECT * FROM EMP WHERE MGR IS NULL ;
La sélection simple
Les opérateurs logiques : ils sont les trois suivants AND, OR et NOT. Il est
inutile de vous rappeler que AND est prioritaire au OR, tout comme les
opérateurs * et / qui sont prioritaires au + et au -.
Afficher tous les clerks dont le salaire est entre 1000 et 2000 ?
REQ 19 : SELECT * FROM EMP WHERE (SAL BETWEEN 1000 AND 2000 AND
JOB=’CLERK’);
Afficher tous les managers dont le salaire est supérieur à 1500 et tous les salesman ?
REQ 20 : SELECT * FROM EMP WHERE (SAL>1500 AND JOB=’MANAGER’ ) OR
(JOB=’SALESMAN’);
Afficher tous les salesman et tous les managers dont le salaire est supérieur à 1500 ?
REQ21 : SELECT * FROM EMP WHERE (SAL>1500) AND (JOB=’MANAGER’ OR
JOB=’SALESMAN’);
Les fonctions
Les fonctions
Ces fonctions concernent une seule ligne et retournent donc un seul résultat
par ligne. Elles peuvent être utilisées dans la clause SELECT, dans la clause
WHERE ou encore dans la clause ORDER BY.
Les fonctions de ligne sont classées par le type de données :
Les fonctions de caractères
Les fonctions de nombres
Les fonctions de date
Les fonctions de conversion
Les fonctions générales (de tous types de données)
Les fonctions de caractères
DECODE(arg,SEARCH1,val1,[SEARCH2,val2,…],default_arg)
Cette fonction retourne vali si arg=SEARCHi, si aucune valeur SEARCHi ne
correspond à l’argument arg, alors default_arg sera retournée.
Afficher les salaires de tous les employés sauf les managers à qui on affichera
‘MMM’ et le président à qui on affichera ‘PPP’ ?
REQ 26 : SELECT ENAME, DECODE(JOB, ‘MANAGER’, ‘MMM’, ‘PRESIDENT’,
‘PPP’, SAL) SALAIRE FROM EMP;
NVL(arg,val) : retourne val si l’argument est NULL sinon la valeur de l’argument.
GREATEST(arg1,arg2,…) : retourne l’argument la plus grande. S’il s’agit de DATE,
alors elle retourne la date la plus récente.
LEAST(arg1,arg2,…) : retourne la valeur la plus petite.
Les fonctions de groupe
Contrairement aux fonctions de lignes, les fonctions de groupe opèrent sur des
groupes de lignes et retournent un seul résultat par groupe.
AVG([DISTINCT|ALL] arg) : retourne la moyenne des arguments pour chaque
groupe tout en ignorant les valeurs NULL.
Afficher la moyenne des commissions des employés ?
REQ 27 : SELECT AVG(COMM) MOYENNE FROM EMP ;
Afficher la moyenne des salaires annuels des employés du département 20 ?
REQ 28 : SELECT AVG(SAL*12+NVL(COMM,0)) MOYENNE FROM EMP
WHERE DEPTNO=20;
Les fonctions de groupe
Remarques :
Le mot clé DISTINCT oblige une fonction de groupe à ne considérer que les
lignes distinctes ; contrairement à ALL qui lui oblige à considérer les valeurs
dupliquées. ALL est considérée par défaut.
Toutes les fonctions de groupe ignorent les valeurs NULL. Pour considérer
cette valeur spéciale, on peut utiliser la fonction NVL.
Les fonctions de groupe
Remarque : Il est à noter qu’on ne peut mettre dans la clause SELECT que les
fonctions de groupe et/ou les colonnes qui suivent la clause GROUP BY.
Les fonctions de groupe
La clause HAVING : Tout comme la clause WHERE qui sert à restreindre les
lignes retournées, cette clause sert à restreindre les groupes retournés. La
clause HAVING est suivie d’une condition simple ou composée qui concerne
les colonnes qui suivent la clause GROUP BY, ou/et des fonctions de groupe.
Afficher les moyennes de salaires de chaque département s’il inclut plus de 3
employés ?
REQ 36 : SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO
HAVING COUNT(*) > 3 ;
Les fonctions de groupe
Une jointure est utilisée quand on veut extraire des données à partir de
plusieurs tables.
Les lignes d’une table peuvent être jointes à des lignes d’une autre table grâce
à des valeurs qui existent dans des colonnes correspondantes.
Le produit cartésien de deux tables est réalisé lorsque la condition de jointure
est omise ou non valide.
C’est une relation qui inclut toutes les lignes de la première table jointes à
toutes les lignes de la deuxième table.
La jointure
Si une ligne ne satisfait pas une condition de jointure, alors elle ne sera pas
retournée. En effet, dans la relation d’equi-jointure entre la table EMP et la
table DEPT, le département 40 n’apparaît pas.
C’est parce qu’il n’y a aucun employé dans ce département. (En d’autres
termes, dans la table DEPT, la ligne de code 40 ne peut joindre aucune autre
ligne de la table EMP).
La ou les lignes qui manquent peuvent être retournées si on utilise l’opérateur
de jointure externe (+).
Cet opérateur est placé dans le coté de la table qui manque d’informations. Il
peut s’interpréter comme l’ajout dans cette table d’une ligne fictive qui réalise
la correspondance avec les lignes de l’autre table n’ayant pas de correspondant
réel.
Jointure externe
Il peut être utile de rassembler des informations venant d’une ligne d’une
table avec des informations venant d’une autre ligne de la même table.
Dans ce cas il faut renommer au moins l’une des deux tables en lui donnant un
alias, afin de pouvoir préfixer sans ambiguïté chaque nom de colonne.
Indiquer le nom du manager de chaque employé.
REQ 41 : SELECT E.ENAME EMPLOYE, M.ENAME EMPLOYEUR
FROM EMP E, EMP M WHERE E.MGR=M.EMPNO ;
Le Langage de Définition de Données
Introduction
Jusque là, nous avons réalisé toutes les interrogations possibles sur les données,
sans pour autant savoir comment gérer leurs structures.
Dans ce chapitre, il s’agit de présenter les requêtes de création, de
modification et de suppression des tables dans une base de données Oracle.
Création d’une table – CREATE
TABLE
C’est la requête CREATE TABLE qui sert à créer une table dans la norme SQL.
Une table étant définie par son nom et ses colonnes (une colonne étant définie
par son nom et son type de données), la syntaxe générale et simple de ce type
de requête est la suivante :
CREATE TABLE table (colonne1 type1, colonne2 type2, …, colonnen typen) ;
Supposons que nous voulons créer la table personne dont les champs sont : id,
nom, prénom et date de naissance. La requête relative est la suivante :
CREATE TABLE personne (id NUMBER, nom VARCHAR2(15), prenom
VARCHAR2(15), date_naissance DATE) ;
A partir de ce moment, il est possible d’insérer des lignes dans la table
personne (objet du prochain chapitre).
Les contraintes
Une contrainte concerne une colonne de la table et peut être aperçue comme
étant une condition que doivent respecter les valeurs de cette colonne. Elle est
spécifiée lors de la création de la table et vient après le type de données de la
colonne dans la requête :
[CONSTRAINT nom_contrainte] contrainte
Toute contrainte est définie par une table, une colonne, un type et un nom.
L’utilisateur peut affecter un nom à une contrainte, sinon Oracle lui affectera
un nom par défaut. Les types de contraintes sont les suivants :
Clé primaire
Les contraintes
Clé primaire
PRIMARY KEY une clé primaire d’une table est composée d’une ou plusieurs
colonnes. Elle est utilisée pour identifier chaque ligne de manière unique. La
valeur d’une clé primaire composée de plusieurs colonnes est dite clé primaire
composée. Une clé primaire ne doit pas contenir de valeurs NULL.
Clé unique
UNIQUE cette contrainte oblige la colonne de ne pas avoir deux valeurs
identiques. Elle a donc le même principe qu’une clé primaire à l’exception
qu’elle peut avoir la valeur NULL. Cette contrainte peut être appliquée à une
ou à plusieurs colonnes (dans ce cas, chaque uplet doit être unique).
Les contraintes
Clé étrangère
FOREIGN KEY … REFERENCES … elle représente une relation entre deux
tables. Elle concerne une ou plusieurs colonnes d’une table dite table fille, et
dont les valeurs dépendent des clés primaires ou uniques (et de leurs types
données) d’une table dite table mère. On peut ajouter l’option [ON DELETE
CASCADE] pour que la suppression d’une ligne de la table mère entraîne la
suppression de toutes les lignes de la table fille qui en dépendent. Si cette
option n’est pas spécifiée, la suppression des lignes de la table mère est
impossible si elles référencent des lignes dans la table fille. On peut aussi
ajouter [ON DELETE SET NULL] et dans ce cas, la suppression d’une ligne de
la table mère entraîne la mise à NULL des colonnes qui la référencent dans la
table fille.
Les contraintes
Contrainte de vérification
CHECK parfois la colonne d’une table doit satisfaire certaines conditions
posées par l’utilisateur. Les contraintes de vérification permettent
généralement de restreindre le domaine d’une colonne.
NOT NULL
NOT NULL si cette contrainte est appliquée à une colonne, alors cette colonne
ne doit pas contenir de valeurs NULL.
Exemple
Créez la table EMP sachant que la table DEPT l’est déjà. Cette table contient
une clé primaire EMPNO, un nom qui doit être unique ENAME, un poste
JOB, un salaire SAL qui doit dépasser un salaire minimum conventionnel
(SMIG) de 600, une date d’embauche HIREDATE qui ne peut pas être NULL,
un code d’employeur MGR qui réfère la colonne EMPNO et finalement un
numéro de département DEPTNO qui réfère la colonne DEPTNO de la table
DEPT ?
REQ 42: CREATE TABLE EMP(EMPNO NUMBER CONSTRAINT PK1
PRIMARY KEY, ENAME VARCHAR2(20) CONSTRAINT UN1 UNIQUE,
JOB VARCHAR2(15), SAL NUMBER CONSTRAINT CH1 CHECK(SAL>600),
HIREDATE DATE DEFAULT ’01-JAN-80’ NOT NULL, MGR NUMBER
CONSTRAINT FK_EMP_EMP REFERENCES EMP(EMPNO), DEPTNO
NUMBER REFERENCES DEPT(DEPTNO) ON DELETE CASCADE) ;
Remarques
Créez la table EMP1 dont les colonnes sont NUEMP, NOMEMP, NOMDEPT
et EGRADE et y insérer les lignes convenables à partir des tables EMP, DEPT
et SALGRADE ?
REQ 43 : CREATE TABLE EMP1(NUEMP NUMBER PRIMARY KEY,
NOMEMP VARCHAR2(15), NOMDEPT VARCHAR2(15), EGRADE
VARCHAR2(15)) AS SELECT EMPNO, ENAME, DNAME, GRADE FROM
EMP E, DEPT D, SALGRADE S WHERE E.DEPTNO=D.DEPTNO AND
E.SAL BETWEEN S.LOSAL AND S.HISAL;
Remarque : Naturellement, on doit respecter l’égalité du nombre des colonnes
et de leurs types de données entre la définition de la table et la sélection de la
requête SELECT. Il est possible également que la définition d’une table soit
directement extraite à partir de la requête SELECT.
Exemple
L’ajout de colonne se fait via la clause ADD. Une colonne ajoutée est mise à
NULL pour toutes les lignes. Il en découle qu’on ne peut pas appliquer une
contrainte sur cette colonne lui interdisant d’avoir une valeur NULL à moins
qu’elle soit affectée à une valeur par défaut ou que la table soit vide.
Ajouter les colonnes téléphone TEL et Adresse ADR. La colonne TEL ne doit
pas avoir la valeur NULL ?
REQ 47 ALTER TABLE EMP ADD VARCHAR2(30)) ;(TEL NUMBER(8)
DEFAULT ‘00000000’ NOT NULL, ADR VARCHAR2(30)) ;
Il est possible de renommer une colonne via la clause RENAME COLUMN.
Renommer la colonne SAL pour SALARY dans la table EMP ?
REQ 74 : ALTER TABLE EMP RENAME COLUMN SAL TO SALARY;
Modifier une colonne
La suppression d’une table est effectuée par la requête DROP TABLE, celle-ci
détruirait les données et la structure de la table.
Si votre table est une table mère, c-à-d que sa clé primaire est
référée par d’autres colonnes FOREIGN KEY qui sont dans une ou plusieurs
tables filles, alors la suppression est impossible.
La solution est d’utiliser l’option CASCADE CONSTRAINTS ; dans ce cas là,
les contraintes FOREIGN KEY –posées sur les colonnes des tables filles- seront
à leurs tours supprimés.
Supprimer totalement la table DEPT ?
REQ 53 : DROP TABLE DEPT CASCADE CONSTRAINTS;
Consultation des contraintes
Lorsqu’on veut insérer des données, les modifier ou les supprimer, nous
devons exécuter des requêtes du langage de manipulation de données.
Ces opérations de mise à jour sont faites via trois requêtes INSERT, UPDATE
et DELETE.
Ajout de données – INSERT
L’ajout d’une ou de plusieurs lignes dans une table se fait par la requête
INSERT.
Si on veut ajouter les données ligne par ligne, on peut alors utiliser la première
variante de la requête INSERT dont la forme générale est la suivante :
INSERT INTO nom_table[(col1,[ col2,…, coln])] VALUES (v1,[v2,…,vn])
nom_table est le nom de la table dans laquelle on veut insérer notre ligne, il
est suivi par la liste des colonnes de la table, par le mot clé VLAUES et par la
liste des valeurs qu’on veut insérer.
Il est possible d’insérer une partie d’une ligne (omettre les valeurs d’une ou de
plusieurs colonnes) mais à condition de respecter les contraintes de la table
(on ne peut pas omettre la valeur d’une colonne NOT NULL), dans ce cas les
valeurs non communiquées auront NULL par défaut.
Ajout de données – INSERT
Il faut aussi respecter une certaine cohérence dans la requête INSERT entre la
liste descriptive de la table et la liste des valeurs à ajouter. Cette cohérence
concerne le nombre et l’ordre des colonnes.
La liste descriptive peut être omise, et dans ce cas on doit respecter l’ordre des
colonnes (défini lors de la création de la table et qu’on peut consulter par la
commande DESC nom_table) et saisir les valeurs de toutes les colonnes de la
table.
Insérer dans la table EMP le nouvel employé de matricule 7521, de nom
‘PATRICK’, ‘SALESMAN’, de manager 5000, de salaire 1250 et département
30 ?
REQ 55 : INSERT INTO EMP
(EMPNO,ENAME,JOB,HIREDATE,MGR,SAL,DEPTNO)
VALUES(7521,‘PATRICK’,’SALESMAN’,SYSDATE,5000,1250,30);
Ajout de données – INSERT
Dans la table FPJ, insérer le projet ‘J1’ qui a été alimenté par 5 pièces ‘P1’ par
les fournisseurs de ‘LONDRES’ ?
REQ 58 : INSERT INTO FPJ SELECT NF,’J1’,’P1’,5 FROM F WHERE
VILLE=’LONDRES’;
Modification de données –
UPDATE
La modification des données se fait via la requête UPDATE. Cette requête met
à jour une ou plusieurs lignes de la table (la mise à jour peut concerner une ou
plusieurs colonnes).
La syntaxe de cette requête est la suivante :
UPDATE nom_table SET col1=arg1 [, col2=arg2, …, coln=argn] [WHERE
condition(s)]
Ici, la mise à jour concerne la table nom_table et plus particulièrement les
lignes de cette table qui satisfont la condition de la clause WHERE. Seules les
colonnes de la clause SET sont modifiées par cette requête.
Un argument argi peut être un littéral (constante), une expression, une
fonction ou encore une sous-requête (le résultat d’une sous-requête). Il est à
noter que la clause WHERE est facultative, si elle est omise la mise à jour
concerne alors toute les lignes de la table.
Modification de données –
UPDATE
Il est possible aussi de mettre à jour plusieurs colonnes d’une table à partir
d’une seule sousrequête, la syntaxe correspondante est la suivante :
UPDATE nom_table SET (col1,…,coln)=(SELECT arg1,…,argn FROM table)
[WHERE condition(s)]
Mettez à jour la colonne COMM dans la table EMP. Chaque valeur NULL doit
être remplacée par zéro ?
REQ 59 : UPDATE EMP SET COMM=0 WHERE COMM IS NULL;
Mettez à jour le salaire et le job des SALESMAN, ils ont eu une augmentation
de 10% et leur job est maintenant dit SALESPERSON ?
REQ 60 : UPDATE EMP SET SAL=SAL*1.1, JOB=’SALESPERSON’ WHERE
JOB=’SALESMAN’ ;
Modification de données –
UPDATE