**Lien vers la page d'accueil de la compétence (le glisser ici)** # Atelier n°1 ## 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]] ### 01- Afficher toutes les données de la table *T_Film*. **Demande :** Faire une requête qui affiche toute les données de la table *t_film*. >[!question]- Aide : voir tous les champs de la table > >Pour lister tous les champs, vous trouverez la solution dans la page [[01_ Détail sur les 6 mots clés d'une requête sélection]] > >[!tip]- Voir la solution > 1- Préparation de la requête > >[!flou] schéma > >![[Pasted image 20260227182401.png]] > > 2- La requête > >[!flou] Requête SQL > >```SQL > >SELECT * > >FROM t_film; > >``` ### 02- Taille d'une chaines de caractères **Demande :** Faire une requête qui affiche, pour chaque film, son identifiant, son titre et le nombre de caractères qui composent le titre qui sera affiché dans un champ nommé *longueurTitre*. >[!question]- Aide : Nombre de caractères >Connaitre le nombre de caractères présents dans un champ, vous trouverez la solution dans la page [[07_Fonctions utiles#Les Fonctions Textes]] >[!question]- Aide : Renommer un champ >Pour (re)nommer un champ, vous trouverez la solution dans la page [[01_ Détail sur les 6 mots clés d'une requête sélection]] > ou en regardant la vidéo suivante : ><iframe title="YouTube video player" src="https://www.youtube.com/embed/sdxZ3l-ENDA?si=oP0bi3cmO_k1ZgGo" width="560" height="315" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen"></iframe> >[!tip]- Voir la solution > 1- Préparation de la requête > >[!flou] schéma > >![[Pasted image 20260227194316.png]] > > 2- La requête > >[!flou] Requête SQL > >```SQL > >SELECT id_film, titre, CHAR_LENGTH(titre) AS longueurTitre > >FROM t_film; > >``` > > ### 03- Critères de sélection, opérateur LIKE et tri. **Demande :** Liste des films américains contenant "poi" dans leur titre. On affichera le titre des films, avec leur durée et l'année de sortie, des plus récents aux plus anciens. >[!question]- Aide : Utiliser WHERE, LIKE et ORDER BY >Pour utiliser correctement WHERE, LIKE et ORDER BY, vous trouverez la solution dans la page [[01_ Détail sur les 6 mots clés d'une requête sélection]] > > Vous pouvez aussi regarder les vidéos suivantes : > **Utiliser `WHERE` :** ><iframe title="YouTube video player" src="https://www.youtube.com/embed/W2v8KU6NKqA?si=qkMdQ2Fqo5V68d5L" width="560" height="315" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen"></iframe> > >**Utiliser `LIKE` :** ><iframe title="YouTube video player" src="https://www.youtube.com/embed/cumc7nAxSuw?si=LK4KcoJL7Vf8Dx_7" width="560" height="315" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen"></iframe> > >>[!important] Nous ne sommes plus sur Access mais sur MySQL >> * `*`est remplacé par `%` : Représente zéro, un ou plusieurs caractères. >> * `?`est remplacé par `_` : Représente un seul caractère. > >**Utiliser `ORDER BY` :** ><iframe title="YouTube video player" src="https://www.youtube.com/embed/7MYcShTQmz4?si=iGoV5Lc_T4ZV_VKT" width="560" height="315" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen"></iframe> > >[!tip]- Voir la solution > 1- Préparation de la requête > >[!flou] schéma > >![[Pasted image 20260227224923.png]] > > 2- La requête > >[!flou] Requête SQL > >```SQL > >SELECT titre, duree, annee_sortie >> FROM t_film f inner join t_pays p ON f.id_pays = p.id_pays >> WHERE titre LIKE "%poi%" AND nom_pays = "Etats_Unis" >> ORDER BY annee_sortie desc; > >``` > >Autre solution : > >```SQL > >SELECT titre, duree, annee_sortie >> FROM t_pays p inner join t_film f ON p.id_pays = f.id_pays >> WHERE titre LIKE "%poi%" AND nom_pays = "Etats_Unis" >> ORDER BY annee_sortie desc; > >``` ### 04- Opérateur BETWEEN **Demande :** Liste de **tous** les films sortis entre 1980 et 2000 sans résumé et non empruntés. En plus du titre, nous afficherons l'année de sortie et le type du film. >[!question]- Aide : BETWEEN >Pour utiliser correctement BETWEEN, vous trouverez la solution dans la page [[01_ Détail sur les 6 mots clés d'une requête sélection]] > >[!important]- Avez-vous bien lu la demande ?... >Attention, il y a un mot en gras dans la demande. Quel pourrait-être le problème ? L'avez-vous bien géré ? > >[!tip]- Voir la solution > 1- Préparation de la requête > >[!flou] schéma > >![[Pasted image 20260227233240.png]] > > 2- La requête > >[!flou] Requête SQL > >```SQL > >select titre, annee_sortie, nom_type > > from t_film f LEFT JOIN t_type t ON f.id_type = t.id_type > > where annee_sortie BETWEEN 1980 AND 2000 and resume is NULL and emprunt = FALSE; > >``` > >Autre solution : > >```SQL > >select titre, annee_sortie, nom_type > > from t_type t RIGHT JOIN t_film f ON t.id_type = f.id_type > > where annee_sortie BETWEEN 1980 AND 2000 and resume is NULL and emprunt = FALSE; > >``` ### 05- Comprendre une requête et l'écrire autrement **Demande :** Déterminer ce que fait la requête ci-dessous. - Faire le schéma qui permet de préparer une requête. - En déduire ce que fait cette requête ```SQL SELECT titre, nom_pays FROM t_film t INNER JOIN T_pays p ON t.id_pays = p.id_pays WHERE nom_pays = "Etats_Unis" AND emprunt = true OR nom_pays = "Italie" AND emprunt = true ORDER BY titre DESC; ``` >[!tip]- Voir la solution > 1- Préparation de la requête > >[!flou] schéma > >![[Pasted image 20260228000819.png]] **Demande :** En réutilisant vos cours de logique, saurez-vous écrire autrement les conditions présentes dans le `WHERE` ? >[!tip]- Voir la solution > > >[!flou] Passer par la logique puis revenir au SQL > > Je commence par poser : A, B et C : > > $A : nom_pays = "Etats_Unis"$ > > $B : emprunt = true$ > > $C : nom_pays = "Italie"$ > > Cela donne : $A \cdot B + C \cdot B$ > > En simplifiant, nous obtenons : $B \cdot (A + C)$ > > On repasse au `SQL` : > > ```SQL > > SELECT titre, nom_pays > > FROM t_film t INNER JOIN T_pays p ON t.id_pays = p.id_pays > > WHERE emprunt = true AND (nom_pays = "Etats_Unis" OR nom_pays = "Italie") > > ORDER BY titre DESC; > > ``` > > > > ![[Pasted image 20260302144908.png]] > **Demande :** Maintenant que vous avez changé l'écriture des conditions, il devrait vous être facile d'utiliser la fonction `IN`. >[!tip]- Voir la solution > > >[!flou] Le nom du pays doit être dans une liste > > ```SQL > > SELECT titre, nom_pays > > FROM t_film t INNER JOIN T_pays p ON t.id_pays = p.id_pays > > WHERE emprunt = true AND nom_pays IN ("Etats_Unis","Italie") > > ORDER BY titre DESC; > > ``` > ### 06 : Comprendre ce qu'il se passe dans le `FROM` **Demande :** Afficher le nom des pays présents dans la base mais sans films associés. >[!question]- Aide >Tout se joue dans le `FROM` puis le `WHERE`. >Une fois que vous aurez les enregistrements qu'il vous faut (`FROM`), vous pourrez retirer ceux qui ne vous intéressent pas (`WHERE`) > >[!tip]- Voir la solution > 1- Préparation de la requête > >[!flou] schéma > >![[Pasted image 20260302155720.png]] > > > >**Remarque :** Si vous avez prévu une jointure strict `INNER JOIN`, vous n'auriez que les films dont on connait le pays. Les Pays sans films ne seraient pas présents alors que c'est ce que vous cherchez. > >Avec la dissymétrie t_pays ->t_film, on a tous les pays présents à la sortie du `FROM` : > >![[Pasted image 20260302161032.png]] > > > >Ensuite, grâce au `WHERE`, il faut retirer les films dont on connait le pays pour ne garder que les pays sans film. Pour cela, prendre un champ de la table film et vérifier qu'il est `NULL`. On vous conseille de prendre un champ qui est non `NULL` quand l'enregistrement existe. Dans notre cas, nous prenons `id_film` qui est la clé primaire. > >*Si vous ne comprenez pas tout aux explications ci-dessus, il faut revoir le cours car ce sont des notions **extrêmement** importantes.* > > 2- La requête > >[!flou] Requête SQL > >```SQL > >select nom_pays > >from t_pays p left join t_film f on p.id_pays = f.id_pays > >where id_film is null; > >``` > >Autre solution : > >```SQL > >select nom_pays > >from t_film f right join t_pays p on f.id_pays = p.id_pays > >where id_film is null; > >```