Fichier de rejeu Close

Indication Close

A propos de... Close

Commentaire Close

Systèmes d'Information

  • Notions mathématiques
  • Calcul relationnel
  • Algèbre relationnelle
  • Langage de requêtes
  • Arbre de requêtes
  • QCM
  • Introduction
  • Commandes de bases
  • Langage de définition de données
  • Types de données
  • Requêtes
  • Présentation
  • Calcul relationnel
  • Algèbre relationnelle
  • Division relationnelle
  • Dépendances fonctionnelles
  • Décomposition de relations
  • Inférence logique
  • Normalisation
  • Aux pays des bières
  • Modélisation
  • Exercices
  • Présentation
  • Aux pays des bières
  • Au Tournoi des six nations
  • Salles de concerts
  • Définitions
  • Langage SQL
  • Modèle relationnel
  • Repas
Index

Téléchargements

  • Site
  • Sources
  • EniBook
logo

Crédits

© Your Copyright

Aide

En-tête

MenuContenu
Sommaire,
Téléchargements
Aide sur les outils

Pied de page

ChevronAction
Aller en haut de la page courante
Aller en bas de la page courante
Passer à la page précédente
Passer à la page suivante

Repas

Création des tables SQL

CREATE TABLE repas (
                    jour DATE,
                    personne VARCHAR(20)
                   );

CREATE TABLE menus (
                    jour DATE,
                    plat VARCHAR(50)
                   );

CREATE TABLE gouts (
                    personne VARCHAR(20),
                    plat VARCHAR(50)
                   );

Insertion d'éléments dans les tables

INSERT INTO menus VALUES ('2017-01-01','choucroute');
INSERT INTO menus VALUES ('2017-01-01','raclette');
INSERT INTO menus VALUES ('2017-01-02','kig ha farz');
INSERT INTO menus VALUES ('2017-01-02','raclette');

INSERT INTO repas VALUES ('2017-01-01','Jojo');
INSERT INTO repas VALUES ('2017-01-02','Jojo');
INSERT INTO repas VALUES ('2017-01-02','Nono');
INSERT INTO repas VALUES ('2017-01-01','Bibi');

INSERT INTO gouts VALUES ('Jojo','kig ha farz');
INSERT INTO gouts VALUES ('Jojo','raclette');
INSERT INTO gouts VALUES ('Bibi','cassoulet');
INSERT INTO gouts VALUES ('Nono','raclette');
INSERT INTO gouts VALUES ('Nanard','pizza');

Rechercher les personnes qui assistaient au repas du 1er janvier 2017.

  1. Calcul relationnel de domaine :

    • \(R=\{ p \; | repas(jour='2017-01-01',p:personne)\}\)
  2. Algèbre relationnelle :

    • \(R=\Pi_{personne}(\sigma_{[jour='2017-01-01']}(repas))\)
  3. Requête SQL :

    SELECT personne FROM repas
    WHERE jour='2017-01-01';
    

Les plats proposés à 'Nono' lors de ses repas.

  1. Calcul relationnel de n-uplets

    • \(R=\{ m.plat \; | \; m \in menus \land r \in repas \land m.jour=r.jour \land r.personne='Nono'\}\)
  2. Algèbre relationnelle :

    • \(R=\Pi_{plat}(\Join_{[menus.jour=repas.jour]}(menu,\sigma_{[personne='Nono']}(repas)) )\)
  3. Requête SQL :

    -- produit cartésien et restriction
    SELECT DISTINCT plat
    FROM repas r, menus m
    WHERE r.jour=m.jour AND personne='Nono';
    
    -- jointure naturelle
    SELECT DISTINCT plat
    FROM repas r NATURAL JOIN  menus m
    WHERE personne='Nono';
    

A quelle question en langage naturel correspond l'expression algébrique suivante :

  • \(R=\Pi_{personne}(\Join_{[repas.jour=menus.jour]}(repas,\Join_{[menus.plat=gouts.plat]}(menus,gouts)) )\)
  1. Une formulation en langage naturel pourrait être :

    • « Rechercher les personnes qui lors d’un repas ont eu au moins un de leur plat préféré. »
  2. Ecrire la requête SQL correspondante

    -- Jointure naturelle
    SELECT DISTINCT personne
    FROM repas NATURAL JOIN  menus NATURAL JOIN  gouts;
    
    -- Produit cartesien, restriction
    SELECT DISTINCT r.personne
    FROM repas r, menus m, gouts g
    WHERE r.jour=m.jour AND g.plat=m.plat AND r.personne=g.personne;
    
  3. Ecrire la requête en calcul relationnel de n-uplets

    • \(R=\{ r.personne \; | \; r \in repas \land m \in menus \land p \in gouts \land r.jour=m.jour \land m.plat=p.plat\}\)

