%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %%
> [!nav]
> ↩ [[Code et Développement/Développement d'Applications/SQL I/SQL I|Accueil · SQL I]]
>
> | [[Code et Développement/Développement d'Applications/SQL I/01_ Détails sur les 6 mots clés d'une requête sélection\|← Détails sur les 6 mots clés d'une requête sélection]] | [[Code et Développement/Développement d'Applications/SQL I/03_ Opérations entre les enregistrements\|Opérations entre les enregistrements →]] |
> |:---|---:|
%% nav-fin %%
[[01_ Détails sur les 6 mots clés d'une requête sélection|Détails sur les 6 mots clés d'une requête sélection]]
# Requêtes sur une seule table
Tout vous a été présenté dans le chapitre précédent.
Ici, nous allons simplement appliquer les premières étapes d'une requête basée sur une seule table pour bien comprendre ce qu'il se passe. Cela nous permettra dans les prochains chapitres de pouvoir faire le lien quand il y a 2 ou plusieurs tables.
## La table `Produits`
Prenons comme exemple la table `Produits` :
| id_produit | nom_produit | prix_unitaire | stock | categorie |
| :--------- | :---------- | :------------ | :---- | :----------- |
| 1 | Ordinateur | 1200.00 | 50 | Électronique |
| 2 | Souris | 25.00 | 200 | Périphérique |
| 3 | Clavier | 75.00 | 150 | Périphérique |
| 4 | Écran | 300.00 | 80 | Électronique |
| 5 | Routeur | 150.00 | NULL | Réseau |
## La demande initiale
Supposons que vous souhaitiez afficher ***la liste des produits (juste le nom des produits dans l'ordre alphabétique) dont le prix est supérieur à 100 et le stock est inférieur à 100***.
## La requête répondant à la demande
Nous aurions alors la requête suivante :
```sql
SELECT nom_produit
FROM Produits
WHERE prix_unitaire > 100 AND stock < 100
ORDER BY nom_produit;
```
## Exécution de la requête
### Avant de commencer
1. N'oubliez pas l'ordre d'exécution d'une requête : `FROM` → `WHERE` → `SELECT` → `ORDER BY`.
Ici, il n'y a ni `GROUP BY` ni `HAVING` : ces étapes sont donc sautées.
2. À chaque étape de la requête, sachez toujours à quoi correspond un enregistrement.
>[!important] Pourquoi savoir à quoi correspond un enregistrement
>- Comprendre ce que représentent les informations qui sortent d'une requête.
> *Essentiel si nous nous servons de ces données pour faire d'autres requêtes.*
>- Quand on fait des opérations d'agrégats, cela permet de s'assurer que les calculs sont bons.
> *En particulier quand nous allons compter. Mais pas que !*
### Résultat après le `FROM`
Dans le `FROM`, il n'y a qu'une table. Donc après son exécution, nous retrouvons les enregistrements de la table `Produits` :
| id_produit | nom_produit | prix_unitaire | stock | categorie |
| :--------- | :---------- | :------------ | :---- | :----------- |
| 1 | Ordinateur | 1200.00 | 50 | Électronique |
| 2 | Souris | 25.00 | 200 | Périphérique |
| 3 | Clavier | 75.00 | 150 | Périphérique |
| 4 | Écran | 300.00 | 80 | Électronique |
| 5 | Routeur | 150.00 | NULL | Réseau |
Ici, ***un enregistrement correspond à un enregistrement de la table `Produits` donc, par définition, à un produit***.
### Résultat après le `WHERE`
Le `WHERE` contient les conditions :
```sql
prix_unitaire > 100 AND stock < 100
```
Les enregistrements sortis du `FROM` qui ne correspondent pas aux critères du `WHERE` sont mis en rouge ci-dessous et vont disparaître.
| id_produit | nom_produit | prix_unitaire | stock | categorie |
| :--------- | :---------- | :------------ | :---- | :----------- |
| 1 | Ordinateur | 1200.00 | 50 | Électronique |
| <em style="color:red;text-decoration: line-through;">2</em> | <em style="color:red;text-decoration: line-through;">Souris</em> | <em style="color:red;text-decoration: line-through;">25.00</em> | <em style="color:red;text-decoration: line-through;">200</em> | <em style="color:red;text-decoration: line-through;">Périphérique</em> |
| <em style="color:red;text-decoration: line-through;">3</em> | <em style="color:red;text-decoration: line-through;">Clavier</em> | <em style="color:red;text-decoration: line-through;">75.00</em> | <em style="color:red;text-decoration: line-through;">150</em> | <em style="color:red;text-decoration: line-through;">Périphérique</em> |
| 4 | Écran | 300.00 | 80 | Électronique |
| <em style="color:red;text-decoration: line-through;">5</em> | <em style="color:red;text-decoration: line-through;">Routeur</em> | <em style="color:red;text-decoration: line-through;">150.00</em> | <em style="color:red;text-decoration: line-through;">NULL</em> | <em style="color:red;text-decoration: line-through;">Réseau</em> |
- La `Souris` (25.00) et le `Clavier` (75.00) disparaissent car leur prix n'est pas supérieur à 100 (ils ont aussi un stock supérieur à 100).
- Le `Routeur` a bien un prix supérieur à 100, mais son stock est inconnu (`NULL`). Le SGBD ne peut pas affirmer que `stock < 100` est vrai : la condition n'est donc pas remplie et le `Routeur` disparaît lui aussi.
> [!warning] Les `NULL` et les conditions
> Une condition appliquée à une valeur `NULL` (`stock < 100`, `stock = 0`, `stock > 100`…) n'est jamais vraie. Pour retrouver les enregistrements dont un champ est `NULL`, il faut utiliser `IS NULL` (voir le chapitre [[01_ Détails sur les 6 mots clés d'une requête sélection|Détails sur les 6 mots clés d'une requête sélection]]).
Après l'exécution du `WHERE`, nous obtenons :
| id_produit | nom_produit | prix_unitaire | stock | categorie |
| :--------- | :---------- | :------------ | :---- | :----------- |
| 1 | Ordinateur | 1200.00 | 50 | Électronique |
| 4 | Écran | 300.00 | 80 | Électronique |
Maintenant, *un enregistrement correspond à un produit* ***dont le prix unitaire est supérieur à 100 et le stock inférieur à 100***.
### Résultat après le `SELECT`
Dans le `SELECT`, on demande à ne mettre que le champ `nom_produit`. Il reste donc :
| nom_produit |
| :---------- |
| Ordinateur |
| Écran |
Un enregistrement correspond au ***nom d'*** *un produit dont le prix unitaire est supérieur à 100 et le stock inférieur à 100*.
### Résultat après le `ORDER BY`
Dans le `ORDER BY`, il y a le champ `nom_produit` sans précision, c'est donc l'ordre croissant (`ASC`), ici l'ordre alphabétique.
Cela donne :
| nom_produit |
| :---------- |
| Écran |
| Ordinateur |
Cela ne change rien pour la définition d'un enregistrement qui correspond donc toujours au *nom d'un produit dont le prix unitaire est supérieur à 100 et le stock inférieur à 100*.
***Ce résultat est celui qui sortira de notre requête.***
---
>[!important] Avant de continuer
>Ces explications vous ont certainement semblé très simples. Pourtant, il faut s'assurer de bien les maîtriser avant de continuer car nous allons :
>1. ajouter la notion d'agrégation, qui va changer ce que représente un enregistrement ;
>2. travailler sur plusieurs tables, ce qui peut rendre plus complexe la définition d'un enregistrement.
Prochaine étape, faire des requêtes permettant d'analyser un ensemble d'enregistrements :
[[Code et Développement/Développement d'Applications/SQL I/03_ Opérations entre les enregistrements|Opérations entre les enregistrements]]
%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %%
> [!nav]
> ↩ [[Code et Développement/Développement d'Applications/SQL I/SQL I|Accueil · SQL I]]
>
> | [[Code et Développement/Développement d'Applications/SQL I/01_ Détails sur les 6 mots clés d'une requête sélection\|← Détails sur les 6 mots clés d'une requête sélection]] | [[Code et Développement/Développement d'Applications/SQL I/03_ Opérations entre les enregistrements\|Opérations entre les enregistrements →]] |
> |:---|---:|
%% nav-fin %%
---
🗓️ Historique
Dernière mise à jour : `21 octobre 2026`
Rédigé par : [[Vincent TELLIER]]