====== TP introduction SQL ====== Vous pouvez utiliser le serveur [[http://bdd.imst.os.univ-lyon1.fr]] avec les login et mot de passe fourni par votre enseignant. ===== Requêtes simples ===== Faire des requêtes sur la table des catégories * Listez l'ensemble de la table * Listez uniquement le titre de toutes les catégories * Listez les catégories qui sont des sujets ? Combien y en a-t-il ? * Listez les sujets qui contiennent le mot science. # Listez le titre de toutes les catégories SELECT categories.title FROM categories WHERE 1; # Listez les catégories qui sont des sujets ? Combien y en a-t-il ? SELECT categories.title AS titre FROM categories WHERE genre='subjects'; # Listez les sujets qui contiennent le mot science (On ne tiens plus compte de la casse). SELECT categories.title AS titre FROM categories WHERE genre='subjects' AND title LIKE '%science%'; ===== Requêtes avec jointure ===== vous devez faire une jointure entre les tables ''courses'' et ''courses_runs'' * Trouvez la date de début de tous les cours. * Trouvez les cours qui ont lieu après octobre 2022 * Trouvez les cours qui ont lieu après octobre 2022 et parlent de données ou de mathématiques ############################################### # Trouvez la date de début de tous les cours. ############################################### SELECT courses.title, courses_runs.start FROM courses, courses_runs WHERE courses.id=courses_runs.id_course; # meme chose avec un join SELECT courses.title, courses_runs.start FROM courses JOIN courses_runs ON courses.id=courses_runs.id_course WHERE 1; ######################################################## # Trouvez les cours qui ont lieu après octobre 2022 ######################################################## ######################################################## # Trouvez les cours qui ont lieu après octobre 2022 et parlent de données ######################################################## ===== Requête plus complexes ===== * Trouvez tous les mots clefs utilisés par chacun des cours de science en n'affichant que le mot clef et le titre du cours * On cherche à obtenir une liste avec chaque mots clef utilisé par toutes les organisations avec l'affichage uniquement du nom de l'organisation et de la valeur du mot clef. Faites la requête Pour vous aider: - Un mot clef est une catégorie de genre ''subject''. - Les catégories sont liées aux cours qui sont liées au organisations. - On peut considérer qu'un cours est un cours de science si son titre ou son introduction contiennent le mot ''science''. ################################################## # * Trouvez tous les mots clefs utilisés par chacun des cours de science en # n'affichant que le mot clef et le titre du cours ################################################## SELECT categories.title AS motClef, courses.title AS titrecours FROM courses JOIN courses_categories ON courses_categories.id_course=courses.id JOIN categories ON courses_categories.id_categorie=categories.id WHERE courses.title LIKE '%science%' OR courses.introduction LIKE '%science%'; * Faites une requète pour voirs les cours d'une école des mines (école avec mines dans le nom) SELECT courses.title AS NomCours, organizations.title AS NomOrga FROM courses JOIN courses_organizations ON courses.id=courses_organizations.id_course JOIN organizations ON courses_organizations.id_organization=organizations.id WHERE organizations.title REGEXP ".*mines.*"; ===== En python ===== Pour python, vous pouvez utiliser le notebook https://jupyter.imst.os.univ-lyon1.fr * Faire un programme python qui affiche pour chaque mot clef le nombre de fois qu'il est utilisé dans un cours. #!/usr/bin/env python # coding: utf-8 # ## Connexion à la base et curseur # # In[1]: import mysql.connector import json conn = mysql.connector.connect( host="bdd.imst.os.univ-lyon1.fr", user="etudiant", password="sqlavance", database="funmooc") cursor = conn.cursor() # ## Éxécution de la requète # In[2]: cursor.execute(""" SELECT categories.title AS motClef, courses.title AS titrecours FROM courses JOIN courses_categories ON courses_categories.id_course=courses.id JOIN categories ON courses_categories.id_categorie=categories.id WHERE categories.genre="subjects" ORDER BY courses.id """) # ## Comptage des mots clef # # Pour chaque mot clef trouvé, j'ajoute 1 dans le tableau qui contient le nombre de fois qu'on l'a déjà vu. # Si le mot n'a jamais été vu, j'utilise le fait qu'il est possible d'avoir une valeur par défaut dans un dictionnaire via `get` # # Au passage j'affiche le mot et le nombre de fois qu'on l'a vu. # # In[3]: tab = {} while True: res = cursor.fetchone() if res is None: break # Le mot clef est la première colonne demandée dans le SELECT alors il sera # dans la première case du résultat mot = res[0] # On récupère le nmbre de fois où il a été vu ou 0 s'il n'a jamais été vu nbdeja = tab.get(mot, 0) # on affiche print(f"On trouve le mot clef '{mot}' déjà vu {nbdeja} fois") # on ajoute un et on change la valeur du tableau tab[mot] = nbdeja+1 # Affichage print(tab) # Affichage plus joli print(json.dumps(tab, indent=2)) # ## on fait un nuage de mot # # Ce n'est pas demander mais à partir d'un dictionnaire qui compte le nombre d'ocurence des mots on peut facilement faire un nuage de mot avec la librairie `wordcloud` # In[5]: # génération du nuage import wordcloud import matplotlib.pyplot as plt wordcloud = wordcloud.WordCloud().generate_from_frequencies(tab) # affichage plt.imshow(wordcloud, interpolation='bilinear') plt.axis("off") plt.show() * Faire un programme python qui obtient la liste des mots clef de chaque cours de chaque organisation et affiche le tableau suivant: ^ Nom organisation ^ liste mot clef ^ | MINES ParisTech | Economie et gestion, Environnement et dévelop... | | Inria | Informatique et programmation, Numérique et technologie, Droit, Numérique et technologie, ... | | ... | ... |