# Atelier n°2 ## Avant de commencer Ne pas oublier que pour répondre aux demandes, il est recommandé de préparer ses requêtes. Pour cela, nous vous proposons l'outil ci-dessous. Nous l'utiliserons dans nos propositions de solutions ![[Preparer_sa_requete.pdf]] ## Vos premières requêtes sur la base de données *Films* ### 00- Lancer *Visual Studio Code*. Lancer une connexion avec *Visual Studio Code* . Cette connexion doit avoir *films* en base de données. >[!Remarque] Utiliser *Visual Studio Code*. >Si besoin, revoir comment utiliser ce logiciel : [[10_Atelier 0_installer- paramétrer et lancer Visual Studio Code]]. ### 00- Schéma de base *films* ![[Pasted image 20260309225928.png|750]] ### 07- Créer une nouvelle donnée. **Demande :** Pour chaque film, afficher le titre et, dans un champ nommé *information_duree*, la mention "Plus de 2 Heures" ou "2 Heures ou moins" en fonction de la durée du film. >[!question]- Aide : Afficher une information en fonction des données > >Pour afficher ce qu'on nous demande, il faut utiliser une fonction conditionnelle. Vous trouverez la solution dans la page [[07_Fonctions utiles#Les Fonctions Conditionnelles]] > >[!tip]- Voir la solution > 1- Préparation de la requête > >[!flou] schéma > > ![[Pasted image 20260309180650.png]] > > 2- La requête > >[!flou] Requête SQL > >```SQL > >SELECT titre, duree, if(duree>120, 'Plus de 2 Heures', '2H ou moins') AS 'information durée' > >from t_film; > >``` > > >La solution ci-dessus semble bien répondre à la demande. Pourtant, dans la table *t_film*, regardez le durée de film *Attention les dégats*. Vous comprendrez, qu'il y a un souci. Cherchez une autre fonction qui permettra de prendre en compte le fait qu'un film peut ne pas avoir de durée renseignée. > > >[!flou] Requête SQL avec la bonne fonction > >```SQL > >SELECT titre, > > duree, > > Case when duree>120 then 'Plus de 2 Heures' > > when duree<=120 then '2H ou moins' > > else 'Durée non définie pour ce film' > > end AS 'information durée' > >from t_film; > >``` ### 08- Lire/Analyser correctement une demande **Demande :** Afficher pour chaque réalisateur le nombre de films présents dans la base de données. Vous afficherez le nom (en majuscule) et le prénom du réalisateur dans un même champ nommé *Realisateur* et Le nombre de films dans un champ nommé *NbFilms*. >[!question]- Aide : Chaque mot compte. > >Pour répondre correctement à cette demande (comme toutes les autres !), il faut bien faire attention à chaque mot. Ici, un mot impose le type de jointure à mettre en place. > >[!question]- Aide : Concaténation et Casse. > >Pour mettre plusieurs champs dans un seul, il faut utiliser la concaténation. Vous trouverez la solution dans la page [[07_Fonctions utiles#Les Fonctions Textes]] ainsi que comment mettre le nom en majuscule. > >[!tip]- Voir la solution > 1- Préparation de la requête > >[!flou] schéma > > ![[Pasted image 20260309232638.png|750]] > > 2- La requête > >[!flou] Requête SQL > >```SQL > >SELECT concat(upper(nom_real), ' ', prenom_real) AS realisateur, count(id_film) AS NbFilms > >FROM t_realisateur r LEFT JOIN t_film f ON r.id_real = f.id_real > >GROUP BY nom_real, prenom_real; > >``` > >ou > >```SQL > >SELECT concat(upper(nom_real), ' ', prenom_real) AS realisateur, count(id_film) AS NbFilms > >FROM t_film f RIGHT JOIN t_realisateur r ON f.id_real = r.id_real > >GROUP BY nom_real, prenom_real; > >``` ### 09- A vous de jouer ! **Demande :** Nous souhaitons afficher les titres de films sur des écrans géants. Malheureusement, il ne faut pas que le titre dépasse 30 caractères. Nous vous demandons donc de faire une requête qui nous indique pour chaque film, si le titre est trop grand ("Titre trop grand") ou pas ("Titre Ok"). La requête affichera 2 champs : *titre* et *Verdict*. >[!tip]- Voir la solution > 1- Préparation de la requête > >[!flou] schéma > > ![[Pasted image 20260310115859.png|750]] > > 2- La requête > >[!flou] Requête SQL > >```SQL > >SELECT concat(upper(nom_real), ' ', prenom_real) AS realisateur, count(id_film) AS NbFilms > >FROM t_realisateur r LEFT JOIN t_film f ON r.id_real = f.id_real > >GROUP BY nom_real, prenom_real; > >``` ### 10- Deuxième opération d'agrégat **Demande :** Afficher le nombre de types de film présents dans la base de données. Nous vous demandons de compter de deux manières différentes. Les champs contenant la valeur seront nommé *NbType* et *NbTypeAussi*. >[!tip]- Voir la solution > 1- Préparation de la requête > >[!flou] schéma > > ![[Pasted image 20260310122759.png|750]] > > 2- La requête > >[!flou] Requête SQL > >```SQL > >SELECT count(*) AS nbType, count(id_type) AS nbTypeAussi > >FROM t_type > >``` ### 11- Eviter les doublons **Demande :** Afficher la liste des acteurs qui ont tourné avec Georges Lucas. Le nom et le prénom de chaque acteur seront dans un seul champ nommé *Les Acteurs de G. Lucas*. Les acteurs seront affichés dans l'ordre alphabétique. Dans votre solution, vous devez utiliser *George* et *Lucas*. >[!note] Remarque : Le nom du champ >Ce nom correspond au résultat final de la requête. (et non pas au contenu de chaque enregistrement). >Cette technique est utilisée lorsqu'on sait qu'il s'agit d'une requête finale (**son résultat ne sera pas repris dans une autre requête**) afin de **faciliter la compréhension** de celui qui exécute la requête >[!question]- Aide : Votre solution affiche plusieurs fois les acteurs ? > >Si vous êtes dans ce cas de figure, il faut d'abord comprendre pourquoi (tout ce passe dans le FROM.) >Ensuite, il faut chercher une solution. Cela se jouera avec une opération d'agrégat. > >[!tip]- Voir la solution > 1- Préparation de la requête > >[!flou] schéma > >![[Pasted image 20260310140936.png|750]] > > > > 2- La requête > >[!flou] Requête SQL > >```SQL > >SELECT concat(nom_act, " ", prenom_act) AS "Les acteurs de G. Lucas" > >FROM t_acteur a INNER JOIN t_film_acteur fa ON a.id_act = fa.id_act > > INNER JOIN t_film f ON fa.id_film = f.id_film > > INNER JOIN t_realisateur r ON f.id_real = r.id_real > >WHERE nom_real = "Lucas" AND prenom_real = "Georges" > >GROUP BY nom_act, prenom_act > >ORDER BY nom_act, prenom_act; > >``` ### 12- Première réflexion **Demande :** Afficher le nombre de films empruntés et le nombre de films disponibles sous forme d'un tableau **Résultat attendu** : ![[Pasted image 20260311145544.png|400]] >[!question]- Aide : Des questions pour vous aiguiller > > - Que cherche-t-on vraiment à compter ? > - Ne peut-on pas utiliser des fonctions découvertes dans ces premiers ateliers ? > - Que dit la "Remarque :" de la question R11 ? Ne peut-on pas faire la même chose avec les valeurs à afficher ? >[!tip]- Voir la solution > 1- Voir la vidéo explicative > >[!flou] Vidéo > >Ne pas hésiter à mettre la vidéo en plein écran et sur pause pour prendre le temps de lire ou de chercher la suite seul. > ><iframe width="560" height="315" src="https://www.youtube.com/embed/y1E15HO5bdA?si=uXz-jMwY5FKMMkGu" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> > >2- La requête SQL > >[!flou] Requête SQL > >```SQL > >SELECT if(emprunt = 0, 'Nbre de films Disponibles', 'Nbre de films Empruntés') AS Catégories, > > Count(id_film) AS 'Nbre de Films' > >FROM T_Film > >GROUP BY emprunt; > >```