nsi:terminales:sql_requests
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| nsi:terminales:sql_requests [2021/08/19 15:01] – goupillwiki | nsi:terminales:sql_requests [2022/08/29 21:45] (Version actuelle) – goupillwiki | ||
|---|---|---|---|
| Ligne 15: | Ligne 15: | ||
| Afin d' | Afin d' | ||
| - | {{ :nsi: | + | {{ nsi: |
| Pour cette base, nous besoin de deux tables FILM et ARTISTE et aussi d'une table JOUEDANS pour la relation du haut : | Pour cette base, nous besoin de deux tables FILM et ARTISTE et aussi d'une table JOUEDANS pour la relation du haut : | ||
| Ligne 72: | Ligne 72: | ||
| * commencer par créer une bdd vide, | * commencer par créer une bdd vide, | ||
| * chercher " | * chercher " | ||
| - | * chercher " | + | * chercher " |
| + | </ | ||
| ==== Les domaines = types de données ==== | ==== Les domaines = types de données ==== | ||
| Ligne 103: | Ligne 104: | ||
| Dans le texte de la biographie, vous pouvez voir la présence de caractères '' | Dans le texte de la biographie, vous pouvez voir la présence de caractères '' | ||
| - | ==== On ne précise pas la clé primaire ==== | + | <WRAP tip> |
| + | ==== Préciser ou non la clé primaire | ||
| - | '' | + | On a le choix : on peut décider de préciser un '' |
| + | |||
| + | <code sql> | ||
| + | INSERT INTO ARTISTE(idArtiste, | ||
| + | </ | ||
| + | |||
| + | et on précise l' | ||
| + | |||
| + | Puisque dans la requête précédente figurent toutes les colonnes de la table, on peut se contenter de : | ||
| + | |||
| + | <code sql> | ||
| + | INSERT INTO ARTISTE VALUES(129, 'Jo', ' | ||
| + | </ | ||
| + | |||
| + | Dans les sujets | ||
| + | </ | ||
| ==== Erreur si insertion de film sans idReal ==== | ==== Erreur si insertion de film sans idReal ==== | ||
| Ligne 201: | Ligne 218: | ||
| </ | </ | ||
| - | < | + | ===== Consulter la table ===== |
| - | ## Consulter la table | + | |
| - | Nous abons vu comment créer la base, créer des items, en supprimer, en modifier. | + | Nous avons vu comment créer la base, créer des items, en supprimer, en modifier. |
| Nous allons passer maintenant aux commandes permettant d'en explorer le contenu. | Nous allons passer maintenant aux commandes permettant d'en explorer le contenu. | ||
| - | Une base est construite par des milliers d' | + | <WRAP box>Une base est construite par des milliers d' |
| - | Vous disposez du fichier | + | Vous disposez du fichier |
| + | </ | ||
| - | ### Sélection | + | ==== Sélection |
| - | La commande `SELECT` permet d' | + | === cas le plus simple |
| - | ```sql | + | La commande '' |
| + | |||
| + | < | ||
| SELECT * FROM ARTISTE; | SELECT * FROM ARTISTE; | ||
| - | ``` | + | </ |
| - | `*` est un symbole couramment utilisé quand on veut dire TOUT. Donc ici on renvoie toutes les colonnes pour toute la table ARTISTE. | + | '' |
| - | ```sql | + | === projection === |
| + | |||
| + | < | ||
| SELECT nom, prénom FROM ARTISTE; | SELECT nom, prénom FROM ARTISTE; | ||
| - | ``` | + | </ |
| - | Presque la même chose, sinon que l'on ne demande que la colonne nom et la colonne prénom. On parle de **projection**. | + | Presque la même chose, sinon que l'on ne demande que la colonne |
| - | ```sql | + | === clause WHERE === |
| + | |||
| + | < | ||
| SELECT nom, prénom FROM ARTISTE WHERE naissance > ' | SELECT nom, prénom FROM ARTISTE WHERE naissance > ' | ||
| - | ``` | + | </ |
| La clause WHERE permet de limiter le retour aux seuls artistes dont la naissance vient après le 01/01/1970. | La clause WHERE permet de limiter le retour aux seuls artistes dont la naissance vient après le 01/01/1970. | ||
| - | ```sql | + | === clause LIKE === |
| + | |||
| + | < | ||
| SELECT nom, prénom FROM ARTISTE WHERE nom LIKE ' | SELECT nom, prénom FROM ARTISTE WHERE nom LIKE ' | ||
| - | ``` | + | </ |
| - | LIKE signifie RESSEMBLE, ici on ne garde que les artistes dont le nom commence par 'Bo'. | + | '' |
| - | On peut éviter d' | + | === doublons, |
| - | ```sql | + | On peut éviter d' |
| + | |||
| + | < | ||
| SELECT rôle FROM JOUEDANS; | SELECT rôle FROM JOUEDANS; | ||
| SELECT DISTINCT rôle FROM JOUEDANS; | SELECT DISTINCT rôle FROM JOUEDANS; | ||
| - | ``` | + | </ |
| - | Et on peut trier - *tri par naissance puis nom dans le premier cas, ordre descendant dans le second cas*. | + | === tri === |
| - | ```sql | + | Et on peut trier : |
| + | * tri par naissance puis nom dans le premier cas, | ||
| + | * ordre descendant dans le second cas -- mot clé '' | ||
| + | |||
| + | < | ||
| SELECT nom, prénom FROM ARTISTE ORDER BY naissance, nom; | SELECT nom, prénom FROM ARTISTE ORDER BY naissance, nom; | ||
| SELECT nom, prénom FROM ARTISTE ORDER BY naissance DESC; | SELECT nom, prénom FROM ARTISTE ORDER BY naissance DESC; | ||
| - | ``` | + | </ |
| + | |||
| + | <wrap important> | ||
| + | |||
| + | === compte === | ||
| + | |||
| + | On peut compter les items. Par exemple la requête suivante renvoie une liste de noms avec éventuellement des doublons : | ||
| + | |||
| + | <code sql> | ||
| + | SELECT nom from ARTISTE; | ||
| + | </ | ||
| + | |||
| + | Si nous n' | ||
| + | |||
| + | <code sql> | ||
| + | SELECT COUNT(nom) from ARTISTE; | ||
| + | </ | ||
| + | |||
| + | Cette requête est différente puisqu' | ||
| + | |||
| + | <WRAP tip>On compte tous les noms apparaissant, | ||
| + | |||
| + | <WRAP info> | ||
| - | ### Jointure | + | Plus loin encore : on pourrait produire une liste avec chaque nom associé avec le nombre d' |
| + | ==== Jointure | ||
| Si je veux afficher les films | Si je veux afficher les films | ||
| - | ```sql | + | < |
| SELECT * FROM FILM; | SELECT * FROM FILM; | ||
| - | ``` | + | </ |
| On n'est pas très satisfait car on ne voit pas le nom du réalisateur, | On n'est pas très satisfait car on ne voit pas le nom du réalisateur, | ||
| Ligne 268: | Ligne 322: | ||
| On réalise pour cela une **jointure**. | On réalise pour cela une **jointure**. | ||
| - | ```sql | + | < |
| SELECT * FROM FILM JOIN ARTISTE ON FILM.idReal = ARTISTE.idArtiste; | SELECT * FROM FILM JOIN ARTISTE ON FILM.idReal = ARTISTE.idArtiste; | ||
| - | ``` | + | </ |
| Et voilà ! | Et voilà ! | ||
| Ligne 276: | Ligne 330: | ||
| On peut bien sûr limiter les colonnes, filtrer avec WHERE, trier, tout cela en même temps : | On peut bien sûr limiter les colonnes, filtrer avec WHERE, trier, tout cela en même temps : | ||
| - | ```sql | + | < |
| SELECT titreVO, année, nom, prénom FROM FILM JOIN ARTISTE ON FILM.idReal = ARTISTE.idArtiste WHERE année > 2000 ORDER BY naissance; | SELECT titreVO, année, nom, prénom FROM FILM JOIN ARTISTE ON FILM.idReal = ARTISTE.idArtiste WHERE année > 2000 ORDER BY naissance; | ||
| - | ``` | + | </ |
| - | *Remarque : ORDER BY doit être après WHERE* | + | <wrap important> |
| - | ## Des requêtes | + | <WRAP tip> |
| - | + | <code sql linenums> | |
| - | On utilise la base précédente. | + | SELECT * FROM FILM, ARTISTE; |
| - | + | </ | |
| - | ### Applications directes, sans jointure | + | On obtient |
| - | + | < | |
| - | 1. Lister | + | SELECT * FROM FILM, ARTISTE WHERE FILM.idReal |
| - | 2. Lister tous les titreVO de films dont le réalisateur à l'idArtiste 15 | + | </ |
| - | 3. Lister tous les rôles joués par l' | + | Ce qui revient |
| - | + | ||
| - | ### Avec une jointure | + | |
| - | + | ||
| - | 4. Lister tous les titreVO, année des films de Tarantino | + | |
| - | 5. Lister tous les rôles de Brad Pitt | + | |
| - | 6. Lister tous les titreVO, année des films dans lequel a joué l'artiste avec l'idArtiste 1 | + | |
| - | 7. Lister les noms et prénoms de tous les réalisateurs (*c'est à dire des artistes qui sont réalisateurd d'un film*) | + | |
| - | + | ||
| - | ### Avec deux jointures | + | |
| - | + | ||
| - | Pour lier un artiste | + | |
| - | + | ||
| - | ```sql | + | |
| - | ... FROM JOUEDANS | + | |
| - | JOIN FILM ON FILM.idFilm = JOUEDANS.idFilm | + | |
| - | JOIN ARTISTE ON ARTISTE.idArtiste = JOUEDANS.idArtiste | + | |
| - | ``` | + | |
| - | + | ||
| - | 8. Trouver tous les titreVO, année des films dans lesquels joue un artiste nommé Willis | + | |
| - | + | ||
| - | 9. Trouver tous les titreVO, année des films dont un acteur est né après 1970 | + | |
| - | + | ||
| - | *Remarque : La requête 8. correspond à la requête 6. mais nécessite une jointure supplémentaire. En situation réelle, on sera plutôt dans la situation du 6. car on connaîtra | + | |
| - | + | ||
| - | ### Avec trois jointures... | + | |
| - | + | ||
| - | *Ça commence à devenir plus compliqué et on ne vous demande pas d'aller si loin.* | + | |
| - | + | ||
| - | Si pour une paire acteur - film, on veut en plus avoir le réalisateur du film, il faut en plus joindre FILM à ARTISTE selon la clé idRéal. Cette fois c'est plus difficile car ceci ne fonctionne pas : | + | |
| - | + | ||
| - | ```sql | + | |
| - | ... FROM JOUEDANS | + | |
| - | JOIN FILM ON FILM.idFilm | + | |
| - | JOIN ARTISTE ON ARTISTE.idArtiste | + | |
| - | JOIN ARTISTE ON ARTISTE.idArtiste = FILM.idReal | + | |
| - | ``` | + | |
| - | + | ||
| - | Car ARTISTE apparaît deux fois pour des raisons différentes. Il est possible de se sortir d' | + | |
| - | ```sql | + | // |
| - | ... FROM JOUEDANS | + | </WRAP> |
| - | JOIN FILM ON FILM.idFilm = JOUEDANS.idFilm | + | |
| - | JOIN ARTISTE acteur ON acteur.idArtiste = JOUEDANS.idArtiste | + | |
| - | JOIN ARTISTE réalisateur ON réalisateur.idArtiste = FILM.idReal | + | |
| - | ``` | + | |
| - | + | ||
| - | L' | + | |
| - | + | ||
| - | Supposons que l'on veuille visualiser le nom d' | + | |
| - | + | ||
| - | ```sql | + | |
| - | SELECT nom, nom, titreVO FROM JOUEDANS | + | |
| - | JOIN FILM ON FILM.idFilm = JOUEDANS.idFilm | + | |
| - | JOIN ARTISTE acteur ON acteur.idArtiste = JOUEDANS.idArtiste | + | |
| - | JOIN ARTISTE réalisateur ON réalisateur.idArtiste = FILM.idReal | + | |
| - | ``` | + | |
| - | + | ||
| - | car les deux occurences de nom sont ambigues : est-ce nom pour la première occurence de ARTISTE (acteur) ou la deuxième (réalisateur) ? Il faudra préciser : | + | |
| - | + | ||
| - | ```sql | + | |
| - | SELECT acteur.nom, réalisateur.nom, | + | |
| - | JOIN FILM ON FILM.idFilm = JOUEDANS.idFilm | + | |
| - | JOIN ARTISTE acteur ON acteur.idArtiste = JOUEDANS.idArtiste | + | |
| - | JOIN ARTISTE réalisateur ON réalisateur.idArtiste = FILM.idReal | + | |
| - | ``` | + | |
| - | + | ||
| - | 10. Trouver | + | |
| - | + | ||
| - | 11. Trouver tous les noms, prénoms | + | |
| - | + | ||
| - | ## Les réponses | + | |
| - | + | ||
| - | 1. Lister tous les noms, prénoms, naissances d' | + | |
| - | + | ||
| - | | + | |
| - | | + | |
| - | ``` | + | |
| - | + | ||
| - | 2. Lister tous les films dont le réalisateur à l' | + | |
| - | + | ||
| - | | + | |
| - | | + | |
| - | ``` | + | |
| - | + | ||
| - | 3. Lister tous les rôles joués par l' | + | |
| - | + | ||
| - | | + | |
| - | | + | |
| - | ``` | + | |
| - | + | ||
| - | 4. Lister tous les titreVO, année | + | |
| - | + | ||
| - | | + | |
| - | | + | |
| - | JOIN FILM ON FILM.idReal = ARTISTE.idArtiste | + | |
| - | WHERE nom = ' | + | |
| - | ``` | + | |
| - | + | ||
| - | 5. Lister tous les rôles de Brad Pitt | + | |
| - | + | ||
| - | | + | |
| - | | + | |
| - | JOIN ARTISTE ON JOUEDANS.idArtiste = ARTISTE.idArtiste | + | |
| - | WHERE nom = ' | + | |
| - | ``` | + | |
| - | + | ||
| - | 6. Lister tous les titreVO, année des films dans lequel a joué l' | + | |
| - | + | ||
| - | | + | |
| - | | + | |
| - | JOIN JOUEDANS ON FILM.idFilm = JOUEDANS.idFilm | + | |
| - | WHERE idArtiste = 1; | + | |
| - | ``` | + | |
| - | + | ||
| - | 7. Lister les noms et prénoms de tous les réalisateurs (*c' | + | |
| - | + | ||
| - | | + | |
| - | | + | |
| - | JOIN FILM ON FILM.idReal = ARTISTE.idArtiste; | + | |
| - | ``` | + | |
| - | + | ||
| - | | + | |
| - | + | ||
| - | 8. Trouver tous les titreVO, année des films dans lesquels joue un artiste nommé Willis | + | |
| - | + | ||
| - | | + | |
| - | | + | |
| - | JOIN FILM ON FILM.idFilm = JOUEDANS.idFilm | + | |
| - | JOIN ARTISTE ON ARTISTE.idArtiste = JOUEDANS.idArtiste | + | |
| - | WHERE nom = 'Willis' | + | |
| - | ``` | + | |
| - | + | ||
| - | 9. Trouver tous les titreVO, année des films dont un acteur | + | |
| - | + | ||
| - | | + | |
| - | | + | |
| - | JOIN FILM ON FILM.idFilm = JOUEDANS.idFilm | + | |
| - | JOIN ARTISTE ON ARTISTE.idArtiste = JOUEDANS.idArtiste | + | |
| - | WHERE naissance | + | |
| - | ``` | + | |
| - | + | ||
| - | 10. Trouver tous les noms et prénoms, rôle et titreVO pour des acteurs jouant dans un film de Tarantino | + | |
| - | + | ||
| - | ```sql | + | |
| - | SELECT acteur.nom, acteur.prénom, | + | |
| - | JOIN FILM ON FILM.idFilm = JOUEDANS.idFilm | + | |
| - | JOIN ARTISTE acteur ON acteur.idArtiste = JOUEDANS.idArtiste | + | |
| - | JOIN ARTISTE réalisateur ON réalisateur.idArtiste = FILM.idReal | + | |
| - | WHERE réalisateur.nom = ' | + | |
| - | ``` | + | |
| - | 11. Trouver tous les noms, prénoms de réalisateurs d'un film dont dont un des acteurs est né après 1970 | ||
| - | ```sql | ||
| - | SELECT DISTINCT réalisateur.nom, | ||
| - | JOIN FILM ON FILM.idFilm = JOUEDANS.idFilm | ||
| - | JOIN ARTISTE acteur ON acteur.idArtiste = JOUEDANS.idArtiste | ||
| - | JOIN ARTISTE réalisateur ON réalisateur.idArtiste = FILM.idReal | ||
| - | WHERE acteur.naissance > ' | ||
| - | ``` | ||
| - | </ | ||
nsi/terminales/sql_requests.1629378091.txt.gz · Dernière modification : de goupillwiki
