Écrire une sous-requête dans une clause WHERE
Dans cette étape, vous apprendrez à utiliser une sous-requête dans la clause WHERE
d'une requête SQL. Une sous-requête, également appelée requête interne ou requête imbriquée, est une requête intégrée à l'intérieur d'une autre requête. Les sous-requêtes sont utilisées pour renvoyer des données qui seront utilisées dans la requête principale comme condition pour restreindre davantage les données à extraire.
Comprendre les sous-requêtes dans la clause WHERE
Une sous-requête dans la clause WHERE
est généralement utilisée pour comparer la valeur d'une colonne au résultat de la sous-requête. La sous-requête est exécutée en premier, et son résultat est ensuite utilisé par la requête externe.
Syntaxe de base :
SELECT column1, column2
FROM table_name
WHERE column_name IN (SELECT column_name FROM another_table WHERE condition);
Ici, la sous-requête (SELECT column_name FROM another_table WHERE condition)
renvoie un ensemble de valeurs. La requête externe sélectionne ensuite les lignes de table_name
où column_name
se trouve dans cet ensemble.
Scénario :
Supposons que vous ayez deux tables : employees
(employés) et departments
(départements). La table employees
contient des informations sur les employés, notamment leur employee_id
(identifiant d'employé), employee_name
(nom d'employé) et department_id
(identifiant de département). La table departments
contient des informations sur les départements, notamment leur department_id
et department_name
(nom de département).
Nous voulons trouver tous les employés qui travaillent dans le département 'Sales' (Ventes).
Étape 1 : Créer les tables et insérer des données
Tout d'abord, connectez-vous à la base de données PostgreSQL en utilisant l'utilisateur postgres
:
sudo -u postgres psql
Ensuite, créez la table departments
:
CREATE TABLE departments (
department_id SERIAL PRIMARY KEY,
department_name VARCHAR(50)
);
Insérez des exemples de données dans la table departments
:
INSERT INTO departments (department_name) VALUES
('Sales'),
('Marketing'),
('Engineering');
Maintenant, créez la table employees
:
CREATE TABLE employees (
employee_id SERIAL PRIMARY KEY,
employee_name VARCHAR(50),
department_id INTEGER REFERENCES departments(department_id)
);
Insérez des exemples de données dans la table employees
:
INSERT INTO employees (employee_name, department_id) VALUES
('Alice', 1),
('Bob', 2),
('Charlie', 1),
('David', 3),
('Eve', 2);
Étape 2 : Écrire la sous-requête
Maintenant, écrivons la requête pour trouver tous les employés qui travaillent dans le département 'Sales' en utilisant une sous-requête dans la clause WHERE
.
SELECT employee_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'Sales');
Explication :
- La sous-requête
(SELECT department_id FROM departments WHERE department_name = 'Sales')
sélectionne le department_id
de la table departments
où le department_name
est 'Sales'. Dans ce cas, elle renverra 1
.
- La requête externe sélectionne ensuite le
employee_name
de la table employees
où le department_id
se trouve dans l'ensemble renvoyé par la sous-requête (qui est juste 1
).
Étape 3 : Exécuter la requête et afficher les résultats
Exécutez la requête dans votre terminal psql
. Vous devriez voir la sortie suivante :
employee_name
---------------
Alice
Charlie
(2 rows)
Cela montre qu'Alice et Charlie sont les employés qui travaillent dans le département 'Sales'.
Étape 4 : Utilisation de EXISTS
avec des sous-requêtes
Une autre façon d'utiliser des sous-requêtes dans la clause WHERE
est avec l'opérateur EXISTS
. L'opérateur EXISTS
teste l'existence de lignes dans une sous-requête. Il renvoie true si la sous-requête renvoie des lignes, et false sinon.
Voici un exemple d'utilisation de EXISTS
pour obtenir le même résultat :
SELECT employee_name
FROM employees e
WHERE EXISTS (
SELECT 1
FROM departments d
WHERE d.department_id = e.department_id
AND d.department_name = 'Sales'
);
Cette requête obtient le même résultat que la précédente, mais utilise l'opérateur EXISTS
au lieu de IN
.
Explication :
- La sous-requête
SELECT 1 FROM departments d WHERE d.department_id = e.department_id AND d.department_name = 'Sales'
vérifie s'il existe un département avec le nom 'Sales' qui a le même department_id
que l'employé actuel.
- Si la sous-requête renvoie des lignes (ce qui signifie qu'il existe un département 'Sales' avec le même
department_id
), l'opérateur EXISTS
renvoie true, et le nom de l'employé est sélectionné.
Exécutez la requête dans votre terminal psql
. Vous devriez voir la même sortie qu'avant :
employee_name
---------------
Alice
Charlie
(2 rows)
Vous avez maintenant utilisé avec succès une sous-requête dans la clause WHERE
pour filtrer les données en fonction d'une condition dans une autre table. Vous avez également appris à utiliser l'opérateur EXISTS
avec une sous-requête.