Cours SQLPLUS Oracle
Cours SQLPLUS Oracle
E-mail : [email protected]
ABD © 2011-2021
INTRODUCTION
L’histoire des bases de données a fortement évoluée depuis lors. En effet, des bases de données
entre autres dites hiérarchiques aux bases de données réseaux, nous sommes aujourd’hui à l’ère de
bases de données relationnelles (SGBDR) et des bases de données objets (SGBDO). Les bases de
données relationnelles restent les plus mises en oeuvre à l’heure actuelle.
Toutefois, l’intérêt d’une base de données réside dans sa capacité à interagir avec les utilisateurs
qui la sollicite. Mais cette interaction ne peut se faire que par l’intermédiaire d’un langage
spécifique et approprié : le SQL (Structured Query Language) qui est le langage d’interrogation
des bases de données par excellence. Il existe un SQL normalisé dit standard et commun à tous les
systèmes de gestion de bases de données (SGBD). Mais bien de SGBD à l’instar d’Oracle, en plus
du SQL standard possède quelques spécificités supplémentaires.
L’objet du présent document est en effet d’étudier l’essentiel du SQL du SGBD du Server Oracle.
Le document s’accentuera essentiellement sur les points suivants :
Concepts fondamentaux : Principes relationnels et concepts Oracle
L’Ordre SELECT Basique
Sélection et Tri des Lignes Retournées par un SELECT
Fonction Mono-Ligne
Affichage des Données Issues de Plusieurs Tables
Fonctions de Groupe
Opérateurs Ensemblistes
Sous-Interrogation
Manipulation des Données
Création et Gestion de Tables et Objets d’une Base de Données Oracle
NB : L’essentiel du contenu de ce document est la compilation des publications des divers auteurs
ayant abordé ces différents points. Toutefois, certaines modifications ont été apportées et les
exercices illustratifs ont été adaptés au contexte de l’exécution du cours.
Le cours mettra, bien entendu, l’accent sur les aspects pratiques pour asseoir une meilleure
maîtrise du langage SQL.
Certains autres aspects non évoqués dans le document seront éventuellement abordés au fil du
déroulement du cours.
Objectifs : Ce chapitre est entièrement dédié aux principes de base des systèmes de bases de
données relationnelles (SGBDR). Aussi, après ce chapitre, vous devriez pouvoir discuter des
aspects théoriques et physiques d’une base de données relationnelle.
Données :
Une donnée n’est rien d’autre qu’une information élémentaire quelconque.
Base de données :
Une base de données (BD) représente l'ensemble (cohérent, intégré, partagé) des informations
nécessaires au fonctionnement d'une entreprise, ensemble dont la gestion est assurée par un
logiciel appelé système de gestion de bases de données (SGBD).
Exemples de base de données: celle qui permet la gestion des personnels, étudiants, cours,
inscriptions, ... d'une université ou école, celle du système de réservation de places d'avion des
compagnies d'aviation, celles qui permettent la gestion des comptes des clients des sociétés
bancaires, etc.
Banque de données :
Une base de données est développée au sein d'une entreprise, pour son propre fonctionnement.
Inversement, une banque de données est un ensemble de données, propres à un domaine
d'application, que des "producteurs" réunissent pour ensuite en commercialiser l'usage vers le
public extérieur. Exemple: les banques de données juridiques, économiques, médicales, des
brevets, des propriétés des matériaux, ... . La constitution et l'exploitation des banques de données
font appel à des techniques spécifiques (télématique, par exemple), différentes des techniques
bases de données, seules étudiées dans ce cours.
Fichiers :
Dans une entreprise, il convient de faire appel à l'approche base de données lorsque les données à
gérer sont de natures diverses (exemple : étudiants, cours, enseignants, salles, ...) et possèdent de
nombreux liens entre elles (exemple : un étudiant suit un cours, un cours est assuré par un
enseignant, ...). A contrario, il existe des cas où les données à gérer, bien que importantes en
volume, sont homogènes : les abonnés d'une revue, le personnel d'une entreprise, les produits
vendus par un magasin ... . Dans ces cas, on parlera de fichier (le fichier des abonnés, ...) et l'on
utilisera un système de gestion de fichiers (SGF), moins complexe qu'un SGBD.
Amadou Bobo DIALLO Développement et Administration des SI sous Oracle 4
Dev’IT Centre : Cours de Base de Données Oracle/SQL
Tout système d'exploitation d'un ordinateur contient un SGF spécifique. Toutefois, pour les
applications, on fait plutôt appel à des progiciels du commerce (exemple: dBase, Filemaker, ...),
d'un usage plus simple et offrant des fonctionnalités plus élaborées.
Il est à noter que l'implantation physique d'une base de données sur les mémoires secondaires se
fait via la notion de fichier. Le choix de ceux-ci, toutefois, reste de la compétence du SGBD et est
invisible à l'utilisateur. Le cours abordera les techniques de gestion de fichiers lorsque nous
traiterons des aspects internes de réalisation d'un SGBD.
Stratégie et Analyse
• Etude et analyse des besoins. Consultation des utilisateurs et responsables en vue d'identifier les
besoins en informations. Intégration des divers rapports d'entreprise et comptes-rendus de
mission, ainsi que des éventuelles spécifications futures du système.
• Création de plusieurs modèles du système. Transformation des spécifications écrites en une
représentation graphique des besoins et règles d'information de gestion. Révision et confirmation
de certains éléments du modèle avec les analystes et les experts.
Design (Conception)
Définition de la base de données à partir du schéma conceptuel des données développé au cours
de la phase précédente.
Réalisation et Documentation
• Génération des commandes de création des tables et des objets de la base de données.
• Développement de la documentation utilisateur, des textes d'aide et des manuels destinés à
faciliter l’utilisation et le maniement du système.
Mise en œuvre
Passage en production impliquant les tests d'acceptation utilisateur, la conversion des données
existantes et les opérations parallèles. Ajout des modifications nécessaires.
Formation des utilisateurs finaux.
Production et Maintenance
Livraison du système aux utilisateurs et mise en oeuvre. Contrôle des performances et
amélioration du système.
Maintenance du système.
Le Modèle Relationnel
C’est le Dr. E. F. Codd qui, en juin 1970, a présenté pour la première fois les principes du modèle
relationnel pour les bases de données dans un article intitulé "A Relational Model of Data for
Large Shared Data Banks".
A cette époque, les modèles les plus utilisés étaient les modèles hiérarchiques et réseau, voire de
simples structures séquentielles. Les systèmes de gestion de bases de données relationnelles
(SGBDR) furent rapidement adoptés en raison, notamment, de leur simplicité d’utilisation et de la
flexibilité de leur structure. En outre, plusieurs fournisseurs novateurs, tels que Oracle, ont
complété les SGBDR en leur adjoignant une série de puissants outils de développement
d'applications et produits utilisateur, offrant ainsi une solution complète.
Modèles de Données
Toute conception repose sur un modèle. Ainsi, les ingénieurs automobile commencent par
concevoir un modèle de voiture, afin d’en vérifier tous les détails avant de lancer la production.
De la même manière, les concepteurs de systèmes développent des modèles pour tester les
nouvelles idées et améliorer la conception des bases de données.
Les modèles facilitent l’explication et la compréhension des concepts. On peut les utiliser pour :
• Communiquer
• Classifier
• Décrire
• Spécifier
• Rechercher
• Evoluer
• Analyser
• Imiter
L’objectif est de produire un modèle adapté au maximum de ces usages, compréhensible par un
utilisateur final et suffisamment précis pour permettre au développeur de créer un système de base
de données.
Modélisation ER (Entité-Relation)
Dans un système réel, les données sont divisées en catégories discrètes ou entités. Un modèle ER
est la représentation des diverses entités qui existent au sein d’une société et de leurs
interrelations. Un modèle ER est issu de règles de gestion ou de compte-rendu d'interview et est
conçu au cours de la phase d’analyse du cycle de vie du système. Dans les modèles ER,
l’information nécessaire à une société est séparée des activités de cette société. En effet, même si
l'activité change, le type d’information, lui, a tendance à ne pas varier. Ainsi les structures de
données tendent elles aussi à être constantes.
Avantages de la Modélisation ER
Une base de données relationnelle peut contenir une ou plusieurs tables. La table est la structure
de stockage élémentaire d'un SGBDR. Elle contient toutes les données nécessaires relatives à des
éléments du monde réel, par exemple, des employés, des factures, des clients.
La diapositive ci-dessus montre le contenu de la table ou relation EMP. Les numéros désignent
les éléments suivants :
1. Une ligne unique ou tuple indiquant toutes les données concernant un employé particulier.
Chaque ligne de la table doit être identifiée par une clé primaire, ce qui permet d'éviter les
doublons. L'ordre des lignes n'a pas d'importance ; il peut être spécifié lors de l'extraction des
données.
2. Cette colonne ou attribut contenant le matricule des employés, est la clé primaire. Le matricule
identifie un employé unique dans la table EMP. La colonne clé primaire doit obligatoirement être
renseignée.
3. Cette colonne ne contient pas de valeur clé. Dans une table, une colonne représente un type de
données ; ici, il s'agit des intitulés de postes de tous les employés. L'ordre des colonnes n'a pas
d'importance pour le stockage des données ; il peut être spécifié lors de l'extraction des données.
4. Cette colonne contenant le numéro du département fait également office de clé étrangère. Une
clé étrangère est une colonne qui définit la manière dont les tables sont liées entre elles. Elle fait
référence à une clé primaire ou à une clé unique d'une autre table.
Dans l'exemple, DEPTNO identifie de façon unique un département de la table DEPT.
5. Un champ se situe à l'intersection d'une ligne et d'une colonne. Il ne peut contenir qu'une seule
valeur.
6. Un champ peut ne contenir aucune valeur. On parle alors de valeur NULL. Dans la table EMP,
seules les lignes des employés ayant le statut de vendeur contiennent une valeur dans le champ
COMM (commission).
Amadou Bobo DIALLO Développement et Administration des SI sous Oracle 8
Dev’IT Centre : Cours de Base de Données Oracle/SQL
Remarque : les valeurs NULL sont traitées plus en détails dans les chapitres suivants.
Chaque table contient des données qui décrivent une et une seule entité. La table EMP, par
exemple, contient des données sur les employés. Un format de table permet immédiatement de
visualiser, comprendre et utiliser l'information.
Les données concernant chaque entité distincte étant stockées dans différentes tables, il peut être
nécessaire de combiner deux ou plusieurs tables afin de répondre à une question particulière.
Supposons, par exemple, que vous vouliez savoir où se situe le département d'un employé. Vous
avez besoin pour cela des données de la table EMP (contenant des informations sur les employés)
et de la table DEPT (contenant des informations sur les départements). Un SGBDR permet de lier
les données de deux tables au moyen de la clé étrangère. La clé étrangère est une colonne ou un
ensemble de colonnes faisant référence à une clé primaire de la même table ou d'une autre table.
La possibilité de relier les données d'une table à celles d'une autre table permet d'organiser
l'information en unités séparées et faciles à gérer. Ainsi, vous pouvez séparer de façon logique les
données concernant les employés de celles concernant les départements, en les stockant dans des
tables différentes.
Dans une base de données relationnelle, il est inutile d'indiquer le chemin d'accès aux tables ni de
connaître l'agencement physique des données.
Pour accéder à la base de données, vous exécutez un ordre du langage SQL (Structured Query
Language) qui est le langage standard ANSI des bases de données relationnelles. Il comprend un
grand nombre d'opérateurs qui permettent de partitionner et combiner les relations. La base de
données peut être modifiée au moyen d'ordres SQL.
Oracle offre un SGBDR flexible, Oracle Server. Ce système permet de stocker et gérer des
données, avec tous les avantages que procure une structure relationnelle combinée à PL/SQL,
moteur permettant de stocker et d'exécuter des unités de programme. Oracle Server permet aux
Amadou Bobo DIALLO Développement et Administration des SI sous Oracle 9
Dev’IT Centre : Cours de Base de Données Oracle/SQL
utilisateurs des accès optimisés aux données. Il inclut des fonctions de sécurité qui contrôlent les
accès à la base de données et son utilisation. Il comprend aussi des mécanismes de verrouillage
qui assurent la cohérence et la protection des données.
Les applications Oracle peuvent être exécutées sur le même ordinateur qu'Oracle Server. Mais il
est également possible d'exécuter les applications sur un ordinateur local et Oracle Server sur un
autre système (architecture client-serveur). Un tel environnement client-serveur peut faire appel à
de nombreuses ressources de traitement. Par exemple, une application de réservation de billets
d'avion peut tourner sur un PC client, avec accès aux données de vol gérées par un système Oracle
Server sur ordinateur central.
SQL :
Un ordre SELECT permet d'extraire des informations d'une base de données. L'utilisation d'un
ordre SELECT offre les possibilités suivantes :
Sélection : SQL permet de choisir dans une table, les lignes que l'on souhaite ramener au
moyen d'une requête. Divers critères de sélection sont disponibles à cet effet.
Projection : SQL permet de choisir dans une table, les colonnes que l'on souhaite ramener
au moyen d'une requête. Vous pouvez déterminer autant de colonnes que vous le
souhaitez.
Jointure : SQL permet de joindre des données stockées dans différentes tables, en créant
un lien par le biais d'une colonne commune à chacune des tables. Les jointures seront
décrites en détail dans la suite de ce cours.
Remarque : nous utiliserons les termes mot-clé, clause et ordre tout au long de ce cours.
En suivant les règles et indications simples ci-dessous, vous pourrez créer des ordres corrects,
simples à lire et à éditer.
• Sauf indication contraire, les ordres SQL peuvent être écrits indifféremment en majuscules ou en
minuscules.
• Les ordres SQL peuvent être saisis sur plusieurs lignes.
• Les mots-clés ne doivent pas être scindés sur deux lignes différentes, ni abrégés.
• Les clauses se placent généralement sur des lignes distinctes pour en faciliter la lecture et
l'édition.
• L'utilisation de tabulations et d'indentations permet une meilleure lisibilité.
• Généralement, les mots-clés sont saisis en majuscules, et tous les autres termes, tels que les
noms de tables et de colonnes, sont saisis en minuscules.
• Dans le SQL*Plus, un ordre SQL est saisi au prompt SQL, et les lignes qui suivent sont
numérotées. C'est ce qu'on appelle le buffer SQL. Il ne peut y avoir qu'un seul ordre courant à la
fois dans le buffer.
Pour afficher toutes les colonnes d'une table, placez un astérisque à la suite du mot-clé
SELECT (*).
Exemple : SELECT * FROM dept ;
Vous pouvez également afficher toutes les colonnes de la table en les énumérant toutes à la suite
du mot-clé SELECT. Par exemple, l'ordre SQL suivant affiche toutes les colonnes et toutes les
lignes de la table DEPT au même titre la requête définie dans l’exemple précédent :
L'ordre SELECT peut être utilisé pour afficher des colonnes spécifiques de la table. Pour cela,
indiquez les noms de colonnes séparés par des virgules. L'exemple ci-dessus affiche tous les
numéros de département de la table DEPT, ainsi que leur localisation.
Dans la clause SELECT, indiquez les colonnes dans l'ordre où vous souhaitez qu'elles vous soient
rapportées.
Les en-têtes de colonnes, comme les données, alphanumériques et dates sont justifiées à gauche.
Les en-têtes de colonnes, comme les données, numériques sont justifiées à droite.
Opérateurs Arithmétiques
L'exemple suivant utilise l'opérateur d'addition pour calculer l'augmentation de salaire de 300 pour
tous les employés, puis affiche une nouvelle colonne SAL+300.
Lorsqu'il manque une valeur dans une colonne sur une ligne, la valeur est dite NULL.
Une valeur NULL est une valeur non disponible, non affectée, inconnue ou inapplicable. Une
valeur NULL est différente du zéro ou de l'espace. Le zéro est un chiffre et l'espace est un
caractère.
Quel que soit le type de données d'une colonne, celle-ci peut contenir des valeurs NULL, excepté
lorsque cette colonne a été définie comme NOT NULL ou comme CLE PRIMAIRE lors de sa
création.
Dans la colonne COMM de la table EMP, vous pouvez remarquer que seul un employé occupant
le poste de vendeur est habilité à toucher une commission. Ainsi, pour les non vendeurs COMM
contient NULL. Turner, vendeur, n'a pas touché de commission : la valeur de sa commission est 0
et par conséquent non NULL.
Lorsqu'une valeur NULL est utilisée dans une expression arithmétique, le résultat de cette
expression est NULL. Si vous essayez de diviser par zéro, vous obtenez une erreur. En revanche,
si vous divisez un nombre par NULL, le résultat sera NULL ou inconnu.
Dans l'exemple ci-dessous, l'employé SMITH ne fait pas partie de la catégorie SALESMAN et ne
touche donc pas de commission. La valeur de la colonne COMM dans l'expression arithmétique
étant NULL, le résultat est donc NULL.
Lors de l'affichage des résultats d'une requête, SQL*Plus prend le nom de la colonne sélectionnée
comme en-tête de colonne. La plupart du temps, cet en-tête n'est pas explicite et par conséquent
est difficile à comprendre. L'alias de colonne permet de modifier l'en-tête d'une colonne.
On spécifie l'alias à la suite de la colonne dans la liste SELECT en utilisant le caractère espace
comme séparateur. Par défaut, les en-têtes de colonne sont en majuscules. Si l'alias contient des
espaces ou des caractères spéciaux (tels que # ou $), ou si la différence entre majuscules et
minuscules est importante, placez l'alias entre guillemets (" ").
Amadou Bobo DIALLO Développement et Administration des SI sous Oracle 14
Dev’IT Centre : Cours de Base de Données Oracle/SQL
Exemple1 :
Exemple2:
SELECT ename “Nom”, job AS “Fonction”, sal AS “Salaire”
FROM emp ;
Exemple3:
SELECT ename “Nom”, job AS “Fonction”, sal AS “Salaire”, sal * 12 AS “Salaire Annuel”
FROM emp ;
Remarque: Le mot-clé optionnel AS a été placé avant l'alias de colonne. L'utilisation ou non de
ce mot-clé ne modifie pas le résultat de la requête.
L'Opérateur de Concaténation
L'opérateur de concaténation représenté par deux barres verticales (||) permet de concaténer des
colonnes à d'autres colonnes, à des expressions arithmétiques ou à des valeurs constantes afin de
créer une expression caractère. Les colonnes situées de part et d'autre de l'opérateur se combinent
pour donner une colonne unique lors de la restitution des données.
Exemple 1:
SELECT ename||job “Employes”
FROM emp;
Amadou Bobo DIALLO Développement et Administration des SI sous Oracle 15
Dev’IT Centre : Cours de Base de Données Oracle/SQL
Employes
--------------------------
SMITHCLERK
ALLENSALESMAN
WARDSALESMAN
Exemple 2:
SELECT ename||’ ‘||job “Employes”
FROM emp ;
Employes
--------------------------
SMITH CLERK
ALLENS ALESMAN
WARD SALESMAN
Un littéral est un caractère, une expression, ou un nombre quelconque inclus dans la liste
SELECT, et qui n'est ni un nom de colonne ni un alias de colonne. Il apparaît sur chaque ligne
ramenée. Des chaînes de texte littérales en format libre peuvent être intégrées au résultat de la
requête. Elles sont traitées comme les colonnes dans une liste SELECT.
Les littéraux date et alphanumérique doivent être inclus entre simples quotes (' '), mais pas les
littéraux numériques.
Exemple :
SELECT ename||’ excerce la fonction de ‘||job “Fonction Employés”
FROM emp ;
Fonction Employés
-------------------------------------------------------
SMITH excerce la fonction de CLERK
ALLEN excerce la fonction de SALESMAN
JONES excerce la fonction de MANAGER
Doublons
Par défaut, l'instruction SELECT retourne un résultat sans éliminer les doublons. L'exemple ci-
après affiche la totalité des numéros de département de la table EMP. Vous pouvez remarquer que
certains numéros de département apparaissent plusieurs fois.
SELECT deptno
FROM emp ;
DEPTNO
-----------
20
30
30
20
Pour éliminer les doublons du résultat d'une requête, ajoutez le mot-clé DISTINCT à la clause
SELECT, directement à la suite du mot-clé SELECT.
Exemple :
SELECT DISTINCT deptno
FROM emp ;
DEPTNO
-----------
10
20
30
Objectifs : Lors d’une recherche de données dans une base de données, il est parfois nécessaire
de restreindre le nombre de lignes retournées ou de préciser l’ordre d’affichage de ces lignes. Ce
chapitre explique quelles clauses SQL utiliser à cet effet.
On peut limiter le nombre de lignes ramenées par la requête au moyen de la clause WHERE.
La clause WHERE permet de spécifier une condition à satisfaire.
Exemple1:
Exemple 2:
Dans la clause WHERE, les chaînes alphanumériques et les dates doivent être incluses entre
simples quottes (''), mais pas les constantes numériques.
Amadou Bobo DIALLO Développement et Administration des SI sous Oracle 18
Dev’IT Centre : Cours de Base de Données Oracle/SQL
Toutes les recherches de caractères tiennent compte des majuscules et des minuscules. Dans
l'exemple ci-dessous, aucune ligne n'est ramenée car, dans la table EMP, toutes les données sont
stockées en lettres majuscules.
Oracle stocke les dates dans un certain format numérique interne, représentant le siècle, l'année, le
mois, le jour, les heures, les minutes et les secondes. Le format de date par défaut est
DD-MON-YY.
Opérateurs de Comparaison
Opérateur Description
= Egal à
> Supérieur à
>= Supérieur ou égal à
< Inférieur à
<= Inférieur ou égal à
<> ou != Différent de
Ces opérateurs de comparaison s'utilisent dans les conditions qui comparent deux expressions.
Exemples :
Opérateur Description
BETWEEN…AND… Compris entre…et… (bornes)
IN (liste) Correspond à une valeur de liste
LIKE Ressemblance partielle des chaînes de
caractères
IS NULL Correspond à une valeur NULL
L'Opérateur BETWEEN :
L'opérateur BETWEEN permet d'afficher des lignes en fonction d'un intervalle de valeurs.
Vous spécifiez un intervalle comprenant une limite inférieure et une limite supérieure.
Exemple:
L'Opérateur IN :
Pour comparer une expression avec une liste de valeurs, utilisez l'opérateur IN.
Exemple :
SELECT empno, ename, job, sal
FROM emp
WHERE ename IN (‘SMITH’,’JONES’,’ALLEN’);
L'Opérateur LIKE :
Vous ne connaissez pas toujours les valeurs exactes à rechercher. Vous pouvez sélectionner des
lignes correspondant à une suite de caractères au moyen de l'opérateur LIKE. L'opération ainsi
exécutée est appelée recherche générique. Deux symboles sont utilisables pour construire la
chaîne de recherche :
Symbole Description
% Représente zéro caractère ou une séquence quelconque de caractères
_ Représente un caractère quelconque
L'ordre SELECT ci-dessous ramène tous les employés dont le nom commence par "J" (il s'agit
bien du J majuscule). Les noms commençant par "j" ne seront pas sélectionnés.
L'opérateur LIKE peut s'utiliser comme raccourci dans certaines comparaisons BETWEEN.
L'exemple suivant affiche le nom et la date d'embauche de tous les employés ayant rejoint la
société entre Janvier 1981 et Décembre 1981.
Les symboles % et _ peuvent être combinés de manière quelconque avec des caractères littéraux.
L'exemple de la diapositive affiche le nom des employés dont la deuxième lettre est un "L".
L'Opérateur IS NULL :
L'opérateur IS NULL teste les valeurs NULL. Une valeur NULL est indisponible, non attribuée,
inconnue ou inapplicable. Il est donc impossible de tester une valeur NULL à l'aide de l'opérateur
(=) puisqu'elle ne peut répondre à aucune condition d'égalité ou d'inégalité.
L'exemple ci-dessous recherche le nom et le manager de tous les employés n'ayant pas de
manager.
Opérateurs Logiques
Un opérateur logique combine le résultat de deux conditions pour produire un résultat unique ou
inverse le résultat d'une condition unique. SQL inclut trois opérateurs logiques :
Opérateur Description
AND Retourne TRUE si les deux conditions sont VRAIES
OR Retourne TRUE si au moins l’une des conditions est VRAIE
NOT Ramène la valeur TRUE si la condition qui suit l’opérateur
est fausse
Tous les exemples que vous avez vus jusqu'ici ne spécifiaient qu'une seule condition dans la
clause WHERE. En utilisant les opérateurs AND et OR, vous pouvez inclure plusieurs conditions
dans une même clause WHERE.
L'Opérateur AND :
Dans l'exemple suivant, les deux conditions doivent être vraies pour qu'un enregistrement soit
sélectionné. Ainsi, tout employé dont le poste est MANAGER et qui gagne plus de $2000 sera
sélectionné.
Toutes les recherches de caractères font la distinction entre les majuscules et les minuscules.
Aucune ligne n'est ramenée si le mot CLERK n'est pas entièrement en majuscules. Les chaînes de
caractères doivent obligatoirement être incluses entre simples quottes.
L'Opérateur OR :
Dans l'exemple suivant, l'une ou l'autre des deux conditions doit être vraie pour qu'un
enregistrement quelconque soit sélectionné. Ainsi, tout employé dont le poste est MANAGER ou
qui gagne plus de $2000 est sélectionné
L'Opérateur NOT :
L'exemple ci-dessous affiche le nom et le poste de tous les employés dont l'intitulé du poste n'est
pas MANAGER ni ANALYST.
Remarque : l'opérateur NOT peut également s'utiliser avec d'autres opérateurs SQL comme
BETWEEN, LIKE et NULL.
Exemples :
La Clause ORDER BY
Les lignes trouvées par une requête sont ramenées dans un ordre quelconque.
La clause ORDER BY sert à trier les lignes. Si vous l'utilisez, vous devez la placer en dernier
dans l'ordre SELECT. Vous pouvez spécifier une expression ou un alias sur lesquels le tri sera
effectué.
Syntaxe
SELECT expr
FROM table
[WHERE condition (s)]
[ORDER BY {column, expr} [ASC|DESC]];
Si la clause ORDER BY n'est pas utilisée, l'ordre de tri est indéfini et il peut arriver qu’Oracle
n'extraie pas deux fois de suite les lignes d'une même requête dans un ordre identique. Pour
afficher les lignes dans un ordre spécifique, il faut spécifier une clause ORDER BY.
Exemple :
Pour inverser l'ordre d'affichage des lignes, spécifiez le mot-clé DESC après le nom de colonne
dans la clause ORDER BY. Dans l'exemple ci-dessus, les résultats sont triés à partir du dernier
salarié embauché.
Exemple :
Vous pouvez trier les résultats d'une requête sur plusieurs colonnes, à concurrence du nombre de
colonnes présentes dans la table concernée.
Dans la clause ORDER BY, spécifiez les noms de colonnes en les séparant par une virgule.
Pour inverser l'ordre de tri d'une colonne, faites suivre son nom du mot-clé DESC. Vous pouvez
faire un tri sur des colonnes non incluses dans la clause SELECT.
Exemple :
Affichez le nom et le salaire de tous les employés et classez le résultat par numéro de département
croissant, puis par salaire décroissant.
Objectifs : Les fonctions rendent l'instruction SELECT plus puissante en permettant de manipuler
des valeurs de données. Ce chapitre est le premier de deux consacrés aux fonctions.
Il explique en particulier les fonctions caractère, numériques et date, ainsi que les fonctions qui
convertissent des données d'un certain type en un autre type, par exemple, des données de type
caractère en données numériques.
Fonctions SQL
Les fonctions représentent une caractéristique très puissante de SQL et sont utilisées pour :
o Effectuer des calculs sur des données
o Transformer des données
o Effectuer des calculs sur des groupes de lignes
o Formater des dates et des nombres pour l'affichage
o Convertir des types de données de colonnes
Remarque: la plupart des fonctions SQL décrites dans ce chapitre sont spécifiques au SQL
d'Oracle.
NB : Dans le cadre de ce cours, nous nous limiterons uniquement aux fonctions mono-ligne.
Fonctions Mono-Ligne
Ces fonctions agissent sur une seule ligne à la fois et ramènent un seul résultat. Il existe plusieurs
types de fonctions mono-ligne. Ce chapitre décrit les quatre suivantes :
Caractère
Numérique
Date
Conversion
Les fonctions mono-ligne sont utilisées pour manipuler des éléments de données. Elles acceptent
un ou plusieurs arguments et ramènent une seule valeur par ligne issue de la requête. Un argument
peut être l'un des éléments suivants :
• Une valeur constante utilisateur
• Une variable
• Un nom de colonne
• Une expression
Fonctions caractère
Les fonctions mono-ligne caractère acceptent des données caractère en entrée et ramènent des
données caractère ou numériques. Les fonctions caractère se divisent en deux groupes :
Les fonctions de conversion majuscules/minuscules
Les fonctions de manipulation des caractères
Fonction Modification
LOWER(column|expression) Convertit les caractères alphabétiques en minuscules.
UPPER(column|expression) Convertit les caractères alphabétiques en majuscules.
Convertit l’initiale de chaque mot en majuscule et les caractères suivants en
INITCAP(column|expression) minuscules.
CONCAT(column1|expression1, Concatène la première chaîne de caractère à la seconde. Equivaut à l’opérateur
column2|expression2) de concaténation (||).
SUBSTR(column|expression,m[,n]) Extrait une partie de la chaîne de caractères en commençant au caractère situé à
la position m et sur une longueur de n caractères.
Si m est une valeur négative, le décompte s’effectue dans le sens inverse (à
partir du dernier caractère de la chaîne).
Si n est omis, tous les caractères jusqu’à la fin de la chaîne sont ramenés.
LENGTH(column|expression) Ramène le nombre de caractères d'une chaîne de caractères.
LOWER, UPPER, et INITCAP sont les trois fonctions qui modifient la casse.
• LOWER : Convertit tous les caractères d'une chaîne en minuscules
• UPPER : Convertit tous les caractères d'une chaîne en majuscules
• INITCAP : Convertit la première lettre de chaque mot en majuscule et les lettres suivantes en
minuscules
Exemples :
Remarque : La table DUAL est une table factice. Nous y reviendrons ultérieurement
CONCAT, SUBSTR, LENGTH, INSTR et LPAD sont les cinq fonctions de manipulation des
caractères étudiées dans ce chapitre.
CONCAT : Concatène des valeurs. Le nombre de paramètres avec CONCAT est limité à
deux.
SUBSTR : Extrait une chaîne de longueur déterminée.
LENGTH : Fournit la valeur numérique correspondant au nombre de caractères d'une
chaîne.
INSTR : Fournit la valeur numérique correspondant à la position d'un caractère.
LPAD : Ajoute des caractères de remplissage à la gauche d'une valeur alphanumérique qui
sera ainsi cadrée à droite.
Exemple :
Fonctions numériques
Les fonctions numériques utilisent et ramènent des valeurs numériques. Cette section décrit
quelques-unes de ces fonctions.
Fonction Modification
ROUND(column|expression, n) Arrondit la valeur de la colonne ou de l’expression à une précision
de 10-n.
Si n est positif, le nombre sera arrondi à n décimales.
Si n est omis, il n’y aura pas de décimale.
Si n est négatif, l'arrondi portera sur la partie du nombre
située à gauche de la virgule (dizaine, centaine...)
TRUNC(column|expression,n) Tronque la valeur de la colonne ou de l’expression à une précision
de 10-n.
Si n est positif, le nombre sera tronqué à n décimales.
Si n est omis, il n’y aura pas de décimale.
Si n est négatif, ce sera la partie du nombre située à gauche
de la virgule (dizaine, centaine...) qui sera tronquée.
MOD(m,n) Ramène le reste de la division de m par n.
Exemples :
SELECT ROUND (75.927, 2), ROUND (75.927, 0), ROUND (75.927, -1)
FROM DUAL;
SELECT TRUNC (75.927, 2), TRUNC (75.927, 0), TRUNC (75.927, -1)
FROM DUAL;
Le format d'entrée et d'affichage par défaut des dates est DD-MON-YY. Les dates valides pour
Oracle sont comprises entre le 1er janvier 4712 av.J.-C. et le 31 décembre 9999 apr.J.-C.
SYSDATE
SYSDATE est une fonction date qui permet d'obtenir la date et l'heure courante. SYSDATE
s'utilise de la même façon qu'un nom de colonne quelconque. Il est usuel d'interroger la table
"factice" DUAL.
DUAL
La table DUAL appartient à l'utilisateur SYS, mais tous les utilisateurs peuvent y accéder. Elle
contient une seule colonne, DUMMY, et une seule ligne contenant la valeur X. La table DUAL
est utile lorsque vous souhaitez ramener une valeur une seule fois, par exemple, la valeur d'une
constante, d'une pseudo-colonne ou d'une expression qui ne dépend pas d'une table de données
utilisateur.
Exemple
Afficher la date courante au moyen de la table DUAL.
SELECT SYSDATE
FROM DUAL ;
Comme la base de données stocke les dates en tant que données numériques, il est possible
d'effectuer des calculs tels que l'addition ou la soustraction au moyen d'opérateurs arithmétiques.
Il est possible d'ajouter et soustraire des constantes numériques aussi bien que des dates.
Les opérations possibles sont les suivantes :
L'exemple suivant affiche le nom et le nombre de semaines d'ancienneté de tous les employés du
département 20. La date courante (SYSDATE) est soustraite de la date d'embauche de l'employé,
puis le résultat est divisé par 7 pour obtenir le nombre de semaines d'ancienneté.
Remarque : SYSDATE est une fonction SQL qui donne l'heure et la date courantes. Vos résultats
peuvent donc être différents de ceux de l'exemple.
Fonctions Date
Les fonctions date s'appliquent aux données de type DATE. Toutes les fonctions date ramènent
une valeur de type DATE, à l'exception de MONTHS_BETWEEN qui ramène une valeur
numérique.
MONTHS_BETWEEN(date1, date2) : Donne le nombre de mois situés entre une date
(date1) et une autre date (date2). Le résultat peut être positif ou négatif. Si date1 est
postérieure à date2, le résultat est positif ; si date1 est antérieure à date2, le résultat est
négatif. La partie non entière du résultat représente une portion de mois.
ADD_MONTHS(date, n) : Ajoute un nombre n de mois à une date. n doit être un nombre
entier et peut être négatif.
NEXT_DAY(date, ‘char’) : Fournit la date de la première occurrence du jour spécifié
(‘char’) après la date fournie. char peut être, soit un numéro de jour de semaine, soit une
chaîne de caractères.
LAST_DAY(date) : Indique la date du dernier jour du mois auquel appartient la date
indiquée.
Cette liste des fonctions date n'est pas exhaustive. Les modèles de format sont expliqués dans la
suite de ce chapitre. Le mois ou l'année sont des exemples de modèles de format.
Exemples :
Pour les affectations, Oracle Server peut convertir automatiquement les types de données
suivants:
L'affectation réussit si Oracle Server parvient à convertir le type de données de la valeur à affecter
dans le type de données de la cible de l'affectation.
SQL offre trois fonctions pour convertir une valeur d'un certain type de données dans autre type :
Fonction Résultat
TO_CHAR(number|date,[‘fmt’]) Convertit un nombre ou une date en une chaîne de
caractères de type VARCHAR2 et de format fmt.
TO_NUMBER(char) Convertit une chaîne de caractères en un nombre.
TO_DATE(char,[‘fmt’]) Convertit une chaîne de caractères représentant une date
au format fmt en une date Oracle. Lorsque fmt est omis,
le format est DD-MON-YY.
Exemples :
Formats Horaires
Utilisez les formats suivants pour afficher des informations et littéraux de type heure, et pour
transformer des valeurs numériques en caractères.
Elément Description
AM ou PM Respectivement, matin ou après-midi
A.M. ou P.M. Respectivement, matin ou après-midi avec points
HH ou HH12 ou HH24 Heure du jour ou heure (1 à 12) ou heure (0 à 23)
MI Minutes (0 à 59)
SS Secondes (0 à 59)
SSSSS Secondes après minuit (0 à 86399)
La fonction NVL
Pour transformer une valeur NULL en une valeur réelle, on utilise la fonction NVL.
Syntaxe
La fonction NVL permet de convertir n'importe quel type de données, mais toutefois, la valeur de
remplacement doit être de même type que la valeur de l'expression expr1.
Exemple :
Afficher le salaire annuel de tous les employés
SELECT ename, job, sal, comm, (sal * 12) + NVL (comm, 0) "Salaire Annuel + commission"
FROM emp;
Objectifs : Au cours de ce chapitre, vous allez étudier les différentes façons d'obtenir des données
de plusieurs tables.
On a parfois besoin d'obtenir des données de plusieurs tables. Dans l'exemple ci-dessus, l'état
affiche les données de deux tables différentes.
EMPNO appartient à la table EMP.
DEPTNO appartient aux tables EMP et DEPT.
LOC appartient à la table DEPT.
Pour obtenir cet état, il faut relier les tables EMP et DEPT et accéder aux données de ces deux
tables.
Pour obtenir des données appartenant à différentes tables de la base de données, vous devez
utiliser une condition de jointure. Les lignes d'une table peuvent être reliées aux lignes d'une autre
table en fonction de valeurs communes existant dans des colonnes se correspondant, en général la
colonne clé primaire et la colonne clé étrangère.
Pour afficher les données issues de deux ou plusieurs tables, écrivez une condition de jointure
simple dans la clause WHERE.
Syntaxe :
Conseils
Lorque vous écrivez un ordre SELECT pour joindre des tables, il est recommandé, par
souci de clarté et de facilité d'accès, de placer le nom de la table avant le nom de la
colonne.
Lorsque le même nom de colonne apparaît dans plusieurs tables, il doit obligatoirement
être préfixé par le nom de la table.
Produit Cartésien
Amadou Bobo DIALLO Développement et Administration des SI sous Oracle 33
Dev’IT Centre : Cours de Base de Données Oracle/SQL
Lorsqu'une condition de jointure est incorrecte ou tout simplement omise, on obtient un produit
cartésien dans lequel sont affichées toutes les combinaisons de lignes. Toutes les lignes de la
première table sont jointes à toutes les lignes de la seconde.
Un produit cartésien fournit en général un nombre important de lignes, donnant un résultat
rarement exploitable. C'est pourquoi il faut toujours inclure une condition de jointure correcte
dans une clause WHERE, à moins que vous n'ayez réellement besoin de combiner toutes les
lignes de toutes les tables.
L'omission d'une condition de jointure génère un produit cartésien. L'exemple suivant affiche le
nom d'employé et le nom de département des tables EMP et DEPT. Comme aucune clause
WHERE n'a été spécifiée, toutes les lignes (14) de la table EMP ont été jointes à l'ensemble des
lignes (4) de la table DEPT, donnant ainsi un résultat de 56 lignes.
Types de Jointures
Equijointures
Pour déterminer le département auquel appartient un employé, vous devez comparer les valeurs de
la colonne DEPTNO de la table EMP avec les valeurs de la colonne DEPTNO de la table DEPT.
La relation établie entre les tables EMP et DEPT est une équijointure : les valeurs de la colonne
DEPTNO appartenant aux deux tables doivent être identiques. Ce type de relation fait souvent
appel aux clés primaires et étrangères.
Exemple :
SELECT emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc
FROM emp, dept
WHERE emp.deptno = dept.deptno;
La clause FROM spécifie les deux tables de la base de données auxquelles on souhaite
accéder :
– la table EMP
– la table DEPT
La clause WHERE spécifie la façon dont les deux tables sont jointes :
EMP.DEPTNO=DEPT.DEPTNO
La colonne DEPTNO étant commune aux deux tables, vous devez la préfixer du nom de la table
d'appartenance afin d'éviter toute ambiguïté.
Remarque : les équijointures sont aussi appelées jointures simples ou jointures internes.
Alias de Table
La qualification des noms de colonne à l'aide des noms de table peut prendre beaucoup de temps,
en particulier si les noms de table sont longs. Vous pouvez substituer des alias de table aux noms
de table. De la même manière qu'un alias de colonne renomme une colonne, un alias de table
donne un nouveau nom à une table. Les alias de table permettent ainsi de réduire le volume du
code SQL et donc, de gagner de la place en mémoire.
Notez la manière dont les alias de table sont identifiés dans la clause FROM de l'exemple. Le nom
de la table spécifié en entier est suivi d'un espace puis de l'alias de table. E est l'alias de la table
EMP, et D l'alias de la table DEPT.
Conseils
Bien qu'un alias de table puisse compter jusqu'à 30 caractères, il est préférable qu'il soit le
plus court possible.
Lorsqu'un alias de table est substitué à un nom de table dans la clause FROM, cette
substitution doit s'opérer dans la totalité de l'ordre SELECT.
Choisissez de préférence des alias "parlants".
Un alias de table ne s'applique que dans l'ordre SELECT courant.
Exemple :
Non-Equijointures
La relation entre la table EMP et la table SALGRADE (schéma de SCOTT) est une non-
équijointure car aucune colonne de la table EMP ne correspond directement à une colonne de la
table SALGRADE. La relation existant entre les deux tables est la suivante: les valeurs de la
colonne SAL de la table EMP sont comprises entre celles des colonnes LOSAL et HISAL de la
table SALGRADE. Il faut donc utiliser un autre opérateur que le signe égal (=) pour effectuer une
jointure.
L'exemple ci-dessous crée une non-équijointure pour évaluer l'échelon de salaire d'un employé. Le
salaire est obligatoirement compris entre deux valeurs délimitant une tranche salariale.
Il est important de noter que tous les employés n'apparaissent qu'une seule fois dans la liste
lorsque la requête est exécutée, et ce pour deux raisons :
Aucune ligne de la table des échelons de salaire ne déborde sur une autre. Autrement dit,
le salaire d'un employé se situe nécessairement entre la valeur minimale et la valeur
maximale d'une des lignes de la table.
Tous les salaires des employés entrent dans les limites prévues par la table des échelons de
salaire. Aucun employé ne peut gagner moins que le salaire minimal de la colonne
LOSAL ni plus que le salaire maximal de la colonne HISAL.
Remarque : il serait possible d'utiliser d'autres opérateurs tels que <= et >=, mais BETWEEN est
le plus simple. Avec BETWEEN, n'oubliez pas de spécifier d'abord la valeur la plus basse puis la
valeur la plus haute. Dans l'exemple, des alias de table ont été spécifiés pour améliorer les
performances et non à cause d’un possible ambiguïté.
Lorsqu'une ligne ne satisfait pas à une condition de jointure, elle n'apparaît pas dans le résultat de
la requête. Par exemple, quand on fait l'équijointure entre les tables EMP et DEPT, le département
OPERATIONS n'apparaît pas car personne ne travaille dans ce département.
Ou
Syntaxe :
table1.colonne = condition qui joint (ou lie) les tables entre-elles.
table2.colonne (+) symbole de jointure externe ; se place d'un côté ou de l'autre de la condition de
la clause WHERE, jamais des deux côtés. Placez le symbole de jointure externe après le nom de
la colonne appartenant à la table où manquent les lignes correspondantes.
Exemple :
L'exemple ci-dessus affiche les numéros et les noms de tous les départements. Le département
OPERATIONS, qui ne comprend aucun employé, est également affiché.
L'opérateur de jointure externe ne peut être placé que d'un seul côté de l'expression, à
savoir le côté où l'information manque. Il permet de ramener les lignes d'une table n'ayant
pas de jointure directe avec l'autre table.
Une condition comportant une jointure externe ne peut pas utiliser l'opérateur IN ni être
liée à une autre condition par l'opérateur OR.
Il se peut que vous ayez besoin de relier une table à elle-même. Ici, pour retrouver le nom du
manager de chaque employé, il faut que la table EMP soit reliée à elle-même. Par exemple, pour
retrouver le nom du manager de l'employé Blake, vous devez :
Dans ce processus, vous utilisez la même table deux fois : la première, pour rechercher le nom de
Blake dans la colonne ENAME et la valeur correspondante dans la colonne MRG ; la seconde,
pour rechercher le matricule 7839 dans la colonne EMPNO et le nom correspondant (King) dans
la colonne ENAME.
L'exemple suivant relie la table EMP à elle-même. Afin de simuler l'existence de deux tables dans
la clause FROM, on a mis deux alias, SUBORDONNE et SUPERIEUR, pour la même table
EMP.
Dans cet exemple, la clause WHERE contient une jointure dont la signification est "lorsque le
matricule du manager d'un employé correspond au matricule du manager".
Objectifs : Ce chapitre poursuit l'étude des fonctions. Il explique comment effectuer des calculs
statistiques, tels que les moyennes, sur des groupes de lignes. Il présente les différentes manières
de grouper les lignes d'une table en sous-ensembles et comment spécifier des critères de recherche
sur ces groupes de lignes.
Contrairement aux fonctions mono-ligne, les fonctions de groupe agissent sur des groupes de
lignes et donnent un résultat par groupe. Un groupe peut être une table entière ou un ensemble de
lignes d'une table
Chaque fonction accepte un argument. La table suivante présente les différentes options de
syntaxe possibles.
Avec DISTINCT, la fonction ne prend en compte que les valeurs distinctes ; avec ALL,
elle tient compte de toutes les valeurs y compris les doublons. La valeur par défaut est
ALL, par conséquent il n'est pas nécessaire de la spécifier.
Si expr est spécifié, les différents types de données possibles pour les arguments sont
CHAR, VARCHAR2, NUMBER ou DATE.
Toutes les fonctions de groupe, à l'exception de COUNT(*), ignorent les valeurs NULL.
Pour substituer une valeur à une valeur NULL, utilisez la fonction NVL.
Vous pouvez utiliser les fonctions AVG, SUM, MIN et MAX avec des colonnes de données
numériques. L'exemple ci-dessous affiche la moyenne, le maximum, le minimum et la somme des
salaires mensuels pour tous les commerciaux.
NB: AVG et SUM s’utilisent avec des données numériques. MIN et MAX s’utilisent avec
tous types de données.
Fonction Description
AVG([DISTINCT|ALL]n) Valeur moyenne de n, en ignorant les valeurs NULL
COUNT({*|[DISTINCT|ALL]expr}) Nombre de lignes, où expr est différent de NULL. Le caractère *
comptabilise toutes les lignes sélectionnées y compris les doublons et
les lignes NULL
MAX([DISTINCT|ALL]expr) Valeur maximale de expr, en ignorant les valeurs NULL
Fonction COUNT
COUNT(*) ramène le nombre de lignes d'une table, y compris les lignes en double et celles
contenant des valeurs NULL.
A l'opposé, COUNT(expr) ramène le nombre de lignes pour lesquelles la colonne identifiée par
expr est non NULL.
SELECT COUNT(*)
FROM emp
WHERE deptno = 20;
SELECT COUNT(comm)
FROM emp
WHERE deptno = 30 ;
Toutes les fonctions de groupe, à l'exception de COUNT (*), ignorent les valeurs NULL des
colonnes. Dans l'exemple ci-dessous, la moyenne est calculée uniquement sur les lignes pour
lesquelles la colonne COMM est renseignée. Le calcul de la moyenne s'effectue en divisant le
total des commissions versées à tous les employés par le nombre d'employés touchant une
commission (4).
SELECT AVG(comm)
FROM emp ;
La fonction NVL force les fonctions de groupe à prendre en compte les valeurs NULL. Dans
l'exemple ci-dessous, la moyenne est calculée sur toutes les lignes de la table y compris celles
dont la colonne COMM contient des valeurs NULL. Le calcul de la moyenne s'effectue en
divisant le total des commissions de tous les employés par le nombre total d'employés de
l'entreprise (14).
Groupes de Données
Jusqu'ici, la table a été prise en compte par les fonctions de groupe, comme un seul groupe
d'informations. Mais il est parfois nécessaire de diviser les informations d'une table en groupes
plus petits. Pour cela, il faut utiliser la clause GROUP BY.
La Clause GROUP BY
Vous pouvez utiliser la clause GROUP BY pour diviser une table en groupes de lignes. Vous
pouvez alors utiliser les fonctions de groupe pour effectuer des calculs statistiques sur chaque
groupe.
Syntaxe :
expression_groupe_by : spécifie les colonnes dont les valeurs déterminent les différents groupes.
Conseils
Lorsque vous intégrez une fonction de groupe dans une clause SELECT, vous ne pouvez
pas en même temps sélectionner des résultats individuels, à moins que la colonne
individuelle ne soit mentionnée dans la clause GROUP BY. Si vous omettez de spécifier
un de ces colonnes, un message d'erreur s'affichera.
Avec la clause WHERE, vous pouvez exclure des lignes avant de créer des groupes.
Vous devez inclure les "colonne" de la liste SELECT dans la clause GROUP BY.
Vous ne pouvez pas utiliser l'alias de colonne dans la clause GROUP BY.
Par défaut, les lignes sont triées dans l'ordre croissant des colonnes incluses dans la liste
GROUP BY. Vous pouvez changer cet ordre en utilisant la clause ORDER BY.
Exemple :
Lorsque vous utilisez la clause GROUP BY, pensez à inclure dans cette clause toutes les colonnes
de la liste SELECT qui ne figurent pas dans les fonctions de groupe. L'exemple ci-dessus affiche
le numéro et le salaire moyen de chaque département. Voici comment est évalué l'ordre SELECT
ci-dessus, qui contient une clause GROUP BY :
La clause SELECT indique les colonnes à extraire :
- Colonne numéro de département de la table EMP
- La moyenne de tous les salaires du groupe que vous avez spécifié dans la clause
GROUP BY
La clause FROM indique les tables de la base de données auxquelles il faut accéder : la
table EMP.
La clause WHERE indique les lignes à extraire. Comme il n'y a pas de clause WHERE,
toutes les lignes seront extraites.
La clause GROUP BY spécifie la manière dont les lignes doivent être groupées. Ici, elles
sont groupées par numéro de département pour permettre à la fonction AVG, appliquée à
la colonne des salaires (sal), de calculer la moyenne des salaires de chaque département.
Chaque fois que vous mélangez des éléments individuels (DEPTNO) et des fonctions de groupe
(COUNT) dans le même ordre SELECT, vous devez obligatoirement inclure une clause GROUP
BY qui spécifie les éléments individuels (ici, DEPTNO). Si la clause GROUP BY est absente,
vous verrez apparaître le message d'erreur " La fonction de groupe ne porte pas sur un groupe
simple ", la colonne incorrecte étant indiquée par un astérisque (*).
L'erreur dans l’exemple ci-dessous peut être corrigée en ajoutant la clause GROUP BY.
SELECT deptno,COUNT(ename)
FROM emp ;
Cette requête affiche l’erreur suivante: La fonction de groupe ne porte pas sur un groupe
simple
Requête corrigée :
SELECT deptno,COUNT(ename)
FROM emp
GROUP BY deptno;
La Clause HAVING
Utilisez la clause HAVING pour indiquer les groupes que vous souhaitez afficher.
Syntaxe :
groupe_condition : limite les groupes de lignes ramenés aux groupes pour lesquels la condition
spécifiée est VRAIE
Il est possible de placer la clause HAVING avant la clause GROUP BY ; néanmoins, pour des
raisons de logique, il est recommandé de placer la clause GROUP BY en tête. Les groupes sont
formés puis les fonctions de groupe calculées avant que la clause HAVING ne soit appliquée aux
groupes de la liste SELECT.
Vous pouvez utiliser la clause GROUP BY sans utiliser de fonction de groupe dans la liste
SELECT.
Si vous souhaitez, pour restreindre les lignes retournées, vous baser sur le résultat d'une fonction
de groupe, vous devez utiliser une clause HAVING plus une clause GROUP BY.
Objectifs : Au cours de ce chapitre, vous allez apprendre à écrire des requêtes avec des opérateurs
ensemblistes.
Présentation
Les opérateurs ensemblistes combinent les résultats de deux ou plusieurs requêtes en un seul
résultat. Une requête composée est une requête contenant des opérateurs ensemblistes.
L'opérateur Ramène
INTERSECT Toutes les lignes communes aux deux requêtes.
INTERSECT combine les deux requêtes et ramène les
lignes du premier ordre SELECT identiques aux
lignes du second ordre SELECT
UNION Toutes les lignes distinctes ramenées par les deux
requêtes.
UNION ALL Toutes les lignes sélectionnées par les deux requêtes,
y compris les doublons.
MINUS Toutes les lignes sélectionnées par le premier ordre
SELECT moins les lignes sélectionnées dans le
second ordre SELECT.
.
Tous les opérateurs ensemblistes ont la même priorité. Si un ordre SQL en contient plusieurs, la
base de données les évalue de gauche à droite ou de haut en bas, si aucune parenthèse n'indique
explicitement un autre ordre.
L'Opérateur UNION
Cet opérateur combine le résultat de deux requêtes. Il permet de ramener toutes les lignes issues
de plusieurs requêtes et d'éliminer les doublons.
Règle :
Le nombre de colonnes et les types de données des colonnes doivent être identiques dans
les deux ordres SELECT. En revanche, les noms de colonnes peuvent être différents.
L'opérateur UNION intervient sur toutes les colonnes sélectionnées. Par exemple, si vous
modifiez la requête de la page suivante pour sélectionner uniquement les noms des
employés et leur poste, ALLEN n'apparaîtra qu'une seule fois dans les résultats.
Les colonnes NULL sont ignorées lors du contrôle des doublons. Par exemple, si la
colonne DEPTNO correspondant à ALLEN contenait une valeur NULL dans le premier
ordre SELECT (si DEPTNO n'était pas une colonne NOT NULL) à la place de la valeur
30 comme dans le second ordre SELECT, ALLEN n'apparaîtrait qu'une seule fois dans les
résultats.
L'opérateur IN a une priorité plus élevée que l'opérateur UNION.
Les requêtes incluant l'opérateur UNION dans la clause WHERE doivent comprendre le
même nombre de colonnes et des colonnes du même type que celles de la clause
SELECT.
Par défaut, les données sont affichées par ordre ascendant.
Exemple :
Cet opérateur permet de ramener toutes les lignes issues de plusieurs requêtes.
Règle :
Contrairement à l'opérateur UNION, les doublons ne sont pas éliminés et le résultat n'est
pas trié par défaut.
Il n'est pas possible d'utiliser le mot-clé DISTINCT.
Remarque : Les règles relatives aux opérateurs UNION et UNION ALL sont les mêmes, excepté
les deux points ci-dessus.
Exemple :
L'Opérateur INTERSECT
Cet opérateur permet de ramener toutes les lignes communes aux deux requêtes.
Le nombre de colonnes et les types de données des deux colonnes doivent être identiques
dans les deux ordres SELECT. En revanche, les noms de colonnes peuvent être différents.
L'inversion de l'ordre des tables interrogées ne modifie pas le résultat.
Comme l'opérateur UNION, l'opérateur INTERSECT ignore les colonnes NULL.
Les requêtes incluant l'opérateur INTERSECT dans la clause WHERE doivent
comprendre le même nombre et des colonnes du même type que celles de la clause
SELECT.
Exemple :
SELECT deptno from dept
INTERSECT
SELECT deptno from emp ;
L'opérateur MINUS
Cet opérateur ramène les lignes retournées par la première requête, qui ne le sont pas par la
seconde (premier ordre SELECT moins le second).
Le nombre de colonnes et les types de données des colonnes doivent être identiques dans
les deux ordres SELECT. En revanche, les noms de colonnes peuvent être différents.
Toutes les colonnes incluses dans la clause WHERE doivent également être incluses dans
la clause SELECT pour que la requête de l'opérateur MINUS puisse être exécutée.
Les requêtes incluant l'opérateur MINUS dans la clause WHERE doivent comprendre le
même nombre de colonnes et des colonnes du même type que celles de la clause
SELECT.
Exemple :
Chapitre 8 : Sous-Interrogation
Objectifs : Au cours de ce chapitre, vous allez étudier des aspects plus complexes de l'ordre
SELECT. Il est possible d'inclure des sous-interrogations dans la clause WHERE de tout ordre
SQL pour obtenir les valeurs de différentes inconnues. Ce chapitre traite des sous-interrogations
mono-ligne et multi-ligne.
Supposons que vous souhaitiez écrire une requête pour trouver qui gagne plus que l'employé
Jones.
Pour résoudre ce problème, deux requêtes sont nécessaires : une qui trouve le salaire de Jones, et
l'autre qui trouve quel employé a un salaire supérieur.
A cet effet, vous pouvez combiner deux requêtes, en en plaçant l'une à l'intérieur de l'autre. La
requête interne, ou sous-interrogation, ramène une valeur utilisée par la requête externe, ou
principale. Utiliser une sous-interrogation revient à exécuter deux requêtes successives en utilisant
le résultat de la première comme valeur de recherche de la seconde.
Une sous-interrogation est un ordre SELECT imbriqué dans une clause d'un autre ordre SELECT.
Les sous-interrogations vous permettent de construire des ordres puissants à partir d'instructions
toutes simples. Elles s’avèrent très utiles pour sélectionner des lignes d'une table lorsqu'une
condition dépend des données de la table elle-même.
Vous pouvez placer une sous-interrogation dans les clauses SQL suivantes :
WHERE
HAVING
FROM
Syntaxe :
operator est un opérateur de comparaison tel que >, = ou IN.
Remarque : les opérateurs de comparaison se classent en deux catégories : les opérateurs mono-
ligne (>, =, >=, <, <>, <=) et les opérateurs multi-ligne (IN, ANY, ALL).
Une sous-interrogation est souvent désignée sous le nom "d'ordre SELECT imbriqué", "sous-
ordre SELECT", ou encore "ordre SELECT interne". Elle est exécutée en premier, et son résultat
sert à évaluer la condition définie dans l'interrogation principale ou externe.
Exemple :
La requête suivante affiche tous les employés dont le salaire est supérieur à celui de lemployé
7566. La requête externe prend le résultat de la requête interne et l'utilise pour afficher tous les
employés qui gagnent plus que cette somme.
SELECT ename
FROM emp
WHERE sal > (SELECT sal
FROM emp
WHERE empno = 7566);
Types de sous-interrogations
Sous-interrogation mono-ligne : ordre SELECT interne qui ne ramène qu'une seule ligne
Sous-interrogation multi-ligne : ordre SELECT interne qui ramène plusieurs lignes
Sous-interrogation multi-colonne : ordre SELECT interne qui ramène plusieurs colonnes
Objectifs :
Dans ce chapitre, vous allez apprendre à insérer des lignes dans une table, mettre à jour des lignes
existantes et supprimer des lignes d'une table.
Le langage de manipulation des données (LMD) joue un rôle central dans SQL. Chaque fois que
vous ajoutez, modifiez ou supprimez des données dans la base de données, vous exécutez un ordre
du LMD. Un ensemble d'ordres du LMD groupé en une unité de travail logique constitue ce qu'on
appelle une transaction.
Considérons une base de données d’opérations bancaires. Quand un client de la banque transfère
de l’argent d’un compte d’épargne vers un compte courant, la transaction doit donner lieu à trois
opérations différentes : débit du compte d’épargne, crédit du compte courant, et enregistrer la
transaction dans le journal des transactions. Oracle Server doit garantir que l’ensemble des trois
ordres SQL sont exécutés pour maintenir la balance des comptes équilibrée. Quand quelque chose
empêche la bonne exécution de l’un des ordres de la transaction, les autres ordres de la même
transaction doivent être annulés.
Pour ajouter de nouvelles lignes dans une table, utilisez l'ordre INSERT.
Syntaxe :
Remarque : lorsque cet ordre est utilisé avec la clause VALUES, il n'insère qu'une seule ligne à
la fois.
Exemple :
Méthode Description
Implicite Omettez la colonne dans la liste
Explicite Spécifiez le mot-clé NULL dans la liste VALUES
Vous pouvez aussi spécifier une chaîne vide (' ') dans la liste VALUES, mais
uniquement pour les chaînes de caractères et les dates
Assurez-vous que la colonne cible admet les valeurs NULL en vérifiant l'état NULL? Au moyen
de la commande SQL*Plus DESCRIBE.
Vous pouvez utiliser les pseudo-colonnes pour entrer des valeurs spéciales dans une table.
L'exemple ci-dessous enregistre des informations sur l'employé FALL dans la table EMP.
Dans la colonne HIREDATE, il insère la date et l'heure courantes issues de la fonction SYSDATE.
Lorsque vous insérez des lignes dans une table, vous pouvez aussi utiliser la fonction USER qui
renvoie le nom de l'utilisateur courant.
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (7196, 'FALL', 'SALESMAN', 7782, SYSDATE, 2000, NULL, 10);
UPDATE table
SET colonne = valeur [, colonne = valeur]
[WHERE condition] ;
Exemple:
UPDATE emp
SET deptno = 20
WHERE empno = 7782;
Dans cet exemple, la clause WHERE permet de modifier une ou plusieurs lignes spécifiques.
Ici une seule ligne est affectée par la modification.
Par contre, si l’on omet la clause WHERE, toutes les lignes sont modifiées tel que le montre
l’exemple suivant :
UPDATE emp
SET comm = NULL ;
Remarque : de manière générale, utilisez la clé primaire pour identifier une ligne unique.
L’utilisation d'autres colonnes comme critère de sélection risque de provoquer la modification de
plusieurs lignes par inadvertance. Par exemple, il est dangereux d’utiliser le nom d'employé pour
désigner une seule ligne de la table EMP car plusieurs personnes peuvent porter le même nom.
Syntaxe :
Exemple :
Dans cet exemple, la clause WHERE permet de supprimer une ou plusieurs lignes spécifiques.
Par contre, si l’on omet la clause WHERE, toutes les lignes sont supprimées tel que le montre
l’exemple suivant :
Objectifs : Dans ce chapitre, vous allez étudier les principaux objets d'une base de données et les
relations qu'ils entretiennent. Vous apprendrez également à créer, modifier et supprimer ces
objets.
Une base de données Oracle peut contenir de nombreuses structures de données. Chaque structure
doit être prédéfinie lors de la conception de la base de données pour pouvoir être créée durant la
phase de construction de la base.
Vous avez la possibilité de créer des tables à tout moment, y compris lorsque la base de
données est déjà en cours d'utilisation.
Vous n'avez pas à spécifier de taille pour les tables. La taille est en fait définie en fonction
de l'espace total alloué à la base de données. Il est important, néanmoins, d'estimer
l'espace qu'occupera une table avec le temps.
La structure des tables peut être modifiée en ligne.
Règles de Dénomination
Nommez les tables et colonnes de votre base de données en suivant les règles de dénomination
applicables à tous les objets d'une base de données Oracle.
Les noms de table et de colonnes doivent commencer par une lettre et peuvent comprendre
de 1 à 30 caractères.
Les noms ne doivent pas contenir d'autres caractères que les caractères A à Z, a à z, 0 à 9,
_ (trait de soulignement), $ et # (caractères autorisés, mais déconseillés).
Les noms ne doivent pas être utilisés pour nommer plusieurs objets appartenant au même
utilisateur Oracle Server.
Ces noms ne doivent pas être des mots réservés Oracle Server.
Conseils
o Utilisez des noms parlants.
o Utilisez une dénomination uniforme pour des entités identiques appartenant à des
tables différentes. Par exemple, la colonne numéro du département s'appelle
DEPTNO dans la table EMP et dans la table DEPT.
Syntaxe :
CREATE TABLE [schema.] table
(column Datatype [ DEFAULT expr] ;
Exemple :
CREATE TABLE etudiant
(matricule VARCHAR2(8) NOT NULL,
nom VARCHAR2(30) NOT NULL,
prenom VARCHAR2(30));
Pour voir la structure de la table créée, utiliser la commande DESCRIBE comme suit :
DESCRIBE etudiant ou DESC etudiant
Noter ici qu’avec la commande DESCRIBE, la spécification du point virgule est facultative à la
fin de la commande
NB: la création d'une table fait appel à un ordre du LDD, une validation automatique à lieu lors de
son exécution. Donc point besoin de taper la commande de validation COMMIT.
Type de Données
Après avoir créé vos tables, il peut arriver que vous devriez en modifier la structure pour ajouter
une colonne oubliée ou que vous décidiez de changer une définition de colonne. Cela est possible
grâce à l'ordre ALTER TABLE.
Vous pouvez ajouter des colonnes à une table en utilisant l'ordre ALTER TABLE avec la clause
ADD ou alors modifier des colonnes existantes d'une table au moyen de l'ordre ALTER TABLE
avec la clause MODIFY.
Syntaxe :
Exemples :
Vous pouvez supprimer une colonne en utilisant la commande ALTER TABLE avec l’option
DROP COLUMN. Cette fonctionnalité n’existe que depuis Oracle 8i.
La colonne à supprimer peut contenir ou non des données.
La clause DROP COLUMN n’est applicable que sur une colonne.
Amadou Bobo DIALLO Développement et Administration des SI sous Oracle 55
Dev’IT Centre : Cours de Base de Données Oracle/SQL
Syntaxe :
ALTER TABLE table
DROP COLUMN column;
Exemple:
ALTER TABLE etudiant
DROP COLUMN prenom;
Syntaxe :
RENAME old_name TO new_name;
Exemple :
RENAME etudiant TO etudiants ;
TRUNCATE TABLE est un autre ordre LDD, qui permet de supprimer toutes les lignes d'une
table tout en libérant l'espace utilisé pour stocker cette table. L'ordre TRUNCATE TABLE ne
peut être annulé.
Syntaxe :
TRUNCATE TABLE table;
Exemples :
TRUNCATE TABLE etudiants ;
Ou
DELETE FROM etudiants ;
Suppression de Tables
L'ordre DROP TABLE supprime la définition d'une table Oracle. Lorsque vous supprimez une
table, la base de données perd toutes les données de la table ainsi que tous les index associés.
Syntaxe :
DROP TABLE table;
Exemple :
DROP TABLE etudiant ;
Conseils
Toutes les données de la table sont supprimées.
Les vues, synonymes ne sont pas supprimés mais ne sont plus utilisables.
Toute transaction en instance est validée.
Seul le créateur de la table ou un utilisateur ayant le privilège DROP ANY TABLE
peut supprimer une table.
Une fois exécuté, l'ordre DROP TABLE est irréversible. Oracle9i Server ne demande pas
confirmation lorsque vous lancez cet ordre. Si vous êtes le propriétaire de la table ou disposez
d'un niveau de privilège élevé, la table sera immédiatement supprimée. Tous les ordres du LDD
effectuent une validation qui rend la transaction permanente.
Les Vues
Définition :
Une vue est une table logique basée sur une table ou une autre vue. Elle affiche des données qui
ne lui sont pas propres, mais c’est comme une fenêtre par laquelle il est possible de visualiser ou
de modifier des données venant des tables. Les tables sur lesquelles une vue est basée sont
appelées tables de base.
On distingue les vues simples et les vues complexes. La différence principale entre ces deux types
de vues est liée aux opérations LMD (insertion, mise à jour et suppression).
Syntaxe :
CREATE VIEW nom_vue
AS
requete
[WITH CHECK OPTION [CONSTRAINT contrainte]]
[WITH READ ONLY];
Exemple :
CREATE VIEW empvue20
AS SELECT empno, ename, job
FROM emp
WHERE deptno = 20;
L'ordre DROP VIEW permet de supprimer une vue. La définition de la vue est ainsi supprimée de
la base de données. La suppression d'une vue n'a aucun effet sur les tables sur lesquelles la vue est
basée. En revanche, les vues ou autres applications basées sur des vues supprimées ne sont plus
valides.
Syntaxe :
DROP VIEW nom_vue ;
Les Séquences
Définition :
A l'aide d'un générateur de séquences, vous pouvez créer automatiquement des numéros de
séquence pour les lignes des tables. Une séquence est un objet de base de données créé par un
utilisateur et qui peut être partagé entre plusieurs utilisateurs.
En général, les séquences permettent de créer une valeur de clé primaire propre à chaque ligne. La
séquence est générée puis incrémentée (ou décrémentée) par une routine interne d'Oracle. Vous
pouvez ainsi gagner du temps, car le code applicatif utilisé pour écrire une routine de génération
de séquences est considérablement réduit.
Les numéros de séquence sont stockés et générés indépendamment des tables. Vous pouvez donc
utiliser la même séquence pour plusieurs tables.
Syntaxe :
CREATE SEQUENCE nom_sequence
[START WITH valeur]
[INCREMENT BY valeur] ;
Exemple :
CREATE SEQUENCE seq_deptno
INCEMENT BY 10
START WITH 90;
Une fois votre séquence créée, vous pouvez générer des numéros séquentiels pour vos tables.
Référencez les valeurs de votre séquence à l'aide des pseudocolonnes NEXTVAL et CURRVAL.
Exemple :
INSERT INTO dept (deptno, dname, loc)
VALUES (seq_deptno.NEXTVAL, 'MARKETING','PARIS');
Syntaxe :
DROP SEQUENCE nom_sequence ;
Exemple :
DROP SEQUENCE seq_deptno ;
Les Index
Définition :
Un index Oracle Server est un objet de schéma qui permet d'accélérer l'extraction de lignes par le
biais d'un pointeur. Il est possible de créer des index explicitement ou automatiquement.
Si la colonne ne comporte pas d'index, la table entière est balayée.
Un index offre un accès direct et rapide aux lignes d'une table. Il a pour but de réduire les E/S sur
disque grâce à un chemin d'accès indexé qui identifie rapidement l'emplacement des données.
Syntaxe :
CREATE INDEX nom_index
ON TABLE (column [, column]…) ;
Amadou Bobo DIALLO Développement et Administration des SI sous Oracle 60
Dev’IT Centre : Cours de Base de Données Oracle/SQL
Exemple :
On souhaite réduire le temps d’accès d’une requête à la colonne ENAME de la table EMP à l’aide
de l’Index créé ci-après :
Syntaxe :
DROP INDEX nom_index ;
Exemple :
DROP INDEX emp_empno_idx;
Les Synonymes
Les synonymes ne sont rien d’autre qu’une autre appellation d’objets déjà existant qui facilitent
l’accès aux objets à partir desquels ils sont créés.
Syntaxe:
CREATE [PUBLIC] SYNONYM nom_synonyme
FOR objet ;
Exemple :
CREATE SYNONYM sy_emp
FOR emp ;
Syntaxe :
DROP SYNONYM nom_synonyme ;