**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;
> >```