Bases de données

BdD - TP 1 - M1 IM

Université Paris-Sud

  1. Shell - commandes de base
    Cet exercice et le suivant s'effectuent dans un terminal. Ils sont largement inspirés (parfois copiés-collés) de ces questions. Vous pouvez les effectuer indifféremment sur la machine des TPs via SSH, ou sur le poste local.
    1. Prise de contact et commandes simples
      1. Comment s'appelle votre machine ? (uname, hostname)
        hostname
        #ou :
        uname -m
      2. Quel jour sommes nous ? (date)
        date +%A
      3. Quel jour de la semaine êtes-vous né ? (cal)
        #Si vous êtes né le 23 novembre 1994 :
        cal [23] 11 1994
        #[23] car la version installée sur les machines de TP ne prend pas le jour
      4. Qui est actuellement logué sur la machine des TPs ? (ssh, who)
        ssh $login@192.168.31.236
        who
      5. Quelles sont les différences entre write et talk ?
        Les deux programmes permettent de s'échanger des messages, mais talk s'apparente à un chat tandis que write affiche du texte sur l'écran du destinataire sans le laisser répondre de façon interactive. Voir aussi la commande 'wall'.
    2. nano, less, ls
      1. Créez un fichier premiertexte contenant une ou deux phrases.
        echo -e "blabla ligne 1\nblabla ligne 2" > premiertexte
      2. Visualisez le contenu de premiertexte sans l'éditer.
        less premiertexte
        #ou :
        cat premiertexte
      3. Quelle est la taille de premiertexte ?
        ls -l premiertext #taille affichée avant la date. Ou :
        stat -c 'taille en octets: %s' premiertexte
      4. Éditez PREMIERTEXTE. Que constatez-vous ?
        nano PREMIERTEXTE
        On édite en fait un nouveau fichier : les noms sont sensibles à la casse.
    3. cp, ls, mv
      1. Faites une copie de premiertexte appelée double.
        cp premiertexte double
      2. Comparez leurs dates de modification.
        ls -lc premiertexte double
      3. Renommez double en introduction.
        mv double introduction
      4. Quelle différence y a-t-il entre mv double introduction et cp double introduction ?
        'mv' supprime le fichier de départ (ici, 'double')
    4. mkdir, mv, cp, ls, c
      1. Créez un répertoire essai/.
        mkdir essai
      2. Déplacez introduction dans essai/.
        mv introduction essai/
        Note : le slash final '/' n'est pas nécessaire, mais pratique pour distinguer fichiers et répertoires.
      3. Faites une copie de premiertexte appelée copie, et placez-la également dans essai/.
        cp premiertexte copie
        mv copie essai/
      4. Affichez une liste de ce que contient essai/.
        ls -l essai/
    5. rmdir, cd, rm
      1. Copiez essai/ en essai2/, puis essayez de détruire essai/. Que se passe-t-il ? Que faut-il faire pour détruire un répertoire ?
        rm essai/ #ne fonctionne pas : essai/ n'est pas un fichier
        rmdir essai/ #ne fonctionne pas : essai/ n'est pas vide
        rm -r essai/ #OK
        Il faut ajouter l'option '-r' pour supprimer récursivement un répertoire. Elle est souvent associée à l'option '-f' pour 'force', mais attention à ne pas lancer ça sur des répertoires utiles...
      2. Détruisez tout ce que contient essai2/ (mais pas le répertoire)
        rm essai2/*
      3. Détruisez essai2/.
        rmdir essai2/ #OK cette fois : essai2/ est vide
      4. Allez directement dans /usr/lib/. Revenez dans votre répertoire personnel, puis allez dans /usr/bin/ via le chemin relatif.
        cd /usr/lib/
        cd ~ #ou juste 'cd'
        cd ../../usr/bin #ou cd ../../../usr/bin si vous êtes sur 192.168.31.236,
                         #car sur celle-ci vos $HOME sont sur /home/tpbd/
  2. Shell - approfondissement
    1. ls, mkdir, rmdir, cp, mv (si rep existe...)
      1. ls -l : dans quel ordre les fichiers et répertoires sont-ils classés par défaut ? Affichez le contenu de votre répertoire courant de telle sorte que les fichiers modifiés récemment apparaissent en premier.
        Par défaut, l'ordre alphabétique est appliqué. Pour un tri par dates inverses :
        ls -lct
      2. Comment créer en une seule ligne de commande les répertoires a/, a/b/, et a/b/c/ ?
        mkdir -p a/b/c #option '-p' pour '(create) Parent'
      3. Tapez git init -q repo. Listez le contenu de 'repo'. Essayez de le supprimer par la commande 'rmdir'. Que se passe-t-il ? Pourquoi ? Comment effectuer la suppression ?
        'rmdir' nous répond que le dossier n'est pas vide. Elle a raison : ls -A repo montre un répertoire caché, '.git'. Le répertoire 'repo' n'étant pas vide, on le supprime par rm -r repo
      4. Comment copier un répertoire avec tous ses fichiers (y compris dans les sous-dossiers) en une seule commande ?
        cp -r origine/ destination/
      5. Comment faire pour à la fois déplacer un fichier et changer son nom ?
        Il suffit d'indiquer un fichier au lieu d'un répertoire comme destination : mv nom1 chemin/vers/emplacement/nom2
      6. Comment renommer un répertoire bla/ en blo/ ? Que se passe-t-il si le répertoire blo/ existe déjà ?
        mv bla/ blo/
        Si blo/ existe déjà, bla/ devient un sous-répertoire de blo/.
    2. grep, find, cat, head, tail
      1. Chercher les fichiers contenant 'subsystem' dans /etc et ses sous-répertoires (grep)
        #La redirection évite d'afficher les erreurs "accès non autorisé"
        grep -rl subsystem /etc 2> /dev/null
      2. Chercher les dossiers de /etc dont le nom commnce par 's' (find)
        find /etc -type d -name "s*" 2> /dev/null
      3. Que fait cat a b > c ? Quelle différence avec cat a b >> c ?
        Concatène les fichiers a et b, puis place le résultat dans c. Avec '>' le contenu de c est écrasé, et avec '>>' on écrit à la suite dans le fichier.
      4. Afficher les 7 premières (resp. dernières) lignes de /etc/passwd. Puis les lignes 5 à 10, et enfin seulement la ligne 9 (head, tail)
        head -n7 /etc/passwd
        tail -n7 /etc/passwd
        head -n10 /etc/passwd | tail -n6 #ou sed -n 5,10p /etc/passwd
        head -n9 /etc/passwd | tail -n1 #ou sed -n 9p /etc/passwd
    3. Les droits (en lecture/écriture/exécution)
      1. Changez les droits d'un fichier fic1 pour que tous ceux de votre groupe puissent écrire dedans.
        touch fic1
        chmod g+w fic1 #ou chmod 664 fic1
      2. Donnez en une seule ligne le droit d'exécution à tous les utilisateurs sur fic1.
        chmod +x fic1 #ou chmod uog+x fic1
      3. Le fichier toto a les droits suivants : -rwxr--r--. Modifiez les en une ligne de commande de sorte que le propriétaire n'ait plus que le droit de lecture.
        chmod u-wx toto #ou chmod 444 toto
      4. Modifier les droits du fichier toto (-rwxr--r--) de sorte que le groupe et les autres utilisateurs aient les mêmes droits que le propriétaire.
        chmod go+wx toto #ou chmod 777 toto
      5. Quelle option de mkdir permet de créer un répertoire en spécifiant les droits sur ce répertoire ?
        L'option -m. Par exemple : mkdir -m0750 mon_dossier.
    4. Diverses autres choses utiles
      1. Jokers : vous avez chez vous des fichiers appelés essai1, essai2, essai3 et essai4. Comment les effacer en une seule ligne de commande ?
        rm essai?
      2. Dans mon répertoire d'accueil, j'ai un certain nombre de fichiers avec un suffixe '.c'. Je désire les regrouper dans un répertoire que j'appelerai C/. Quelles sont les commandes que je dois taper ?
        mkdir -p C #évite les warnings si C/ existe
        mv *.c C/
      3. Affichez le détail des tâches lancées par l'utilisateur root (commande top ou htop)
        htop -u root
        #Voir aussi la commande 'ps' ('ps -e', en particulier)
      4. Lancer vim en arrière plan. Le tuer. Le relancer au premier plan avec un nom de fichier pour argument. Écrire un peu de texte. Stopper vim. Le récupérer au premier plan. Enregistrer le texte. Quitter vim.
        vim & #'&' permet de lancer en arrière plan ("background")
        pkill -9 vim #attention, ça tue tous les processus vim.
                     #'kill -9 PID' est plus précis
        vim toto     #...puis écriture de texte
        Ctrl+D       #met vim en pause (passe en arrière plan).
                     #Pour l'arrêter il faut utiliser Ctrl+C
        fg           #"foreground"
        :w           #enregistre les modifications
        :q
      5. Lisez la documentation d'Ubuntu concernant les liens physiques / symboliques par ici. On utilise très souvent les liens symboliques.
      6. Appliquez la commande file sur un fichier PDF. Renommez le pour qu'il ait l'extension .txt. Relancez file. Que constatez-vous ?
        La commande file détermine le type de fichier en se basant sur le contenu au lieu de l'extension. Voir cette page pour plus d'informations.
  3. Algèbre relationnelle (basique)
    Dans tout l'exercice (source web) on se réfère à la table suivante, notée £T£
    Nom Age Ville
    Marc29Paris
    Catherine32Lyon
    Sophie54Paris
    Claude13Montpellier
    Serge40Lyon

    1. Que font les requêtes suivantes ?
      1. £\sigma[Age=30](T)£
        Rien (sélection ; personne n'a 30 ans)
      2. £\pi[Age](T)£
        La colonne "Age" (projection)
      3. £\pi[Age](\sigma[Nom=Serge](T))£
        L'âge de Serge (une ligne une colonne, sélection puis projection)
    2. Exprimez les requêtes suivantes en algèbre relationnelle.
      1. L'ensemble des informations concernant les personnes qui habitent Paris
        £\sigma[Ville=Paris](T)£
      2. L'ensemble des informations concernant les personnes qui ont moins de 30 ans
        £\sigma[Age<30](T)£
      3. Les villes identifiées dans la table £T£
        £\pi[Ville](T)£
      4. Les noms des personnes habitant à Paris
        £\pi[Nom](\sigma[Ville=Paris](T))£
  4. Algèbre relationnelle (plus avancé)
    (Source web). On considère les deux relations suivantes où les clés sont soulignées :
    • Films(titre, pays, année, réalisateur, durée)
    • Acteurs(titre, acteur)
    On pourra éventuellement les abréger en £F£ et £A£.
    1. Écrire les requêtes suivantes en algèbre relationnelle.
      1. Liste des films français (titre, année, réalisateur).
        £\pi[titre, annee, realisateur] \circ \sigma[pays=France](Films)£
      2. Donnez les années de sortie des films dans lesquels (Jean) Gabin joue.
        £\pi[annee] ( \bowtie[F.titre=A.titre](F, \sigma[acteur=Gabin](Acteurs)) )£
      3. Trouver les acteurs qui ont tourné avec (François) Truffault comme réalisateur.
        £\pi[acteur] ( \bowtie[F.titre=A.titre](A, \sigma[realisateur=Truffaut](F)) )£
      4. Trouver tous les acteurs qui ont été partenaires de (Catherine) Deneuve.
        Vue intermédiaire pratique :
        £V := \pi[titre] \circ \sigma[acteur=Deneuve](A)£
        £Resultat := \pi[A.acteur] ( \sigma[V.titre=A.titre] (\bowtie[acteur \neq Deneuve](A, V) )£
      5. Liste des films où le réalisateur est aussi acteur
        £\pi[titre] ( \sigma[acteur=realisateur] ( \bowtie[F.titre=A.titre] (F, A) ) )£
      6. Réalisateurs ayant joué comme acteurs dans des films qu'ils ne réalisaient pas eux-mêmes.

        £RES1 := \pi[acteur]( \sigma[acteur \neq réalisateur] (\bowtie[F.titre=A.titre] (F, A)))£
        £RES2 := \pi[réalisateur](F)£
        £RES := RES1 \cap RES2£

        Explication : RES1 donne les acteurs d'un film qui n'ont pas réalisé ce film. RES2 donne les réalisateurs. L'intersection contient la réponse finale.

      7. Réalisateurs / acteurs n'ayant pas joué dans des films qu'ils réalisaient.

        £RES1 := \{ \pi[réalisateur](F) \} \cap \{ \pi[acteur](A) \}£
        £RES2 := \pi[réalisateur](\sigma[acteur=réalisateur](\bowtie[F.titre=A.titre](F, A)))£
        £RES := RES1 - RES2£

        Explication : RES1 donne les réalisateurs / acteurs. RES2 donne les réalisateurs qui sont acteurs dans leur propre film. La différence ensembliste produit le résultat demandé.

      8. Donnez les acteurs qui jouent dans tous les films de (François) Truffaut.
        £Acteurs \div \{ \pi[titre] \circ \sigma[réalisateur=Truffaut](Films) \}£