{"id":63,"date":"2008-08-26T09:45:58","date_gmt":"2008-08-26T07:45:58","guid":{"rendered":"http:\/\/wp1.fredptitgars.net\/index.php\/2008\/08\/26\/le-modele-relationnel-et-le-langage-sql\/"},"modified":"2008-08-26T09:45:58","modified_gmt":"2008-08-26T07:45:58","slug":"le-modele-relationnel-et-le-langage-sql","status":"publish","type":"post","link":"https:\/\/fredptitgars.ovh\/?p=63","title":{"rendered":"Le mod\u00e8le Relationnel et le langage SQL"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>La puissance du mod\u00e8le relationnel offre aux utilisateurs la possibilit\u00e9 d&rsquo;analyser les donn\u00e9es par l&rsquo;interm\u00e9diaire de requ\u00eates interactives et d&rsquo;\u00e9tats sans recourir \u00e0 l&rsquo;assistance de programmeurs.<br \/>\nA la fin des ann\u00e9es quatre-vingt, les avanc\u00e9es constantes, \u00e0 la fois dans le domaine des technologies mat\u00e9rielles et dans celui des syst\u00e8mes relationnels, ont renforc\u00e9 l&rsquo;int\u00e9gration de la base de donn\u00e9es relationnelle dans les syst\u00e8mes de traitement transactionnel.<\/p>\n<p>Les bases de donn\u00e9es relationnelle actuelles disposent d&rsquo;un certain nombre de fonctionnalit\u00e9s tr\u00e8s utiles que l&rsquo;article original de E. F. Codd ne mentionnait pas. Toutefois, au moment de la r\u00e9daction de cet expos\u00e9, aucune base de donn\u00e9es du march\u00e9 ne comportait l&rsquo;int\u00e9gralit\u00e9 des r\u00e8gles du syst\u00e8me relationnel de Codd.<\/p>\n<p>Aujourd&rsquo;hui, la base de donn\u00e9es relationnelle se trouve au c\u0153ur des syst\u00e8mes d&rsquo;information de nombreuses organisations, publiques ou priv\u00e9es, grandes ou petites. Il existe de nombreux \u00e9diteurs de syst\u00e8mes de gestion de bases de donn\u00e9es relationnels (SGBDR), parmi lesquels Oracle, Sybase, IBM, Informix, Microsoft, et Computer Associates. De ce groupe, Oracle a \u00e9merg\u00e9 comme leader. Son moteur de SGBDR a \u00e9t\u00e9 impl\u00e9ment\u00e9 sur plus de plates-formes que toute autre base de donn\u00e9es. C&rsquo;est la raison pour laquelle un grand nombre de concepteurs de logiciels l&rsquo;ont choisi comme plate-forme de pr\u00e9dilection.<\/p>\n<p>Un SGBDR (syst\u00e8me de gestion de base de donn\u00e9es relationnel) est un logiciel qui permet de g\u00e9rer une base de donn\u00e9es relationnelle. Un tel syst\u00e8me accepte l&rsquo;utilisation d&rsquo;instructions d\u00e9claratives pour d\u00e9crire les r\u00e8gles r\u00e9gissant les donn\u00e9es de la base. Cette fonctionnalit\u00e9 s&rsquo;appelle int\u00e9grit\u00e9 d\u00e9clarative. Le SGBDR est le composant central d&rsquo;une architecture client-serveur qui sera abord\u00e9e dans ce chapitre.<\/p>\n<p>SQL (Structured Query Language) n&rsquo;est pas un langage proc\u00e9dural, comme C ou COBOL qui d\u00e9crivent pr\u00e9cis\u00e9ment les proc\u00e9dures d&rsquo;acc\u00e8s et de manipulation des donn\u00e9es. A la diff\u00e9rence de ces langages, SQL se contente d&rsquo;indiquer ce qui doit \u00eatre fait. Le syst\u00e8me de gestion de base de donn\u00e9es se charge ensuite de d\u00e9terminer comment ex\u00e9cuter la requ\u00eate. SQL existe en tant que standard industriel ANSI (American National Standards Institute) et ISO (International Standards Organization). <\/p>\n<p>L&rsquo;impl\u00e9mentation SQL d&rsquo;Oracle respecte le niveau 2 des standards ANSI X3.135-1989 et ISO 9075-1989 avec une prise en charge totale de la fonction d&rsquo;am\u00e9lioration de l&rsquo;int\u00e9grit\u00e9, Comme d&rsquo;autres fournisseurs de bases de donn\u00e9es, Oracle fournit de nombreuses extensions au SQL ANSI.<\/p>\n<p>En 1970, l&rsquo;ACM, un respectable journal informatique  am\u00e9ricain, publiait un article intitul\u00e9 \u00ab\u00a0Un mod\u00e8le de donn\u00e9es relationnel pour les grandes banques de donn\u00e9es partag\u00e9es\u00a0\u00bb. L&rsquo;auteur de cet article \u00e9tait le Dr E. F. Codd, un membre du laboratoire de recherche IBM de San Jos\u00e9. Le sujet jetait les fondements math\u00e9matiques et th\u00e9oriques du concept de la base de donn\u00e9es relationnelle.<\/p>\n<p>Il est difficile de faire \u00e9tat d&rsquo;un autre article ayant eu autant d&rsquo;impact aupr\u00e8s des constructeurs, des informaticiens et des utilisateurs.<\/p>\n<p>Une base de donn\u00e9es relationnelle est un syst\u00e8me d&rsquo;information pr\u00e9sentant les donn\u00e9es sous forme de lignes regroup\u00e9es au sein de tables, chaque table \u00e9tant compos\u00e9e d&rsquo;une ou de plusieurs colonnes.<\/p>\n<p>Dans son article, Codd d\u00e9crivait les \u00e9l\u00e9ments d&rsquo;une base de donn\u00e9es relationnelle : relations, attributs, domaines, et les op\u00e9rateurs relationnels. Il pr\u00e9sentait un syst\u00e8me de stockage de donn\u00e9es pourvu de trois caract\u00e9ristiques qui faisaient jusque-l\u00e0 terriblement d\u00e9faut :<\/p>\n<p>&#8211; Ind\u00e9pendance logique des donn\u00e9es.<br \/>\n<br \/>Cette caract\u00e9ristique tant attendue signifiait que les changements apport\u00e9s \u00e0 un attribut (une colonne), par exemple, une augmentation ou diminution de sa taille, ne devaient avoir aucune incidence sur les autres attributs de la m\u00eame relation (une table).<br \/>\nCette ind\u00e9pendance logique des donn\u00e9es semblait tr\u00e8s int\u00e9ressante aux yeux des organisations sp\u00e9cialis\u00e9es dans le traitement de donn\u00e9es, car elle permettait de r\u00e9duire de fa\u00e7on cons\u00e9quente le co\u00fbt de la maintenance logicielle.<\/p>\n<p>&#8211; Int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle et int\u00e9grit\u00e9 des donn\u00e9es.<br \/>\n<br \/>A la diff\u00e9rence des autres syst\u00e8mes, une base de donn\u00e9es relationnelle lib\u00e9rait l&rsquo;application de la charge d&rsquo;assurer les contraintes d&rsquo;int\u00e9grit\u00e9. Codd d\u00e9crivait deux autres caract\u00e9ristiques propres \u00e0 la base de donn\u00e9es relationnelle, l&rsquo;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle et l&rsquo;int\u00e9grit\u00e9 des donn\u00e9es.<\/p>\n<p>&#8211; Requ\u00eate sp\u00e9cifique.<\/p>\n<p>Cette caract\u00e9ristique devait permettre \u00e0 l&rsquo;utilisateur d&rsquo;indiquer \u00e0 la base quelles donn\u00e9es<br \/>\nextraire sans avoir \u00e0 sp\u00e9cifier de quelle mani\u00e8re la t\u00e2che devait s&rsquo;effectuer.<\/p>\n<p>Il est important de bien comprendre les limitations des syst\u00e8mes de bases de donn\u00e9es de l&rsquo;\u00e9poque. L&rsquo;utilisateur moyen ne pouvait r\u00e9cup\u00e9rer des donn\u00e9es selon des crit\u00e8res d\u00e9termin\u00e9s que par l&rsquo;interm\u00e9diaire de programmes con\u00e7us sp\u00e9cialement \u00e0 cet effet.<\/p>\n<p>Pour une op\u00e9ration aussi \u00e9l\u00e9mentaire qu&rsquo;agrandir la largeur d&rsquo;un champ existant, de sorte qu&rsquo;il puisse accepter plus de chiffres d&rsquo;un num\u00e9ro de t\u00e9l\u00e9phone par exemple, les programmeurs charg\u00e9s de la maintenance devaient replancher sur d&rsquo;innombrables programmes, aboutissant \u00e0 un simple ajustement d&rsquo;offset (le d\u00e9calage) entre deux champs. M\u00eame si beaucoup de ces programmes pouvaient ne pas contenir de relation directe avec le num\u00e9ro de t\u00e9l\u00e9phone en question, il fallait tenir compte de l&rsquo;effet de vague que produisait le changement de taille du champ correspondant.<\/p>\n<p>Un certain temps s&rsquo;est \u00e9coul\u00e9 avant qu&rsquo;un produit commercialis\u00e9 n&rsquo;int\u00e8gre r\u00e9ellement certaines des caract\u00e9ristiques ainsi d\u00e9finies. Au d\u00e9but des ann\u00e9es quatre-vingt, la base de donn\u00e9es relationnelle constitua le fondement sur lequel se sont appuy\u00e9s les syst\u00e8mes d&rsquo;aide \u00e0 la d\u00e9cision.<\/p>\n<h2> Le Mod\u00e8le physique des Travaux Pratiques<\/h2>\n<p><strong>1.1 G\u00e9n\u00e9ration des fichiers de stockage et des utilisateurs<\/strong><\/p>\n<p><code><br \/>\ncreate tablespace TP_IDX datafile 'C:\\ORACLE\\ORADATA\\ A4\\TP_IDX.DBF' size 40M reuse;<br \/>\ncreate tablespace TP_USR datafile 'C:\\ ORACLE\\ORADATA\\ A4\\TP_USR.DBF' size 80M reuse;<br \/>\n\/<br \/>\ncreate user A4 identified by A4;<br \/>\ngrant connect to A4;<br \/>\ngrant resource to A4;<\/p>\n<p><\/code><\/p>\n<p><strong>1.2 G\u00e9n\u00e9ration des s\u00e9quences<\/strong><\/p>\n<p><code><br \/>\nPROMPT Creating Sequence 'NUM_FOURNISSEUR'<br \/>\nCREATE SEQUENCE NUM_FOURNISSEUR<br \/>\n NOMAXVALUE<br \/>\n NOMINVALUE<br \/>\n NOCYCLE<br \/>\n NOCACHE<br \/>\n\/<br \/>\nPROMPT Creating Sequence 'NUM_CLIENT'<br \/>\nCREATE SEQUENCE NUM_CLIENT<br \/>\n NOMAXVALUE<br \/>\n NOMINVALUE<br \/>\n NOCYCLE<br \/>\n NOCACHE<br \/>\n\/<br \/>\nPROMPT Creating Sequence 'NUM_PRODUIT'<br \/>\nCREATE SEQUENCE NUM_PRODUIT<br \/>\n NOMAXVALUE<br \/>\n NOMINVALUE<br \/>\n NOCYCLE<br \/>\n NOCACHE<br \/>\n\/<br \/>\nPROMPT Creating Sequence 'NUM_COMMANDE'<br \/>\nCREATE SEQUENCE NUM_COMMANDE<br \/>\n NOMAXVALUE<br \/>\n NOMINVALUE<br \/>\n NOCYCLE<br \/>\n NOCACHE<br \/>\n\/<br \/>\nPROMPT Creating Sequence 'NUM_LIGNE_COMMANDE'<br \/>\nCREATE SEQUENCE NUM_LIGNE_COMMANDE<br \/>\n NOMAXVALUE<br \/>\n NOMINVALUE<br \/>\n NOCYCLE<br \/>\n NOCACHE<br \/>\n\/<\/p>\n<p><\/code><\/p>\n<p><strong>1.3 G\u00e9n\u00e9ration des tables<\/strong><\/p>\n<p><code><\/p>\n<p>PROMPT Creating Table 'TYPE_FOURNISSEUR'<br \/>\nCREATE TABLE TYPE_FOURNISSEUR<br \/>\n (TYPE_FOURNISSEUR VARCHAR2(1) NOT NULL<br \/>\n ,LIBELLE_TYPE_FOURNISSEUR VARCHAR2(30) NOT NULL<br \/>\n )<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 50K<br \/>\n NEXT 50K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_USR<br \/>\n\/<\/p>\n<p>PROMPT Creating Table 'TYPE_COMMANDE'<br \/>\nCREATE TABLE TYPE_COMMANDE<br \/>\n (TYPE_COMMANDE VARCHAR2(1) NOT NULL<br \/>\n ,LIBELLE_TYPE_COMMANDE VARCHAR2(30) NOT NULL<br \/>\n )<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 50K<br \/>\n NEXT 50K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_USR<br \/>\n\/<\/p>\n<p>PROMPT Creating Table 'FOURNISSEUR'<br \/>\nCREATE TABLE FOURNISSEUR<br \/>\n (NUM_FOURNISSEUR NUMBER(7,0) NOT NULL<br \/>\n ,NOM_FOURNISSEUR VARCHAR2(40) NOT NULL<br \/>\n ,TYPE_FOURNISSEUR VARCHAR2(1)<br \/>\n ,ADRESSE_1_FOURNISSEUR VARCHAR2(40) NOT NULL<br \/>\n ,ADRESSE_2_FOURNISSEUR VARCHAR2(40)<br \/>\n ,CP_FOURNISSEUR VARCHAR2(5) NOT NULL<br \/>\n ,VILLE_FOURNISSEUR VARCHAR2(40) NOT NULL<br \/>\n ,DATE_CREATION DATE NOT NULL<br \/>\n )<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 50K<br \/>\n NEXT 50K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_USR<br \/>\n\/<\/p>\n<p>PROMPT Creating Table 'LIGNE_COMMANDE'<br \/>\nCREATE TABLE LIGNE_COMMANDE<br \/>\n (NUM_LIGNE_COMMANDE NUMBER(7,0) NOT NULL<br \/>\n ,NUM_COMMANDE NUMBER(7,0) NOT NULL<br \/>\n ,NUM_PRODUIT NUMBER(7,0) NOT NULL<br \/>\n ,QTE NUMBER(4) NOT NULL<br \/>\n ,PU_HT NUMBER(6,2) NOT NULL<br \/>\n ,REMISE NUMBER(3) NOT NULL<br \/>\n )<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 50K<br \/>\n NEXT 50K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_USR<br \/>\n\/<\/p>\n<p>PROMPT Creating Table 'STATUS_COMMANDE'<br \/>\nCREATE TABLE STATUS_COMMANDE<br \/>\n (STATUS_COMMANDE VARCHAR2(1) NOT NULL<br \/>\n ,LIBELLE_STATUS_COMMANDE VARCHAR2(30) NOT NULL<br \/>\n )<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 50K<br \/>\n NEXT 50K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_USR<br \/>\n\/<\/p>\n<p>PROMPT Creating Table 'CLIENT'<br \/>\nCREATE TABLE CLIENT<br \/>\n (NUM_CLIENT NUMBER(7,0) NOT NULL<br \/>\n ,NOM_CLIENT VARCHAR2(40) NOT NULL<br \/>\n ,TYPE_CLIENT VARCHAR2(1)<br \/>\n ,ADRESSE_1_CLIENT VARCHAR2(40) NOT NULL<br \/>\n ,ADRESSE_2_CLIENT VARCHAR2(40)<br \/>\n ,CP_CLIENT VARCHAR2(5) NOT NULL<br \/>\n ,VILLE_CLIENT VARCHAR2(40) NOT NULL<br \/>\n ,DATE_CREATION DATE NOT NULL<br \/>\n )<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 50K<br \/>\n NEXT 50K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_USR<br \/>\n\/<br \/>\nPROMPT Creating Table 'PRODUIT'<br \/>\nCREATE TABLE PRODUIT<br \/>\n (NUM_PRODUIT NUMBER(7,0) NOT NULL<br \/>\n ,NUM_FOURNISSEUR NUMBER(7) NOT NULL<br \/>\n ,LIBELLE_PRODUIT VARCHAR2(30) NOT NULL<br \/>\n ,QTE_STOCK NUMBER(7) NOT NULL<br \/>\n ,QTE_LIMITE NUMBER(7,0) NOT NULL<br \/>\n )<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 50K<br \/>\n NEXT 50K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_USR<br \/>\n\/<\/p>\n<p>PROMPT Creating Table 'ENTETE_COMMANDE'<br \/>\nCREATE TABLE ENTETE_COMMANDE<br \/>\n (NUM_COMMANDE NUMBER(7,0) NOT NULL<br \/>\n ,DATE_COMMANDE DATE NOT NULL<br \/>\n ,NUM_CLIENT NUMBER(7,0) NOT NULL<br \/>\n ,TYPE_COMMANDE VARCHAR2(1) NOT NULL<br \/>\n ,STATUS_COMMANDE VARCHAR2(1) NOT NULL<br \/>\n )<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 50K<br \/>\n NEXT 50K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_USR<br \/>\n\/<\/p>\n<p>PROMPT Creating Table 'TYPE_CLIENT'<br \/>\nCREATE TABLE TYPE_CLIENT<br \/>\n (TYPE_CLIENT VARCHAR2(1) NOT NULL<br \/>\n ,LIBELLE_TYPE_CLIENT VARCHAR2(30) NOT NULL<br \/>\n )<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 50K<br \/>\n NEXT 50K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_USR<br \/>\n\/<\/p>\n<p><\/code><\/p>\n<p><strong>1.4 G\u00e9n\u00e9ration des cl\u00e9s primaires<\/strong><\/p>\n<p><code><\/p>\n<p>PROMPT Creating Primary Key on 'TYPE_FOURNISSEUR'<br \/>\nALTER TABLE TYPE_FOURNISSEUR<br \/>\n ADD CONSTRAINT PK_TYPE_FOURNISSEUR PRIMARY KEY<br \/>\n  (TYPE_FOURNISSEUR)<br \/>\n USING INDEX<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 20K<br \/>\n NEXT 20K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_IDX<br \/>\n\/<\/p>\n<p>PROMPT Creating Primary Key on 'TYPE_COMMANDE'<br \/>\nALTER TABLE TYPE_COMMANDE<br \/>\n ADD CONSTRAINT PK_TYPE_COMMANDE PRIMARY KEY<br \/>\n  (TYPE_COMMANDE)<br \/>\n USING INDEX<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 20K<br \/>\n NEXT 20K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_IDX<br \/>\n\/<\/p>\n<p>PROMPT Creating Primary Key on 'FOURNISSEUR'<br \/>\nALTER TABLE FOURNISSEUR<br \/>\n ADD CONSTRAINT PK_FOURNISSEUR PRIMARY KEY<br \/>\n  (NUM_FOURNISSEUR)<br \/>\n USING INDEX<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 20K<br \/>\n NEXT 20K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_IDX<br \/>\n\/<\/p>\n<p>PROMPT Creating Primary Key on 'LIGNE_COMMANDE'<br \/>\nALTER TABLE LIGNE_COMMANDE<br \/>\n ADD CONSTRAINT PK_LIGNE_COMMANDE PRIMARY KEY<br \/>\n  (NUM_LIGNE_COMMANDE)<br \/>\n USING INDEX<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 20K<br \/>\n NEXT 20K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_IDX<br \/>\n\/<\/p>\n<p>PROMPT Creating Primary Key on 'STATUS_COMMANDE'<br \/>\nALTER TABLE STATUS_COMMANDE<br \/>\n ADD CONSTRAINT PK_STATUS_COMMANDE PRIMARY KEY<br \/>\n  (STATUS_COMMANDE)<br \/>\n USING INDEX<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 20K<br \/>\n NEXT 20K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_IDX<br \/>\n\/<\/p>\n<p>PROMPT Creating Primary Key on 'CLIENT'<br \/>\nALTER TABLE CLIENT<br \/>\n ADD CONSTRAINT PK_CLIENT PRIMARY KEY<br \/>\n  (NUM_CLIENT)<br \/>\n USING INDEX<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 20K<br \/>\n NEXT 20K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_IDX<br \/>\n\/<br \/>\nPROMPT Creating Primary Key on 'PRODUIT'<br \/>\nALTER TABLE PRODUIT<br \/>\n ADD CONSTRAINT PK_PRODUIT PRIMARY KEY<br \/>\n  (NUM_PRODUIT)<br \/>\n USING INDEX<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 20K<br \/>\n NEXT 20K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_IDX<br \/>\n\/<\/p>\n<p>PROMPT Creating Primary Key on 'ENTETE_COMMANDE'<br \/>\nALTER TABLE ENTETE_COMMANDE<br \/>\n ADD CONSTRAINT PK_ENTETE_COMMANDE PRIMARY KEY<br \/>\n  (NUM_COMMANDE)<br \/>\n USING INDEX<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 20K<br \/>\n NEXT 20K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_IDX<br \/>\n\/<\/p>\n<p>PROMPT Creating Primary Key on 'TYPE_CLIENT'<br \/>\nALTER TABLE TYPE_CLIENT<br \/>\n ADD CONSTRAINT PK_TYPE_CLIENT PRIMARY KEY<br \/>\n  (TYPE_CLIENT)<br \/>\n USING INDEX<br \/>\n STORAGE<br \/>\n (<br \/>\n INITIAL 20K<br \/>\n NEXT 20K<br \/>\n PCTINCREASE 0<br \/>\n MINEXTENTS 1<br \/>\n MAXEXTENTS 100<br \/>\n )<br \/>\n TABLESPACE TP_IDX<br \/>\n\/<\/p>\n<p><\/code><\/p>\n<p><strong>1.5 G\u00e9n\u00e9ration des cl\u00e9s \u00e9trang\u00e8res<\/strong><\/p>\n<p><code><\/p>\n<p>PROMPT Creating Foreign Keys on 'FOURNISSEUR'<br \/>\nALTER TABLE FOURNISSEUR ADD CONSTRAINT<br \/>\n FK_FOURNISSEUR_1 FOREIGN KEY<br \/>\n  (TYPE_FOURNISSEUR) REFERENCES TYPE_FOURNISSEUR<br \/>\n  (TYPE_FOURNISSEUR)<br \/>\n\/<\/p>\n<p>PROMPT Creating Foreign Keys on 'LIGNE_COMMANDE'<br \/>\nALTER TABLE LIGNE_COMMANDE ADD CONSTRAINT<br \/>\n FK_LIGNE_COMMANDE_1 FOREIGN KEY<br \/>\n  (NUM_COMMANDE) REFERENCES ENTETE_COMMANDE<br \/>\n  (NUM_COMMANDE) ADD CONSTRAINT<br \/>\n FK_LIGNE_COMMANDE_2 FOREIGN KEY<br \/>\n  (NUM_PRODUIT) REFERENCES PRODUIT<br \/>\n  (NUM_PRODUIT)<br \/>\n\/<\/p>\n<p>PROMPT Creating Foreign Keys on 'CLIENT'<br \/>\nALTER TABLE CLIENT ADD CONSTRAINT<br \/>\n FK_TYPE_CLIENT_1 FOREIGN KEY<br \/>\n  (TYPE_CLIENT) REFERENCES TYPE_CLIENT<br \/>\n  (TYPE_CLIENT)<br \/>\n\/<\/p>\n<p>PROMPT Creating Foreign Keys on 'PRODUIT'<br \/>\nALTER TABLE PRODUIT ADD CONSTRAINT<br \/>\n FK_PRODUIT_1 FOREIGN KEY<br \/>\n  (NUM_FOURNISSEUR) REFERENCES FOURNISSEUR<br \/>\n  (NUM_FOURNISSEUR)<br \/>\n\/<\/p>\n<p>PROMPT Creating Foreign Keys on 'ENTETE_COMMANDE'<br \/>\nALTER TABLE ENTETE_COMMANDE ADD CONSTRAINT<br \/>\n FK_ENTETE_COMMANDE_3 FOREIGN KEY<br \/>\n  (TYPE_COMMANDE) REFERENCES TYPE_COMMANDE<br \/>\n  (TYPE_COMMANDE) ADD CONSTRAINT<br \/>\n FK_ENTETE_COMMANDE_1 FOREIGN KEY<br \/>\n  (NUM_CLIENT) REFERENCES CLIENT<br \/>\n  (NUM_CLIENT) ADD CONSTRAINT<br \/>\n FK_ENTETE_COMMANDE_2 FOREIGN KEY<br \/>\n  (STATUS_COMMANDE) REFERENCES STATUS_COMMANDE<br \/>\n  (STATUS_COMMANDE)<br \/>\n\/<\/p>\n<p><\/code><\/p>\n<p><strong>1.6 Insertion des donn\u00e9es<\/strong><\/p>\n<p>&mdash;&nbsp;Alimentation des tables de param\u00e9trage<\/p>\n<p><code><\/p>\n<p>Insert into TYPE_FOURNISSEUR values ('A','Artisan');<br \/>\nInsert into TYPE_FOURNISSEUR values ('I','Industriel');<br \/>\nInsert into TYPE_FOURNISSEUR values ('C','Centrale d''achat');<\/p>\n<p>Insert into TYPE_CLIENT values ('N','National');<br \/>\nInsert into TYPE_CLIENT values ('R','R\u00e9gional');<br \/>\nInsert into TYPE_CLIENT values ('I','International');<\/p>\n<p>Insert into TYPE_COMMANDE values ('C','Courrier');<br \/>\nInsert into TYPE_COMMANDE values ('T','T\u00e9l\u00e9phone');<br \/>\nInsert into TYPE_COMMANDE values ('M','Minitel');<br \/>\nInsert into TYPE_COMMANDE values ('I','Internet');<\/p>\n<p>Insert into STATUS_COMMANDE values ('E','En cours');<br \/>\nInsert into STATUS_COMMANDE values ('V','Valid\u00e9e');<br \/>\nInsert into STATUS_COMMANDE values ('F','Factur\u00e9e');<\/p>\n<p><\/code><\/p>\n<p>&mdash;&nbsp;Cr\u00e9ation de la commande 1<\/p>\n<p><code><\/p>\n<p>Insert into CLIENT values (NUM_CLIENT.NEXTVAL,'DURANT','N','Rue des affaires',null,'59650','VILLEUNEUVE D''ASCQ',sysdate);<br \/>\nInsert into FOURNISSEUR values (NUM_FOURNISSEUR.NEXTVAL,'DUPONT','C','Rue de la vente',null,'59290','WASQUEHAL',sysdate);<\/p>\n<p>Insert into ENTETE_COMMANDE values (NUM_COMMANDE.NEXTVAL,sysdate,NUM_CLIENT.CURRVAL,'C','E');<br \/>\nInsert into PRODUIT values (NUM_PRODUIT.NEXTVAL,NUM_FOURNISSEUR.CURRVAL,'Pantalon Levis 501 Taille S',25,10);<\/p>\n<p>Insert into LIGNE_COMMANDE values (NUM_LIGNE_COMMANDE.NEXTVAL,NUM_COMMANDE.CURRVAL,NUM_PRODUIT.CURRVAL,1,350,0);<\/p>\n<p>Insert into PRODUIT values (NUM_PRODUIT.NEXTVAL,NUM_FOURNISSEUR.CURRVAL,'Pantalon Levis 501 Taille L',25,10);<br \/>\nInsert into PRODUIT values (NUM_PRODUIT.NEXTVAL,NUM_FOURNISSEUR.CURRVAL,'Pantalon Levis 501 Taille XL',25,10);<br \/>\nInsert into PRODUIT values (NUM_PRODUIT.NEXTVAL,NUM_FOURNISSEUR.CURRVAL,'Pantalon Levis 501 Taille XXL',25,10);<\/p>\n<p>Insert into LIGNE_COMMANDE values (NUM_LIGNE_COMMANDE.NEXTVAL,NUM_COMMANDE.CURRVAL,NUM_PRODUIT.CURRVAL,1,400,0);<\/p>\n<p><\/code><\/p>\n<p>&mdash;&nbsp;Cr\u00e9ation de la commande 2<\/p>\n<p><code><\/p>\n<p>Insert into CLIENT values (NUM_CLIENT.NEXTVAL,'MIRZA','N','Rue des achats',null,'59000','LILLE',sysdate);<br \/>\nInsert into FOURNISSEUR values (NUM_FOURNISSEUR.NEXTVAL,'FELIX','C','Rue des magasins',null,'59290','WASQUEHAL',sysdate);<\/p>\n<p>Insert into ENTETE_COMMANDE values (NUM_COMMANDE.NEXTVAL,sysdate,NUM_CLIENT.CURRVAL,'C','E');<br \/>\nInsert into PRODUIT values (NUM_PRODUIT.NEXTVAL,NUM_FOURNISSEUR.CURRVAL,'Veste Levis 501 Taille S',25,10);<\/p>\n<p>Insert into LIGNE_COMMANDE values (NUM_LIGNE_COMMANDE.NEXTVAL,NUM_COMMANDE.CURRVAL,NUM_PRODUIT.CURRVAL,1,400,0);<\/p>\n<p>Insert into PRODUIT values (NUM_PRODUIT.NEXTVAL,NUM_FOURNISSEUR.CURRVAL,'Veste Levis 501 Taille L',25,10);<br \/>\nInsert into PRODUIT values (NUM_PRODUIT.NEXTVAL,NUM_FOURNISSEUR.CURRVAL,'Veste Levis 501 Taille XL',25,10);<br \/>\nInsert into PRODUIT values (NUM_PRODUIT.NEXTVAL,NUM_FOURNISSEUR.CURRVAL,'Veste Levis 501 Taille XXL',25,10);<\/p>\n<p>Insert into LIGNE_COMMANDE values (NUM_LIGNE_COMMANDE.NEXTVAL,NUM_COMMANDE.CURRVAL,NUM_PRODUIT.CURRVAL,1,500,0);<\/p>\n<p><\/code><\/p>\n<p>&mdash;&nbsp;Cr\u00e9ation de la commande 3<\/p>\n<p><code><\/p>\n<p>Insert into CLIENT values (NUM_CLIENT.NEXTVAL,'BARNABE',null,'Rue du sac',null,'59000','LILLE',sysdate);<br \/>\nInsert into FOURNISSEUR values (NUM_FOURNISSEUR.NEXTVAL,'HONORE','C','Rue du molinel',null,'5900','LILLE',sysdate);<\/p>\n<p>Insert into ENTETE_COMMANDE values (NUM_COMMANDE.NEXTVAL,sysdate,NUM_CLIENT.CURRVAL,'C','E');<br \/>\nInsert into PRODUIT values (NUM_PRODUIT.NEXTVAL,NUM_FOURNISSEUR.CURRVAL,'SAC Levis 501',14,10);<br \/>\nInsert into LIGNE_COMMANDE values (NUM_LIGNE_COMMANDE.NEXTVAL,NUM_COMMANDE.CURRVAL,NUM_PRODUIT.CURRVAL,4,400,0);<\/p>\n<p><\/code><\/p>\n<h2>2 Le Langage de Manipulation des donn\u00e9es (LMD)<\/h2>\n<p><strong>2.1 La consultation des donn\u00e9es et les diff\u00e9rents op\u00e9rateurs<\/strong><\/p>\n<p>La consultation des donn\u00e9es se fait par le verbe SELECT qui signifie s\u00e9lectionner ou extraire des donn\u00e9es. La consultation des donn\u00e9es ne n\u00e9cessite aucun COMMIT ou ROLLBACK.<\/p>\n<p><code><\/p>\n<p>SELECT [ALL | DISTINCT] liste_de_s\u00e9lection<br \/>\nFROM liste_de_tables<br \/>\n[WHERE condition]<br \/>\n[ [START WITH condition] CONNECT BY condition ]<br \/>\n[ GROUP BY liste_d'expression [HAVING condition] ]<br \/>\n[ (UNION | UNION ALL | INTERSECT | MINUS) commande SELECT]<br \/>\n[ ORDER BY (expr | position) [ASC | DESC]<br \/>\n[, (expr | position) [ASC | DESC ]]...]<br \/>\n[FOR UPDATE [OF [ [sch\u00e9ma.](table | vue).]colonne<br \/>\n[, [[sch\u00e9ma.](table | vue).]colonne]...] [NOWAIT]<\/p>\n<p><\/code><\/p>\n<p>Les clauses SELECT et FROM sont obligatoires et permettent de sp\u00e9cifier respectivement la liste des colonnes \u00e0 extraire et la liste de tables \u00e0 partir desquelles les donn\u00e9es seront extraites. Toutes les autres clauses sont optionnelles.<\/p>\n<p>Exemple 1 : S\u00e9lection de l\u2019ensemble des clients :<br \/>\n<br \/><code> SELECT * FROM CLIENT; <\/code><\/p>\n<p>Exemple 2 : S\u00e9lection du num\u00e9ro et du nom des clients :<br \/>\n<br \/><code> SELECT NUM_CLIENT Num\u00e9ro, NOM_CLIENT Nom FROM CLIENT; <\/code><\/p>\n<p>La clause WHERE a pour but d\u2019introduire des conditions \u00e0 la requ\u00eate gr\u00e2ce \u00e0 des op\u00e9rateurs. Il existe deux classes d\u2019op\u00e9rateurs : <\/p>\n<p>Les op\u00e9rateurs Unaires : Op\u00e9rateur Op\u00e9rande<br \/>\n<br \/>Les op\u00e9rateurs Binaires : Op\u00e9rande1 Op\u00e9rateur Op\u00e9rande2<\/p>\n<p>+, &#8211; \tPositif, N\u00e9gatif<br \/>\n<br \/>*, \/ \tMultiplication, Division<br \/>\n<br \/>+, -, ||  \tAddition, Soustraction, Concatenation  <\/p>\n<p>=, !=, <, >, <=, >=, IS NULL, LIKE, BETWEEN, IN  \tComparaison  <\/p>\n<p>NOT  \tN\u00e9gation logique<br \/>\n<br \/>AND  \tConjonction logique<br \/>\n<br \/>OR   \tDisjonction logique  <\/p>\n<p>UNION \/ UNION ALL  \tUnion<br \/>\n<br \/>INTERSECT  \t\tIntersection<br \/>\n<br \/>MINUS  \t\tDiff\u00e9rence<br \/>\n<br \/>(+)  \t\t\tExternalisation d\u2019une jointure<\/p>\n<p>Exemple 3 : S\u00e9lection de l\u2019ensemble des clients dont le nom commence par \u2018BA\u2019 :<br \/>\n<br \/><code> SELECT * FROM CLIENT WHERE NOM_CLIENT LIKE \u2018BA%\u2019; <\/code><\/p>\n<p>Exemple 4 : S\u00e9lection de l\u2019ensemble des clients n\u2019ayant pas de deuxi\u00e8me ligne d\u2019adresse :<br \/>\n<br \/><code> SELECT * FROM CLIENT WHERE ADRESSE_2_CLIENT is null; <\/code><\/p>\n<p>Exemple 5 : S\u00e9lection de l\u2019ensemble des clients ayant \u00e9t\u00e9 cr\u00e9\u00e9s entre le 01\/01\/1999 et le 31\/01\/1999:<br \/>\n<br \/><code><br \/>\nSELECT * FROM CLIENT WHERE DATE_CREATION BETWEEN to_date(\u201801\/01\/1999\u2019,\u2019DD\/MM\/YYYY\u2019) and to_date(\u201831\/01\/1999\u2019,\u2019DD\/MM\/YYYY\u2019);<br \/>\n<\/code><\/p>\n<p><strong>2.2 Les fonctions num\u00e9riques<\/strong><\/p>\n<p>ABS Retourne la valeur absolue d\u2019un nombre. <\/p>\n<p><code><br \/>\nSELECT ABS(-15) \"Absolute\" FROM DUAL;<\/p>\n<p>  Absolute<\/p>\n<hr \/>\n<p>        15<br \/>\n<\/code><\/p>\n<hr \/>\n<p>ACOS Retourne le cosine arc d\u2019un nombre.<br \/>\n<br \/><code><br \/>\nSELECT ACOS(.3)\"Arc_Cosine\" FROM DUAL;<\/p>\n<p>Arc_Cosine<\/p>\n<hr \/>\n<p>1.26610367<br \/>\n<\/code><\/p>\n<hr \/>\n<p>ASIN Retourne le sinus arc d\u2019un nombre.<br \/>\n<br \/><code><br \/>\nSELECT ASIN(.3) \"Arc_Sine\" FROM DUAL;<\/p>\n<p>Arc_Sine<\/p>\n<hr \/>\n<p>.304692654<br \/>\n<\/code><\/p>\n<hr \/>\n<p>ATAN Retourne la tangente arc d\u2019un nombre.<br \/>\n<br \/><code><br \/>\nSELECT ATAN(.3) \"Arc_Tangent\" FROM DUAL;<\/p>\n<p>Arc_Tangent<\/p>\n<hr \/>\n<p> .291456794<br \/>\n<\/code><\/p>\n<hr \/>\n<p>ATAN2 Retourne la tangente arc de n et m.<br \/>\n<br \/><code><br \/>\nSELECT ATAN2(.3, .2) \"Arc_Tangent2\" FROM DUAL;<\/p>\n<p>Arc_Tangent2<\/p>\n<hr \/>\n<p>  .982793723<br \/>\n<\/code><\/p>\n<hr \/>\n<p>CEIL Retourne le plus petit sup\u00e9rieur ou \u00e9gal d\u2019un nombre.<br \/>\n<br \/><code><br \/>\nSELECT CEIL(15.7) \"Ceiling\" FROM DUAL;<\/p>\n<p>   Ceiling<\/p>\n<hr \/>\n<p>        16<br \/>\n<\/code><\/p>\n<hr \/>\n<p>COS Retourne le cosinus d\u2019un nombre.<br \/>\n<br \/><code><\/p>\n<p>SELECT COS(180 * 3.14159265359\/180)<br \/>\n\"Cosine of 180 degrees\" FROM DUAL;<\/p>\n<p>Cosine of 180 degrees<\/p>\n<hr \/>\n<p>                   -1<br \/>\n<\/code><\/p>\n<hr \/>\n<p>COSH Retourne le cosinus hyperbolique d\u2019un nombre.<br \/>\n<br \/><code><br \/>\nSELECT COSH(0) \"Hyperbolic cosine of 0\" FROM DUAL;<\/p>\n<p>Hyperbolic cosine of 0<\/p>\n<hr \/>\n<p>                     1<br \/>\n<\/code><\/p>\n<hr \/>\n<p>EXP Retourne l\u2019exponentiel d\u2019un nombre.<br \/>\n<br \/><code><\/p>\n<p>SELECT EXP(4) \"e to the 4th power\" FROM DUAL;<\/p>\n<p>e to the 4th power<\/p>\n<hr \/>\n<p>          54.59815<br \/>\n<\/code><\/p>\n<hr \/>\n<p>FLOOR Retourne la valeur enti\u00e8re d\u2019un nombre.<br \/>\n<br \/><code><br \/>\nSELECT FLOOR(15.7) \"Floor\" FROM DUAL;<\/p>\n<p>     Floor<\/p>\n<hr \/>\n<p>        15<br \/>\n<\/code><\/p>\n<hr \/>\n<p>LN Retourne le logarithme n\u00e9peri\u00e9n de n.<br \/>\n<br \/><code><br \/>\nSELECT LN(95) \"Natural log of 95\" FROM DUAL;<\/p>\n<p>Natural log of 95<\/p>\n<hr \/>\n<p>       4.55387689<br \/>\n<\/code><\/p>\n<hr \/>\n<p>LOG Retourne  le logarithme \u00e0 base de m, de n.<br \/>\n<br \/><code><br \/>\nSELECT LOG(10,100) \"Log base 10 of 100\" FROM DUAL;<\/p>\n<p>Log base 10 of 100<\/p>\n<hr \/>\n<p>                 2<br \/>\n<\/code><\/p>\n<hr \/>\n<p>MOD Retourne le reste de la division enti\u00e8re de m par n.<\/p>\n<p><code><br \/>\nSELECT MOD(11,4) \"Modulus\" FROM DUAL;<\/p>\n<p>   Modulus<\/p>\n<hr \/>\n<p>         3<br \/>\n<\/code><\/p>\n<hr \/>\n<p>POWER Retorne la valeur de m \u00e0 la puissnce n.<\/p>\n<p><code><br \/>\nSELECT POWER(3,2) \"Raised\" FROM DUAL;<\/p>\n<p>    Raised<\/p>\n<hr \/>\n<p>         9<br \/>\n<\/code><\/p>\n<hr \/>\n<p>ROUND Retourne la valeur de n arrondi \u00e0 m positions \u00e0 droite du point d\u00e9cimal.<\/p>\n<p><code><br \/>\nSELECT ROUND(15.193,1) \"Round\" FROM DUAL;<\/p>\n<p>     Round<\/p>\n<hr \/>\n<p>      15.2<\/p>\n<p>SELECT ROUND(15.193,-1) \"Round\" FROM DUAL;<\/p>\n<p>     Round<\/p>\n<hr \/>\n<p>        20<br \/>\n<\/code><\/p>\n<hr \/>\n<p>SIGN Retourne le signe d\u2019un nombre (Si n<0, la fonction retourne -1; Si n=0, la fonction retourne 0; Si n>0, la fonction retourne 1). <\/p>\n<p><code><br \/>\nSELECT SIGN(-15) \"Sign\" FROM DUAL;<\/p>\n<p>      Sign<\/p>\n<hr \/>\n<p>        -1<br \/>\n<\/code><\/p>\n<hr \/>\n<p>SIN Retourne le sinus d\u2019un nombre. <\/p>\n<p><code><br \/>\nSELECT SIN(30 * 3.14159265359\/180)<br \/>\n \"Sine of 30 degrees\" FROM DUAL;<\/p>\n<p>Sine of 30 degrees<\/p>\n<hr \/>\n<p>                .5<br \/>\n<\/code><\/p>\n<hr \/>\n<p>SINH Retourne le sinus hyperbolique d\u2019un nombre. <\/p>\n<p><code><br \/>\nSELECT SINH(1) \"Hyperbolic sine of 1\" FROM DUAL;<\/p>\n<p>Hyperbolic sine of 1<\/p>\n<hr \/>\n<p>          1.17520119<br \/>\n<\/code><\/p>\n<hr \/>\n<p>SQRT Retourne la racine carr\u00e9 d\u2019un nombre.<\/p>\n<p><code><br \/>\nSELECT SQRT(26) \"Square root\" FROM DUAL;<\/p>\n<p>Square root<\/p>\n<hr \/>\n<p>5.09901951<br \/>\n<\/code><\/p>\n<hr \/>\n<p>TAN Retourne la tangente d\u2019un nombre.<\/p>\n<p><code><br \/>\nSELECT TAN(135 * 3.14159265359\/180)<br \/>\n\"Tangent of 135 degrees\"  FROM DUAL;<\/p>\n<p>Tangent of 135 degrees<\/p>\n<hr \/>\n<p>                   - 1<br \/>\n<\/code><\/p>\n<hr \/>\n<p>TANH Retourne la tangente hyperbolique d\u2019un nombre. <\/p>\n<p><code><br \/>\nSELECT TANH(.5) \"Hyperbolic tangent of .5\" FROM DUAL;<\/p>\n<p>Hyperbolic tangent of .5<\/p>\n<hr \/>\n<p>              .462117157<br \/>\n<\/code><\/p>\n<hr \/>\n<p>TRUNC Retourne la valeur n tronqu\u00e9e \u00e0 m positions d\u00e9cimale.<\/p>\n<p><code><br \/>\nSELECT TRUNC(15.79,1) \"Truncate\" FROM DUAL;<\/p>\n<p>  Truncate<\/p>\n<hr \/>\n<p>      15.7<\/p>\n<p>SELECT TRUNC(15.79,-1) \"Truncate\" FROM DUAL;<\/p>\n<p>  Truncate<\/p>\n<hr \/>\n<p>        10<br \/>\n<\/code><\/p>\n<p><strong>2.3 Les fonctions de cha\u00eenes de caract\u00e8res.<\/strong><\/p>\n<p><em>a) Les fonctions de cha\u00eenes de caract\u00e8res retournant une cha\u00eene de caract\u00e8res.<\/em><\/p>\n<p>CHR Retourne le caract\u00e8re ayant l\u2019\u00e9quivalence binaire de n.<\/p>\n<p><code><br \/>\nSELECT CHR(67)||CHR(65)||CHR(84) \"Dog\"<br \/>\n  FROM DUAL;<\/p>\n<p>Dog<br \/>\n<br \/>&mdash;&nbsp;-<br \/>\nCAT<\/p>\n<p>SELECT CHR(16705 USING NCHAR_CS) FROM DUAL;<\/p>\n<p>C<br \/>\n-<br \/>\nA<br \/>\n<\/code><\/p>\n<hr \/>\n<p>CONCAT Retourne la concatenation de 2 cha\u00eenes de caract\u00e8res.<\/p>\n<p><code><br \/>\nSELECT CONCAT( CONCAT(ename, ' is a '), job) \"Job\"<br \/>\nFROM emp<br \/>\nWHERE empno = 7900;<\/p>\n<p>Job<\/p>\n<hr \/>\n<p>JAMES is a CLERK<br \/>\n<\/code><\/p>\n<hr \/>\n<p>INITCAP Met en majuscule la premi\u00e8re lettre de chaque mot de la cha\u00eene.<\/p>\n<p><code><br \/>\nSELECT INITCAP('the soap') \"Capitals\" FROM DUAL;<\/p>\n<p>Capitals<\/p>\n<hr \/>\n<p>The Soap<br \/>\n<\/code><\/p>\n<hr \/>\n<p>LOWER Retourne la cha\u00eene de caract\u00e8re en minuscule. <\/p>\n<p><code><br \/>\nSELECT LOWER('MR. SCOTT MCMILLAN') \"Lowercase\" FROM DUAL;<\/p>\n<p>Lowercase<\/p>\n<hr \/>\n<p>mr. scott mcmillan<br \/>\n<\/code><\/p>\n<hr \/>\n<p>LPAD Retourne la cha\u00eene ch1 compl\u00e9t\u00e9e \u00e0 gauche avec la cha\u00eene ch2 \u00e0 la longueur n.<\/p>\n<p><code><br \/>\nSELECT LPAD('Page 1',15,'*.') \"LPAD example\" FROM DUAL;<\/p>\n<p>LPAD example<\/p>\n<hr \/>\n<p>*.*.*.*.*Page 1<br \/>\n<\/code><\/p>\n<hr \/>\n<p>LTRIM Enl\u00e8ve les caract\u00e8res de gauche de la cha\u00eene ch1 qui se trouve dans l\u2019ensemble ch2 jusqu\u2019\u00e0 la rencontre du premier caract\u00e8re non compris dans ens.<\/p>\n<p><code><br \/>\nSELECT LTRIM('xyxXxyLAST WORD','xy') \"LTRIM example\" FROM DUAL;<\/p>\n<p>LTRIM example<\/p>\n<hr \/>\n<p>XxyLAST WORD<br \/>\n<\/code><\/p>\n<hr \/>\n<p>NLS_INITCAP Fonctionne de la m\u00eame fa\u00e7on que INITCAP, \u00e0 l\u2019exception de l\u2019introduction des param\u00e8tres NLS qui tiennent compte de la langue utilis\u00e9e.<\/p>\n<p><code><br \/>\nSELECT NLS_INITCAP('ijsland', 'NLS_SORT = XDutch') \"Capitalized\" FROM DUAL;<\/p>\n<p>Capitalized<\/p>\n<hr \/>\n<p>IJsland<br \/>\n<\/code><\/p>\n<hr \/>\n<p>NLS_LOWER Identique \u00e0 LOWER mais avec les param\u00e8tres NLS.<\/p>\n<p><code><br \/>\nSELECT NLS_LOWER ('CITTA''', 'NLS_SORT = XGerman') \"Lowercase\" FROM DUAL;<\/p>\n<p>Lower<\/p>\n<hr \/>\n<p>citt\u00e1<br \/>\n<\/code><\/p>\n<hr \/>\n<p>NLS_UPPER Identique \u00e0 UPPER mais avec les param\u00e8tres NLS.<\/p>\n<p><code><br \/>\nSELECT NLS_UPPER ('gro\u00df', 'NLS_SORT = XGerman') \"Uppercase\" FROM DUAL;<\/p>\n<p>Upper<\/p>\n<hr \/>\n<p>GROSS<br \/>\n<\/code><\/p>\n<hr \/>\n<p>REPLACE Remplace dans la cha\u00eene char chaque occurrence ch1 par ch2.<\/p>\n<p><code><br \/>\nSELECT REPLACE('JACK and JUE','J','BL') \"Changes\" FROM DUAL;<\/p>\n<p>Changes<\/p>\n<hr \/>\n<p>BLACK and BLUE<br \/>\n<\/code><\/p>\n<hr \/>\n<p>RPAD Retourne la cha\u00eene ch1 compl\u00e9t\u00e9e \u00e0 droite avec la s\u00e9quence ch2 \u00e0 la longueur n.<\/p>\n<p><code><br \/>\nSELECT RPAD('MORRISON',12,'ab') \"RPAD example\" FROM DUAL;<\/p>\n<p>RPAD example<\/p>\n<hr \/>\n<p>MORRISONabab<br \/>\n<\/code><\/p>\n<hr \/>\n<p>RTRIM Enl\u00e8ve les caract\u00e8res de droite de la cha\u00eene ch1 qui se trouve dans l\u2019ensemble ch2 jusqu\u2019\u00e0 la rencontre du dernier caract\u00e8re non compris dans ens.<\/p>\n<p><code><br \/>\nSELECT RTRIM('BROWNINGyxXxy','xy') \"RTRIM e.g.\" FROM DUAL;<\/p>\n<p>RTRIM e.g<\/p>\n<hr \/>\n<p>BROWNINGyxX<br \/>\n<\/code><\/p>\n<hr \/>\n<p>SOUNDEX Retourne une cha\u00eene de caract\u00e8res contenant la repr\u00e9sentation phon\u00e9tique de char.<br \/>\n<code><br \/>\nSELECT ename FROM emp WHERE SOUNDEX(ename) = SOUNDEX('SMYTHE');<\/p>\n<p>ENAME<\/p>\n<hr \/>\n<p>SMITH<br \/>\n<\/code><\/p>\n<hr \/>\n<p>SUBSTR Retourne une portion de n caract\u00e8res de la cha\u00eene char commen\u00e7ant \u00e0 la position m.<br \/>\n <code><br \/>\nSELECT SUBSTR('ABCDEFG',3.1,4) \"Subs\" FROM DUAL;<\/p>\n<p>Subs<\/p>\n<hr \/>\n<p>CDEF<\/p>\n<p>SELECT SUBSTR('ABCDEFG',-5,4) \"Subs\" FROM DUAL;<\/p>\n<p>Subs<\/p>\n<hr \/>\n<p>CDEF<br \/>\n<\/code><\/p>\n<hr \/>\n<p>SUBSTRB Retourne une portion de n octets de la cha\u00eene char commen\u00e7ant \u00e0 la position m.<br \/>\n<code><br \/>\nSELECT SUBSTRB('ABCDEFG',5,4.2) \"Substring with bytes\" FROM DUAL;<\/p>\n<p>Substring with bytes<\/p>\n<hr \/>\n<p>CD<br \/>\n<\/code><\/p>\n<hr \/>\n<p>TRANSLATE Retourne la cha\u00eene char apr\u00e8s remplacement de toutes les occurrences source par cible.<br \/>\n<code><br \/>\nSELECT TRANSLATE('2KRW229', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',<br \/>\n'9999999999XXXXXXXXXXXXXXXXXXXXXXXXXX') \"License\" FROM DUAL;<\/p>\n<p>License<\/p>\n<hr \/>\n<p>9XXX999 <\/p>\n<p>SELECT TRANSLATE('2KRW229', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',<br \/>\n'0123456789') \"Translate example\" FROM DUAL;<\/p>\n<p>Translate example<\/p>\n<hr \/>\n<p>2229<br \/>\n<\/code><\/p>\n<hr \/>\n<p>UPPER Retourne la cha\u00eene char avec toutes les lettres en majuscule.<br \/>\n<code><br \/>\nSELECT UPPER('Large') \"Uppercase\" FROM DUAL;<\/p>\n<p>Upper<\/p>\n<hr \/>\n<p>LARGE<br \/>\n<\/code><\/p>\n<p>b) Les fonctions de cha\u00eenes de caract\u00e8res retournant un nombre.<\/p>\n<p>ASCII Retourne la valeur ASCII en d\u00e9cimal du premier caract\u00e8re de la cha\u00eene.<br \/>\n <code><br \/>\nSELECT ASCII('Q') FROM DUAL;<\/p>\n<p>ASCII('Q')<\/p>\n<hr \/>\n<p>        81<br \/>\n<\/code><\/p>\n<hr \/>\n<p>INSTR retourne la position de char2 dans char1 avec n caract\u00e8res et m occurrences.<br \/>\n<code><br \/>\nSELECT INSTR('CORPORATE FLOOR','OR', 3, 2) \"Instring\" FROM DUAL;<\/p>\n<p>  Instring<\/p>\n<hr \/>\n<p>        14<\/p>\n<p>SELECT INSTR('CORPORATE FLOOR','OR', -3, 2)<br \/>\n\"Reversed Instring\"<br \/>\n     FROM DUAL;<\/p>\n<p>Reversed Instring<\/p>\n<hr \/>\n<p>                2<br \/>\n<\/code><\/p>\n<hr \/>\n<p>INSTRB retourne la position de char2 dans char1 avec n octets et m occurrences.<\/p>\n<p><code><br \/>\nSELECT INSTRB('CORPORATE FLOOR','OR',5,2) \"Instring in bytes\" FROM DUAL;<\/p>\n<p>Instring in bytes<\/p>\n<hr \/>\n<p>               27<br \/>\n<\/code><\/p>\n<hr \/>\n<p>LENGTH Retourne lla longueur de la cha\u00eene char en caract\u00e8res.<\/p>\n<p>SELECT LENGTH(&lsquo;CANDIDE&rsquo;) \u00ab\u00a0Length in characters\u00a0\u00bb FROM DUAL;<br \/>\n<code><br \/>\nLength in characters<\/p>\n<hr \/>\n<p>                   7<br \/>\n<\/code><\/p>\n<hr \/>\n<p>LENGTHB Retourne lla longueur de la cha\u00eene char en octets.<br \/>\n<code><br \/>\nSELECT LENGTHB ('CANDIDE') \"Length in bytes\" FROM DUAL;<\/p>\n<p>Length in bytes<\/p>\n<hr \/>\n<p>             14<br \/>\n<\/code><\/p>\n<hr \/>\n<p>NLSSORT Retourne la valeur de char dans un autre s\u00e9quence de tri.<br \/>\n<code><br \/>\nSELECT ename FROM emp WHERE NLSSORT (ename, 'NLS_SORT = German')<br \/>\n> NLSSORT ('S', 'NLS_SORT = German') ORDER BY ename;<\/p>\n<p>ENAME<\/p>\n<hr \/>\n<p>SCOTT<br \/>\nSMITH<br \/>\nTURNER<br \/>\nWARD<br \/>\n<\/code><\/p>\n<p>IV.4.4 Les fonctions de date<\/p>\n<p>ADD_MONTHS Ajout n mois \u00e0 la date D. Le r\u00e9sultat est une date.<br \/>\n<code><br \/>\nSELECT TO_CHAR(ADD_MONTHS(hiredate,1),'DD-MON-YYYY') \"Next month\"<br \/>\nFROM emp WHERE ename = 'SMITH';<\/p>\n<p>Next Month<\/p>\n<hr \/>\n<p>17-JAN-1981<br \/>\n<\/code><\/p>\n<hr \/>\n<p>LAST_DAY Retourne la date du dernier jour du mois de la date d.<br \/>\n<code><br \/>\nSELECT SYSDATE, LAST_DAY(SYSDATE) \"Last\", LAST_DAY(SYSDATE) - SYSDATE \"Days Left\"<br \/>\nFROM DUAL;<\/p>\n<p>SYSDATE   Last       Days Left<\/p>\n<hr \/>\n<p> --------- ----------<br \/>\n23-OCT-97 31-OCT-97          8<\/p>\n<p>SELECT TO_CHAR(ADD_MONTHS(LAST_DAY(hiredate),5),'DD-MON-YYYY')\"Five months\"<br \/>\nFROM emp WHERE ename = 'MARTIN';<\/p>\n<p>Five months<\/p>\n<hr \/>\n<p>28-FEB-1982<br \/>\n<\/code><\/p>\n<hr \/>\n<p>MONTHS_BETWEEN Retourne le nombre de mois entre les dates d1 et d2.<br \/>\n<code><br \/>\nSELECT MONTHS_BETWEEN (TO_DATE('02-02-1995','MM-DD-YYYY'),<br \/>\nTO_DATE('01-01-1995','MM-DD-YYYY') ) \"Months\" FROM DUAL;<\/p>\n<p>    Months<\/p>\n<hr \/>\n<p>1.03225806<br \/>\n<\/code><\/p>\n<hr \/>\n<p>NEXT_DAY Retourne la date du premier jour de semaine nomm\u00e9 par char.<br \/>\n<code><br \/>\nSELECT NEXT_DAY('15-MAR-92','TUESDAY') \"NEXT DAY\" FROM DUAL;<\/p>\n<p>NEXT DAY<\/p>\n<hr \/>\n<p>17-MAR-92<br \/>\n<\/code><\/p>\n<hr \/>\n<p>ROUND Retourne une date arrondie selon le format sp\u00e9cifi\u00e9 (DD ;MM,YY).<br \/>\n<code><br \/>\nSELECT ROUND (TO_DATE ('27-OCT-92'),'YEAR') \"New Year\" FROM DUAL;<\/p>\n<p>New Year<\/p>\n<hr \/>\n<p>01-JAN-93<br \/>\n<\/code><\/p>\n<hr \/>\n<p>SYSDATE Retourne la date et l\u2019heure courante du syst\u00e8me.<br \/>\n<code><br \/>\nSELECT TO_CHAR(SYSDATE, 'MM-DD-YYYY HH24:MI:SS')\"NOW\" FROM DUAL;<\/p>\n<p>NOW<\/p>\n<hr \/>\n<p>10-29-1993 20:27:11<br \/>\n<\/code><\/p>\n<hr \/>\n<p>TRUNC Retourne la date d tronqu\u00e9e selon le format sp\u00e9cifi\u00e9.<br \/>\n<code><br \/>\nSELECT TRUNC(TO_DATE('27-OCT-92','DD-MON-YY'), 'YEAR') \"New Year\" FROM DUAL;<\/p>\n<p>New Year<\/p>\n<hr \/>\n<p>01-JAN-92<br \/>\n<\/code><\/p>\n<p>IV.4.5 Les fonctions de conversion<\/p>\n<p>CHARTOROWID Convertit une valeur de type CHAR or VARCHAR2  \u00e0 une valeur de type ROWID.<br \/>\n<code><br \/>\nSELECT ename FROM emp WHERE ROWID = CHARTOROWID('AAAAfZAABAAACp8AAO');<\/p>\n<p>ENAME<\/p>\n<hr \/>\n<p>LEWIS<br \/>\n<\/code><\/p>\n<hr \/>\n<p>CONVERT Convertit une cha\u00eene de caract\u00e8res d\u2019un ensemble de caract\u00e8res \u00e0 un autre<br \/>\n<code><br \/>\nSELECT CONVERT('Gro\u00df', 'US7ASCII', 'WE8HP') \"Conversion\" FROM DUAL;<\/p>\n<p>Conversion<\/p>\n<hr \/>\n<p>Gross<br \/>\n<\/code><\/p>\n<hr \/>\n<p>HEXTORAW Convertit une valeur h\u00e9xad\u00e9cimale en une valeur binaire.<br \/>\n<code><br \/>\nINSERT INTO graphics (raw_column) SELECT HEXTORAW('7D') FROM DUAL;<br \/>\n<\/code><\/p>\n<hr \/>\n<p>RAWTOHEX Convertit une valeur binaire en une valeur h\u00e9xad\u00e9cimale.<br \/>\n<code><br \/>\nSELECT RAWTOHEX(raw_column) \"Graphics\" FROM graphics;<\/p>\n<p>Graphics<\/p>\n<hr \/>\n<p>7D<br \/>\n<\/code><\/p>\n<hr \/>\n<p>ROWIDTOCHAR Convertit une valeur de type ROWID en une valeur de type CHAR.<br \/>\n<code><br \/>\nSELECT ROWID FROM offices WHERE ROWIDTOCHAR(ROWID) LIKE '%Br1AAB%';<\/p>\n<p>ROWID<\/p>\n<hr \/>\n<p>AAAAZ6AABAAABr1AAB<br \/>\n<\/code><\/p>\n<hr \/>\n<p>TO_CHAR Convertit une donn\u00e9e de type DATE \u00e0 une valeur de type VARCHAR2 selon le format sp\u00e9cifi\u00e9.<br \/>\n<code><br \/>\nSELECT TO_CHAR(HIREDATE, 'Month DD, YYYY') \"New date format\" FROM emp<br \/>\nWHERE ename = 'BLAKE';<\/p>\n<p>New date format<\/p>\n<hr \/>\n<p>May       01, 1981<br \/>\n<\/code><\/p>\n<hr \/>\n<p>TO_CHAR Convertit une donn\u00e9e de type NUMBER \u00e0 une valeur de type VARCHAR2 selon le format sp\u00e9cifi\u00e9.<br \/>\n<code><br \/>\nSELECT TO_CHAR(-10000,'L99G999D99MI') \"Amount\" FROM DUAL;<\/p>\n<p>Amount<\/p>\n<hr \/>\n<p>  $10,000.00-<\/p>\n<p>SELECT TO_CHAR(-10000,'L99G999D99MI','NLS_NUMERIC_CHARACTERS = '',.''<br \/>\nNLS_CURRENCY = ''AusDollars'' ') \"Amount\" FROM DUAL;<\/p>\n<p>Amount<\/p>\n<hr \/>\n<p>AusDollars10.000,00-<br \/>\n<\/code><\/p>\n<hr \/>\n<p>TO_DATE Convertit une cha\u00eene de caract\u00e8res \u00e0 une valeur de type DATE selon le format sp\u00e9cifi\u00e9.<br \/>\n<code><br \/>\nINSERT INTO bonus (bonus_date) SELECT TO_DATE('January 15, 1989, 11:00 A.M.','Month dd, YYYY, HH:MI A.M.', 'NLS_DATE_LANGUAGE = American')<br \/>\nFROM DUAL;<br \/>\n<\/code><\/p>\n<hr \/>\n<p>TO_NUMBER Convertit une valeur de type CHAR ou VARCHAR2 \u00e0 un nombre selon le format sp\u00e9cifi\u00e9.<br \/>\n<code><br \/>\nUPDATE emp SET sal = sal + TO_NUMBER('100.00', '9G999D99')<br \/>\nWHERE ename = 'BLAKE';<\/p>\n<p>SELECT TO_NUMBER('-AusDollars100','L9G999D99',<br \/>\n'NLS_NUMERIC_CHARACTERS = '',.''NLS_CURRENCY = ''AusDollars'' ') \"Amount\" FROM DUAL;<\/p>\n<p>    Amount<\/p>\n<hr \/>\n<p>      -100<br \/>\n<\/code><\/p>\n<p><strong>IV.4.6 Les autres fonctions<\/strong><\/p>\n<p>DUMP Retourne le code du type de donn\u00e9es, sa longueur et sa repr\u00e9sentation interne.<br \/>\n<code><br \/>\nSELECT DUMP('abc', 1016) FROM DUAL;<\/p>\n<p>DUMP('ABC',1016)                          <\/p>\n<hr \/>\n<p>Type=96 Len=3 CharacterSet=WE8DEC: 61,62,63 <\/p>\n<p>SELECT DUMP(ename, 8, 3, 2) \"OCTAL\" FROM emp WHERE ename = 'SCOTT';<\/p>\n<p>OCTAL<\/p>\n<hr \/>\n<p>Type=1 Len=5: 117,124 <\/p>\n<p>SELECT DUMP(ename, 10, 3, 2) \"ASCII\" FROM emp WHERE ename = 'SCOTT';<\/p>\n<p>ASCII<\/p>\n<hr \/>\n<p>Type=1 Len=5: 79,84<br \/>\n<\/code><\/p>\n<hr \/>\n<p>GREATEST Retourne la plus grande valeur dans la liste.<br \/>\n<code><br \/>\nSELECT GREATEST ('HARRY', 'HARRIOT', 'HAROLD') \"Great\" FROM DUAL;<\/p>\n<p>Great<\/p>\n<hr \/>\n<p>HARRY<br \/>\n<\/code><\/p>\n<hr \/>\n<p>LEAST Retourne la plus petite valeur de la liste.<br \/>\n<code><br \/>\nSELECT LEAST('HARRY','HARRIOT','HAROLD') \"LEAST\" FROM DUAL;<\/p>\n<p>LEAST<\/p>\n<hr \/>\n<p>HAROLD<br \/>\n<\/code><\/p>\n<hr \/>\n<p>NVL Retourne Exp2 si Exp1 est nulle. Si non retourne Exp1.<br \/>\n<code><br \/>\nSELECT ename, NVL(TO_CHAR(COMM), 'NOT APPLICABLE')<br \/>\n\"COMMISSION\" FROM emp WHERE deptno = 30;<\/p>\n<p>ENAME      COMMISSION<\/p>\n<hr \/>\n<p> -------------------------------------<br \/>\nALLEN      300<br \/>\nWARD       500<br \/>\nBLAKE      NOT APPLICABLE<br \/>\nTURNER     0<br \/>\nJAMES      NOT APPLICABLE<br \/>\n<\/code><\/p>\n<hr \/>\n<p>UID Retoure un entier qui identifie l\u2019utilisateur courant.<br \/>\nUSER Retourne le nom de l\u2019utilisateur courant.<br \/>\n<code><br \/>\nSELECT USER, UID FROM DUAL;<\/p>\n<p>USER                                  UID<\/p>\n<hr \/>\n<p> ----------<br \/>\nSCOTT                                  19<br \/>\n<\/code><\/p>\n<hr \/>\n<p>USERENV Retourne les informations sur la session courante.<br \/>\n&#8211; &lsquo;ISDBA&rsquo;<br \/>\n&#8211; &lsquo;LANGUAGE&rsquo;<br \/>\n&#8211; &lsquo;TERMINAL&rsquo;<br \/>\n&#8211; &lsquo;SESSIONID&rsquo;<br \/>\n&#8211; &lsquo;ENTRYID&rsquo;<br \/>\n&#8211; &lsquo;LANG&rsquo;<br \/>\n&#8211; &lsquo;INSTANCE&rsquo;<br \/>\n<code><br \/>\nSELECT USERENV('LANGUAGE') \"Language\" FROM DUAL;<\/p>\n<p>Language<\/p>\n<hr \/>\n<p>AMERICAN_AMERICA.WE8DEC<br \/>\n<code><\/p>\n<hr \/>\n<p>VSIZE Retourne le nombre d\u2019octets de la repr\u00e9sentation interne de exp.<br \/>\n<code><br \/>\nSELECT ename, VSIZE (ename) \"BYTES\" FROM emp WHERE deptno = 10;<\/p>\n<p>ENAME           BYTES<\/p>\n<hr \/>\n<p> ----------<br \/>\nCLARK               5<br \/>\nKING                4<br \/>\nMILLER              6<br \/>\n<\/code><\/p>\n<hr \/>\n<p>DECODE Permet de comparer une colonne ou une expression \u00e0 une condition de recherche explicit\u00e9e et de renvoyer un r\u00e9sultat qui d\u00e9pend de cette comparaison.<\/p>\n<p>Expression DECODE(expr,recherche,r\u00e9sultat[,recherche,r\u00e9sultat]\u2026[,d\u00e9faut])<br \/>\n<code><br \/>\nDECODE(QTE_STOCK,0,\u2019Stock \u00e9puis\u00e9\u2019,10,\u2019Stock limite\u2019,\u2019Stock OK\u2019)<br \/>\n<\/code><br \/>\nUne expression DECODE ne peut pas contenir plus de 255 composantes. <\/p>\n<hr \/>\n<p>ROWID Permet de retourner un type interne \u00e0 Oracle identifiant une ligne unique de donn\u00e9es (permettant un acc\u00e8s rapide aux donn\u00e9es).<\/p>\n<p>RONUM Permet de retourner un num\u00e9ro courant de l\u2019enregistrement par rapport \u00e0 la s\u00e9lection.<br \/>\n<code><br \/>\nSELECT ROWID, ROWNUM, NUM_CLIENT, SUBSTR(NOM_CLIENT,1,8) NOM FROM CLIENT;<\/p>\n<p>ROWID                  ROWNUM NUM_CLIENT NOM<\/p>\n<hr \/>\n<p> ---------- ---------- --------<br \/>\nAAABM8AABAAADnCAAA          1          1 DURANT<br \/>\nAAABM8AABAAADnCAAB          2          2 MIRZA<br \/>\nAAABM8AABAAADnCAAC          3          3 BARNABE<br \/>\n<\/code><\/p>\n<p><strong>IV.4.7 Les fonctions d\u2019agr\u00e9gat<\/strong><\/p>\n<p>Plusieurs fonctions d\u2019agr\u00e9gat accepte deux types d\u2019options :<\/p>\n<p>- DISTINCT \tCette option oblige la fonction d\u2019agr\u00e9gat \u00e0 ne consid\u00e9rer que les valeurs distinctes.<br \/>\n- ALL Cette option oblige \u00e0 la fonction \u00e0 consid\u00e9rer toutes les valeurs y compris celles qui sont dupliqu\u00e9es. <\/p>\n<p>AVG Retourne la moyenne des valeurs de n.<\/p>\n<p>AVG([DISTINCT|ALL] n)<br \/>\n<code><br \/>\nSELECT AVG(sal) \"Average\" FROM emp;<\/p>\n<p>   Average<\/p>\n<hr \/>\n<p>2077.21429<br \/>\n<\/code><\/p>\n<hr \/>\n<p>COUNT Retourne le nombre d\u2019enregistrements d\u2019une requ\u00eate.<br \/>\n<code><br \/>\nCOUNT(<em>* | [DISTINCT|ALL] expr<\/em>)<br \/>\n<\/code><br \/>\nSi vous sp\u00e9cifiez expr, la fonction retourne le nombre d\u2019enregistrements ou expr n\u2019est pas null. Si vous sp\u00e9cifiez l\u2019asterisque (*), cette fonction retourne l\u2019ensemble des enregistrements y compris dupliqu\u00e9s ou nulls.<br \/>\n<code><br \/>\nSELECT COUNT(*) \"Total\" FROM emp;<\/p>\n<p>   Total<\/p>\n<hr \/>\n<p>      18<\/p>\n<p>SELECT COUNT(job) \"Count\" FROM emp;<\/p>\n<p>   Count<\/p>\n<hr \/>\n<p>      14<\/p>\n<p>SELECT COUNT(DISTINCT job) \"Jobs\" FROM emp;<\/p>\n<p>     Jobs<\/p>\n<hr \/>\n<p>        5<br \/>\n<\/code><\/p>\n<hr \/>\n<p>MAX Retourne le maximum des valeurs de expr.<br \/>\n<code><br \/>\nMAX([DISTINCT|ALL] expr)<\/p>\n<p>SELECT MAX(sal) \"Maximum\" FROM emp;<\/p>\n<p>   Maximum<\/p>\n<hr \/>\n<p>      5000<br \/>\n<\/code><\/p>\n<hr \/>\n<p>MIN Retourne le minimum des valeurs de expr.<br \/>\n<code><br \/>\nMIN([DISTINCT|ALL] expr)<\/p>\n<p>SELECT MIN(hiredate) \"Earliest\" FROM emp;<\/p>\n<p>Earliest<\/p>\n<hr \/>\n<p>17-DEC-80<br \/>\n<\/code><\/p>\n<hr \/>\n<p>STDDEV Retourne l\u2019\u00e9cart type de la colonne.<br \/>\n<code><br \/>\nSTDDEV([DISTINCT|ALL] x)<\/p>\n<p>SELECT STDDEV(sal) \"Deviation\" FROM emp;<\/p>\n<p> Deviation<\/p>\n<hr \/>\n<p>1182.50322<br \/>\n<\/code><\/p>\n<hr \/>\n<p>SUM Retourne la somme des valeurs de la requ\u00eate.<br \/>\n<code><br \/>\nSUM([DISTINCT|ALL] n)<\/p>\n<p>SELECT SUM(sal) \"Total\" FROM emp;<\/p>\n<p>     Total<\/p>\n<hr \/>\n<p>     29081<br \/>\n<\/code><\/p>\n<hr \/>\n<p>VARIANCE Retourne la variance de la colonne.<br \/>\n<code><br \/>\nVARIANCE([DISTINCT|ALL]x)<\/p>\n<p>SELECT VARIANCE(sal) \"Variance\" FROM emp;<\/p>\n<p>Variance<\/p>\n<hr \/>\n<p>1389313.87<br \/>\n<\/code><\/p>\n<p><strong>IV.4.8 La requ\u00eate s\u00e9lection et les conditions de jointure<\/strong><\/p>\n<p><em>a)L\u2019\u00e9quijointure<\/em><\/p>\n<p>Une \u00e9quijointure est une jointure dont la condition est une comparaison d\u2019\u00e9galit\u00e9 de deux colonnes appartenant \u00e0 deux tables diff\u00e9rentes.<\/p>\n<p>Exemple : Lister les clients ayant effectu\u00e9s une commande entre le 01\/01\/1999 et aujourd\u2019hui.<br \/>\n<code><br \/>\nSELECT DISTINCT C.NUM_CLIENT, C.NOM_CLIENT, C.VILLE_CLIENT, E.DATE_COMMANDE<br \/>\nFROM CLIENT C, ENTETE_COMMANDE E<br \/>\nWHERE C.NUM_CLIENT=E.NUM_CLIENT<br \/>\nAND E.DATE_COMMANDE BETWEEN TO_DATE(\u201801\/01\/1999\u2019,\u2019DD\/MM\/YYYY\u2019) AND SYSDATE;<br \/>\n <\/code><\/p>\n<p><em>b)La th\u00e9tajointure<\/em><\/p>\n<p>Une th\u00e9tajointure est une jointure dont la condition est une comparaison de deux colonnes utilisant un op\u00e9rateur autre que l\u2019\u00e9galit\u00e9.<\/p>\n<p><em>c)La jointure multiple<\/em><\/p>\n<p>Une jointure multiple est une jointure qui met en relation plusieurs colonnes de plusieurs tables.<\/p>\n<p>Exemple : Lister les produits qui ont \u00e9t\u00e9 command\u00e9s entre le 01\/01\/1999 et aujourd\u2019hui.<br \/>\n<code><br \/>\nSELECT P.NUM_PRODUIT, P.LIBELLE_PRODUIT<br \/>\nFROM PRODUIT P, ENTETE_COMMANDE E, LIGNE_COMMANDE L<br \/>\nWHERE P.NUM_PRODUIT = L.NUM_PRODUIT<br \/>\nAND E.NUM_COMMANDE = L.NUM_COMMANDE<br \/>\nAND E.DATE_COMMANDE BETWEEN TO_DATE(\u201801\/01\/1999\u2019,\u2019DD\/MM\/YYYY\u2019) AND SYSDATE;<br \/>\n<\/code><\/p>\n<p><em>d)L\u2019autojointure<\/em><\/p>\n<p>Une autojointure est une jointure d\u2019une table avec elle-m\u00eame.<\/p>\n<p>Exemple : Lister tous les couples de produits dont la quantit\u00e9 en stock du premier est \u00e9gale \u00e0 deux fois celle du second.<br \/>\n<code><br \/>\nSELECT X.NUM_PRODUIT, X.QTE_STOCK, Y.NUM_PRODUIT, Y.QTE_STOCK<br \/>\nFROM PRODUIT X, PRODUIT Y<br \/>\nWHERE X.QTE_STOCK = 2 * Y.QTE_STOCK;<br \/>\n<\/code><\/p>\n<p><em>e)La jointure externe<\/em><\/p>\n<p>Une jointure externe est une jointure qui favorise une table par rapport \u00e0 une autre. Ainsi les lignes de la table dominante seront affich\u00e9es m\u00eame si la condition n\u2019est pas respect\u00e9e.<\/p>\n<p>Exemple : Lister les clients dont le code postal est \u00e9gal \u00e0 59000.<br \/>\n<code><br \/>\nSELECT C.NUM_CLIENT, C.NOM_CLIENT, C.CP_CLIENT, T.LIBELLE_TYPE_CLIENT<br \/>\nFROM TYPE_CLIENT T, CLIENT C<br \/>\nWHERE C.TYPE_CLIENT = T.TYPE_CLIENT<br \/>\nAND C.CP_CLIENT = '59000';<\/p>\n<p>NUM_CLIENT NOM_CLIENT                               CP_CL<\/p>\n<hr \/>\n<p> ---------------------------------------- -----<br \/>\nLIBELLE_TYPE_CLIENT<\/p>\n<hr \/>\n<p>         2 MIRZA                                    59000<\/p>\n<p>National<br \/>\n<\/code><br \/>\nLe client BARNABE ne poss\u00e8de pas de TYPE de CLIENT. Afin de pouvoir l\u2019obtenir dans une s\u00e9lection, il est important d\u2019externaliser la requ\u00eate par rapport \u00e0 la table TYPE_CLIENT.<br \/>\n<code><br \/>\nSELECT C.NUM_CLIENT, C.NOM_CLIENT, C.CP_CLIENT, T.LIBELLE_TYPE_CLIENT<br \/>\nFROM TYPE_CLIENT T, CLIENT C<br \/>\nWHERE C.TYPE_CLIENT = T.TYPE_CLIENT(+)<br \/>\nAND C.CP_CLIENT = '59000';<\/p>\n<p>NUM_CLIENT NOM_CLIENT                               CP_CL<\/p>\n<hr \/>\n<p> ---------------------------------------- -----<br \/>\nLIBELLE_TYPE_CLIENT<\/p>\n<hr \/>\n<p>         2 MIRZA                                    59000<br \/>\nNational<\/p>\n<p>         3 BARNABE                                  59000<br \/>\n<\/code><br \/>\nL\u2019exemple ci-dessus est une jointure externe droite.<\/p>\n<p><strong>IV.4.9 La requ\u00eate s\u00e9lection et les conditions de sous-requ\u00eates<\/strong><\/p>\n<p>SQL permet de comparer une expression ou une colonne au r\u00e9sultat d\u2019une autre requ\u00eate SELECT. Cette condition est dite condition de sous-requ\u00eate et les deux requ\u00eates sont dites requ\u00eates imbriqu\u00e9es. La sous-requ\u00eate peut faire appel dans sa condition \u00e0 une autre sous-requ\u00eate, etc<\/p>\n<p>Une condition de sous-requ\u00eate peut \u00eatre formul\u00e9e selon l'une des possibilit\u00e9s suivantes :<\/p>\n<p>WHEREexp op\u00e9rateur_de_comparaison (ALL | ANY | SOME)(requ\u00eate_SELECT)<br \/>\nWHERE exp [NOT] IN (requ\u00eate_SELECT)<br \/>\nWHERE [NOT] EXISTS (requ\u00eate_SELECT)<\/p>\n<p>Les sous-requ\u00eates situ\u00e9es apr\u00e8s les mots cl\u00e9s IN, ALL, ANY et SOME doivent avoir le m\u00eame nombre de colonnes que celui sp\u00e9cifi\u00e9 dans exp. L'\u00e9valuation de ces sous-requ\u00eates peut renvoyer plusieurs valeurs qui seront interpr\u00e9t\u00e9es comme suit :<\/p>\n<p>ALL : la condition est vraie si la comparaison est vraie pour chacune des valeurs retoum\u00e9es. Si l'expression de condition est de type num\u00e9rique et si l'op\u00e9rateur de comparaison est '>', la sous-requ\u00eate sera \u00e9quivalente \u00e0 l'extraction de la valeur maximale car, si la condition est vraie pour le maximum, elle l'est aussi pour toutes les autres valeurs. <\/p>\n<p>ANY : la condition est vraie si la comparaison est vraie pour au moins une des valeurs retourn\u00e9es. Si l'expression de condition est de type num\u00e9rique et si l'op\u00e9rateur de comparaison est '<', la sous-requ\u00eate sera \u00e9quivalente \u00e0 l'extraction de la valeur minimale car, si la condition est vraie pour le minimum, elle l'est aussi pour toutes les autres valeurs.\n\nSOME : repr\u00e9sente le synonyme de ANY.\n\nLes mots cl\u00e9s ALL, ANY et SOME sont inutiles si le r\u00e9sultat de la sous-requ\u00eate renvoie une seule valeur.\n\nIN : la condition est vraie si la comparaison est vraie pour une des valeurs retoum\u00e9es par la sous-requ\u00eate.\n\nEXISTS : il est diff\u00e9rent des autres op\u00e9rateurs. Il renvoie le bool\u00e9en vrai ou faux selon le r\u00e9sultat de la sous-requ\u00eate. Si l'\u00e9valuation de la sous-requ\u00eate donne lieu \u00e0 une ou plusieurs ligne(s), la valeur retoum\u00e9e est vraie. Cette valeur sera fausse dans le cas contraire.\n\n\nExemple : Lister les produits ayant une quantit\u00e9 en stock sup\u00e9rieure \u00e0 la moyenne des quantit\u00e9s en stock de l\u2019ensemble des produits.\n<code><br \/>\nSELECT P.NUM_PRODUIT, P.LIBELLE_PRODUIT, P.QTE_STOCK<br \/>\nFROM PRODUIT P<br \/>\nWHERE P.QTE_STOCK > (SELECT AVG(PM.QTE_STOCK) FROM PRODUIT PM);<\/p>\n<p>NUM_PRODUIT LIBELLE_PRODUIT                 QTE_STOCK<\/p>\n<hr \/>\n<p> ------------------------------ ----------<br \/>\n          1 Pantalon Levis 501 Taille S            25<br \/>\n          2 Pantalon Levis 501 Taille L            25<br \/>\n          3 Pantalon Levis 501 Taille XL           25<br \/>\n          4 Pantalon Levis 501 Taille XXL          25<br \/>\n          5 Veste Levis 501 Taille S               25<br \/>\n          6 Veste Levis 501 Taille L               25<br \/>\n          7 Veste Levis 501 Taille XL              25<br \/>\n          8 Veste Levis 501 Taille XXL             25<br \/>\n<\/code><br \/>\nUne sous-requ\u00eate est d\u00e9finie comme une instruction SELECT apparaissant dans d'autres instructions du LMD, \u00e0 savoir SELECT, UPDATE, DELETE, ou INSERT.<\/p>\n<p>Dans une instruction SELECT, une sous-requ\u00eate fait partie d'une condition dans la clause WHERE. Il existe certaines particularit\u00e9s importantes li\u00e9es \u00e0 l'utilisation d'une sous-requ\u00eate :<\/p>\n<p>La sous-requ\u00eate doit appara\u00eetre entre parenth\u00e8ses.<\/p>\n<p>Le nombre de lignes retourn\u00e9es par la sous-requ\u00eate doit correspondre au nombre de valeurs que la fonction ou l'op\u00e9rateur attend. Dans l'exemple pr\u00e9c\u00e9dent, l'op\u00e9rateur > attend une seule valeur pour sa comparaison, et la fonction AVG (qui est une fonction de type groupe) retoume une seule valeur.<\/p>\n<p>Le nombre de colonnes retourn\u00e9es par la sous-requ\u00eate doit correspondre au nombre de colonnes que la fonction ou l'op\u00e9rateur attend.<\/p>\n<p>La clause ORDER BY n'est pas utilis\u00e9e au sein d'une sous-requ\u00eate.<\/p>\n<p>La cr\u00e9ation d'une nouvelle table avec l'instruction SELECT<\/p>\n<p>Analysons une forme d'instruction CREATE TABLE qui utilise une requ\u00eate pour sp\u00e9cifier la structure<br \/>\nd'une table \u00e0 cr\u00e9er. Cette instruction peut se r\u00e9v\u00e9ler pratique lors du d\u00e9veloppement et des tests d'une application.<\/p>\n<p>Si vous souhaitez effectuer des tests sur le contenu d'une table, ajouter, supprimer, ou modifier des lignes, il serait judicieux de r\u00e9aliser une copie de la table en question. Imaginez la situation suivante : la table contient une liste de clients sur les dix demi\u00e8res ann\u00e9es, ce qui repr\u00e9sente un nombre important de lignes, environ 10 000. Vous souhaitez utiliser un sous-ensemble de ces lignes, en particulier, celles qui concernent les clients demeurant \u00e0 WASQUEHAL.<\/p>\n<p>Exemple : Cr\u00e9ation d'une table \u00e0 partir d'un sous-ensemble de lignes d'une autre table<br \/>\n<code><br \/>\nCREATE TABLE CLIENT_WASQUEHAL<br \/>\nAS<br \/>\nSELECT *<br \/>\nFROM CLIENT<br \/>\nWHERE CP_CLIENT = '59290';<br \/>\n<\/code><br \/>\nExaminons maintenant la syntaxe :<\/p>\n<p>CREATE TABLE nom_nouvelle_table<br \/>\n<br \/>AS<br \/>\n<br \/>instruction_select<\/p>\n<p>Les variables sont d\u00e9finies ainsi :<\/p>\n<p>nom_nouvelle_table est le nom de la table \u00e0 cr\u00e9er.<br \/>\n<br \/>instruction_select est une instruction SELECT valide.<\/p>\n<p>De plus, ces deux instructions peuvent servir un autre objectif. Si vous souhaitez cr\u00e9er une table poss\u00e9dant la m\u00eame structure qu'une table existante, avec les m\u00eames d\u00e9finitions de colonnes, mais vid\u00e9e de ses donn\u00e9es, vous pouvez recourir \u00e0 la requ\u00eate suivante :<\/p>\n<p><code><br \/>\nCREATE TABLE nom_nouvelle_table_vide<br \/>\nAS<br \/>\nSELECT *<br \/>\nFROM nom_table_existante<br \/>\nWHERE 1 = 2;<br \/>\n<\/code><\/p>\n<p>Vous avez probablement remarqu\u00e9 que 1 n'est jamais \u00e9gal \u00e0 2. C'est la raison pour laquelle aucune ligne de la table existante n'est copi\u00e9e dans la nouvelle table. Cette derni\u00e8re poss\u00e8de les m\u00eames d\u00e9finitions de colonnes, mais aucune donn\u00e9e. Vous pourriez recourir \u00e0 n'importe quelle expression fausse pour obtenir ce r\u00e9sultat.<\/p>\n<p>Une nouvelle fonctionnalit\u00e9 de l'instruction SELECT permet \u00e0 une sous-requ\u00eate d'\u00eatre utilis\u00e9e \u00e0 la place d'une table ou d\u2019une vue dans une clause FROM.<\/p>\n<p>Exemple : Lister les produits qui ont \u00e9t\u00e9 command\u00e9s entre le 01\/01\/1999 et aujourd\u2019hui.<br \/>\n<code><br \/>\nSELECT P.NUM_PRODUIT, P.LIBELLE_PRODUIT<br \/>\nFROM PRODUIT P, ENTETE_COMMANDE E, LIGNE_COMMANDE L<br \/>\nWHERE P.NUM_PRODUIT = L.NUM_PRODUIT<br \/>\nAND E.NUM_COMMANDE = L.NUM_COMMANDE<br \/>\nAND E.DATE_COMMANDE BETWEEN TO_DATE(\u201801\/01\/1999\u2019,\u2019DD\/MM\/YYYY\u2019) AND SYSDATE;<br \/>\n<\/code><br \/>\nOu<br \/>\n<code><br \/>\nSELECT P.NUM_PRODUIT, P.LIBELLE_PRODUIT<br \/>\nFROM<br \/>\nPRODUIT P,<br \/>\n(SELECT NUM_COMMANDE FROM ENTETE_COMMANDE WHERE DATE_COMMANDE BETWEEN TO_DATE(\u201801\/01\/1999\u2019,\u2019DD\/MM\/YYYY\u2019) AND SYSDATE) E,<br \/>\nLIGNE_COMMANDE L<br \/>\nWHERE P.NUM_PRODUIT = L.NUM_PRODUIT<br \/>\nAND E.NUM_COMMANDE = L.NUM_COMMANDE<br \/>\n<\/code><\/p>\n<p><strong>IV.4.10 La requ\u00eate s\u00e9lection et le groupement des donn\u00e9es<\/strong><\/p>\n<p>SQL permet de grouper des donn\u00e9es ayant des valeurs communes. Cette possibilit\u00e9 est explicit\u00e9e par la clause GROUP BY.<\/p>\n<p>Les expressions de la clause GROUP BY peuvent contenir n\u2019importe quelle colonne appartenant \u00e0 la liste de tables de la clause FROM.<\/p>\n<p>Exemple 1 : Lister le nombre de lignes par commande.<br \/>\n<code><br \/>\nSELECT L.NUM_COMMANDE, COUNT(*)<br \/>\nFROM LIGNE_COMMANDE L<br \/>\nGROUP BY L.NUM_COMMANDE;<br \/>\n<\/code><\/p>\n<p>Exemple 2 : Lister le montant total de chaque commande.<br \/>\n<code><br \/>\nSELECT L.NUM_COMMANDE, SUM(L.QTE*L.PU_HT)<br \/>\nFROM LIGNE_COMMANDE L<br \/>\nGROUP BY L.NUM_COMMANDE;<br \/>\n<\/code><\/p>\n<p>La condition de la clause WHERE ne pouvant en aucun cas inclure des fonctions d\u2019agr\u00e9gat, SQL offre la clause HAVING qui permet un restriction portant sur un groupe de lignes.<\/p>\n<p>Exemple 3 : Lister les num\u00e9ros de commande ayant un montant total sup\u00e9rieur \u00e0 1000 francs.<br \/>\n<code><br \/>\nSELECT L.NUM_COMMANDE, SUM(L.QTE*L.PU_HT) MONTANT_TOTAL<br \/>\nFROM LIGNE_COMMANDE L<br \/>\nGROUP BY L.NUM_COMMANDE<br \/>\nHAVING SUM(L.QTE*L.PU_HT) > 1000;<br \/>\n<\/code><\/p>\n<p><strong>IV.4.11 La requ\u00eate s\u00e9lection et le tri du r\u00e9sultat<\/strong><\/p>\n<p>SQL permet de r\u00e9aliser des op\u00e9rations de tri sur les donn\u00e9es extraites avec une requ\u00eate d\u2019interrogation. On peut ainsi trier jusqu\u2019\u00e0 huit colonnes dans une m\u00eame requ\u00eate. C\u2019est la clause ORDER BY qui r\u00e9alise le tri.<\/p>\n<p>SQL offre deux options de tri en ascendant avec l\u2019option ASC (ascending) prise par d\u00e9faut ou en descendant avec l\u2019option DESC (descending) sp\u00e9cifi\u00e9e explicitement.<\/p>\n<p>Exemple 1 : Lister tous les clients par ordre de CP et de nom.<br \/>\n <code><br \/>\nSELECT *<br \/>\nFROM CLIENT<br \/>\nORDER BY CP_CLIENT, NOM_CLIENT;<br \/>\n<\/code><br \/>\nExemple 2 : Lister toutes les commandes par ordre d\u00e9croisssant des num\u00e9ros de commandes et de lignes.<br \/>\n <code><br \/>\nSELECT NUM_COMMANDE, NUM_LIGNE_COMMANDE<br \/>\nFROM LIGNE_COMMANDE<br \/>\nORDER BY 1,2 DESC;<br \/>\n<\/code><\/p>\n<p><strong>IV.4.12 La requ\u00eate s\u00e9lection et les op\u00e9rateurs ensemblistes<\/strong><\/p>\n<p>SQL est b\u00e2ti sur les principes de l\u2019alg\u00e8bre relationnelle et la th\u00e9orie des ensembles. L\u2019union, l\u2019intersection et la diff\u00e9rence des ensembles sont incluses dans le langage de manipulation de donn\u00e9es par les verbes UNION, INTERSECT et MINUS.<\/p>\n<p><em>a)L\u2019union<\/em><\/p>\n<p>L\u2019union permet la fusion de donn\u00e9es provenant de plusieurs requ\u00eates.<br \/>\n<code><br \/>\nRequ\u00eate SELECT<br \/>\nUNION [ALL]<br \/>\nRequ\u00eate SELECT<br \/>\n<\/code><br \/>\nLa condition essentielle de formulation de requ\u00eates est la compatibilit\u00e9 des listes de s\u00e9lection dans les clauses SELECT du point de vue du type de donn\u00e9es et de l\u2019ordre des colonnes. L\u2019op\u00e9rateur UNION supprime toutes les donn\u00e9es redondantes par d\u00e9faut, sauf si l\u2019option ALL est explicit\u00e9e.<\/p>\n<p>Exemple : Lister l\u2019ensemble des clients et des fournisseurs dont le code postal est \u00e9gal \u00e0 59000.<br \/>\n<code><br \/>\nSELECT C.NUM_CLIENT NUMERO,<br \/>\n       C.NOM_CLIENT NOM,<br \/>\n       C.CP_CLIENT  CP<br \/>\nFROM CLIENT C<br \/>\nWHERE C.CP_CLIENT = '59000'<br \/>\nUNION ALL<br \/>\nSELECT F.NUM_FOURNISSEUR NUMERO,<br \/>\n       F.NOM_FOURNISSEUR NOM,<br \/>\n       F.CP_FOURNISSEUR  CP<br \/>\nFROM FOURNISSEUR F<br \/>\nWHERE F.CP_FOURNISSEUR = '59000'<\/p>\n<p>    NUMERO NOM                                      CP<\/p>\n<hr \/>\n<p> ---------------------------------------- -----<br \/>\n         2 MIRZA                                    59000<br \/>\n         3 BARNABE                                  59000<br \/>\n<\/code><br \/>\n<em>b)L\u2019intersection<\/em><\/p>\n<p>L\u2019intersection permet d\u2019obtenir comme r\u00e9sultat les lignes appartenant \u00e0 la fois \u00e0 deux requ\u00eates.<br \/>\n<code><br \/>\nRequ\u00eate SELECT<br \/>\nINTERSECT<br \/>\nRequ\u00eate SELECT<br \/>\n<\/code><\/p>\n<p><em>c)La diff\u00e9rence<\/em><\/p>\n<p>La diff\u00e9rence permet d\u2019obtenir comme r\u00e9sultat les lignes de la premi\u00e8re requ\u00eate qui ne sont pas comprises dans la seconde requ\u00eate.<br \/>\n<code><br \/>\nRequ\u00eate SELECT<br \/>\nMINUS<br \/>\nRequ\u00eate SELECT<br \/>\n<\/code><\/p>\n<p><strong>IV.4.13 L\u2019insertion des donn\u00e9es<\/strong><\/p>\n<p>L\u2019insertion de nouvelles donn\u00e9es dans la base de donn\u00e9es se fait selon deux types de requ\u00eate : La premi\u00e8re permet d\u2019ins\u00e9rer des donn\u00e9es en provenance du monde ext\u00e9rieur et la seconde permet une insertion insertables. L\u2019insertion des donn\u00e9es n\u00e9cessite un COMMIT ou un ROLLBACK en fin de transaction.<\/p>\n<p><em>a)Insertion de donn\u00e9es externes<\/em><br \/>\n<code><br \/>\nINSERT INTO [sch\u00e9ma.](table | vue)[@dblink]<br \/>\n[(liste_de_colonnes)]<br \/>\nVALUES (liste_de_valeur)<br \/>\n<\/code><br \/>\nExemple : Insertion d\u2019un nouveau client.<br \/>\n<code><br \/>\nINSERT INTO CLIENT VALUES (NUM_CLIENT.NEXTVAL,<br \/>\n   'BARNABE',<br \/>\n   null,<br \/>\n   'Rue du sac',<br \/>\n   null,<br \/>\n   '59000',<br \/>\n   'LILLE',<br \/>\n   sysdate);<br \/>\n<\/code><\/p>\n<p><em>b)Insertion de donn\u00e9es internes<\/em><br \/>\n<code><br \/>\nINSERT INTO nom_de_table [liste_de_s\u00e9lection)]<br \/>\nRequ\u00eate_SELECT<br \/>\n<\/code><br \/>\nExemple : Alimentation en donn\u00e9es d\u2019une table temporaire TMP_CLIENT par les clients ayant un code postal \u00e9gal \u00e0 59000.<br \/>\n<code><br \/>\nINSET INTO TMP_CLIENT<br \/>\nSELECT NUM_CLIENT,<br \/>\n       NOM_CLIENT,<br \/>\n       TYPE_CLIENT,<br \/>\n       ADRESSE_1_CLIENT,<br \/>\n       ADRESSE_2_CLIENT,<br \/>\n       CP_CLIENT,<br \/>\n       VILLE_CLIENT,<br \/>\n       DATE_CREATION<br \/>\nFROM CLIENT<br \/>\nWHERE CP_CLIENT=\u201959000\u2019;<br \/>\n<\/code><\/p>\n<p><strong>IV.4.14 La modification des donn\u00e9es<\/strong><\/p>\n<p>SQL permet de modifier les donn\u00e9es existantes par la commande UPDATE. La modification des donn\u00e9es n\u00e9cessite un COMMIT ou un ROLLBACK en fin de transaction. Il existe trois types de syntaxe :<\/p>\n<p><em>a)Premi\u00e8re syntaxe<\/em><br \/>\n<code><br \/>\nUPDATE [sch\u00e9ma.](table | vue)[@dblink] [alias]<br \/>\nSET nom_de_colonne = exp,\u2026<br \/>\n[WHERE condition]<br \/>\n<\/code><br \/>\nExemple 1 : Augmentation g\u00e9n\u00e9rale des prix unitaires des lignes de commande de 0,5%<br \/>\n<code><br \/>\nUPDATE LIGNE_COMMANDE SET PU_HT=PU_HT*1.005;<br \/>\n<\/code><br \/>\nExemple 2 : Ajout des mots \u2018Fin s\u00e9rie\u2019 au libell\u00e9 des produits et mise \u00e0 jour de la quantit\u00e9 limite \u00e0 0 pour tous les produits ayant une quantit\u00e9 en stock inf\u00e9rieure \u00e0 5<br \/>\n<code><br \/>\nUPDATE PRODUIT<br \/>\nSET LIBELLE_PRODUIT = LIBELLE_PRODUIT||\u2019 Fin s\u00e9rie\u2019,<br \/>\nQTE_LIMITE = 0<br \/>\nWHERE QTE_STOCK < 5;\n<\/code><\/p>\n<p><em>b)Seconde syntaxe<\/em><br \/>\n<code><br \/>\nUPDATE [sch\u00e9ma.](table | vue)[@dblink] [alias]<br \/>\nSET (liste_de_colonnes) = (requ\u00eate SELECT)<br \/>\n[WHERE condition]<br \/>\n<\/code><br \/>\nExemple : Modification de l\u2019adresse (1 et 2), de la ville et du code postal du client num\u00e9ro 3 par ceux du fournisseur num\u00e9ro 2<br \/>\n<code><br \/>\nUPDATE CLIENT<br \/>\nSET (ADRESSE_1_CLIENT, ADRESSE_2_CLIENT, VILLE_CLIENT, CP_CLIENT) =<br \/>\n      (SELECT ADRESSE_1_FOURNISSEUR,<br \/>\n              ADRESSE_2_FOURNISSEUR,<br \/>\n              VILLE_FOURNISSEUR,<br \/>\n              CP_FOURNISSEUR<br \/>\n       FROM FOURNISSEUR<br \/>\n       WHERE NUM_FOURNISSEUR=2)<br \/>\nWHERE NUM_CLIENT = 3;<br \/>\n<\/code><br \/>\n<em>c)Troisi\u00e8me syntaxe (Combinaison de la premi\u00e8re et de la seconde)<\/em><br \/>\n<code><br \/>\nUPDATE [sch\u00e9ma.](table | vue)[@dblink] [alias]<br \/>\nSET (liste_de_colonnes) = (requ\u00eate SELECT), nom_de_colonne = exp,\u2026<br \/>\n[WHERE condition]<br \/>\n<\/code><br \/>\n<strong>IV.4.15 La suppression des donn\u00e9es<\/strong><\/p>\n<p>SQL permet de supprimer des enregistrements par la commande DELETE. La suppression des donn\u00e9es n\u00e9cessite un COMMIT ou un ROLLBACK en fin de transaction.<\/p>\n<p><code><br \/>\nDELETE FROM [sch\u00e9ma.](table | vue)[@dblink] [alias]<br \/>\n[WHERE condition]<br \/>\n<\/code><\/p>\n<p>Exemple 1 : Suppression de l\u2019ensemble des lignes de commande de la base de donn\u00e9es.<br \/>\n <code><br \/>\nDELETE FROM LIGNE_COMMANDE;<br \/>\n<\/code><\/p>\n<p>Exemple 2 : Suppression de l\u2019ensemble des lignes de commande de la base de donn\u00e9es concernant le produit num\u00e9ro 4.<br \/>\n <code><br \/>\nDELETE FROM LIGNE_COMMANDE<br \/>\nWHERE NUM_PRODUIT = 4;<br \/>\n<\/code><\/p>\n<p><strong>IV.4.16 Le plan d\u2019\u00e9xecution d\u2019une requ\u00eate<\/strong><\/p>\n<p>Oracle permet d\u2019analyser le plan d\u2019\u00e9xecution d\u2019une requ\u00eate.<\/p>\n<p><em>a) La table Oracle utilis\u00e9e afin de stocker le plan d\u2019\u00e9xecution d\u2019une requ\u00eate<\/em><br \/>\n<code><br \/>\ncreate table PLAN_TABLE (statement_id \tvarchar2(30),<br \/>\n timestamp    \tdate,<br \/>\n\t remarks      \tvarchar2(80),<br \/>\n\t operation    \tvarchar2(30),<br \/>\n\t options       \tvarchar2(30),<br \/>\n\t object_node  \tvarchar2(128),<br \/>\n\t object_owner \tvarchar2(30),<br \/>\n\t object_name  \tvarchar2(30),<br \/>\n\t object_instance  numeric,<br \/>\n\t object_type      varchar2(30),<br \/>\n\t optimizer        varchar2(255),<br \/>\n\t search_columns   numeric,<br \/>\n\t id\t\t      numeric,<br \/>\n\t parent_id\t      numeric,<br \/>\n\t position\t      numeric,<br \/>\n\t cost\t\t      numeric,<br \/>\n\t cardinality\tnumeric,<br \/>\n\t bytes\t\tnumeric,<br \/>\n\t other_tag        varchar2(255),<br \/>\n\t other\t\tlong);<br \/>\n<\/code><\/p>\n<p><em>b) Le script SQL utilis\u00e9 afin d\u2019obtenir le plan d\u2019\u00e9xecution d\u2019une requ\u00eate<\/em><\/p>\n<p><code><br \/>\n<br \/>&mdash;&nbsp;RAZ de la table PLAN_TABLE<br \/>\nset verify off<br \/>\nDELETE FROM PLAN_TABLE WHERE STATEMENT_ID='P_EXEC1';<br \/>\nCOMMIT;<\/p>\n<p>&mdash;&nbsp;Analyse de la requ\u00eate<br \/>\nEXPLAIN PLAN<br \/>\n\tSET STATEMENT_ID = 'P_EXEC1' FOR<br \/>\n        SELECT NOM_CLIENT<br \/>\n          FROM CLIENT<br \/>\n         WHERE NOM_CLIENT LIKE &NOM||'%';<\/p>\n<p>&mdash;&nbsp;Lecture de la table PLAN_TABLE<br \/>\nCOL OPERATION FORMAT A30<br \/>\nCOL OPTIONS FORMAT A20<br \/>\nCOL OBJECT_NAME FORMAT A20<\/p>\n<p>SELECT LPAD(' ',2*LEVEL)||OPERATION OPERATION ,OPTIONS, OBJECT_NAME<br \/>\n\tFROM PLAN_TABLE WHERE STATEMENT_ID='P_EXEC1'<br \/>\n\tCONNECT BY PRIOR ID = PARENT_ID<br \/>\n           AND STATEMENT_ID = 'P_EXEC1'<br \/>\n \tSTART WITH ID = 1<br \/>\n           AND STATEMENT_ID = 'P_EXEC1'<br \/>\n\tORDER BY ID;<br \/>\n<\/code><\/p>\n<p><em>c) Quelques exemples d\u2019analyse du plan d\u2019ex\u00e9cution d\u2019une requ\u00eate<\/em><\/p>\n<p>Acc\u00e8s par rapport \u00e0 la cl\u00e9 primaire<br \/>\n<code><br \/>\nEXPLAIN PLAN<br \/>\n   SET STATEMENT_ID = 'P_EXEC1' FOR<br \/>\n          SELECT NOM_CLIENT<br \/>\n            FROM CLIENT<br \/>\n           WHERE NUM_CLIENT=1<\/p>\n<p>OPERATION                      OPTIONS              OBJECT_NAME<\/p>\n<hr \/>\n<p> -------------------- --------------------<br \/>\n  TABLE ACCESS                 BY INDEX ROWID       CLIENT<br \/>\n    INDEX                      UNIQUE SCAN          PK_CLIENT<br \/>\n<\/code><\/p>\n<p>Acc\u00e8s par rapport \u00e0 un champ non ind\u00e9x\u00e9<br \/>\n<code><br \/>\nEXPLAIN PLAN<br \/>\n   SET STATEMENT_ID = 'P_EXEC1' FOR<br \/>\n          SELECT NOM_CLIENT<br \/>\n            FROM CLIENT<br \/>\n           WHERE NOM_CLIENT LIKE 'BAR%'<\/p>\n<p>OPERATION                      OPTIONS              OBJECT_NAME<\/p>\n<hr \/>\n<p> -------------------- --------------------<br \/>\n  TABLE ACCESS                 FULL                 CLIENT<\/p>\n<p><\/code><\/p>\n<p>Acc\u00e8s par rapport au ROWID de l\u2019enregistrement<br \/>\n<code><br \/>\nEXPLAIN PLAN<br \/>\n   SET STATEMENT_ID = 'P_EXEC1' FOR<br \/>\n          SELECT NOM_CLIENT<br \/>\n            FROM CLIENT<br \/>\n           WHERE ROWID='AAABM8AABAAADnCAAA'<\/p>\n<p>OPERATION                      OPTIONS              OBJECT_NAME<\/p>\n<hr \/>\n<p> -------------------- --------------------<br \/>\n  TABLE ACCESS                 BY USER ROWID        CLIENT<\/p>\n<p><\/code><\/p>\n<p><em>d) La comparaison du plan d\u2019\u00e9xecution d\u2019une requ\u00eate \u00e9crite de deux mani\u00e8res diff\u00e9rentes (Requ\u00eate \/ Sous-Requ\u00eate)<\/em><\/p>\n<p><code><br \/>\nEXPLAIN PLAN<br \/>\nSET STATEMENT_ID = 'P_EXEC1' FOR<br \/>\n SELECT P.NUM_PRODUIT, P.LIBELLE_PRODUIT<br \/>\n FROM PRODUIT P, ENTETE_COMMANDE E, LIGNE_COMMANDE L<br \/>\n WHERE P.NUM_PRODUIT = L.NUM_PRODUIT<br \/>\n AND E.NUM_COMMANDE = L.NUM_COMMANDE<br \/>\n AND E.DATE_COMMANDE BETWEEN TO_DATE('01\/01\/1999','DD\/MM\/YYYY') AND SYSDATE<\/p>\n<p>OPERATION                      OPTIONS              OBJECT_NAME<\/p>\n<hr \/>\n<p> -------------------- --------------------<br \/>\n  NESTED LOOPS<br \/>\n    NESTED LOOPS<br \/>\n      TABLE ACCESS             FULL                 LIGNE_COMMANDE<br \/>\n      TABLE ACCESS             BY INDEX ROWID       ENTETE_COMMANDE<br \/>\n        INDEX                  UNIQUE SCAN          PK_ENTETE_COMMANDE<br \/>\n    TABLE ACCESS               BY INDEX ROWID       PRODUIT<br \/>\n      INDEX                    UNIQUE SCAN          PK_PRODUIT<\/p>\n<p>EXPLAIN PLAN<br \/>\n SET STATEMENT_ID = 'P_EXEC1' FOR<br \/>\n  SELECT P.NUM_PRODUIT, P.LIBELLE_PRODUIT<br \/>\n  FROM<br \/>\n  PRODUIT P,<br \/>\n  (SELECT NUM_COMMANDE FROM ENTETE_COMMANDE<br \/>\n   WHERE DATE_COMMANDE BETWEEN<br \/>\n   TO_DATE('01\/01\/1999','DD\/MM\/YYYY') AND SYSDATE<br \/>\n  ) E,<br \/>\n LIGNE_COMMANDE L<br \/>\n WHERE P.NUM_PRODUIT = L.NUM_PRODUIT<br \/>\n AND E.NUM_COMMANDE = L.NUM_COMMANDE<\/p>\n<p>OPERATION                      OPTIONS              OBJECT_NAME<\/p>\n<hr \/>\n<p> -------------------- --------------------<br \/>\n  NESTED LOOPS<br \/>\n    NESTED LOOPS<br \/>\n      TABLE ACCESS             FULL                 LIGNE_COMMANDE<br \/>\n      TABLE ACCESS             BY INDEX ROWID       ENTETE_COMMANDE<br \/>\n        INDEX                  UNIQUE SCAN          PK_ENTETE_COMMANDE<br \/>\n    TABLE ACCESS               BY INDEX ROWID       PRODUIT<br \/>\n      INDEX                    UNIQUE SCAN          PK_PRODUIT<\/p>\n<p><\/code><\/p>\n<p><em>e) La comparaison du plan d\u2019\u00e9xecution d\u2019une requ\u00eate \u00e9crite de deux mani\u00e8res diff\u00e9rentes (NOT IN \/ MINUS)<\/em><\/p>\n<p><code><br \/>\nEXPLAIN PLAN<br \/>\nSET STATEMENT_ID = 'P_EXEC1' FOR<br \/>\n SELECT P.NUM_PRODUIT, P.LIBELLE_PRODUIT<br \/>\n FROM PRODUIT P<br \/>\n WHERE P.NUM_PRODUIT not in<br \/>\n (SELECT DISTINCT L.NUM_PRODUIT<br \/>\n  FROM ENTETE_COMMANDE E, LIGNE_COMMANDE L<br \/>\n  WHERE E.NUM_COMMANDE = L.NUM_COMMANDE<br \/>\n  AND E.DATE_COMMANDE BETWEEN<br \/>\n  TO_DATE('01\/01\/1999','DD\/MM\/YYYY') AND SYSDATE<br \/>\n )<\/p>\n<p>OPERATION                      OPTIONS              OBJECT_NAME<\/p>\n<hr \/>\n<p> -------------------- --------------------<br \/>\n  FILTER<br \/>\n    TABLE ACCESS               FULL                 PRODUIT<br \/>\n    NESTED LOOPS<br \/>\n      TABLE ACCESS             FULL                 LIGNE_COMMANDE<br \/>\n      TABLE ACCESS             BY INDEX ROWID       ENTETE_COMMANDE<br \/>\n        INDEX                  UNIQUE SCAN          PK_ENTETE_COMMANDE<\/p>\n<p>EXPLAIN PLAN<br \/>\nSET STATEMENT_ID = 'P_EXEC1' FOR<br \/>\n SELECT P.NUM_PRODUIT, P.LIBELLE_PRODUIT<br \/>\n FROM PRODUIT P<br \/>\n MINUS<br \/>\n SELECT DISTINCT P.NUM_PRODUIT, P.LIBELLE_PRODUIT<br \/>\n FROM PRODUIT P,ENTETE_COMMANDE E, LIGNE_COMMANDE L<br \/>\n WHERE E.NUM_COMMANDE = L.NUM_COMMANDE<br \/>\n AND P.NUM_PRODUIT = L.NUM_PRODUIT<br \/>\n AND E.DATE_COMMANDE BETWEEN<br \/>\n TO_DATE('01\/01\/1999','DD\/MM\/YYYY') AND SYSDATE<\/p>\n<p>OPERATION                      OPTIONS              OBJECT_NAME<\/p>\n<hr \/>\n<p> -------------------- --------------------<br \/>\n  MINUS<br \/>\n    SORT                       UNIQUE<br \/>\n      TABLE ACCESS             FULL                 PRODUIT<br \/>\n    SORT                       UNIQUE<br \/>\n      NESTED LOOPS<br \/>\n        NESTED LOOPS<br \/>\n          TABLE ACCESS         FULL                 LIGNE_COMMANDE<br \/>\n          TABLE ACCESS         BY INDEX ROWID       ENTETE_COMMANDE<br \/>\n            INDEX              UNIQUE SCAN          PK_ENTETE_COMMANDE<br \/>\n        TABLE ACCESS           BY INDEX ROWID       PRODUIT<br \/>\n          INDEX                UNIQUE SCAN          PK_PRODUIT<\/p>\n<p><\/code><\/p>\n<p><em>f) Un exemple d\u2019optimisation du plan d\u2019\u00e9xecution d\u2019une requ\u00eate<\/em><\/p>\n<p><code><br \/>\nEXPLAIN PLAN<br \/>\nSET STATEMENT_ID = 'P_EXEC1' FOR<br \/>\n SELECT P.NUM_PRODUIT, P.LIBELLE_PRODUIT<br \/>\n FROM PRODUIT P, ENTETE_COMMANDE E, LIGNE_COMMANDE L<br \/>\n WHERE P.NUM_PRODUIT = L.NUM_PRODUIT<br \/>\n AND E.NUM_COMMANDE = L.NUM_COMMANDE<br \/>\n AND E.DATE_COMMANDE BETWEEN TO_DATE('01\/01\/1999','DD\/MM\/YYYY') AND SYSDATE<\/p>\n<p>OPERATION                      OPTIONS              OBJECT_NAME<\/p>\n<hr \/>\n<p> -------------------- --------------------<br \/>\nNESTED LOOPS<br \/>\nNESTED LOOPS<br \/>\nTABLE ACCESS             FULL                         LIGNE_COMMANDE<br \/>\nTABLE ACCESS             BY INDEX ROWID       ENTETE_COMMANDE<br \/>\nINDEX                          UNIQUE SCAN           PK_ENTETE_COMMANDE<br \/>\nTABLE ACCESS             BY INDEX ROWID       PRODUIT<br \/>\nINDEX                          UNIQUE SCAN           PK_PRODUIT<br \/>\n<\/code><\/p>\n<p>Cr\u00e9ation d\u2019un index sur la champ DATE_COMMANDE de la table ENTETE_COMMANDE<br \/>\n<code><br \/>\ncreate index ENTETE_COMMANDE_IDX1<br \/>\n ON ENTETE_COMMANDE (DATE_COMMANDE) TABLESPACE TP_IDX;<br \/>\n<\/code><\/p>\n<p>Cr\u00e9ation d\u2019un index sur le champ NUM_COMMANDE de la table LIGNE_COMMANDE (Champ de type cl\u00e9 \u00e9trang\u00e8re de la table ENTETE_COMMANDE)<br \/>\n<code><br \/>\ncreate index LIGNE_COMMANDE_IDX1<br \/>\n ON LIGNE_COMMANDE (NUM_COMMANDE) TABLESPACE TP_IDX;<\/p>\n<p>EXPLAIN PLAN<br \/>\nSET STATEMENT_ID = 'P_EXEC1' FOR<br \/>\n SELECT P.NUM_PRODUIT, P.LIBELLE_PRODUIT<br \/>\n FROM ENTETE_COMMANDE E, PRODUIT P, LIGNE_COMMANDE L<br \/>\n WHERE P.NUM_PRODUIT = L.NUM_PRODUIT<br \/>\n AND E.NUM_COMMANDE = L.NUM_COMMANDE<br \/>\n AND E.DATE_COMMANDE BETWEEN TO_DATE('01\/01\/1999','DD\/MM\/YYYY') AND SYSDATE<\/p>\n<p>OPERATION                      OPTIONS              OBJECT_NAME<\/p>\n<hr \/>\n<p> -------------------- --------------------<br \/>\nNESTED LOOPS<br \/>\nNESTED LOOPS<br \/>\nTABLE ACCESS               BY INDEX ROWID      ENTETE_COMMANDE<br \/>\nINDEX                            RANGE SCAN           ENTETE_COMMANDE_IDX1<br \/>\nTABLE ACCESS               BY INDEX ROWID      LIGNE_COMMANDE<br \/>\nINDEX                            RANGE SCAN           LIGNE_COMMANDE_IDX1<br \/>\nTABLE ACCESS               BY INDEX ROWID      PRODUIT<br \/>\nINDEX                            UNIQUE SCAN          PK_PRODUIT<br \/>\n<\/code><\/p>\n<p><strong>IV.4.17 Les nouvelles caract\u00e9ristiques d\u2019Oracle 8 Server<\/strong><\/p>\n<p>Le 24 juin 1997, Oracle Corporation a officiellement annonc\u00e9 la naissance de la derni\u00e8re version du SGBDR d'Oracle : Oracle8. Cette version est un des composants principaux de l'architecture NCA (Network Computing Architecture) d'Oracle. Oracle Corporation met l'accent sur plusieurs nouvelles caract\u00e9ristiques d'Oracle8 Server, telles que :<\/p>\n<p>Am\u00e9lioration de l'\u00e9volutivit\u00e9. La taille maximale d'une base de donn\u00e9es Oracle a \u00e9t\u00e9 augment\u00e9e pour prendre en charge des centaines de t\u00e9raoctets, en fonction du syst\u00e8me d'exploitation qui l'h\u00e9berge.<\/p>\n<p>Am\u00e9lioration de l'administration de la s\u00e9curit\u00e9. Par exemple, Oracle8 Server inclut \u00e0 pr\u00e9sent la gestion de mots de passe afin de limiter leur dur\u00e9e de vie, et appliquer certains crit\u00e8res plus complexes dans leur composition, comme une longueur minimale. Un compte peut par ailleurs \u00eatre verrouill\u00e9 apr\u00e8s un nombre donn\u00e9 de tentatives infructueuses.<\/p>\n<p>Am\u00e9lioration des performances au moyen du partitionnement. Une table ou un index peuvent \u00eatre divis\u00e9s en portions plus petites, appel\u00e9es partitions, d\u00e9finies selon les valeurs d'une ou plusieurs colonnes. Une partition de table peut \u00eatre g\u00e9r\u00e9e individuellement afin que les op\u00e9rations dans une partition n'affectent pas la disponibilit\u00e9 des donn\u00e9es dans d'autres partitions.<br \/>\nDe plus, les op\u00e9rations du langage LMD, INSERT, UPDATE ou DELETE sur des tables partitionn\u00e9es peuvent \u00eatre trait\u00e9es en parall\u00e8le. En d'autres termes, Oracle8 Server peut assigner une partie du traitement n\u00e9cessaire \u00e0 une instruction du LMD \u00e0 plusieurs processus qui peuvent, \u00e0 leur tour, \u00eatre allou\u00e9s \u00e0 plusieurs processeurs par le syst\u00e8me d'exploitation du serveur. On aboutit ainsi \u00e0 une ex\u00e9cution plus rapide des op\u00e9rations parall\u00e8les du LMD.<\/p>\n<p>Am\u00e9lioration des fonctionnalit\u00e9s de r\u00e9plication de base de donn\u00e9es. Les performances et la capacit\u00e9 de gestion de la r\u00e9plication ont \u00e9t\u00e9 am\u00e9lior\u00e9es de fa\u00e7on significative.<\/p>\n<p>Capacit\u00e9 \u00e0 g\u00e9rer un nombre plus important d'utilisateurs concurrents. En groupant les connexions, le serveur Oracle8 peut traiter un plus grand nombre d'utilisateurs concurrents,  jusqu'\u00e0 3000, selon le syst\u00e8me d'exploitation et les ressources mat\u00e9rielles dont dispose le serveur.<\/p>\n<p>Nouveaux types et am\u00e9lioration des types existants. Certains types d\u00e9j\u00e0 existants ont \u00e9t\u00e9 am\u00e9lior\u00e9s et de nouveaux types ont \u00e9t\u00e9 introduits.<\/p>\n<p>Am\u00e9lioration de l'instruction SELECT. Une nouvelle fonctionnalit\u00e9 de l'instruction SELECT permet \u00e0 une sous-requ\u00eate d'\u00eatre utilis\u00e9e \u00e0 la place d'une table ou d\u2019une vue dans une clause FROM.<\/p>\n<p>Fonctionnalites objet-relationnelles via l'option d'objets Oracle. Une nouvelle option du SGBDR int\u00e8gre la d\u00e9finition et l'utilisation de nouveaux types de donn\u00e9es.<\/p>\n<p>Oracle Corporation a d\u00e9clar\u00e9 que l'outil de migration d'Oracle8 peut migrer une base de donn\u00e9e Oracle7 (version 7.1, 7.2 ou 7.3) vers Oracle8. De plus, une application qui fonctionne actuellement avec une base de donn\u00e9es Oracle7 pourra op\u00e9rer correctement avec une base Oracle8.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction La puissance du mod\u00e8le relationnel offre aux utilisateurs la possibilit\u00e9 d&rsquo;analyser les donn\u00e9es par l&rsquo;interm\u00e9diaire de requ\u00eates interactives et d&rsquo;\u00e9tats sans recourir \u00e0 l&rsquo;assistance de programmeurs. A la fin des ann\u00e9es quatre-vingt, les avanc\u00e9es constantes, \u00e0 la fois dans le domaine des technologies mat\u00e9rielles et dans celui des syst\u00e8mes relationnels, ont renforc\u00e9 l&rsquo;int\u00e9gration de [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23],"tags":[],"class_list":["post-63","post","type-post","status-publish","format-standard","hentry","category-base-de-donnees"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=\/wp\/v2\/posts\/63","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=63"}],"version-history":[{"count":0,"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=\/wp\/v2\/posts\/63\/revisions"}],"wp:attachment":[{"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=63"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=63"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fredptitgars.ovh\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=63"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}