Rechercher les personnes qui n'ont jamais pris un repas.

  1. Calcul relationnel de n-uplets

    • \(R=\{ nom \; | \; (nom:g.personne, g \in gouts) \land \neg (nom:r.personne, r \in repas) \}\)

    ou :

    • \(R=\{ nom \; | \; (nom:g.personne, g \in gouts) \} \setminus \{ nom \; | \; (nom:r.personne, r \in repas) \}\)
  2. Algèbre relationnelle :

    • \(R_1=\Pi_{personne}(gouts)\)
    • \(R_2=\Pi_{personne}(repas)\)
    • \(R=\setminus(R_1,R_2)\)

    ou :

    • \(R=\setminus(\Pi_{personne}(gouts),\Pi_{personne}(repas))\)
  3. Requête SQL :

    SELECT personne FROM gouts
    EXCEPT
    SELECT personne FROM repas;
    
    -- ou : requete imbriquee avec IN
    
    SELECT personne
    FROM gouts
    WHERE personne NOT IN (
                           SELECT personne
                           FROM repas
                          );
    
    -- ou : requete imbriquee avec EXISTS
    
    SELECT personne
    FROM gouts g
    WHERE NOT EXISTS (
                      SELECT *
                      FROM repas r
                      WHERE g.personne=r.personne
                     );
    

A quelle question en langage naturel correspond le calcul relationnel suivant :

\(R=\{ p \; | \; \forall j \; repas(j:jour,p:personne), menus(j,-) \}\)

  1. Une formulation en langage naturel pourrait être :

    • « Rechercher les personnes qui sont venues à tous les repas. »
  2. Ecrire la requête SQL correspondante

    --  Double  NOT EXISTS
    SELECT DISTINCT personne
    FROM  repas re
    WHERE NOT EXISTS (
                      SELECT *
                      FROM menus m
                      WHERE NOT EXISTS (
                                        SELECT *
                                        FROM repas ri
                                        WHERE m.jour=ri.jour AND ri.personne=re.personne
                                       )
                     );
    -- NOT EXISTS, EXCEPT
    SELECT DISTINCT personne
    FROM repas re
    WHERE NOT EXISTS (SELECT jour
                      FROM menus
                      EXCEPT
                      SELECT jour
                      FROM repas ri
                      WHERE  ri.personne=re.personne);
    
    
    -- GROUP BY HAVING, COUNT
    SELECT personne FROM repas
    GROUP BY personne
    HAVING COUNT(DISTINCT jour) = (
                                   SELECT COUNT(DISTINCT jour)
                                   FROM menus
                                  );
    
  3. Ecrire la requête en algèbre relationnelle.

    • \(R=\div(repas,\Pi_{jour}(menus))\)

A partir de la requête SQL suivante :

SELECT *
FROM menus me
WHERE
   (
    SELECT plat
    FROM gouts
    WHERE personne='Jojo'
    EXCEPT
    SELECT plat
    FROM  menus mi
    WHERE me.jour = mi.jour
   ) IS NULL;

Trouvez les formulations :

  1. En langage naturel :

    • Rechercher les menus dont les plats correspondront à tous les goûts de “Jojo”
  2. En calcul relationnel de n-uplets :

    • \(R=\{ m \; | \; m \in menus \land \forall ('Jojo',plat) \in gouts, (m.jour,plat) \in menus\}\)
  3. En algèbre relationnelle :

    • \(R=\div(menus,\Pi_{plat}(\sigma_{[personne='Jojo']}(gouts)))\)

sql : essai.sql

    
>
Output

                

Interpréteur

MenuAction
Ré-initialiser les sorties
Faire apparaître le menu d'aide
Interpréter le programme

Editeur

MenuRaccouciAction
Ctrl+N Initialiser l'éditeur
Ctrl+O Charger le contenu d'un fichier dans l'éditeur
Ctrl+S Sauvegarder le contenu de l'éditeur dans un fichier
Ctrl+P Imprimer le contenu de l'éditeur
Ctrl+Z Annuler la dernière modification
Maj+Ctrl+Z Rétablir la modification précedente
Ctrl+F Chercher une expression dans l'éditeur
Maj+Ctrl+F Chercher et remplacer une expression par une autre
F10 Ouvrir une documentation du langage

RaccourciAction
F1 Afficher cette aide
Tab Indenter la sélection
Maj+Tab Désindenter la sélection
Ctrl+A Sélectionner le contenu de l'éditeur
Ctrl+C Copier la sélection dans le presse-papier
Ctrl+V Remplacer la sélection par le contenu du presse-papier
Ctrl+X Supprimer la sélection et la copier dans le presse-papier
Maj+Ctrl+R Chercher et remplacer une expression par une autre dans tout l'éditeur
Arbre de requêtes : repas-1.json

Tables

Opérateurs unaires

Opérateurs binaires

Vue d'ensemble
 
Systèmes d'Information : Repas, 12 févr. 2018.