Requêtes sql
par Dominique DOLÉ
décembre 2011
Table des matières
1 Sélections sur table unique 4
1.1 Liste simple 4
1.1.1 Énoncé 4
1.1.2 Résultat 4
1.1.3 Requête 4
1.2 Liste avec élimination des doublons 5
1.2.1 Énoncé 5
1.2.2 Résultat 5
1.2.3 Résultat avec liste simple 5
1.2.4 Requête 5
2 Comment exécuter une requête 6
2.1 Par la console graphique phpMyAdmin 6
2.1.1 Après sélection de la base de données 6
2.1.2 Directement depuis la page d'accueil 6
2.2 Par la console MySQL 6
2.2.1 En entrant le texte au clavier 6
2.2.2 En collant le code par un clic droit 7
2.2.3 Envoi du résultat dans un fichier Texte 7
2.2.4 Envoi du résultat dans un fichier Excel 8
2.3 Par la fenêtre de commande Windows (cmd) 8
2.3.1 Affichage dans la fenêtre 8
2.3.2 Import d'un fichier texte SQL contenant la requête 9
2.3.3 Envoi du résultat dans un fichier Html 9
2.3.4 Envoi du résultat dans un fichier Xml 10
2.3.5 Gestion des caractères accentués 11
2.4 En Php 12
2.4.1 Code Php 12
2.4.2 Résultat 12
3 Sélections avec jointure interne simple 13
3.1 Liste simple 14
3.1.1 Énoncé 14
3.1.2 Résultat 14
3.1.3 Requête avec l’ancienne syntaxe 14
3.1.4 Requête avec la syntaxe actuelle 14
3.1.5 Requête en utilisant les alias 14
3.1.6 Requête en utilisant la syntaxe simplifiée 15
3.2 Liste sélective 15
3.2.1 Énoncé 15
3.2.2 Résultat 15
3.2.3 Requête 15
Dominique DOLÉ Requêtes SQL page 2
3.3 Liste filtrée 16
3.3.1 Énoncé 16
3.3.2 Résultat 16
3.3.3 Requête 16
3.4 Liste ordonnée 16
3.4.1 Énoncé 16
3.4.2 Résultat 16
3.4.3 Requête 16
3.5 Sélection groupée et comptage 17
3.5.1 Énoncé 17
3.5.2 Résultat 17
3.5.3 Requête 17
3.6 Sélection groupée et filtrée 17
3.6.1 Énoncé 17
3.6.2 Résultat 17
3.6.3 Requête 17
3.7 Renommer une colonne 18
3.7.1 Énoncé 18
3.7.2 Résultat 18
3.7.3 Requête 18
3.8 Concaténation de données 19
3.8.1 Énoncé 19
3.8.2 Résultat 19
3.8.3 Requête 19
4 Sélections imbriquées 20
4.1.1 Énoncé 20
4.1.2 Résultat 20
4.1.3 Requête 20
5 Sélections avec jointures internes sur tables multiples 20
5.1 Clés étrangères multiples 20
5.1.1 Énoncé 21
5.1.2 Résultat 21
5.1.3 Requête 22
5.2 Tables en cascades 22
5.2.1 Énoncé 24
5.2.2 Résultat 24
5.2.3 Requête 24
Dominique DOLÉ Requêtes SQL page 3
1 Sélections sur table unique
Soit la base de données « GestionDuPersonnel » ci-dessous
1.1 Liste simple
1.1.1 Énoncé
Liste de toutes les données de toutes les personnes.
1.1.2 Résultat
1.1.3 Requête
SELECT *
FROM personnes
Dominique DOLÉ Requêtes SQL page 4
1.2 Liste avec élimination des doublons
1.2.1 Énoncé
Liste des services.
1.2.2 Résultat
1.2.3 Résultat avec liste simple
Si on utilise la requête ci-dessous
SELECT Service
FROM personnes
On obtient le résultat suivant
Pour avoir une liste sans doublons il faudra utiliser la requête ci-dessous
1.2.4 Requête
SELECT DISTINCT Service
FROM personnes
Dominique DOLÉ Requêtes SQL page 5
2 Comment exécuter une requête
2.1 Par la console graphique phpMyAdmin
2.1.1 Après sélection de la base de données
2.1.2 Directement depuis la page d'accueil
Il faut rajouter le nom de base de données (gestiondupersonnel)
2.2 Par la console MySQL
2.2.1 En entrant le texte au clavier
Ne pas oublier le ; à la fin de ligne de commande
Dominique DOLÉ Requêtes SQL page 6
On peut sélectionner la base de données avant d'indiquer la requête (par la
commande use suivi du nom de base de données), on a alors plus besoin de la
spécifier dans la requête.
2.2.2 En collant le code par un clic droit
Le CTRL V ne fonctionne pas !
2.2.3 Envoi du résultat dans un fichier Texte
Il faut spécifier le chemin et le nom du fichier texte à créer
entre guillemets après INTO OUTFILE.
Le fichier texte ne doit pas exister au lancement de la requête !
On peut changer la structure du fichier texte en spécifiant par exemple :
– FIELDS TERMINATED BY '\,' => , comme séparateur
– LINES TERMINATED BY '\n' => LF à la fin de chaque ligne
Dominique DOLÉ Requêtes SQL page 7
2.2.4 Envoi du résultat dans un fichier Excel
2.3 Par la fenêtre de commande Windows (cmd)
2.3.1 Affichage dans la fenêtre
Il faut spécifier le chemin de mysql.
Indiquer le nom d'utilisateur après -u
Spécifier -p pour demander le mot de passe
C:\wamp\bin\mysql\mysql5.5.8\bin\mysql -u root -p -e " SELECT * FROM
[Link]"
On peut également sélectionner la base de données avant le -e,
ainsi on ne sera pas obligé de la mentionner dans la requête.
C:\wamp\bin\mysql\mysql5.5.8\bin\mysql -u root -p gestiondupersonnel -e
"SELECT * FROM personnes"
Dominique DOLÉ Requêtes SQL page 8
2.3.2 Import d'un fichier texte SQL contenant la requête
Soit le fichier [Link] suivant :
C:\wamp\bin\mysql\mysql5.5.8\bin\mysql -u root -p -t <
d:\Temp\MySQL\[Link]
Dans ce cas, il ne faut pas de ; en fin de ligne
Nota : dans ce cas, pour avoir l'affichage sous forme de tableau, il faut
spécifier -t
2.3.3 Envoi du résultat dans un fichier Html
C:\wamp\bin\mysql\mysql5.5.8\bin\mysql -u root -p --html -e "SELECT *
FROM [Link]" > d:/Temp/MySQL/[Link]
Dans ce cas, il ne faut pas de ; en fin de ligne
On peut constater que les caractères accentués sont mal gérés
(é remplacé par ,). Voir la solution au chapitre 2.3.5.
Dominique DOLÉ Requêtes SQL page 9
2.3.4 Envoi du résultat dans un fichier Xml
C:\wamp\bin\mysql\mysql5.5.8\bin\mysql -u root -p --xml -e "SELECT * FROM
[Link]" > d:/Temp/MySQL/[Link]
Dans ce cas, il ne faut pas de ; en fin de ligne
Dominique DOLÉ Requêtes SQL page 10
On peut constater que les caractères accentués sont mal gérés (é
remplacé par ,). Voir la solution au chapitre 2.3.5.
2.3.5 Gestion des caractères accentués
Pour forcer MySQL à travailler avec un jeu de caractère précis, on va devoir
spécifier avant la requête quel jeu de caractères on va utiliser (le même que
celui des tables de la base de données).
On va importer un fichier SQL contenant la spécification du jeu de
caractères et la requête.
On obtient alors un respect des caractères accentués.
C:\wamp\bin\mysql\mysql5.5.8\bin\mysql -u root -p --html <
d:\Temp\MySQL\[Link] > d:/Temp/MySQL/[Link]
C:\wamp\bin\mysql\mysql5.5.8\bin\mysql -u root -p --xml <
d:\Temp\MySQL\[Link] > d:/Temp/MySQL/[Link]
Dominique DOLÉ Requêtes SQL page 11
2.4 En Php
2.4.1 Code Php
2.4.2 Résultat
Dominique DOLÉ Requêtes SQL page 12
3 Sélections avec jointure interne simple
Soit la base de données « GestionDuPersonnel » ci-dessous
Table : personnes
Table : services
Dominique DOLÉ Requêtes SQL page 13
3.1 Liste simple
3.1.1 Énoncé
Liste de toutes les données de toutes les personnes.
3.1.2 Résultat
3.1.3 Requête avec l’ancienne syntaxe
SELECT *
FROM personnes,services
WHERE [Link] = [Link]
3.1.4 Requête avec la syntaxe actuelle
SELECT *
FROM personnes
INNER JOIN services
ON [Link] = [Link]
3.1.5 Requête en utilisant les alias
SELECT *
FROM personnes AS p
INNER JOIN services AS s
ON [Link] = [Link]
La syntaxe ci-dessous est également admise (sans le AS)
SELECT *
FROM personnes p
INNER JOIN services s
ON [Link] = [Link]
Dominique DOLÉ Requêtes SQL page 14
3.1.6 Requête en utilisant la syntaxe simplifiée
On ne peut utiliser la syntaxe simplifiée (sans spécifier la table)
que si les champs sont uniques dans toute la base de données.
Pour respecter cette contrainte, dans la table personnes il faudrait
renommer le champ « idService » par exemple en « fk_idService ».
SELECT *
FROM personnes
INNER JOIN services
ON idservice = fk_idservice
3.2 Liste sélective
3.2.1 Énoncé
Nom, Prénom et Service de toutes les personnes.
3.2.2 Résultat
3.2.3 Requête
SELECT Nom, Prénom, Service
FROM personnes p
INNER JOIN services s
ON [Link] = [Link]
Dominique DOLÉ Requêtes SQL page 15
3.3 Liste filtrée
3.3.1 Énoncé
Nom et Prénom des personnes du service « Secrétariat ».
3.3.2 Résultat
3.3.3 Requête
SELECT Nom, Prénom
FROM personnes p
INNER JOIN services s
ON [Link] = [Link]
WHERE [Link] = "Secrétariat"
3.4 Liste ordonnée
3.4.1 Énoncé
Nom, Prénom et Service de toutes les personnes classées par ordre
alphabétique.
3.4.2 Résultat
3.4.3 Requête
SELECT Nom, Prénom, Service
FROM personnes p
INNER JOIN services s
ON [Link] = [Link]
ORDER BY [Link]
Dominique DOLÉ Requêtes SQL page 16
3.5 Sélection groupée et comptage
3.5.1 Énoncé
Liste des Services classés par ordre alphabétique et nombre de personnes
dans chaque service.
3.5.2 Résultat
3.5.3 Requête
SELECT [Link], COUNT(*)
FROM personnes p
INNER JOIN services s
ON [Link] = [Link]
GROUP BY [Link]
ORDER BY [Link]
3.6 Sélection groupée et filtrée
3.6.1 Énoncé
Liste des Services ayant plus d'une personne et nombre de personnes.
3.6.2 Résultat
3.6.3 Requête
SELECT [Link], COUNT(*)
FROM personnes p
INNER JOIN services s
ON [Link] = [Link]
GROUP BY [Link]
HAVING COUNT(*) > 1
Dominique DOLÉ Requêtes SQL page 17
3.7 Renommer une colonne
3.7.1 Énoncé
Liste des Services classés par ordre alphabétique et Nombre de personnes
dans chaque service (Effectif).
3.7.2 Résultat
3.7.3 Requête
SELECT [Link], COUNT(*) AS Effectif
FROM personnes p
INNER JOIN services s
ON [Link] = [Link]
GROUP BY [Link]
ORDER BY [Link]
La syntaxe ci-dessous est également admise (sans le AS)
SELECT [Link] Emploi, COUNT(*) Effectif
FROM personnes p
INNER JOIN services s
ON [Link] = [Link]
GROUP BY [Link]
ORDER BY [Link]
Dominique DOLÉ Requêtes SQL page 18
Si le nom à attribuer comprend des espaces
(Nombre de personnes), il faut l’encadrer par des guillemets
('Nombre de personnes') :
SELECT [Link], COUNT(*) AS 'Nombre de personnes'
FROM personnes p
INNER JOIN services s
ON [Link] = [Link]
GROUP BY [Link]
ORDER BY [Link]
3.8 Concaténation de données
3.8.1 Énoncé
Liste des Services classés par ordre alphabétique avec entre crochets le
Département et Nombre de personnes dans chaque service (Effectif).
3.8.2 Résultat
3.8.3 Requête
SELECT CONCAT([Link], ' [', s.département, ']')
AS 'Service [Département]', COUNT(*) AS Effectif
FROM personnes p
INNER JOIN services s
ON [Link] = p. idservice
GROUP BY s. service
ORDER BY s. service
Dominique DOLÉ Requêtes SQL page 19
4 Sélections imbriquées
4.1.1 Énoncé
Nom et Prénom des personnes du service « Secrétariat ».
4.1.2 Résultat
4.1.3 Requête
SELECT Nom, Prénom
FROM personnes
WHERE idService
IN
(SELECT DISTINCT idService
FROM services
WHERE Service = "Secrétariat")
5 Sélections avec jointures internes sur tables multiples
5.1 Clés étrangères multiples
Soit la base de données « GestionDuPersonnel » ci-dessous
Dominique DOLÉ Requêtes SQL page 20
Table : personnes
Table : services
Table : locaux
5.1.1 Énoncé
Nom, Prénom et Téléphone des personnes du service « Magasin ».
5.1.2 Résultat
Dominique DOLÉ Requêtes SQL page 21
5.1.3 Requête
SELECT [Link], [Link]énom, l.Téléphone
FROM personnes p
INNER JOIN services s
ON [Link] = [Link]
INNER JOIN locaux l
ON [Link] = [Link]
WHERE [Link] = "Magasin"
5.2 Tables en cascades
Soit la base de données « GestionDuPersonnel » ci-dessous
Table : personnes
Table : services
Dominique DOLÉ Requêtes SQL page 22
Table : locaux
5.2.1 Énoncé
Nom, Prénom, Service et Téléphone des personnes de tous les services
« Secrétariat » (Secrétariat et Secrétariat de direction).
5.2.2 Résultat
5.2.3 Requête
SELECT [Link], [Link]énom, [Link], l.Téléphone
FROM personnes p
INNER JOIN services s
ON [Link] = [Link]
INNER JOIN locaux l
ON [Link] = s. idlocal
WHERE [Link] like "%Secrétariat%"
Dominique DOLÉ Requêtes SQL page 23