Introduction au langage SQL et ses normes
Introduction au langage SQL et ses normes
Le langage SQL
Structured Query Language
Semestre 2 – 2017/2018
B. EL HATIMI
Deux langages en un
SQL est :
Un langage de description de
données LDD (Data Definition
Language)
Un langage de manipulation de
Un peu d’histoire …
1974 : IBM lance une réflexion autour
d’un langage de données relationnel
1982 : IBM82 Première version SQL
commercialisée
1989 : SQL1 ou SQL-89 (norme ISO89)
1992 : SQL2 ou SQL-92 (norme ISO92)
SQL3 (évolution vers l’objet)
Pourquoi SQL ?
SQL est la seule norme (norme ANSI et
ISO) existante pour les LDD/LMD
relationnels.
Tous les SGBDR (soit > 90% du marché
des bases de données) utilisent une version
de SQL comme LMD/LDD.
Langage SQL
Cahier
Schéma
Réalité Analyse de Conception conceptuel
charges
Modèle
relationnel
SQL LMD Choix du SGDBR
: Oracle, MySQL
SQL LDD
Schéma
Schéma
BD SGBD relationnel
physique
De la BD
[Link] HATIMI - SQL
SQL - LDD
Définition : « Un langage de description
de données est un langage supportant
un modèle et permettant de décrire les
données d’une base d’une manière
assimilable par une machine »
But : Définir le schéma de la base de
données.
Création du schéma
SQL permet de créer une base de données
composées de plusieurs schémas.
Mot clé : CREATE
Création de la base de données
create database BD1
Création du schéma de la base de données
create schema GESTION_SCOL
[Link] HATIMI - SQL
Remarque
La syntaxe SQL n’est pas sensible à la
casse (nom des tables, des attributs …).
Les valeurs des attributs par contre le
sont.
Types de données
Chaque SGBDR fournit un ensemble de
types de données plus ou moins riche.
Les types de données ne sont pas
normalisées Risque d’incompatibilités
entre SGBDR.
Il faut vérifier le type de données par
rapport au SGBDR utilisé.
Types de données
SMALLINT
INTEGER (ou INT)
DECIMAL(p,q)
FLOAT(p) (ou REAL)
CHAR(p)
VARCHAR(p)
DATE
BLOB (Binary large Object) : contenant générique
pouvant accueillir des chaînes de bits de grande
taille (images, séquences vidéo…) …
[Link] HATIMI - SQL
Domaine de données
Le langage SQL offre la possibilité de définir de
nouveaux types de données.
Mot clé domain
Exemple :
create domain MONTANT as decimal (9,2)
Le domaine est alors utilisé comme un type de
données standard :
create table ACHAT (Code char(5),
Valeur MONTANT)
[Link] HATIMI - SQL
Domaine - Exemple
CREATE DOMAIN couleur AS text
CHECK (VALUE IN (‘Blanc’, ‘Rouge’,
‘Noir’));
Exemple (Documentation
PostgreSQL)
CREATE DOMAIN us_postal_code AS TEXT
CHECK ( VALUE ~ '^\d{5}$‘
OR VALUE ~ '^\d{5}-\d{4}$' );
Create domain code as text check (VALUE ~
‘char(1)\\int\\int\\int’)
CREATE TABLE us_snail_addy ( address_id
SERIAL PRIMARY KEY, street1 TEXT NOT NULL,
street2 TEXT, street3 TEXT, city TEXT NOT
NULL, postal us_postal_code NOT NULL );
[Link] HATIMI - SQL
Exercice
CANDIDAT (Code_CNC clé primaire, Nom,
Prenom, Adresse, date_naissance)
Créer un domaine pour le code CNC
Format : XX000Y (XX : ville, 000 : numéro
d’ordre, Y : filière M, P, T, B)
Ex : SL028M (SL : Salé, 028 Ordre, M : MP)
Saisir des enregistrements pour tester
Clé primaire
Mot clé : primary key
create table ETUD
Clé primaire
Les deux syntaxes suivantes sont équivalentes :
create table ETUD1
(CNE char (10) primary key,
Moyenne decimal(2,2))
Contrainte d’unicité
La contrainte d’unicité est précisée par le mot-clé
unique.
Contrainte d’unicité
La contrainte d’unicité peut s’appliquer sur un
ensemble d’attributs :
Clé secondaire
Le langage SQL ne permet pas de définir
formellement une clé secondaire.
On peut donc utiliser UNIQUE pour
préciser les clés secondaires.
Exercice : Table U
Soit le schéma relationnel de la table u
décrit comme suit :
u (nu : Entier, nomu : Chaine(100), ville
: Chaine(50))
nu est la clé primaire
nomu est obligatoire
Ville a comme valeur par défaut
‘Casablanca’
[Link] HATIMI - SQL
Solution
CREATE TABLE u (nu integer primary key,
nomu character varying (100) not null,
Ville character varying(50) default
‘Casablanca’);
Exercice : Table F
Soit le schéma relationnel de la table F
décrit comme suit :
F (NF : Entier, NomF : Chaine(50), Ville
: Chaine(30))
NF est la clé primaire
NomF est obligatoire
Exercice : Table F
CREATE TABLE F (NF integer
PRIMARY KEY, NomF Varchar (50)
NOT NULL, Ville Varchar (30));
Exemple : Table P
Table des produits P (NP : Entier, NomP
: Chaine(50), Couleur : Chaine(30),
Poids : Entier)
NP est la clé primaire
NomP est obligatoire
Couleur peut prendre les valeurs
(‘Blanc’, ‘Rouge’, ‘Noir’)
Poids > 0
[Link] HATIMI - SQL
Exemple : Table P
CREATE TABLE P
(NP integer PRIMARY KEY,
NomP Character Varying (50) NOT NULL,
Couleur Character Varying (30) CHECK
(Couleur IN (‘Blanc’, ‘Rouge’, ‘Noir’)),
Poids integer CHECK (Poids > 0));
Contrainte implicite Vs
Contrainte explicite
Le code suivant crée une contrainte d’entité
implicite sur la colonne code
CREATE TABLE films (code character(5) PRIMARY
KEY,…)
On peut créer la contrainte de maniére explicite,
en lui associant un nom, avec le mot clé
CONSTRAINT. La syntaxe deviant :
CREATE TABLE films (code character(5) NOT
NULL,…, CONSTRAINT films_pkey PRIMARY KEY
(code))
[Link] HATIMI - SQL
Pseudo-type SERIAL
Sous PostgreSQL, le pseudo-type SERIAL permet de
créer une séquence puis de l’associer aux valeurs d’une
colonne.
CREATE TABLE etudiant (id serial primary key,…);
Il existe trois types SERIAL différents selon leur taille :
smallserial sur 2 octets / serial sur 4 / bigserial sur
8.
Le pseudo-type SERIAL est équivalent au mot-clé
AUTO-INCREMENT de certains SGBD.
Clé étrangère
Mots clés: FOREIGN KEY / REFERENCES
Syntaxe avec contrainte de table :
Clé étrangère
Mots clés: FOREIGN KEY / REFERENCES
Syntaxe avec contrainte de colonne :
Contrainte référentielle
La clé étrangère précise une contrainte référentielle
sur un ou plusieurs attributs de la table vers un ou
plusieurs attributs d’une autre table qui sont soient
une clé primaire ou une clé secondaire.
Syntaxe complète :
Contrainte référentielle
Que se passe t-il en cas de modification ou de
suppression des données en référence ? Risque de
violation de la contrainte référentielle.
Afin d’assurer l’intégrité de la base de données, le
langage SQL propose cinq actions possibles
Syntaxe :
Contrainte référentielle
NO ACTION : Génère une erreur indiquant la
violation de la contrainte référentielle. C’est
l’action par défaut.
RESTRICT : Génère une erreur indiquant la
violation de la contrainte référentielle. La
modification ou la suppression de la donnée en
référence est interdite.
La différence ? (voir documentation)
[Link] HATIMI - SQL
Contrainte référentielle
CASCADE : En cas de suppression de la valeur
référencée, supprime les lignes contenant une
référence à celle-ci. En cas de modification de
la valeur référencée, modifie la valeur de la clé
étrangère dans les lignes contenant une
référence à la valeur modifiée.
Contrainte référentielle
SET NULL : Remplace la valeur référencée par
NULL dans la clé étrangère.
SET DEFAULT : Remplace la valeur référencée
par la valeur par défaut (si elle existe) dans la
clé étrangère. Il faut que la valeur par défaut
existe dans la table de référence.
Contrainte référentielle
Exemple :
create table ACHAT (
Code char(10) primary key,
Prod char(8) not null references PRODUIT on
update cascade on delete no action,
Quantité smallint)
Contrainte référentielle
1. Il est interdit de supprimer 1. ON DELETE NO ACTION
un produit s’il a été acheté. Ne rien écrire
2. Même si on supprime le
produit on veut garder les 2. ON DELETE SET NULL /
achats correspondants. SET DEFAULT
3. Un produit acheté ne peut
pas être modifié. 3. ON UPDATE NO ACTION
4. On change souvent le code Ne rien écrire
de nos produits, dans ce 4. ON UPDATE CASCADE
cas il faut changer le code
dans les achats 5. ON DELETE CASCADE
correspondants.
5. Si on supprime les produits
on ne veut pas garder les
achats.
Contrainte référentielle
Remarque : Certains SGBD acceptent la
création d’une clé étrangère vers une
table qui n’est pas encore créée
(référence en avant)
Si ce n’est pas possible, il faudra ajouter
la contrainte après la création de la table
de référence (en utilisant ALTER TABLE).
[Link] HATIMI - SQL
Exercice 1
Schéma de la BD Gestion_ACHAT :
1. CLIENT (NCLI, Nom, [Adresse], [Ville])
2. COMMANDE (NCOM, Client, DateCommande,
[DateLivraison])
3. PRODUIT (NPRO, Libelle, Prix, [Stock])
4. DETAIL (Commande, Produit, Quant)
Client référence NCLI
Commande référence NCOM
Produit référence NPRO
[Link] HATIMI - SQL
Exercice 2
Des éditeurs se réunissent pour créer une Base de Données
sur leurs publications scientifiques. Dans de telles
publications, plusieurs auteurs se regroupent pour écrire un
livre en se répartissant les chapitres à rédiger. Après
discussion, voici le schéma obtenu :
1. LIVRE (titreLivre, année, éditeur, chiffreAffaire)
2. CHAPITRE (titreLivre, titreChapitre, nbPages)
3. AUTEUR (nomAuteur, prénom, annéeNaissance)
4. REDACTION (nomAuteur, titreLivre, titreChapitre)
Donnez les ordres CREATE TABLE pour le schéma, en
spécifiant soigneusement clés primaires et étrangères
Précisez les stratégies de modification et de suppression sur
les clés étrangères?
[Link] HATIMI - SQL
Exercice 3
PERSONNE (ID entier, [CIN] chaine(10), nom chaine(50), prenom
chaine(50), naissance date, sexe, [deces] date, [pere] entier,
[mere] entier, [nationalite] chaine(30))
• ID est une clé primaire
• CIN est unique
• [Link] référence [Link]
• [Link] référence [Link]
• Interdire la suppression d’une personne qui a des enfants
• En cas de modification de l’ID d’un parent, répercuter la modification sur les
enfants
• nationalite a comme valeur par défaut ‘MAROCAINE’
• La date de décès est supérieure à la date de naissance
• sexe prend deux valeurs possibles (M, F)
[Link] HATIMI - SQL
Solution Exercice 3
CREATE TABLE personne (
ID integer primary key,
Cin varchar(10) unique,
Nom varchar(50) not null,
Prenom varchar(50) not null,
Naissance date not null,
Deces date,
Sexe char check (sexe IN (‘M’, ‘F’)),
Pere integer references personne on update cascade,
Mere integer references personne on update cascade,
Nationalite varchar(50) default ‘MAROCAINE’,
Check (naissance < deces));
[Link] HATIMI - SQL
Modification du schéma
Après la création du schéma de base de
données (clause CREATE) on peut le
modifier en supprimant ou en modifiant
des tables, des colonnes, des contraintes
... avec les clauses ALTER et DROP.
Modification du schéma
Suppression des objets de la base de données :
TABLE, DOMAIN, INDEX, FUNCTION… DROP
Modification du schéma d’une table (ALTER) :
Renommer la table
Renommer une colonne
Ajouter/Supprimer une colonne
Modifier le type d’une colonne
Ajouter / Modifier / Supprimer une valeur par défaut
Ajouter / Modifier / Supprimer une contrainte : Clé
primaire, Clé étrangère, Check …
[Link] HATIMI - SQL
Exemple
Exécuter le script suivant :
CREATE TABLE tab1 (id1 integer primary key);
CREATE TABLE tab2 (id2 integer primary key,
col1 integer references tab1);
Insérer quelques lignes dans tab1 et tab2.
Tester la commande DROP TABLE tab1;
Tester la commande DROP TABLE tab1
CASCADE;
[Link] HATIMI - SQL
Contrainte explicite
On peut donner un nom aux contraintes avec
le mot-clé CONSTRAINT.
Exemple :
create table CLIENT
( IdCli char(3),
Nom char(30),
Adresse char(100),
Ville char(20),
constraint C2 primary
[Link] HATIMIkey
- SQL (IdCli))
Contrainte explicite
Ajouter une contrainte avec un nom. Exemple:
alter table CLIENT
add constraint CS1 unique (Nom,Adresse,Ville)
Supprimer une contrainte par son nom :
alter table CLIENT
drop constraint CS1
Colonne obligatoire/facultative
Rendre une colonne obligatoire. Ceci n’est
possible que si aucune valeur NULL n’existe
dans la colonne :
ALTER TABLE distributors ALTER COLUMN street
SET NOT NULL
Pour rendre une colonne facultative :
Pseudo-type SERIAL
SERIAL est un pseudo-type entier
permettant au SGBD de créer une séquence
puis d’associer à la colonne des valeurs
issues de la séquence.
Syntaxe: CREATE TABLE tablename (
colname SERIAL);
Selon la taille voulue on peut utiliser
SMALLSERIAL, SERIAL ou BIGSERIAL.
[Link] HATIMI - SQL
Les séquences
Une séquence permet de créer un générateur de
valeurs entiéres sous forme d’une énumération
de valeurs uniques à partir d’une valeur de
départ (par défaut 1) et d’un pas
d’incrémentation (par défaut 1).
Syntaxe : CREATE SEQUENCE seq START 101;
La fonction nextval permet de récupérer la valeur
courante de l’énumération :
select nextval('seq');
[Link] HATIMI - SQL
SERIAL Vs SEQUENCE
CREATE TABLE etudiant (id serial
primary key, nom varchar(50), prenom
varchar(50));
Langage SQL
INSERT
En respectant l’ordre des colonnes de la
table, on peut ajouter des enregistrements :
INSERT INTO NomTable VALUES (Val1, Val2,
Val3…)
On peut changer l’ordre d’entrée des
colonnes :
INSERT INTO NomTable (Col1, Col2, Col3)
VALUES (Val1, Val2, Val3)
[Link] HATIMI - SQL
INSERT
DETAIL (Commande, Produit, Quant)
insert into DETAIL values (‘22547’, ‘P147’,
25)
Cas de l’insertion d’une valeur NULL :
insert into DETAIL values (‘22548’, ‘P130’,
INSERT
On peut ne pas introduire toutes les valeurs.
Dans ce cas il faut spécifier les colonnes
voulues :
CLIENT (NCLI, Nom, Adresse, Ville, [Type],
Compte)
insert into CLIENT (Nom, NCLI, Ville, Compte)
values (‘CASALUX’, ‘C312’, ‘Casablanca’, 2000)
INSERT
On peut ajouter à une table existante des
données extraites d’une autre table :
insert into CLIENT_TANGER
select NCLI, Nom, Adresse
from CLIENT
where Ville = ‘Tanger’
Commande COPY
Lorsqu’on veut insérer un grand nombre de lignes
ou importer des données à partir d’un fichier texte,
il est préférable d’utiliser la commande COPY.
La commande COPY ne fait pas partie du standard
SQL. C’est une commande propre à PostgreSQL.
DELETE
Les enregistrements ne sont pas référencés
individuellement aussi n’y a-t-il pas de commande
pour supprimer un enregistrement en particulier.
Par contre, on peut supprimer toutes les lignes
d’une table :
DELETE FROM films;
Ou on peut supprimer les lignes répondant à une
condition :
DELETE FROM films WHERE genre = ‘Horreur'
[Link] HATIMI - SQL
DELETE
Suppression de lignes : delete
Exemple on veut supprimer les détails de
commande qui spécifient des produits en
rupture de stock :
delete from DETAIL
where Produit in ( select NPRO
from PRODUIT
where Qstock = 0)
TRUNCATE
TRUNCATE quickly removes all rows
from a set of tables. It has the same
effect as an unqualified DELETE on
each table, but since it does not
actually scan the tables it is faster.
Furthermore, it reclaims disk space
immediately, rather than requiring a
subsequent VACUUM operation. This is
most useful on large tables.
[Link] HATIMI - SQL
VACUUM
VACUUM reclaims storage occupied by
dead tuples. In normal PostgreSQL
operation, tuples that are deleted or
obsoleted by an update are not
physically removed from their table;
they remain present until a VACUUM is
done. Therefore it's necessary to do
VACUUM periodically, especially on
frequently-updated tables.
[Link] HATIMI - SQL
UPDATE
Modifier les valeurs : update
update CLIENT
set Ville = ‘Casablanca’
where Ville = ‘Casa’
Exemple
Schéma de la BD Gestion_ACHAT :
CLIENT (NCLI, Nom, Adresse, Ville, [Type], Compte)
COMMANDE (NCOM, Client, Date)
PRODUIT (NPRO, Libelle, Prix, QStock)
DETAIL (Commande, Produit, Quant)
Client référence NCLI
Commande référence NCOM
Produit référence NPRO
Extraction simple
Requête :
select NCLI, Nom, Ville
from CLIENT
Extraction simple
Select * permet l’extraction de toutes les
colonnes des tables cibles.
Exemple, si on veut afficher tous les
enregistrements de la table CLIENT :
select *
from CLIENT
Prédicat de sélection
Le prédicat de sélection a la forme d’une
expression logique. Exemples :
WHERE Valeur = 12.5
WHERE Nom = ‘InfoNord’
WHERE date > ’10/08/2006’
Syntaxe : WHERE [Colonne/Constante]
{=,<,>,<=,>=,<>} [Colonne/Constante]
Prédicat de sélection
Un prédicat peut combiner plusieurs
conditions.
Soient P1, P2 et P3 des expressions logiques :
Where P1 and P2
Where P1 or P2
Where not P1
Where P1 and (P2 or P3)
Prédicat de sélection
Pour afficher Nom, Adresse et Compte des
clients de Casablanca ayant un compte
négatif.
Clause LIMIT
LIMIT { count | ALL } OFFSET start
count specifies the maximum number of rows to
return, while start specifies the number of rows to
skip before starting to return rows. When both are
specified, start rows are skipped before starting to
count the count rows to be returned.
Données dérivées
Pour les sélections simples, les données
extraites proviennent directement des tables.
On peut aussi spécifier dans la clause SELECT
des données dérivées c’est-à-dire issues d’un
calcul ou des constantes.
Données dérivées
Exemple : Donner le montant de la TVA
des produits en stock dont la quantité en
stock est supérieure à 500.
Données dérivées
Alias de colonne
Lors de l’affichage du résultat, les colonnes
reçoivent un nom qui est celui indiquée
dans la clause SELECT.
Le nom peut être encombrant et peu
significatif. On peut alors définir
explicitement un nom de colonne qui
apparaîtra à l’affichage : alias de colonne.
Alias de colonne
Select NPRO as Produit, 0.2*Prix*QStock as
Valeur_TVA
From PRODUIT
Where QStock > 500
Alias de colonne
Produit Valeur_TVA
P402S 66520.00
P384T 12478.00
P55T 110540.00
P121R 87456.00
Fonctions SQL
Exemple : Pour concaténer le nom en
majuscules de la société et son adresse en
minuscules :
select upper(Nom) || ‘@’ || lower(Adresse)
as Identification
from Client
Fonctions agrégatives
Principales fonctions agrégatives :
Count(*) : nombre de lignes trouvées.
Count (nom_col) : nombre de lignes avec valeur
de la colonne nom_col non nulle.
Avg(nom_col) : moyenne des valeurs de la
colonne.
Sum(nom_col) : somme des valeurs de la
colonne.
Min(nom_col) : minimum des valeurs de la
colonne.
Max(nom_col) : maximum des valeurs de la
colonne. [Link] HATIMI - SQL
Fonctions agrégatives
Donner le nombre et la moyenne des comptes
des clients de Casablanca ?
Select count (*) as Nombre, avg (Compte) as
Moyenne
From CLIENT
Where Ville = ‘Casablanca’
Nombre Moyenne
32 4355.13
[Link] HATIMI - SQL
Fonctions agrégatives
Donner la valeur totale du stock ?
select sum (Qstock*Prix) as Valeur_Stock
from PRODUIT
Valeur_Stock
82500.00
Fonctions agrégatives
select sum (Qstock) as Total_Stock, Libelle
from PRODUIT
Fonctions agrégatives
Attention aux valeurs dupliquées !
La requête suivante, ne donne pas le
nombre de clients ayant fait au moins une
commande mais le nombre de commandes
où Client n’est pas NULL :
select count (Client)
from COMMANDE
Fonctions agrégatives
Pour avoir le nombre de clients ayant fait au
moins une commande on utilisera :
Select count (distinct Client)
From COMMANDE
A ne pas confondre avec :
Fonctions agrégatives
On veut sélectionner les produits ayant comme
prix le prix maximal de tous les produits.
La requête 1 est fausse car on ne peut pas utiliser
une fonction agrégative dans la clause WHERE :
Select NPRO
From Produit
Where Prix = Max(Prix)
Solution utiliser une sous-requête :
Select NPRO
From Produit
Where Prix = (Select Max(Prix) From Produit)
[Link] HATIMI - SQL
Données groupées
On ne peut spécifier dans la clause
SELECT que des noms de colonnes et des
fonctions dont le résultat est une valeur
unique par groupe : critère de
groupement, fonctions agrégatives,
constantes…
Extraction de données de
plusieurs tables
On a traité des requêtes simples dans les
exemples précédents avec extraction de
données à partir d’une seule table ?
Comment extraire des requêtes à partir de
plusieurs tables ?
Sous-requêtes
Jointures implicites ou explicites
Sous-requêtes
Donner les commandes des clients de
Casablanca.
On commence par trouver les clients de
Casablanca avec la requête :
Select NCLI
From CLIENT
Where Ville = ‘Casablanca’
Qui donne les clients {‘C201’, ‘C805’, ‘C47’,
‘C214’}.
[Link] HATIMI - SQL
Sous-requêtes
On peut alors trouver leur commande
avec la requête :
Select NCOM, Date
From COMMANDE
Where Client in (‘C201’, ‘C805’, ‘C47’,
‘C214’)
Méthode non satisfaisante !!!
[Link] HATIMI - SQL
Sous-requêtes
On écrira :
Select NCOM, Date
From COMMANDE
Where Client in (Select NCLI
From CLIENT
Where Ville = ‘Casablanca’)
La requête incluse dans la clause Where est
appelée sous-requête.
Sous-requêtes
Donner les produits qui ont été
commandés par au moins un client de
Casablanca ?
CLIENT (NCLI, Nom, Adresse, Ville, [Type],
Compte)
COMMANDE (NCOM, Client, Date)
PRODUIT (NPRO, Libelle, Prix, QStock)
DETAIL (Commande, Produit, Quant)
[Link] HATIMI - SQL
Sous-requêtes
On écrira :
Select Produit From DETAIL
Where Commande in
(Select NCOM From COMMANDE
Where Client in (Select NCLI
From CLIENT
Where Ville = ‘Casablanca’))
On peut avoir plusieurs niveaux de sous-
requêtes.
Requête :
select * from CLIENT
where Ville = ( Select Ville from CLIENT
where NCLI = ‘C805’)
[Link] HATIMI - SQL
Sous-requêtes
Si la sous-requête renvoie une seule
ligne, on peut utiliser les opérateurs de
comparaison.
Exemple :
Sous-requêtes
Exercice : Ecrire la requête qui donne les
commandes avec une quantité commandée du
produit ‘P001’ inférieure à celle de la
commande ‘CO001’ (pour le même produit) ?
CLIENT (NCLI, Nom, Adresse, Ville, [Type],
Compte)
COMMANDE (NCOM, Client, Date)
PRODUIT (NPRO, Libelle, Prix, QStock)
DETAIL (Commande, Produit, Quant)
[Link] HATIMI - SQL
Jointures
Une jointure contrairement aux sous-
requêtes permet d’extraire simultanément
des données de plusieurs tables.
Jointures
Exemple : Compléter les commandes
avec les informations du client :
select NCOM, NCLI, DateCommande,
Nom, Adresse, Ville
from COMMANDE, CLIENT
where Client = NCLI
Jointures
La condition NCLI = Client est dite
condition de jointure.
Elle est dans ce cas sous la forme de Clé
étrangère = Clé primaire Equi-jointure
Jointures
select NCOM, [Link], Date, Nom,
Adresse, Ville
from COMMANDE, CLIENT
where NCLI = Client
and CAT = ‘C1’
and Date < ’01/01/2005’
Vues (VIEW)
Définition : « Une vue est une table
virtuelle dont le schéma et les tuples sont
dérivés de la base de données réelle à
partir d’une requête. »
Syntaxe :
Opérateurs ensemblistes
UNION / EXCEPT (ou MINUS) / INTERSECT
Syntaxe : Requete1 <Opérateur> Requete2 avec
Requete1 et Requete2 retournant le même
schéma.
1. Requete1 UNION Requete2 Union des
résultats des deux requêtes.
2. Requete1 EXCEPT Requete2 Différence entre
les résultats des deux requêtes.
3. Requete1 INTERSECT Requete2 Intersection
des résultats des deux requêtes.
[Link] HATIMI - SQL