Claude Belleil
Université de Nantes
1. Présentation générale 2
1.1. Introduction
On définit les index et tous les éléments informatiques susceptibles d'optimiser les
ressources et les accès aux données. Ce niveau concerne l'administrateur.
Selon la norme SQL 92, le SQL interactif permet d'exécuter une requête et d'en
obtenir immédiatement une réponse. Le SQL intégré ( ou module SQL) permet
d'utiliser SQL dans un langage de troisième génération (C, Cobol, ...), les
Introduction à SQL/92 - Université de Nantes - Claude Belleil 3
instructions permettant essentiellement de gérer les curseurs. Le SQL dynamique
est une extension du SQL intégré qui permet d'exécuter des requêtes SQL non
connues au moment de la compilation. Hors norme, SQL est utilisable sous la forme
de librairies de fonctions API (exemple : ODBC). Nous nous limitons au SQL
interactif.
1 - les contraintes de domaine qui restreignent l'ensemble des valeurs que peut
prendre un attribut dans une table,
2 - les contraintes d'intégrité d'entité qui précisent qu'une table doit toujours avoir
une clé primaire
3 - les contraintes d'intégrité référentielles qui précisent les conditions dans
lesquelles peuvent être ajoutés ou supprimés des enregistrements lorsqu'il existe
des associations entre tables par l'intermédiaire de clés étrangères.
Une table (relation) est un ensemble de tuples. On peut donc appliquer à une table
les opérateurs algébriques usuels. Le résultat d'une opération ou requête est une
nouvelle table qui est exploitable à son tour dans une nouvelle opération. Tous les
opérateurs peuvent être dérivés de cinq primitives de base : la PROJECTION, la
SELECTION, l'UNION, la DIFFERENCE et le PRODUIT. L'opérateur de JOINTURE
qui peut être déduit des cinq primitives de base est cependant fondamental.
De plus, pour qu'une base de données soit décrite de façon totalement relationnelle,
l'intégrité des données stockées doit toujours être protégée contre des actions
indésirables de l'utilisateur. Cela est réalisé en définissant des contraintes
auxquelles de nouvelles données sont confrontées avant d'être acceptées dans le
système d'information. SQL permet l'implantation de tels schémas de protection.
Dans une table, un point d'interrogation (ou un tiret) à la place d'une information
indique la présence d'une valeur NULL. Attention au contresens possible. En
SQL, NULL signifie soit que la valeur n'existe pas, soit qu'elle est inconnue, mais en
aucune façon qu’elle est égale à zéro !
le type caractère
le type numérique décimal
Le type de données qui peut être stocké dans la colonne d'une table est déterminé
au moment de la création de la table. Les noms et le texte en général doivent
toujours être rangés dans des colonnes définies comme ayant le type caractère
(n'importe quelle combinaison de lettres, chiffres ou caractères spéciaux
apparaissant sur la clavier d'un ordinateur personnel). Les valeurs numériques sont
habituellement rangées dans des colonnes ayant été définies comme de type
décimal (tout nombre valide de type entier ou réel).
Chaque table doit disposer d'une clé primaire qui consiste en une colonne ou une
combinaison de colonnes dans lesquelles chaque valeur identifie de façon unique
une ligne de la table.
Les identificateurs sont utilisés comme noms de tables ou de colonnes. Ils peuvent
comporter un maximum de 20 caractères comprenant lettres (a-z, A-Z), chiffres (0-9)
ou les caractères suivants : _@#$. le premier caractère ne peut être ni un tiret bas
(_), ni un chiffre. Un nom de base de données obéit aux même règles mais est limité
à une longueur de 8 caractères. Il est recommandé de choisir des noms de bases de
données, de tables et de colonnes qui correspondent aux informations stockées.
Les tables de la bases de données Ventes qui servira d'exemple tout au long
de ce cours ont les noms suivants:
cli (clients)
anc_cli (anciens clients)
emp (employés)
prod (produits)
succ (succursales)
fabric (fabrications)
ventes (ventes)
Les systèmes de gestion de bases de données ont des langages spécifiques qui
facilitent l'accès et le contrôle des informations stockées. SQL (Structured Query
Language) a été développé à l'origine par IBM pour l'utilisation des systèmes de
bases de données relationnelles. Ce langage a été normalisé sur le plan
international. MicroSQL correspond à la norme du SQL/2 qui date de 1992. Il
possède la plupart des caractéristiques de cette norme pour ce qui concerne le SQL
direct (interactif):
L'interface MicroSQL est constitué des éléments suivants: une barre de menus en
haut de la fenêtre et une ligne de statut en bas. Immédiatement sous la barre des
menus se trouve une barre des outils qui fournit des accès rapides aux commandes
les plus souvent utilisées. Cette fenêtre principale peut recevoir de nombreuses
autres fenêtres qui peuvent être déplacées ou redimensionnées à volonté. Elle
permet également l'affichage de menus déroulants et de nombreuses boites de
dialogue. Tous cela peut être mis en œuvre soit avec le clavier, soit avec la souris.
Une aide contextuelle est également disponible sur chacun des éléments des menus
déroulants en appuyant sur F1. On accède au système d'aide général en cliquant
sur la commande Help de la barre des menus.
La barre des menus contient les éléments suivants: File, Edit, Table,
Structure, Command, Display, Procedure, Window and Help. Les informations
apparaissant sur la ligne statut comprennent des aides rapides, des messages
d'avertissement ou des informations sur l'état du système.
Le menu est activé en pressant sur F10 ou en cliquant sur une commande. Pour
désactivé le menu taper sur ESC ou sur F10 ou cliquer sur n'importe quelle zone de
la fenêtre principale. Chaque commande du menu possède une touche rapide qui
est indiquée par un caractère souligné. Une commande particulière du menu peut
donc être sélectionnée de différentes façons:
2.2.1.1.2. Set
Les options disponibles donnent accès aux variables d'environnement. Les valeurs
peuvent être changées pour une session SQL à l'aide de boutons radios.
Les options sélectionnées par la commande Set sont sauvegardées sur le disque. Ils
seront restaurés lors de la prochaine session SQL.
2.2.1.1.4. Commit
Les changements réalisés dans les tables sont rendus permanents. Avant que ces
changements ne soient rendus permanents, la base de données peut être
restaurées dans l'état où elle se trouvait au moment de son chargement ou depuis la
dernière commande commit.
2.2.1.1.5. Rollback
Tous les changements réalisés dans les tables depuis la dernière commande
commit ou depuis le chargement de la base sont annulés.
Le sous système Form (écrans de saisies et de mises à jour des tables) est activé.
2.2.1.1.7. Erase
2.2.1.1.8. Organise
Les tables de la base de données active sont triées sur la première de leur colonne
contenant la clé primaire ou sur un autre ensemble de colonnes spécifiées.
Une table résultat, le texte d'une commande ou d'une requête est envoyé vers
l'imprimante.
La session courante est arrêtée. Si des changements ont été réalisés dans les
tables et que la commande commit n'a pas été invoquée, un avertissement est
affiché avant que la session ne soit fermée.
La dernière opération d'édition est annulée et le texte est restauré dans son état
précédent.
2.2.1.2.5. Delete
Ce menu contient des commandes qui permettent d'accéder aux données d'une
table de différentes façons.
Une fenêtre de commande est ouverte afin de permettre la saisie d'une requête. Le
mot réservé SELECT constitue un des éléments de base de la recherche et de la
restitution d'informations dans une base de données relationnelle. Quand l'ensemble
du texte constituant la requête à été saisi, le bouton OK déclenche l'exécution, le
bouton CANCEL l'annulation. La touche de tabulation (TAB) permet de se déplacer
entre les différentes parties du texte de la fenêtre. On peut également cliquer avec la
souris sur une partie du texte. La commande SELECT est présentée de façon plus
approfondie dans les chapitres suivants.
Cette commande est utilisée pour supprimer des lignes dans une table.
Une fenêtre de commande est ouverte pour que le texte de la requête puisse être
saisi. Elle permet à de nouvelles lignes d'être insérées dans la table.
2.2.1.3.4. Update
On choisit cette commande pour modifier des valeurs dans une table. Les valeurs
utilisées peuvent être des constantes ou des valeurs déjà stockées dans la base de
données.
Cette commande ainsi que les trois qui suivent fournissent un accès au système
QBE (Query By Exemple) qui sera présenté en détail plus loin. QBE est une
méthode visuelle de formulation des requêtes et de maintenance des données qui
peut, dans de nombreux cas, être utilisée de façon alternative à SQL. Une boite de
dialogue est ouverte et permet d'effectuer un choix entre table, condition ou
impression. Si la boîte concernant les tables est sélectionnée, une fenêtre de
dialogue supplémentaire est présentée permettant à l'utilisateur de choisir la table
sur laquelle il veut travailler.
Une fois qu'une opération a été définie en plaçant les valeurs appropriées dans la
fenêtre QBE, cette commande est utilisée pour compiler et exécuter la requête.
Avec MicroSQL, les entrées de la fenêtre QBE sont traduites en une requête
équivalente SQL. Cette commande permet de visualiser le code SQL ainsi produit
dans l'éditeur (Change editor).
Les entrées de l'ensemble des boîtes QBE courantes sont listées sur l'imprimante ou
dans un fichier disque.
2.2.1.4.1. Alter
2.2.1.4.2. Create
Assertion
Database
Domaine
Synonyme
Table
View
2.2.1.4.3. Drop
Tous les éléments énumérés ci-dessus peuvent être supprimés du dictionnaire actif
par cette commande.
2.2.1.4.4. Include
2.2.1.4.5. Release
2.2.1.5.1. Change
2.2.1.5.2. List
Assertions
Checks
Command
Default
Domaine
Foreign keys
Previous (command)
Query
View
2.2.1.5.3. Recall
2.2.1.5.5. Start
Une requête ou une commande est chargée à partir du disque et exécutée. Dans les
deux cas, une boîte de dialogue est ouverte pour permettre de choisir la commande
ou la requête à partir de la liste de celles qui sont disponibles sur le disque.
Les commandes ou requêtes tapées ou éditées pendant une session SQL sont
stockées dans un fichier journal auquel on peut accéder dans l'ordre inverse des
entrées.
On utilise cette option pour accéder aux commandes ou requêtes du fichier journal
dans l'ordre des entrées.
2.2.1.5.8. Windows
Une fenêtre vide est ouverte pour entrer le texte d'une commande ou d'une requête.
Donne les détails des bases de données contenues dans le dictionnaire courant ou
d'une table choisie à partir de la base de données active.
2.2.1.6.2. Display
La table résultat courante est réaffichée. On notera que chaque nouvelle copie est
placée dans une fenêtre séparée qui peut être manipulée de façon indépendante.
Introduction à SQL/92 - Université de Nantes - Claude Belleil 13
2.2.1.6.3. Format
Une fenêtre est ouverte pour qu'une commande de Format puisse être tapée. Cela
permet de présenter le résultat de la requête courante de différentes façons. Ces
options de présentation ne s'appliquent qu'au résultat courant. Elles reprennent
leurs valeurs par défaut lors de l'entrée d'une nouvelle requête.
Une procédure est sélectionnée pour être chargée dans l'éditeur de texte, ou bien le
nom d'une nouvelle procédure est saisie, puis le contrôle est donné à l'éditeur des
procédures.
Une aide sur la dernière erreur de commande ou de requête est fournie. Cette
facilité est surtout utilisée quand une erreur survient pendant l'exécution d'une
procédure.
2.2.1.8.1. Tile
Toutes les fenêtres actives sont présentées de façon " tuilée "
2.2.1.8.2. Cascade
2.2.1.9.1. Index
Le contrôle est passé au système d'aide de MicroSQL et les pages d'aide sont
affichées. L'information est alors disponible sous forme d'un hypertexte.
2.2.1.9.2. About
La barre des outils est située sous la barre des menus dont nous venons de détailler
les éléments. Elle est constituée d'un ensemble de boutons qui fournissent un accès
rapide aux commandes les plus communément utilisées. Ces boutons sont libellés
avec une ou deux lettres permettant d'identifier leur fonction.
La ligne de statut est située en bas de la fenêtre principale. Elle est utilisée pour
afficher des messages du système de gestion de la base de données active. Le nom
de celle-ci est signalé dans la partie droite. Quand une tâche est en cours
d’exécution, un message avertit l’utilisateur.
Pendant la saisie de données dans un formulaire, un message informe l’utilisateur
sur le type et le format de l’attribut en cours.
En dehors de ces informations, Ready et Wait indiquent si le système est prêt à
travailler ou s’il est en train d’exécuter une tâche.
0,n
Cli
Code_cli Ventes
Résidence Nom 1,n
1,1
Quant
Taux
Prod 1,n
Fabric Code Pr
1,n
Defauts Libelle
Quant
0,n
0,n Date
Remarques: Les attributs suivants (préfixés du nom des tables) appartiennent aux
mêmes domaines.
1 - Sélection du répertoire
Sélection
du chemin
2 - Chargement de la base
Le type real indique qu’il s’agit d’une table réelle, contenant des données présentent
sur le disque. L’autre type possible est view, que nous étudierons plus loin.
Une fois la base de données chargée, on peut accéder aux descriptions des tables
par la commande [Describe | Table].
Il existe deux tables système contenant des informations sur les autres tables de la
base de données active : systables et syscolumns. Le contenu de ces deux tables
peut être visualisé avec la command SELECT qui sera étudiée dans le chapitre
suivant.
Voici à titre d’exemple le contenu de ces deux tables dans la base de données
Ventes.
SELECT *
FROM systables
SELECT *
FROM syscolumns
1. Ouverture de la fenêtre des requêtes (query) soit par le menu [Table |Select], soit
par la barre des outils [S]
2. Saisie du texte de la requête (les commentaires et le numéro de la requête sont
placés entre {…} )
3. Exécution de la requête (OK)
4. Le résultat est affiché, le texte de la requête disparaît de l’écran.
5. On peut récupérer le texte de la requête par la commande [Command|Prior
command Gray -]
6. La sauvegarde s’effectue par [Command|Save]. On donne alors le nom Q1 … Qn
tel qu’il apparaît dans l’en-tête.
4.1.2. Projection
Introduction à SQL/92 - Université de Nantes - Claude Belleil 23
4.1.2.1. Afficher le contenu d’une table
{ Q01 liste avec toutes les colonnes Question en langage naturel figurant
de la table FABRIC (fabrications) } dans le commentaire de la requête avec
le numéro de la sauvegarde (Q01)
SELECT *
FROM fabric
Texte de la requête (SQL)
Réponse:
Table résultat
La clause SELECT permet de réaliser l’action la plus élémentaire sur une table :
sélectionner le ou les attributs de la table résultat. En algèbre relationnelle, cette
opération est appelée PROJECTION. Il existe donc une ambiguïté au niveau du
vocabulaire. Nous verrons par la suite que l’action de sélection telle qu’elle est
définie sur la plan algébrique est réalisée par une autre commande.
L’astérix (*) remplace tous les attributs de la table. Ainsi, pour reprendre l’exemple
précédent :
SELECT *
Est équivalent à
SELECT DATE,C_PROD,DEPT,DEFAUTS,QUANT
Réponse:
Par défaut, SQL affiche toutes les lignes correspondant aux attributs cités dans le
SELECT. Le mot réservé DISTINCT permet de ne conserver qu’un exemplaire de
toutes les lignes identiques. Dans ce cas, il s’agit d’un équivalent de la projection
algébrique qui élimine les doublons par définition.
Réponse:
Réponse:
Remarque: le DISTINCT agit sur l'ensemble des attributs cités. Dans le cas
précédent, c'est le couple 53 GC qui est éliminé .
{ Q12 Produits vendus dans les succursales (c_succ, c_prod) }
L’ordre dans lequel sont affichées les données de la table résultat peut être contrôlé
par la commande ORDER BY suivi du nom de l’attribut sur lequel le tri interviendra.
Bien entendu les autres valeurs de chacune des lignes de la table résultat suivent
les mêmes réarrangements que l’attribut cité dans le tri !
Réponse:
Sans autres précisions, le tri est ascendant. Cette action correspond au mot réservé
ASC . Un tri descendant est réalisé par le mot réservé DESC.
SELECT *
FROM fabric
ORDER BY defauts DESC
Réponse:
Réponse:
Réponse:
{ Q17 liste des ventes avec toutes les colonnes, triée sur les codes clients
par ordre croissant et sur les quantités par ordre décroissant }
Il est parfois nécessaire de sélectionner certaines lignes dans une table. On utilise
pour cela le mot réservé WHERE qui introduit une clause de sélection sous la forme
d’un prédicat. Chaque ligne (ou tuple) vérifiant le prédicat fera partie de la table
résultat. Il s’agit donc d’une SELECTION au sens algébrique.
Le prédicat est une expression logique composée d’une ou de plusieurs conditions
pouvant prendre la valeur VRAI ou FAUX. Les conditions peuvent être combinées
entre elles à l’aide des opérateurs logiques AND, OR et NOT.
ATTRIBUT θ constante
ATTRIBUT θ ATTRIBUT
ATTRIBUT θ paramètre
Introduction à SQL/92 - Université de Nantes - Claude Belleil 29
où θ est un opérateur appartenant à l’ensemble :
= égal à
<> ou ^= différent de
> supérieur à
^> pas supérieur à
>= supérieur ou égal à
< inférieur à
^< pas inférieur à
<= inférieur ou égal à
ATTRIBUT θ constante
SELECT *
FROM cli
WHERE dept = '44'
Réponse:
3
Ils feront l'objet d'une étude détaillée dans la suite de ce cours
Introduction à SQL/92 - Université de Nantes - Claude Belleil 30
{ Q19 liste avec toutes les colonnes, des produits ayant des défauts supérieurs à 10
}
SELECT *
FROM fabric
WHERE defauts > 10
Réponse:
SELECT nom
FROM cli
WHERE nom > ‘Ingres’
Réponse:
4
Attention au traitement des caractères nationaux dans les versions anglo-saxonnes des SGBDR!
Introduction à SQL/92 - Université de Nantes - Claude Belleil 31
{ Q21 liste avec toutes les colonnes des produits fabriqués en Mayenne }
SELECT *
FROM fabric
WHERE dept = '53'
Réponse:
{ Q24 Numéro des Vendeurs ayant réalisés des ventes > 100 }
ET V F I OU V F I NON
---------------------------- ---------------------------- -----------
V V F I V V V V V F
F F F F F V F I F V
I I F I I V I I I I
Les mots réservés IS NULL, IS NOT NULL permettent de rechercher les lignes
d’une table ayant ou non des valeurs de ce type. On ne peut pas utiliser ces mots
réservés dans une expression contenant un opérateur de comparaison.
{ Q25 liste avec toutes les colonnes des produits pour lesquels
il n y a pas d'information de défauts }
SELECT *
FROM fabric
WHERE defauts IS NULL
Réponse:
{ Q26 liste avec toutes les colonnes des produits pour lesquels
il y a des informations de défauts }
SELECT *
FROM fabric
WHERE defauts IS NOT NULL
Réponse:
Dans ce cas, les mots réservé IS NULL et IS NOT NULL confondent donc les
valeurs inconnues ou indéterminées avec la valeur zéro !
Liste des produits qui sont fabriqués à Paris ET qui ont plus de 16% de défauts.
Cette forme, qui fait apparaître clairement le ET logique est trop lourde pour être
utilisée en langage courant. La forme qui suit est plus naturelle, mais elle masque la
présence du ET logique.
{ Q27 liste des produits fabriqués à Paris avec des défauts > 16% }
Réponse:
Réponse:
SELECT *
FROM fabric
WHERE NOT (dept = '75' OR dept = '53')
Réponse:
SELECT *
FROM fabric
WHERE NOT dept = '75' OR dept = '53'
Réponse:
SELECT *
FROM fabric
WHERE
(dept = '75' OR dept = '53')
AND
defauts <16
Réponse:
Introduction à SQL/92 - Université de Nantes - Claude Belleil 36
{ Q31 numéros des produits vendus par les employés 11 et 24 }
{ Q32 numéros des produits vendus dans la succursale 1A, en quantités >= 30 }
{ Q33 liste des produits fabriques en quantités < 40 avec des défauts > 10 }
{ Q34 liste des produits fabriqués avec des défauts entre 12 ou 16%
Réponse:
{ Q36 liste des ventes avec des quantités entre 100 et 300 }
Une expression de recherche avec LIKE ou NOT LIKE est utilisée quand on veut
retrouver des données qui ont des éléments en commun. Le caractère spécial '%'
ou '*' est utilisé pour remplacer n'importe quel groupe de caractères. Ainsi LIKE 'D%'
recherche toutes les chaînes commençant par D. Le caractère '_' ou '?' est utilisé
dans les recherches comme caractère de substitution non plus à un groupe de
caractères comme '%' ou '*' mais à un seul caractère.
SELECT *
FROM prod
WHERE libelle LIKE 'c%'
Réponse:
SELECT *
FROM prod
WHERE libelle LIKE '%ou%'
Réponse:
SELECT *
FROM prod
WHERE libelle LIKE '%m'
Introduction à SQL/92 - Université de Nantes - Claude Belleil 38
Réponse:
L’opérateur IN permet de sélectionner les lignes dont l’attribut spécifié contient une
valeur appartenant à l’ensemble cité.
Réponse:
ANY: Il suffit que l'un des éléments soit présent dans l'ensemble pour que le test
donne VRAI:
ALL : Il faut que tous les éléments présents dans l'ensemble vérifient le test.
IN : Equivalent à =ANY
{ Q42 liste des produits fabriqués avec code produit et défauts multipliés par deux }
Réponse:
MicroSQL fournit, comme la plupart des SGBDR5, certaines facilités pour effectuer
des calculs temporels à partir de la date et de l’heure maintenues par le système
informatique (ici date et heure de l’horloge du PC).
5
Système de Gestion de Bases de Données Relationnelles
Introduction à SQL/92 - Université de Nantes - Claude Belleil 41
Sysddate Numérique Date au format yyyymmdd
Sysmin Numérique Minute courante (0 – 59)
Syshour Numérique Heure courante (0 – 23)
Systime Caractère Heure au format hh:mmAM/PM
SQL fournit deux types de fonctions : les fonctions de calcul et les fonctions
scalaires.
Les fonctions de calcul s’appliquent à un ensemble de valeurs d’un même attribut et
retourne un résultat. Les fonctions scalaires renvoient un résultat pour chaque
occurrence de valeur d’un attribut.
Une fonction de calcul s’applique sur des ensembles de valeurs dans des colonnes
qui doivent obligatoirement être spécifiées soit dans la clause SELECT, soit dans la
clause HAVING sur laquelle nous reviendrons plus loin. En aucun cas, dans la
clause WHERE !
De plus, quand elle est utilisée pour compter le nombre de lignes dans une table, la
fonction COUNT peut avoir un astérix (*) comme argument.
Les valeurs inconnues ou indéterminées sont toujours ignorées par les fonctions
Avg, Max, Min et Sum.
Les règles à respecter sur le plan formel pour les fonctions de calcul sont les
suivantes :
Réponse:
Réponse:
Réponse:
Réponse:
SELECT COUNT ( *)
FROM fabric
WHERE c_prod = 'DD'
Réponse:
{ Q48 Quelle est la moyenne des défauts pour les produits fabriqués en Mayenne}
Réponse:
Réponse:
Réponse:
Réponse :
Une fonctions scalaire retourne une valeur pour chaque occurrence d’attribut.
Contrairement à la fonction de calcul, la fonction scalaire peut être emboîtée et
constituer l’argument d’une autre fonction scalaire. En général, SQL fournit les
fonctions suivantes :
SELECT Upper(nom)
FROM emp
Réponse :
SELECT Max(char_length(nom))
FROM emp
Réponse :
ERREUR!!
Remarque: SQL va essayer d'afficher des codes produits en mettant une valeur de
calcul en face. Deux possibilités:
1 - soit il y a une énumération de tous les codes produits présents dans la table et le
seul affichage concernant les quantités ne peut être que la liste des quantités
présentes dans la table en face de chaque code produit. Dans ce cas, SQL ne sait
pas quoi faire de la fonction AVG()
2 - soit un calcul global est effectué sur les quantités et SQL ne sait pas quoi faire
de la commande SELECT c_prod
Il est donc nécessaire dans un pareil cas de préciser, au niveau de la requête, qu'il
faut effectuer un regroupement par occurrences de code produit.
Réponse :
Réponse:
SQL signale la présence d’une valeur inconnue ou indéterminée qui n’est pas prise
en compte dans le calcul !
1- il trie par ordre croissant sur le nom de l'attribut (ou des attributs) cité dans le
SELECT
2- il exécute la fonction de calcul pour chaque ensemble de valeurs identiques de
l'attribut cité. C'est, en quelque sorte, une fonction de résultats intermédiaires.
ATTENTION: l'attribut (ou les) cité dans le GROUP BY doit être présent dans le
SELECT.
Réponse:
{ Q58 Liste des départements de fabrication ( sauf Paris) et moyenne des défauts
pour les départements ayant une moyenne>10 }
Réponse:
Réponse:
{ Q60 Plus grosses ventes réalisées par vendeur (No_vend) ayant effectué plus de
trois ventes}
SELECT *
FROM fabric
Réponse:
SELECT *
FROM prod
Réponse:
SELECT *
FROM fabric, prod
Réponse (extrait):
SELECT *
FROM T1, T2
Pour obtenir le résultat souhaité, c’est à dire associer la ligne de la table fabric
concernant un produit, à la ligne de la table prod concernant ce même produit, il est
nécessaire d’installer une contrainte. Dans le cas évoqué ici, cette contrainte
pourrait s’énoncer de la façon suivante en langage naturel :
Il faut que le code de produit de la table des fabrications soit égal au code
produit de la table des produits :
c_prod = code_pr
SELECT *
FROM fabric, prod
WHERE c_prod = code_pr
Réponse :
SELECT *
FROM T1, T2
WHERE T1.Atx = T2.Aty
(Atx et Aty sont des attributs union-compatibles des tables T1 et T2, ils
appartiennent au même DOMAINE)
Réponse:
{ Q66 Pour insérer les noms des produits et les noms des départements,
il est nécessaire d'effectuer une jointure entre les trois tables
fabric, depart et prod }
Réponse:
Quand les attributs de 2 tables ont le même nom, il faut lever l'ambiguïté en préfixant
le nom de l’attribut par celui de la table d’où il provient : on fait précéder le nom de
l'attribut du nom de la table en les séparant par un point :
NOM_TABLE.NOM_ATTRIBUT
{ Q67 exemple: nom des clients et nom des employés ayant réalisé les ventes }
Réponse:
{ Q68 même requête que précédemment en renommant les attributs par des alias }
Réponse:
La plupart du temps, la jointure est utilisée pour « renseigner » une table issue d’une
association du MCD à l’aide des informations contenues dans la ou les tables issues
des entités du MCD. C’est un système de reconstruction de l’information mise en
troisième forme normale, afin de la rendre intelligible.
SELECT date, c_succ, nom_dept, cli.nom, no_vend, emp.nom, c_prod, libelle, quant
FROM ventes, cli, emp, succ, depart, prod
WHERE
c_succ = code_succ
AND
succ.dept = no_dept { ambiguïté entre "dept" de SUCC et "dept" de CLI }
AND
Introduction à SQL/92 - Université de Nantes - Claude Belleil 58
c_cli = code_cli
AND
no_vend =no_emp
AND
c_prod = code_pr
Réponse (extrait):
Réponse:
no_vend = no_emp
quant>100
En SQL, une jointure peut être construite directement en plaçant les mots réservés
NATURAL JOIN entre les deux noms de tables de la clause WHERE d’une requête.
Ce type de jointure n’est réalisable que lorsque les deux attributs utilisés ont le
même nom dans chacune des tables.
Par exemple, la table Fabric et la table Succ ont une colonne Dept en commun qui
indique, pour les succursales comme pour les fabrications, le département dans
lequel elles sont situées. Faire une jointure entre ces deux tables selon cet attribut,
c’est rechercher les fabrications qui ont lieu dans un département où il y a une
succursale.
SELECT *
FROM fabric NATURAL JOIN succ
Réponse:
SELECT *
FROM Table1 NATURAL JOIN Table2 NATURAL JOIN Table3
Quand plusieurs colonnes de deux tables ont des nom identiques, on peut préciser
l’attribut sur lequel la jointure s’effectuera à l’aide du mot réservé USING(attribut).
Par exemple les deux tables Cli (clients) et Anc_cli (Anciens clients) ont des noms
d’attributs identiques. Pour réaliser un join naturel entre ces deux tables selon le
numéro de département, il est nécessaire de préciser USING(Dept).
{ Q72 Join avec USING – Noms des Clients résidant dans un département où
résident d’anciens clients }
Réponse:
Réponse:
Remarques :
1. Quand le mot réservé USING est utilisé, on ne peut pas utiliser NATURAL.
2. Si plusieurs attributs sont cités dans le USING, ils doivent être séparés par des
virgules : USING(At1, At2)
4.4.1.5.3. La clause ON
Ce mot réservé permet de réaliser un JOIN entre deux tables n’ayant pas d’attributs
portant le même nom :
SELECT *
FROM cli JOIN depart
ON dept = no_dept
Remarques :
Jusqu’à présent, nous avons réalisé des jointures dites « internes ». Cela signifie
que dans la table résultat, on obtenait les lignes vérifiant la ou les clauses de
jointures. Pour reprendre un exemple précédent, quand on écrit la requête suivante :
SELECT *
FROM anc_cli JOIN ventes
ON code_cli = c_cli
la table résultat nous donne les lignes pour lesquelles la valeur présente dans
la colonne code_cli de la table anc_cli (anciens clients) est égale à la valeur
présente dans la colonne c_cli de la table des ventes.
Réponse:
1. Dans la table résultat, on reproduit toutes les lignes de la première table (table
de gauche) puis on met en correspondance les lignes de la deuxième table (table
de droite) quand la jointure est possible et des lignes contenant des valeurs
inconnues ou indéterminées quand elle n’est pas possible. C’est ce que l’on
appelle la demi-jointure gauche :
2. Dans la table résultat, on reproduit toutes les lignes de la seconde table (table de
droite). Puis on met en correspondance les lignes de la première table (table de
gauche) de façon symétrique à ce qui vient d’être énoncé pour la demi-jointure
gauche. C’est ce que l’on appelle la demi-jointure droite :
SELECT *
FROM anc_cli LEFT OUTER JOIN ventes
ON code_cli = c_cli
Réponse (extrait):
SELECT *
FROM anc_cli RIGHT OUTER JOIN ventes
ON code_cli = c_cli
Réponse (extrait):
Dans ce cas, tous les nuplets de la table1 sont affichés, quand il n’y a pas de
jointure possible, des informations inconnues ou indéterminées sont affichées dans
la partie droite du résultat. Et de façon symétrique, tous les nuplets de la table2 sont
affichés, quand il n’y a pas de jointure possibles, des informations inconnues ou
indéterminées sont affichées dans la partie gauche du résultat.
SELECT *
FROM anc_cli FULL OUTER JOIN ventes
ON code_cli = c_cli
Réponse (extrait):
SELECT *
FROM anc_cli CROSS JOIN ventes
Réponse (extrait):
2 – l’UNION JOIN qui provoque une union entre toutes les colonnes des deux
tables. Des valeurs inconnues ou indéterminées sont affichées en correspondance
des lignes de chacune des deux tables.
SELECT *
FROM anc_cli UNION JOIN ventes
Réponse (extrait):
Or, il existe des situations où l’on doit pouvoir disposer de deux exemplaire de la
même table dans une requête. Cela est possible en utilisant la technique des ALIAS.
Pour les attributs, on gère les ALIAS dans le SELECT, pour une table, dans le
FROM. Comme pour les attributs, deux formalismes sont possibles :
Nous allons illustrer une des utilisations possible des tables virtuelles au travers
d’un exemple :
Quels sont les produits qui sont fabriqués à la fois en Gironde (33) et en Mayenne
(53) ? Une requête intuitive pourrait être:
SELECT c_prod
FROM fabric
WHERE
Dept = ’33’
AND
Dept = '53'
Réponse:
Remarque: c'est le langage naturel (en Gironde et en Mayenne) qui nous a conduit
à construire la requête de cette façon là. En réalité, son échec est parfaitement
logique car l'attribut "dept" ne peut pas, en même temps, être égal à 33 et à 53 !
Si une réponse existe, elle peut être mise en évidence en associant tous les nuplets
de FABRIC à tous les nuplet de cette même table. Donc, en générant un produit
cartésien de la table FABRIC sur elle-même.
{ Q80 Produit cartésien de la table Fabric sur elle même par génération des tables
virtuelles f1 et f2 }
SELECT *
FROM fabric AS f1, fabric AS f2
→ 02/02/87 DD 53 25 02/03/87 DD 33 22 46
→ 02/03/87 DD 33 22 46 02/02/87 DD 53 25
Il est donc nécessaire de contraindre le Produit cartésien pour obtenir le résultat que
nous venons de mettre en évidence de façon intuitive.
Réponse:
f1.dept =’53’
AND
f2.dept =’33’
car f1.dept et f2.dept sont des attributs de deux tables différentes. Ils peuvent donc
en même temps être égal à 53 pour l'un et à 33 pour l'autre.
Les vues sont dérivées des tables, contrairement à une table, une vue ne contient
pas de données, elle n'a pas d'existence permanente. Elle ne peut donc être utilisée
pour réaliser des mises à jour ou des destructions de données. Chaque fois qu'une
vue est utilisée dans une requête, la table correspondant a cette vue est créée. Il ne
s'agit pas de tables virtuelles. Les tables virtuelles sont des copies, des "clones" de
Introduction à SQL/92 - Université de Nantes - Claude Belleil 71
tables existantes. Elles ont obligatoirement la même structure et les mêmes données
que les tables dont elles sont issues.
Une vue ne correspond pas obligatoirement à une table dans sa totalité. Elle peut
être composée d'éléments d'une tables ( par projection ou sélection) ou de plusieurs
tables ( par jointure).
1. Afin de réaliser des accès restreints. L'utilisateur ne voit qu'une partie des
données de la table dont est issue la vue
2. Améliorer l'interface utilisateur en construisant des vues qui sont des jointures
entre plusieurs tables. Par exemple on renseigne une table issue d'une association
en insérant les libellés correspondant aux clés présentes dans la table "association"
Voici la commande de création d'une vue client2 avec une restriction sur l’attribut
"taux"6
{ Q83 Affichage de toutes les colonnes et de toutes les lignes de la vue client2 }
SELECT *
FROM client2
Réponse:
6
Dans les requêtes de création des vues, les commentaires {…} ne sont pas autorisés!
Introduction à SQL/92 - Université de Nantes - Claude Belleil 72
Création d'une vue en renommant les colonnes
Code_cli à cc
Nom à nc
Dept à dc
{ Q85 Afficher les colonnes en utilisant les noms créés pour la vue }
SELECT cc, nc
FROM client3
WHERE cc = 'AA'
Réponse:
SELECT *
FROM prodfabr
Réponse:
SELECT *
FROM fab_moy
Réponse:
Jusqu'à présent, toutes les opérations de comparaisons ont été effectuées avec des
noms de colonnes ou des valeurs selon l'un des modèles suivants:
Or, il existe des situations où la partie droite de l'opérateur θ n'est pas encore
connue au moment de la construction de la requête. Dans ces cas, la partie droite
peut être déclarée comme une requête séparée (indépendante) que l'on appelle
"sous-requête".
Cette "sous-requête" est exécutée en premier et les données générées par son
exécution sont transmises à la requête dite "principale" qui, a son tour utilisera ces
résultats pour son exécution.
SELECT…
FROM…
WHERE …
Remarques:
Réponse:
• exécution de la sous-requête
• transmission du résultat à la principale
• exécution de la principale
Pour cela, nous utilisons les caractères réservés de commentaires ‘{… }’, afin de
« geler » l’exécution de certaines parties !
7
Il s'agit d'une opération d'exécution interne qui ne modifie pas le texte de la requête elle-même!
Introduction à SQL/92 - Université de Nantes - Claude Belleil 76
Réponse:
SELECT *
FROM ventes
WHERE c_cli = "AA"
qui donnera les informations sur les ventes correspondant au client dont le code est
"AA".
Réponse:
8
Il s'agit d'une opération d'exécution interne qui ne modifie pas le texte de la requête elle-même!
Introduction à SQL/92 - Université de Nantes - Claude Belleil 77
Remarque: De telles questions peuvent désemparer les utilisateurs! En réalité, il
suffit pour les résoudre de les découper en parties élémentaires et en commençant
par la fin.
SELECT SUM(quant)
FROM ventes
WHERE
c_cli = 'BB'
AND
c_prod = 'MW'
2 - nous recherchons donc les clients pour lesquels une vente de produit MW a été
réalisée avec une quantité supérieure à la valeur renvoyée par la sous-requête.
Jusqu’à présent, la sous-requête renvoie une valeur unique. Or, il existe des
situations où la sous requête va renvoyer un ensemble de valeurs. Dès lors,
l’opérateur de comparaison entre sous-requête et requête principale doit être
ensembliste ( IN, NOT IN, θ ANY, θ ALL ).
Bien entendu, il appartient à l'utilisateur d’anticiper ces situations!
Réponse:
SELECT c_prod
FROM fabric
WHERE
dept = '53'
AND c_prod IN
(SELECT c_prod
Introduction à SQL/92 - Université de Nantes - Claude Belleil 79
FROM fabric
WHERE dept ='33')
Réponse:
SELECT *
FROM fabric
WHERE c_prod NOT IN
( SELECT DISTINCT c_prod
FROM fabric
WHERE
dept ='75'
OR
dept ='33')
Réponse:
Réponse:
On peut essayer de résoudre cette question d’une façon différente, en inversant les
opérateurs :
• NOT IN devient IN
• dept = '44' devient dept <> '44'
Réponse:
Une sous-requête peut elle même contenir une autre sous-requête. Le niveau
d’emboîtement autorisé dépend des systèmes sur lesquels on travaille. Avec
MicroSQL, il est égal à huit.
Dans le cas des sous-requêtes emboîtées, la fermeture des parenthèses se fait à la
fin de la requête.
{ Q95 Clients qui ont acheté des produits à des vendeurs travaillant sous les
ordres de Jean-Paul Sartre }
SELECT DISTINCT c_cli { Numéros des Clients ayant acheté à des vendeurs }
FROM ventes { ayant ces Numéros d'Employés }
WHERE no_vend IN
(SELECT no_emp { Numéros des Employés dont le N° de directeur }
FROM emp { est celui de Sartre }
WHERE no_dir =
(SELECT no_emp { Numéro d'employé de Sartre }
FROM emp
WHERE nom = 'Sartre Jean Paul'))
Réponse:
Réponse:
AVANTAGES :
• Elle permet l’affichage des tous les attributs de toutes les tables participant à la
requête
• Elles est transposable en QBE (Query By Example)
INCONVENIENTS :
Requête emboîtée :
AVANTAGES :
INCONVENIENTS :
{ Q96 Clients ayant acheté des produits à des vendeurs qui travaillent
pour le directeur de la succursale 2A }
Une sous-requête peut être associée à une clause ordinaire de sélection à l’aide
d’un des opérateurs logiques (AND, OR, NOT)
Réponse:
On peut de la même façon associer deux (ou plus) sous-requêtes. Ici, il n’y a pas
d’emboîtement des sous-requêtes entre elles. Le système des parenthèses est donc
différent de celui des sous-requêtes emboîtées. Chaque sous requête « ouverte »
est aussitôt « fermée ».
{ Q100 Codes des produits vendus par une succursale de Vendée (85) ou achetés
par un client de Loire-Atlantique (44)}
Réponse:
{ Q101 Codes des produits vendus par une succursale de Vendée (85) et achetés
par un client de Loire-Atlantique (44)}
{ Q102 Codes des produits vendus par une succursale de Loire Atlantique et
achetés par un client de ce département}
{ Q103 Sous-requêtes simples :Liste des ventes pour lesquelles la quantité est
supérieure à la moyenne des quantités vendues }
SELECT *
FROM ventes
WHERE quant >
(SELECT AVG(quant)
FROM ventes)
Réponse:
Cependant, il existe des situations où la comparaison doit être effectuée, non pas
par rapport à la moyenne globale des ventes, mais par rapport à la moyenne des
ventes concernant chaque client. La question posée devient:
{ Liste des ventes pour lesquelles la quantité est supérieure à la moyenne des
quantités vendues pour chaque client }
Donc, pour chaque ligne de la table des ventes, il faut comparer la quantité vendue
au client considéré, à la moyenne des quantités de produits qui ont été vendues à
ce même client. Il est donc nécessaire, pour chaque ligne de la table des ventes
(donc pour chaque vente) de parcourir cette même table afin de pouvoir calculer la
moyenne des ventes pour le client considéré.
Pour cela, il faut mettre en œuvre une sous requête qui, pour chaque ligne traitée
dans la table des ventes, c'est à dire pour chaque client, va réaliser ce calcul de
moyenne. La quantité vendue sera comparée à la valeur renvoyée par cette sous-
requête.
Pour la ligne suivante, c'est à dire pour la vente suivante, le processus sera répété.
Il faut donc mettre en place un processus d'aller et retour entre requête principale et
sous-requête, autant de fois qu'il y a de lignes dans la tables des ventes. Ceci est
réalisé, par la présence, dans la sous-requête, d'une référence externe.
Les sous-requête simples étaient exécutées en une fois, leur résultat était transmis à
la principale qui s'exécutait à son tour et renvoyait le résultat définitif. A l'inverse, les
sous-requêtes à référence externe sont exécutées autant de fois qu'il y a de
valeurs de substitution de la référence externe dans la table traitée par la requête
principale. Dans ce cas, le bloc de qualification de la sous requête n'est pas
homogène. On cite dans le WHERE l'attribut d'une table qui n'est pas citée dans le
FROM.
Réponse:
SELECT *
FROM ventes ventes1
WHERE quant >
…/…
SELECT *
FROM ventes ventes1
9
Dans toute cette simulation, nous représentons par du code SQL les processus de substitutions qui
sont exécutés de façon interne par le moteur SQL. Bien entendu le code de la requête n'est pas
changé!
Introduction à SQL/92 - Université de Nantes - Claude Belleil 87
WHERE quant >
(SELECT AVG(quant)
FROM ventes
WHERE ventes.c_cli = "ZZ")
(SELECT AVG(quant)
FROM ventes
WHERE ventes.c_cli = "ZZ" ⇒ AVG(quant)
--------------
44
SELECT *
FROM ventes ventes1
WHERE quant > 44;
SELECT *
FROM ventes ventes1
WHERE 23 > 44 ⇒ FAUX
qui était traitée par la requête principale, n'est pas éditée, la ligne suivante est
acquise, et ainsi de suite jusqu'à la dernière ligne.
SELECT *
FROM ventes ventes1
WHERE quant >
…/…
SELECT *
FROM ventes ventes1
WHERE quant >
(SELECT AVG(quant)
FROM ventes
WHERE ventes.c_cli = "BB")
Exécution de la sous-requête:
(SELECT AVG(quant)
FROM ventes
WHERE ventes.c_cli = "BB") ⇒ AVG(quant)
--------------
26
Effacement de la sous-requête:
SELECT *
FROM ventes ventes1
WHERE quant > 26
SELECT *
FROM ventes ventes1
WHERE 41 > 26 ⇒ VRAI
{ Q106 Sous-requêtes à références externes : Nom des produits dans la table des
VENTES }
SELECT libelle
FROM prod
WHERE EXISTS
(SELECT *
FROM ventes
WHERE c_prod = code_pr)
Réponse:
Simulation:
SELECT libelle
FROM prod
../..
CODE_PR LIBELLE
------- ---------------
MW clavier
SELECT libelle
FROM prod
WHERE EXISTS
(SELECT *
FROM ventes
WHERE c_prod = "MW")
SELECT libelle
FROM prod
WHERE EXISTS
(SELECT *
FROM ventes
WHERE c_prod = "MW") ⇒ VRAI
SELECT libelle
FROM prod
WHERE EXISTS ⇒ VRAI
SELECT libelle
LIBELLE
------------
clavier
SELECT c_prod
Introduction à SQL/92 - Université de Nantes - Claude Belleil 91
FROM ventes
WHERE NOT EXISTS
(SELECT *
FROM prod
WHERE c_prod = code_pr)
Réponse:
{ Q108 Sous-requêtes à références externes : Numéros des clients dans la table des
VENTES qui n'existent pas dans la table des CLIENTS }
4.9.1. Présentation
Avec SQL, il n'existe pas de moyen de vérifier que l'on a atteint TOUS les éléments
d'une table! Par exemple, SQL ne peut pas répondre de façon directe à la question
suivante:
Quels sont les clients qui ont acheté tous les produits ?
Si l'on rapporte cette question aux trois tables qui sont nécessaires à la mise en
œuvre de la réponse ( CLI, PROD, VENTES), on peut poser la même question de la
façon suivante:
Existe-t-il un CLIENT, qui par l'intermédiaire de la table des VENTES, est en relation
avec TOUS les éléments de la table des PRODUITS?
C'est à dire mettre en évidence que l'on atteint AUCUN élément d'une table
(réponse = ensemble VIDE).
L'opérateur EXISTS ne sait pas détecter une totalité, car il renvoie toujours VRAI
dans l'intervalle {1,TOUT}. En revanche, l'opérateur NOT EXISTS, quand il renvoie
la valeur VRAI, met en évidence un ensemble vide!
un client pour lequel il n'existe pas de produits pour lesquels il n'existe pas de
ventes.
D'où la requête:
Réponse:
(1) Eléments de la table A par lesquels on atteint TOUS les éléments de la table B
par l'intermédiaire de la table C.) Réponse: 2
SELECT A1
FROM A
WHERE NOT EXISTS
(SELECT *
FROM B
WHERE NOT EXISTS
(SELECT *
FROM C
WHERE A.A1=C.C1
AND B.B1= C.C2))
Dans le tableau suivant nous avons représenté dans la partie gauche, les codes de
produits en colonnes et les codes de clients en lignes. Les croix indiquent qu'un
client a acheté un produit. Dans la partie centrale, la phrase exprime dans un
formalisme proche de la structure de la requête les rapports existant entre les
clients, les produits et l'action de vente. La dernière colonne à droite exprime le
résultat obtenu.
MW GC NM DD
AA x x x x Client pour lequel il n'existe pas de Produits pour lesquels il n'existe pas de Ventes TOUS
BB x x x Client pour lequel il existe des Produits pour lesquels il n'existe pas de Ventes De UN à TOUS exclu
ZZ x x x Client pour lequel il existe des Produits pour lesquels il n'existe pas de Ventes De UN à TOUS exclu
DD x Client pour lequel il existe des Produits pour lesquels il n'existe pas de Ventes De UN à TOUS exclu
EE x Client pour lequel il existe des Produits pour lesquels il n'existe pas de Ventes De UN à TOUS exclu
(SELECT *
FROM prod
CODE_PR LIBELLE
------- ---------------
MW clavier
(SELECT *
FROM ventes
WHERE c_cli = code_cli
AND c_prod = code_pr));
Les références externes sont remplacées par les valeurs provenant des deux
niveaux au dessus:
(SELECT *
FROM ventes
WHERE c_cli = AA
AND c_prod = MW));
Cette requête recherche les ventes de produit MW au client AA. Comme on peut le
voir dans la table des ventes (annexe 1), ce produit a bien été acheté par ce client.
La requête va donc renvoyer VRAI au niveau du dessus. Le NOT EXISTS
transforme le VRAI en FAUX…
CODE_PR LIBELLE
------- ---------------
GC modem
(SELECT *
FROM ventes
WHERE c_cli = AA
AND c_prod = GC));
.. et ainsi de suite. Voici présentés dans un tableau, les différentes étapes pour le
client AA.
SELECT c_cli
FROM ventes
GROUP BY c_cli HAVING COUNT(DISTINCT c_prod)=
(SELECT COUNT(*) FROM prod)
Trouver les libellées des questions suivantes:
{ Q116 Clients qui ont acheté des produits qui n'existent pas }
{ Q117 Clients qui ont acheté tous les produits fabriqués en Gironde }
…puis…
[Structure] [Create]
10
Les mots réservés SQL sont en caractères gras: CREATE TABLE; les noms à l'initiative de
l'utilisateur sont en italiques: nom_de_table ; une expression est entre […] est optionnelle; les
expressions en italiques gras font l'objet d'une redéfinition: définition_de_colonne.
11
Voir 5.3
12
Les contraintes définies pour un_nom_de_table ne seront pas transmises à
un_autre_nom_de_table
Introduction à SQL/92 - Université de Nantes - Claude Belleil 105
MicroSql propose une fenêtre avec le début de la commande de création ….
Character(n) ou Char(n)
Character Varying(n) ou Varchar(n)
Date
Decimal(n) ou Dec(n)
Double Precision ou Double
Float(n)
Integer ou Int
Numeric(n)
Real
Smallint
Quand n'est pas défini par l'utilisateur, MicroSql alloue les valeurs suivantes:
Character :1
Date :8
Decimal :6
Double :12
Float :8
Integer :6
Numeric :6
Real :8
Smallint :3
SELECT *
FROM fabric2
Réponse:
5.5.1. Update
UPDATE fabric2
SET defauts = 10
WHERE c_prod = "GC"
SELECT *
FROM fabric2
Réponse:
DATE C_PROD DEPT DEFAUTS QUANT
-------- ------ ---- ------- -----
02/07/87 GC 53 10 15
02/01/87 GC 53 10 55
02/02/87 NM 75 17 93
02/02/87 DD 53 25
02/03/87 DD 33 22 46
02/02/87 NM 33 15 25
02/04/87 DD 44 12 25
Introduction à SQL/92 - Université de Nantes - Claude Belleil 111
02/04/87 DD 75 15 25
02/06/87 GC 44 10 43
{ Q123 Mise à jour des défauts et des quantités pour les productions de la Mayenne
}
UPDATE fabric2
SET defauts = 99, quant= 99
WHERE dept = "53"
SELECT *
FROM fabric2
Réponse:
DATE C_PROD DEPT DEFAUTS QUANT
-------- ------ ---- ------- -----
02/07/87 GC 53 99 99
02/01/87 GC 53 99 99
02/02/87 NM 75 17 93
02/02/87 DD 53 99 99
02/03/87 DD 33 22 46
02/02/87 NM 33 15 25
02/04/87 DD 44 12 25
02/04/87 DD 75 15 25
02/06/87 GC 44 10 43
{ Q125 Mise à jour par calcul: diviser par 3 les quantités de la Mayenne }
UPDATE fabric2
SET quant = quant / 3
WHERE dept = "53"
SELECT *
FROM fabric2
Réponse:
DATE C_PROD DEPT DEFAUTS QUANT
-------- ------ ---- ------- -----
02/07/87 GC 53 99 33
02/01/87 GC 53 99 33
02/02/87 NM 75 17 93
02/02/87 DD 53 99 33
02/03/87 DD 33 22 46
02/02/87 NM 33 15 25
02/04/87 DD 44 12 25
02/04/87 DD 75 15 25
02/06/87 GC 44 10 43
SELECT *
FROM fabric2
Reponse:
| table_constraint
| table_constraint
| table_constraint ] ... ) ]
[STORAGE storage_clause]
[DATAFILE 'filename']
[ ENABLE enable_clause
schema
est le nom du schéma contenant la table. Le schéma par défaut est celui de l'utilisateur qui
exécute la requête.
table
column
datatype
DEFAULT
column_constraint
table_constraint
STORAGE
DROP
ALLOCATE EXTENT
ENABLE
Les contraintes d'intégrité spécifiées dans ces clauses doivent avoir été définies
auparavant. On peut aussi activer ou désactiver des contraintes d'intégrité en
utilisant les paramètre ENABLE et DISABLE de la clause CONSTRAINT. Quand on définit
une contrainte d'intégrité elle est activée par défaut.
Prérequis
Pour pouvoir modifier la définition d'une il faut soit être propriétaire de cette table,
soit avoir le privilège ALTER TABLE sur cette table.
Références croisées
6.2. CONSTRAINT
Description
Cette clause permet de définir des contraintes d'intégrité. Une contrainte d'intégrité
est une règle restreignant les valeurs contenues dans une ou plusieurs colonnes
d'une table.
Syntaxe
Column constraint:
[CONSTRAINT constraint]
[NOT] NULL
| UNIQUE | PRIMARY KEY
| REFERENCES [schema.]table [(column)]
[ON DELETE CASCADE]
| CHECK (condition)
[ USING INDEX [PCTFREE integer]
[INITRANS integer] [MAXTRANS integer]
[TABLESPACE tablespace]
[STORAGE storage_clause] ]
[ EXCEPTIONS INTO [schema.]table
| DISABLE
Table constraint:
[CONSTRAINT constraint]
UNIQUE | PRIMARY KEY (column [,column] ...)
| FOREIGN KEY (column [,column] ...)
REFERENCES [schema.]table [(column [,column] ...)]
[ON DELETE CASCADE]
| CHECK (condition)
[ USING INDEX [PCTFREE integer]
[INITRANS integer] [MAXTRANS integer]
[TABLESPACE tablespace]
[STORAGE storage_clause] ]
[ EXCEPTIONS INTO [schema.]table
| DISABLE
CONSTRAINT
NULL
NOT NULL
PRIMARY KEY
FOREIGN KEY
REFERENCES
ON DELETE CASCADE
CHECK
USING INDEX
EXCEPTIONS INTO
DISABLE
Prérequis
Les clauses CONSTRAINT peuvent apparaître dans les commandes CREATE TABLE ou
ALTER TABLE. Pour définir une contrainte d'intégrité il faut avoir les privilèges
nécessaires pour effectuer l'une ou l'autre de ces commandes. Définir des
contraintes d'intégrité peut nécessiter des privilèges en plus qui dépendent du type
de la contrainte.
Références croisées
Description
Syntaxe
[TABLESPACE tablespace]
[STORAGE storage_clause]
where:
schema
est le nom du schéma contenant le cluster. Le schéma par défaut est celui de l'utilisateur qui
exécute la requête.
cluster
PCTUSED
PCTFREE
précise le pourcentage de place laissée libre dans les blocs du clusters à la création du cluster
l'index.
INITRANS
MAXTRANS
SIZE
TABLESPACE
STORAGE
INDEX
HASH IS
HASHKEYS
Prérequis
Pour pouvoir créer un cluster dans son propre schéma, il faut avoir le privilège
CREATE CLUSTER. Pour pouvoir créer un cluster dans n'importe quel schéma il faut
avoir le privilège CREATE ANY CLUSTER, de plus le propriétaire du schéma doit avoir
assez d'espace libre dans la tablespace devant contenir le cluster ou le privilège
UNLIMITED TABLESPACE.
Références croisées
CREATE TABLE
Description
Syntaxe
| table_constraint
| table_constraint ]...)
[TABLESPACE tablespace]
[STORAGE storage_clause]
[ ENABLE enable_clause
[AS subquery]
schema
est le nom du schéma qui contiendra la table. Le schéma par défaut est celui de l'utilisateur qui
exécute la requête.
table
est le nom d'une colonne de la table. Le nombre de colonnes possibles dans une table est
compris entre 1 et 254.
datatype
AS subquery
insère les lignes renvoyées par la sous requête dans la table, à sa création.
Prérequis
Pour pouvoir créer une table dans son propre schéma, il faut avoir le privilège
CREATE TABLE. Pour pouvoir créer une table dans le schéma d'un autre utilisateur, il
faut avoir le privilège CREATE ANY TABLE. De plus le propriétaire du schéma doit avoir
assez d'espace libre dans la tablespace devant contenir le cluster ou le privilège
UNLIMITED TABLESPACE.
Cette commande permet de définir une vue, table virtuelle, basée sur une ou
plusieurs tables ou vues.
Syntaxe
[(alias [,alias]...)]
AS subquery
crée la vue sans s'inquiéter de l'existence de la table et des privilèges sur celle-ci.
NOFORCE
crée la vue uniquement si la table existe et si le propriétaire du schéma contenant la vue possède
les privilèges adéquats sur celle-ci. C'est la valeur par défaut.
schema
est le nom du schéma qui contiendra la vue. Le schéma par défaut est celui de l'utilisateur qui
exécute la requête.
view
alias
AS subquery
CONSTRAINT
Prérequis
Pour pouvoir créer une vue dans son propre schéma, il faut avoir le privilège CREATE
VIEW. Pour pouvoir créer une vue dans le schéma d'un autre utilisateur, il faut avoir
le privilège CREATE ANY VIEW.
Le propiétaire du schéma contenant la vue doit avoir les privilèges nécessaires pour
pouvoir utiliser les commandes SELECT, INSERT, UPDATE, DELETE sur les tables ou
vues sur lesquelles la vue est basée.
Références croisées
CREATE TABLE, CREATE SYNONYM
6.6. DELETE
Description
Cette commande permet de supprimer des données contenues dans une table ou
dans une vue.
syntaxe
schema
est le nom du schéma contenant la table ou la vue à détruire. Le schéma par défaut est celui de
l'utilisateur qui exécute la requête.
table, view
est le nom de la table ou de la vue contenant les lignes qui seront détruites. Si c'est un nom de
vue, les lignes détruites appartiennent à la table sur laquelle la vue est basée.
alias
Est un alias assigné à la table. les alias sont généralement utilisés dans des DELETE contenant
des requêtes.
WHERE
Détruit seulement les lignes satisfaisant la condition. Cette condition peut référencer la table et
peut contenir des sous-requêtes. Si cette clause est omise détruit toutes les lignes.
Prérequis
Pour détruire des lignes appartenant à une table, il faut soit être propriétaire de la
table, soit avoir le privilège DELETE sur cette table.
Le privilège DELETE ANY TABLE permet à un utilisateur de détruire des lignes se
trouvant dans n'importe quelle table, ou n'importe quelle vue basée sur une table.
Références croisées
Description
Syntaxe
where:
schema
est le nom du schéma contenant le cluster à détruire. Le schéma par défaut est celui de
l'utilisateur qui exécute la requête.
cluster
CASCADE CONSTRAINTS
Prérequis
Le cluster doit appartenir à l'utilisateur, ou celui-ci doit avoir le privilège DROP ANY
CLUSTER.
Références croisées
DROP TABLE
Syntaxe
[CASCADE CONSTRAINTS]
schema
est le nom du schéma contenant la table ou la vue à détruire Le schéma par défaut est celui de
l'utilisateur qui exécute la requête.
table
CASCADE CONSTRAINTS
drops all referential integrity constraints that refer to primary and unique keys in the dropped
table. If you omit this option, and such referential integrity constraints exist, ORACLE returns an
error and does not drop the table.
Prérequis
Pour pouvoir détruire une table il faut soit être propriétaire de cette table, soit avoir
le privilège DROP ANY TABLE.
schema
est le nom du schéma contenant la vue à détruire. Le schéma par défaut est celui de l'utilisateur
qui exécute la requête.
view
Pour pouvoir détruire une vue il faut soit être propriétaire de cette vue, soit avoir le
privilège DROP ANY VIEW.
Références croisées
6.10. INSERT
Description
Cette commande permet d'ajouter des lignes à une table ou à une vue basée sur
une table.
Syntaxe
Dans lequel :
schema
est le nom du schéma contenant la table ou la vue. Le schéma par défaut est celui de l'utilisateur
qui exécute la requête.
table
view
est le nom de la table dans laquelle les lignes seront insérés. Si c'est un nom de vue qui est
précisé, les données seront insérés dans la table basée sur la vue.
column
VALUES
subquery
Pour pouvoir insérer des lignes dans une table il faut soit être propriétaire de cet
objet, soit avoir le privilège INSERT sur cette table.
Le privilège INSERT ANY TABLE permet d'insérer des lignes dans n'importe quelle
table appartenant à n'importe quel utilisateur.
Références croisées
DELETE, UPDATE
6.11. ORDER BY
Description
L'optimiseur d'interrogation d'oracle décidera dans certains cas de passer par l'index
pour sélectionner les lignes d'une table selon un certain ordre. Pour cela il faut que :
• le critère de classement soit le contenu d'une colonne indexée
• cette colonne ait l'attribut not null (obligatoire)
• la sélection porte sur toute la table (pas de WHERE)
Exemple : Le SELECT suivant utilisera l'index sur la colonne salaire si cette colonne
ne contient pas de valeurs NULL.
6.12. RENAME
Description
Cette commande permet de renommer une table, une vue, une séquence, ou un
synonyme privé.
Syntaxe
new
Références croisées
6.13. SELECT
Description
Syntaxe
ALL
renvoie toutes les lignes sélectionnées sans enlever les doublons. C'est la valeur par défaut.
renvoie toutes les colonnes de toutes les tables, les vues et les clichés précisés dans le FROM.
sélectionne une expression habituellement calculée sur les valeurs des colonnes appartenant à
l'une des tables, vues, ou clichés de la clause FROM.
c_alias
schema
est le nom du schéma contenant les tables, vues ou clichés sélectionnés. Le schéma par défaut
Introduction à SQL/92 - Université de Nantes - Claude Belleil 129
est celui de l'utilisateur qui exécute la requête.
table, view, snapshot
synonyme pour la table dont le nom précède, à utiliser dans le reste de la requête.
WHERE
restreint les lignes sélectionnées à celles pour lesquelles la condition est vraie. Si cette clause est
omise, toutes les lignes des tables, vues ou clichés précisés derrière le FROM sont renvoyées.
groupe les lignes sélectionnées en se basant sur la valeur de expr pour chaque ligne et renvoie
une seule ligne par groupe.
HAVING
restreint les groupes de lignes renvoyés à ceux pour lesquels la condition spécifiée est vraie.
Sans cette clause, tous les groupes sont renvoyés.
Combine les lignes retournées par deux SELECT en utilisant une opération ensembliste.
ORDER BY
expr
en utilisant la valeur de expr. Cette expression est basée sur des colonnes précisées derrière le
SELECT ou sur des colonnes appartenant à des tables, vues ou clichés présents derrière le FROM.
position
ASC, DESC
FOR UPDATE
retourne le controle à l'utilisateur si la commande SELECT essaye de bloquer une table utilisée
par un autre utilisateur.
Prérequis
Références croisées
DELETE, UPDATE
6.14. UPDATE
Description
Cette commande permet de modifier des données contenues dans une table ou
dans une vue.
Syntaxe
est le nom du schéma contenant la table ou la vue à modifier. Le schéma par défaut est celui de
l'utilisateur qui exécute la requête.
table, view
est le nom de la table à mettre à jour. Si c'est un nom de vue, la table mise à jour est celle sur
laquelle la vue est définie.
alias
est un alias assigné à la table. les alias sont généralement utilisés dans des UPDATE contenant
des requêtes.
column
est un SELECT qui renvoie les nouvelles valeurs affectées aux colonnes correspondantes.
WHERE
restreint les lignes modifiées à celles pour lesquelles la condition est vraie. Si on omet cette
clause toutes les lignes sont modifiées.
Pour pouvoir modifier des lignes appartenant à une table, il faut soit être propriétaire
de cet objet, soit avoir le privilège UPDATE sur cette table.
le privilège UPDATE ANY TABLE permet de sélectionner des lignes de n'importe quel
objet appartenant à n'importe quel utilisateur.
Références croisées
DELETE, INSERT