Chapitre 6: Langage SQL
1
LANGAGE SQL
Le SQL est langage de communication standard avec le
SGBDR.
Les commandes du langage SQL(Structured Query
Langage) peuvent être tapées directement au clavier par
l'utilisateur ou peuvent être incluses dans un programme
écrit dans un langage de troisième génération (Java,
Langage C, Fortran, Cobol, Ada,...) grâce à un pré-
compilateur ou une librairie d'accès au SGBD.
2
LANGAGE SQL
Les types numériques:
• Nombres entiers :
• SMALLINT (sur 2 octets, de -32.768 à 32.767).
• INTEGER (sur 4 octets, de -[Link] à [Link]).
• Nombres décimaux:
• DECIMAL(p, d ) correspond à des nombres décimaux qui ont p
chiffres significatifs et d chiffres après la virgule.
• NUMERIC a la même syntaxe.
• Numériques à virgule flottante:
• REAL (au moins 7 chiffres significatifs).
• DOUBLE PRECISION ou FLOAT (au moins 15 chiffres 3
significatifs).
LANGAGE SQL
Les types numériques d’oracle:
Oracle n'a qu'un seul type numérique NUMBER. Lors de la définition d'une colonne
de type numérique, on peut préciser le nombre maximum de chiffres et de décimales
qu'une valeur de cette colonne pourra contenir :
NUMBER
NUMBER(taille_maxi )
NUMBER(taille_maxi, décimales)
4
LANGAGE SQL
Types chaîne de caractères
Il existe deux types pour les colonnes qui contiennent des chaînes de
caractères :
CHAR(longueur ) : avec longueur < 256
VARCHAR(longueur ) : avec 0< longueur < 2001
Types chaîne de caractères d’Oracle
Le type VARCHAR s'appelle VARCHAR2 dans Oracle (la taille maximum est de
2000 caractères). 5
LANGAGE SQL
Types temporels
Les types temporels de SQL sont :
•DATE réserve 2 chiffres pour le mois et le jour et 4 pour l'année ;
•TIME pour les heures, minutes et secondes (les secondes peuvent comporter un
certain nombre de décimales) ;
•TIMESTAMP permet d'indiquer un moment précis par une date avec heures,
minutes et secondes (6 chiffres après la virgule ; c'est-à-dire en microsecondes) ;
•INTERVAL permet d'indiquer un intervalle de temps.
Types temporels d’Oracle
Oracle offre le type DATE comme en SQL-2 mais pour Oracle une donnée de type
DATE inclut un temps en heures, minutes et secondes.
6
Une constante de type « date » est une chaîne de caractères entre apostrophes.
LANGAGE SQL
7
LANGAGE SQL
Création de tables:
Une partie du langage SQL est dédiée à la mise en place et à
la maintenance du schéma relationnel des bases de données.
Syntaxe:
La commande CREATE TABLE dans laquelle sont précisés
pour chaque colonne de la table: son intitulé, son type de
donnée et une ou plusieurs contraints.
8
LANGAGE SQL
Création d’une table
Syntaxe:
CREATE TABLE nom_table(
colonne1 type1,
colonne2 type2 NOT NULL,
Colonne2 type3 DEFAULT [valeur par défaut],
.........)
9
LANGAGE SQL
• On peut ajouter après la description d'une colonne l'option NOT
NULL qui interdira que cette colonne contienne la valeur NULL.
• On peut aussi ajouter des contraintes d'intégrité portant sur une ou
plusieurs colonnes de la table.
• On peut donner une valeur par défaut par l’option DEFAULT pour
une colonne si la colonne n'est pas renseignée.
10
LANGAGE SQL
Création d’une table
Soit le schéma relationnel suivant:
Client(CodeCl, NomCl, AdrCl, Tel, Ville)
Création :
create table Client(
CodeCl varchar(12),
NomCl varchar(12),
AdrCl varchar(20),
Tel varchar(16), 11
Ville varchar(12));
LANGAGE SQL
Remarques:
Le type de donnée d’une clé étrangère doit être identique
à celui de la clé primaire référencée.
Une clé étrangère doit être créée après la table qu’elle
référence.
Pour les colonnes qui participent à une clé primaire, il
est inutile de préciser NOT NULL.
La fonction SYSDATE retourne la date et l’heure 12
courante du serveur oracle.
LANGAGE SQL
Une table qui existe déjà peut être modifiée par l’instruction
ALTER TABLE accompagnée d’une clause ADD ou MODIFY.
Une table qui n’est référencée par aucune clé étrangère peut être
supprimer a l’aide de l’instruction DROP TABLE.
L’instruction suivante permet a un utilisateur d’oracle de
retrouver toutes ses tables:
SELECT * FROM user_tables;
Pour connaitre la liste des colonnes d’une table, l’utilisateur
dispose de l’instruction: 13
DESCRIBE nom_table;
LANGAGE SQL
Contraintes d'intégrité:
Dans la définition d'une table, on peut indiquer des contraintes d'intégrité
portant sur une ou plusieurs colonnes. Les contraintes possibles sont : PRIMARY
KEY, UNIQUE, FOREIGN KEY...REFERENCES, CHECK
Toute définition de table doit comporter au moins une contrainte de
type PRIMARY KEY.
Syntaxe:
CONSTRAINT nom-contrainte définition-contrainte.
14
LANGAGE SQL
Contraintes d'intégrité:
Soit le schéma relationnel suivant:
Commande(NBC, DateC, CodeCl)
Création:
create table Commande(
NBC varchar(12) primary key, --contrainte Clé primaire de la table
DateC date,
CodeCl varchar(12) constraint cstfkClient references Client(CodeCl));
15
LANGAGE SQL
Contraintes d'intégrité:
FOREIGN KEY (colonne1, colonne2,...)
REFERENCES table-ref [(col1, col2,...)]
[ON DELETE CASCADE]
Cette contrainte indique que la concaténation de
colonne1, colonne2,... est une clé étrangère qui fait
référence à la concaténation des colonnes col1, col2,... de
la table table-ref.
16
LANGAGE SQL
Contrainte ‘’CHECK’’
CHECK(condition)
La contrainte «check» donne une condition que les
colonnes de chaque ligne devront vérifier.
create table Client(
CodeCl varchar(12) primary key,
NomCl varchar(12),
AdrCl varchar(20),
Tel varchar(16),
Ville varchar(12)
CONSTRAINT CSTVILLE CHECK (Ville IN
17
(‘Marrakech’,’Casablanca’)));
LANGAGE SQL
Ajouter, supprimer ou renommer une contrainte
Des contraintes d'intégrité peuvent être ajoutées ou
supprimées par la commande ALTER TABLE. On peut aussi
modifier l'état de contraintes par MODIFY CONSTRAINT.
Syntaxe:
ALTER TABLE Client
DROP CONSTRAINT CSTVILLE
ADD CONSTRAINT ……………………..
RENAME CONSTRAINT CSTVILLE TO CSTVILLECL
MODIFY CONSTRAINT CSTVILLE
18
LANGAGE SQL
Insertion des données:
Pour créer une ou plusieurs ligne(s) dans une seule table, SQL offre
l’instruction INSERT INTO … VALUES:
Plusieurs précautions doivent être prises lors d’une instruction
INSERT INTO:
Les valeurs qui sont données via VALUES doivent être dans le
même ordre que les colonnes qui sont précisées dans le INTO.
Et avec un type de données compatible a celui qui a été déclaré
dans la table.
Toutes les colonnes qui ne sont pas précisées, reçoivent la valeur par 19
défaut ou NULL
LANGAGE SQL
Insertion des données:
Pour que la colonne reçoit un entier incrémenté
automatiquement, il suffit de créer, avant le première
insertion, une séquence pour cette table et utiliser cette
séquence (avec NEXTVAL)dans l’instruction INSERT INTO:
20
LANGAGE DE
MANIPULATION DES
DONNEES.
21
LMD
Le langage de manipulation de données (LMD) est le langage permettant de
modifier les informations contenues dans la base.
Il existe trois commandes SQL permettant d'effectuer les trois types de
modification des données :
• INSERT ajout de lignes.
• UPDATE mise à jour de lignes.
• DELETE suppression de lignes
22
LMD
Insertion
• INSERT INTO table (col1,..., coln ) VALUES (val1,...,valn ); (1)
• INSERT INTO table VALUES (val1,...,valn ); (2)
• table est le nom de la table sur laquelle porte l'insertion.
• col1,..., coln est la liste des noms des colonnes pour lesquelles on
donne une valeur.
•Si la liste des colonnes (col1,..., coln ) est omise comme pour (2),
ORACLE prendra par défaut l'ensemble des colonnes de la table dans
l'ordre de création.
insert into client values ('CCL004','Hicham','n°12 Ain Dyab','026 54 69 23
87','Casablanca');
LMD
Modification
La commande UPDATE permet de modifier les valeurs d'un ou
plusieurs champs, dans une ou plusieurs lignes existantes d'une table.
Syntaxe:
UPDATE table
SET col1 = exp1, col2 = exp2, ...
WHERE prédicat
Exemple
UPDATE Client
SET NomCl = ‘KAMAL’
WHERE codecl = ‘CCL002‘;
24
LMD
Suppression
L'ordre DELETE permet de supprimer des lignes d'une table. La
clause WHERE indique quelles lignes doivent être supprimées.
• Syntaxe: • Exemple:
DELETE FROM table DELETE FROM Client
WHERE prédicat WHERE CodeCl =‘CCL005’;
Remarque : La clause WHERE est facultative ; si elle n'est pas précisée,
TOUTES LES LIGNES DE LA TABLE SONT SUPPRIMEES.
25
LMD
Les interrogations
L'ordre SELECT possède six clauses différentes, dont seules
les deux premières sont obligatoires. Elles sont données ci-dessous,
dans l'ordre dans lequel elles doivent apparaître, quand elles sont
utilisées :
• SELECT …
• FROM …
• WHERE …
• GROUP BY …
• HAVING …
• ORDER BY ...
26
LMD
Clause SELECT
Cette clause permet d'indiquer quelles colonnes, ou quelles expressions
doivent être retournées par l'interrogation.
• Syntaxe :
SELECT [DISTINCT] *
• Ou
SELECT exp1, exp2,.....
• ‘’ * ’’ signifie que toutes les colonnes de la table sont sélectionnées.
• Le mot clé facultatif ‘’DISTINCT‘’ ajouté derrière l'ordre SELECT permet
d'éliminer les duplications.
27
LMD
Clause FROM
La clause FROM donne la liste des tables participant à
l'interrogation.
• Syntaxe:
FROM table1 [synonyme1 ] , table2 [synonyme2 ] , ...
• Exemple: liste des noms des départements de la table dept.
SELECT Nom_dep
FROM Departement;
Il est possible de lancer des interrogations utilisant plusieurs tables à la fois.
28
LMD
Clause WHERE
La clause WHERE permet de spécifier quelles sont les lignes à
sélectionner dans une table ou dans le produit cartésien de plusieurs tables.
• Syntaxe:
WHERE prédicat
Un prédicat simple est la comparaison de deux expressions ou plus
au moyen d'un opérateur logique :
WHERE exp1 = exp2
WHERE exp1 != exp2
WHERE exp1 < exp2
WHERE exp1 > exp2
29
WHERE exp1 <= exp2
WHERE exp1 >= exp2
LMD
Clause WHERE
Il faut ajouter à ces opérateurs classiques les opérateurs suivants
BETWEEN, IN, LIKE, IS NULL
• WHERE exp1 BETWEEN exp2 AND exp3 : vrai si exp1 est compris
entre exp2 et exp3, bornes incluses.
• WHERE exp1 IN (exp2, exp3,...) : vrai si exp1 est égale à l'une des
expressions de la liste entre parenthèses.
• WHERE exp IS NULL : vrai si l'expression a la valeur NULL.
30
LMD
Clause WHERE
• WHERE exp1 LIKE exp2 : teste l'égalité de deux chaînes en tenant
compte des caractères jokers dans la 2ème chaîne.
• ‘’_’’ remplace 1 caractère exactement.
• ‘’ % ’’ remplace une chaîne de caractères de longueur quelconque, y
compris de longueur nulle.
31
LMD
Exemple:
32
LMD
Exemples:
33
LMD
Exemples:
34
LMD
Exemples:
35
LMD
Clause WHERE : Jointure
La clause WHERE peut aussi être utilisée pour faire des jointures
et des sous-interrogations (une des valeurs utilisées dans un WHERE
provient d'une requête SELECT emboîtée).
Quand on précise plusieurs tables dans la clause FROM, on obtient
le produit cartésien des tables.
36
LMD
Clause WHERE : équi-jointure « interne »
Elle permet de rassembler des informations provenant de plusieurs
tables. Chaque ligne d’une table figurant dans cette jointure doit avoir un
correspondant dans les autres tables.
La liste des clients ayant effectué une commande le mois de
Janvier 2006.
SELECT CodeCL, NomCL, AdrCl
FROM Client, Commande
WHERE ([Link] = [Link]) And
37
([Link] between ’01/01/2006’ and ’31/01/2006’);
LMD
Clause WHERE : Auto-jointure
Ce type de jointure peut être utile pour rassembler des informations
provenant d’une même table.
La liste des clients habitant la même ville que la ville de
Mohammed.
SELECT CodeCL, NomCL, AdrCl
FROM Client c, client
WHERE (([Link] = [Link]) And ([Link] = ‘Mohammed’)
and ([Link] <> [Link])); 38
LMD
Clause WHERE : Opérateurs logiques
Les opérateurs logiques AND et OR peuvent être utilisés pour
combiner plusieurs prédicats (l'opérateur AND est prioritaire par rapport à
l'opérateur OR).
Des parenthèses peuvent être utilisées pour imposer une priorité ou
simplement pour rendre plus claire l'expression logique.
• Exemple :
SELECT * FROM Client
WHERE NomCL =‘KAMAL’ OR NomCL= ‘ADIL’;
39
LMD
Clause WHERE : Requêtes imbriquées
Une caractéristique puissante de SQL est la possibilité qu'un
prédicat employé dans une clause WHERE comporte un SELECT emboîté.
Par exemple, la sélection des clients ayant même ville que KAMAL
peut s'écrire en joignant la table Client avec elle-même :
• Requête :
SELECT * FROM Client
WHERE Ville = (SELECT Ville
FROM Client
WHERE NomCL = ‘KAMAL'); 40
LMD
Clause WHERE : Exists
La clause EXISTS est suivie d'une sous-interrogation entre
parenthèses, et prend la valeur vrai s'il existe au moins une ligne satisfaisant
les conditions de la sous-interrogation.
Souvent on peut utiliser IN à la place de la clause EXISTS.
• Syntaxe :
SELECT exp1 FROM Table
WHERE EXISTS (SELECT exp2 FROM Table
WHERE prédicat);
41
LMD
Fonctions de groupes
Les fonctions de groupes peuvent apparaître dans le Select ou le
Having; les plus utilisées sont :
•AVG moyenne
•SUM somme
•MIN plus petite des valeurs
•MAX plus grande des valeurs
•COUNT(*) nombre de lignes
•COUNT(col ) nombre de valeurs non nulles de la colonne
•COUNT(DISTINCT col ) nombre de valeurs non nulles différentes
42
LMD
Exemple:
43
LMD
Clause GROUP BY
Une expression d'un SELECT avec clause GROUP BY ne peut
évidemment que correspondre à une caractéristique de groupe.
• Syntaxe :
SELECT exp1, exp2
FROM Table
GROUP BY exp3 ;
44
LMD
Exemple:
Pour afficher le montant total de chaque commande, il est
nécessaire de regrouper les lignes de commandes qui portent le même
numéro de commande, puis de faire la somme des quantités* prix unitaire.
45
LMD
Exemple:
Attention, il existe deux contraintes impératives sur les colonnes de la
clause SELECT:
• toutes les colonnes de la clause GROUP BY doivent figurer dans la
clause SELECT.???
• Toutes les colonnes de la clause SELECT sans fonction d’agrégation,
46
doivent figurer dans la clause GROUP BY
LMD
Clause HAVING
La clause HAVING sert à préciser quels groupes doivent être
sélectionnés. Elle se place après la clause GROUP BY.
• Syntaxe :
SELECT exp1, exp2
FROM Table
GROUP BY exp3
Having prédicat ;
Le prédicat suit la même syntaxe que celui de la clause WHERE.
Cependant, il ne peut porter que sur des caractéristiques de groupe : fonction de
groupe ou expression figurant dans la clause GROUP BY. 47
LMD
Exemple:
48
LMD
Clause ORDER BY
Les lignes constituant le résultat d'un SELECT sont obtenues dans
un ordre indéterminé. La clause ORDER BY précise l'ordre dans lequel la
liste des lignes sélectionnées sera donnée.
• Syntaxe :
SELECT *
FROM Client
ORDER BY NomCL DESC;
Le tri par défaut est croissant. L'option facultative DESC donne un tri
par ordre décroissant.
49
LMD
Exemple:
Pour ne garder que les 100 premières lignes du résultat, oracle a
prévu de numéroter les lignes du résultat dans une colonne cachée
nommée.
50
LMD
Colonnes calculées:
Dans la clause SELECT, on peut utiliser les opérateurs arithmétiques(+ -
* /), l’opérateur de concaténation des chaines de caractères (||) ou des
fonctions SQL(comme MOD pour le modulo, FLOOR pour la troncature
entière ou SUBSTR pour l’extraction de sous-chaines de caractères):
51
TP
Créer les tables correspondantes aux tables suivantes :
• Table Service
N_service Nom Lieu
10 développement Daoudiate
20 commercial Gueliz
30 direction Medina
40 production Quartier industriel
52
TP
Créer les tables correspondantes aux tables suivantes :
• Table Employe
Nom Matricule Fonction Matr_sup Date_embauche Salaire Commission N_service
mohamed 16712 directeur 25717 23/05/90 40000 30
Driss 17574 administratif 16712 03/05/95 9000 30
Dalila 26691 commercial 27047 04/04/88 25000 25000 20
Leila 25012 administratif 27047 14/04/91 12000 20
Jamal 25717 president 10/10/82 50000 30
Abdellah 16034 commercial 27047 01/06/91 15000 20
Mohamed 17147 commercial 27047 10/12/93 20000 500 20
Anas 27546 commercial 27047 03/09/83 22000 2000 20
Abdelwahed 25935 commercial 27047 11/01/84 23500 1500 20
Younes 15155 ingenieur 24533 22/03/85 24000 10
Sanae 26834 ingenieur 24533 04/10/88 20000 10
Mehdi 16278 ingenieur 24533 16/11/94 21000 10
Adiba 25067 ingenieur 24533 05/10/87 30000 10
Takoua 24533 directeur 25717 12/09/75 55000 10
Mourad 27047 directeur 25717 07/09/89 45000 20
Bachir 17232 administratif 24533 03/10/87 13500 10 53
Bouchaib 24831 administratif 16712 10/09/88 15000 30