Présentation de la commande SQL SELECT.

SELECT est la seule commande du SQL permettant d'interroger une base de données. Il existe d'autres commandes pour manipuler les données (ajouter, modifier), manipuler les structures (bases, vues, tables), gérer les utilisateurs et leurs droits, créer des procédures stockées.

Le résultat d'un SELECT est appelé un jeu d'enregistrements (recordset en anglais).

Afficher l'ensemble d'une table.

SELECT *
FROM cours_tp_rep ;
exécuté en 2.531 sec.

A partir du schéma relationnel ci-dessus, représentant la base d'un vendeur de logiciels (et qui va nous accompagner tout au long de ce cours), affichez l'ensemble de la table Produit.

Votre réponse n°1

Afficher seulement certains champs.

Au lieu d'afficher toutes les colonnes (ou champs), on veut afficher uniquement le nom et le prénom (c'est à dire les colonnes qui ont été coloriées en orange sur le schéma ci-dessous).

usr_id
usr_name
usr_first_name
usr_login
usr_password
usr_year_study
...
1
PASTORESébastienspastore***********
6
 
540
DETESTYssertesteleve1***********
1
 
539
DUBUISSONChristophecdubuisson***********
2
 
538
BONVALOTRomainrbonvalot***********
2
 
537
LUCKFlorentfluck***********
1
 
536
TRANAlexandreatran***********
2
 
534
ESQUIROLGeorgesgesquirol***********
6
 
533
LEGRANDMarie-Pierremplegrand***********
6
 
532
TEXTORISAndréatextoris***********
6
 
...
      

On utilise pour ça :

SELECT usr_first_name, usr_name
FROM user ;
usr_first_nameusr_name
SébastienPASTORE
YsserDETEST
ChristopheDUBUISSON
RomainBONVALOT
FlorentLUCK
AlexandreTRAN
GeorgesESQUIROL
Marie-PierreLEGRAND
RémiFORT
......
exécuté en 0.005 sec.

A partir de la base "vendeur de logiciels", affichez le nom et le prénom des clients.

Votre réponse n°2

Renommer les colonnes.

Très utile pour clarifier l'affichage ou exploiter les données dans un langage de programmation :

SELECT usr_first_name as Prenom, usr_name as Nom
FROM user ;
PrenomNom
SébastienPASTORE
YsserDETEST
ChristopheDUBUISSON
RomainBONVALOT
FlorentLUCK
AlexandreTRAN
GeorgesESQUIROL
Marie-PierreLEGRAND
RémiFORT
......
exécuté en 0.005 sec.

Le AS est facultatif, on peut donc écrire :

SELECT usr_first_name Pr�nom, usr_name Nom
FROM user ;
Pr�nomNom
SébastienPASTORE
YsserDETEST
ChristopheDUBUISSON
RomainBONVALOT
FlorentLUCK
AlexandreTRAN
GeorgesESQUIROL
Marie-PierreLEGRAND
RémiFORT
......
exécuté en 0.004 sec.

A partir de la base "vendeur de logiciels", affichez le nom et le prénom des clients, en les renommant sans le C final.

Votre réponse n°3

Afficher seulement certains enregistrements : WHERE.

Au lieu d'afficher tous les enregistrements (ou lignes), on veut afficher uniquement les utilisateurs qui s'appellent Romain (en orange sur la capture ci-dessous).

usr_id
usr_name
usr_first_name
usr_login
usr_password
usr_year_study
...
1
PASTORESébastienspastore***********
6
 
540
DETESTYssertesteleve1***********
1
 
539
DUBUISSONChristophecdubuisson***********
2
 
538
BONVALOTRomainrbonvalot***********
2
 
537
LUCKFlorentfluck***********
1
 
536
TRANAlexandreatran***********
2
 
534
ESQUIROLGeorgesgesquirol***********
6
 
533
LEGRANDMarie-Pierremplegrand***********
6
 
532
TEXTORISAndréatextoris***********
6
 
...
      

On utilise pour ça la clause WHERE :

SELECT usr_first_name as Prenom, usr_name as Nom
FROM user
WHERE usr_first_name='Romain';
PrenomNom
RomainBONVALOT
RomainDUMAS
RomainDI FELICE
RomainBARIAL
RomainVIALA
RomainCONSTANT
RomainSICAUD
RomainVANDERHAEGHEN
RomainChaix
exécuté en 0.002 sec.

La condition WHERE est suivie de n'importe quelle expression booléenne, c'est à dire qui a pour résultat "vrai" ou "faux". Par exemple :

WHERE condition1 AND condition2
WHERE condition1 OR condition2
WHERE NOT condition
WHERE champ1 = "valeur"
WHERE champ1 > champ2 AND champ3 > champ4
etc.

A partir de la base "vendeur de logiciels", affichez les clients qui habitent New-York.

Votre réponse n°4

Affichez les produits de catégorie n°5.

Votre réponse n°5

Trier les résultats.

Pour que les résultats soient triés, on utilise la clause ORDER BY, et les paramètres ASC (pour un tri croissant, ascendant en anglais) ou DESC (pour un tri décroissant, descendant en anglais). Par exemple :

SELECT usr_first_name as Prenom, usr_name as Nom
FROM user
WHERE usr_name > ''
ORDER BY Nom ASC;
PrenomNom
IsisABD RABO
ChakibABDALLAH
HasnaABDELADIM
MalikABDESSLEM
NathanielABENSOUR
OlivierAbran
MoradACHACHERA
MimounaADDA-BENAMEUR
OphélieADOLPHE
......
exécuté en 0.026 sec.
SELECT usr_first_name as Prenom, usr_name as Nom
FROM user
ORDER BY Nom DESC;
PrenomNom
IliesZIAMARI
FlorentZAMUNER
DetestYsser
IbrahimYILDIRIM
AnthonyXUEREF
MehdiWEIBEL
LouisVOLLEKINDT
MatthieuVOIGNIER
MickaëlVOGEL
......
exécuté en 0.028 sec.

Le tri par défaut est croissant, on n'est donc pas obligé de préciser ASC. Par exemple :

SELECT usr_first_name as Prenom, usr_name as Nom
FROM user
WHERE usr_name > ''
ORDER BY Nom;
PrenomNom
IsisABD RABO
ChakibABDALLAH
HasnaABDELADIM
MalikABDESSLEM
NathanielABENSOUR
OlivierAbran
MoradACHACHERA
MimounaADDA-BENAMEUR
OphélieADOLPHE
......
exécuté en 0.024 sec.

Cela revient au même de trier sur le nom original du champ (usr_name), sur le nom renommé (Nom) ou sur la position du champ dans le SELECT (2).

On peut enchaîner plusieurs tris. Par exemple : utilisateurs nés en février, triés sur la date d'anniversaire. Pour ceux qui sont nés le même jour, on veut un classement par nom :

SELECT usr_date_of_birth, usr_first_name as Prenom, usr_name as Nom
FROM user
WHERE usr_date_of_birth LIKE '%-02-%'
ORDER BY DAY(usr_date_of_birth), Nom;
usr_date_of_birthPrenomNom
1994-02-01IlyesBALI
1998-02-01HusamTOUBAL
1994-02-03BaptisteMessines
1991-02-06EdouardCABOT-REVERSAC
1992-02-07RobinMARCOT
1988-02-08AuroreBENGUIGUI
2019-02-09NathaëlCOSTES
1994-02-11FlorianSANDRAL
1991-02-12AdrienBERTHIER
.........
exécuté en 0.005 sec.

A partir de la base "vendeur de logiciels", affichez les produits triés par nom de produit.

Votre réponse n°6

Affichez les clients triés par ville. Dans une même ville, les clients sont triés par nom, puis par prénom s'il y a des noms identiques.

Votre réponse n°7

La jointure : afficher des données éparpillées dans différentes tables.

Si je regarde la table des petites annonces, je vois qu'il n'y figure que le numéro de l'utilisateur qui a déposé l'annonce, mais pas son nom ni son prénom. C'est normal : si on stockait son nom et son prénom pour chaque petite annonce, on l'aurait en plusieurs exemplaires. C'est ce qu'on appelle la redondance, et on essaie la plupart du temps de l'éviter dans les bases de données (ça fait perdre de la mémoire et ça rend les mises à jour plus difficiles).

SELECT * FROM cours_annonce ;
ann_idann_user_idann_titreann_prixann_texteann_is_htmlann_date_depot
204442<script>alert('Je suis un boulet')</script>testtest02015-01-27 00:16:27
206401Vend ordinateur150€Je vend un ordinateur fixe de la marque HP, possède un lecteur de carte mémoire, 3 port USB frontaux et 6 a l'arrière, lecteur CD/DVD, écran, clavier, souris et son tapis inclus. Vous pouvez le tester en Salle C352, c'est celui au fond à coté de la fenêtre.02015-10-27 12:22:56
exécuté en 0.001 sec.

Toutefois, je peux afficher cette information puisque le nom et le prénom sont stockés dans la table user, et que ces deux tables sont reliées par le numéro de l'utilisateur qui a déposé l'annonce :

SELECT usr_id, usr_first_name, usr_name, ann_user_id, ann_titre
FROM user, cours_annonce
WHERE usr_id = ann_user_id ;
usr_idusr_first_nameusr_nameann_user_idann_titre
442SteevenThein442<script>alert('Je suis un boulet')</script>
401FlorentVALAY401Vend ordinateur
exécuté en 0.001 sec.

Notez bien l'importance du WHERE usr_id = ann_user_id. Si vous l'oubliez, vous obtenez des résultats incohérents (remarquez que chaque annonce a été affichée à côté de chaque utilisateur : SQL a fait toutes les combinaisons possibles, c'est ce qu'on appelle un produit cartésien et c'est rarement ce qu'on souhaite) :

SELECT usr_id, usr_first_name, usr_name, ann_user_id, ann_titre
FROM user, cours_annonce ;
usr_idusr_first_nameusr_nameann_user_idann_titre
1SébastienPASTORE442<script>alert('Je suis un boulet')</script>
1SébastienPASTORE401Vend ordinateur
77YsserDETEST442<script>alert('Je suis un boulet')</script>
77YsserDETEST401Vend ordinateur
76ChristopheDUBUISSON442<script>alert('Je suis un boulet')</script>
76ChristopheDUBUISSON401Vend ordinateur
75RomainBONVALOT442<script>alert('Je suis un boulet')</script>
75RomainBONVALOT401Vend ordinateur
74FlorentLUCK442<script>alert('Je suis un boulet')</script>
...............
exécuté en 0.013 sec.

A partir de la base "vendeur de logiciels", affichez les noms des produits, suivi du nom de la catégorie correspondante (jointure avec deux tables).

Votre réponse n°8

Affichez les noms et prénoms des clients, suivi des noms des produits qu'ils ont achetés (jointure avec trois tables).

Votre réponse n°9

La clause DISTINCT.

Parfois, on est susceptible d'écrire une requête qui répond plusieurs fois la même réponse. Par exemple : qui a déposé une annonce ?

SELECT usr_first_name, usr_name
FROM user, cours_annonce
WHERE usr_id = ann_user_id ;
usr_first_nameusr_name
SteevenThein
FlorentVALAY
exécuté en 0.001 sec.

Pour éviter que la même réponse soit donnée deux fois, on utilise la clause DISTINCT.

SELECT DISTINCT usr_first_name, usr_name
FROM user, cours_annonce
WHERE usr_id = ann_user_id ;
usr_first_nameusr_name
SteevenThein
FlorentVALAY
exécuté en 0.002 sec.

Question à se poser

Il faut arriver à savoir quand le DISTINCT est obligatoire ou non, sinon vous serez pénalisés à l'examen. Essayez donc d'évaluer si la requête risque de multiplier les résultats ou pas. Par exemple :

  • Si je demande des clients dans une table de clients, sans jointure, ils seront forcément uniques.
  • Si je demande des catégories dans une table de produits, chaque catégorie risque d'être en plusieurs exemplaires => DISTINCT.
  • Si je demande des clients dans une table de clients jointe à une table d'achats, chaque client risque d'être en plusieurs exemplaires => DISTINCT. Par exemple : Quel client a déjà acheté des produits de telle catégorie ?

Dans quelle ville y a-t-il des clients ?

Votre réponse n°10

A quelle catégorie appartient le produit Access 2010 ?.

Votre réponse n°11

Quelles sont les catégories des produits achetés par Eric WANG ?

Votre réponse n°12

La valeur NULL

On peut affecter une valeur spéciale à un champ : la valeur NULL.

A ne pas confondre avec une chaîne de caractères vide :

  • sémantiquement : une chaîne vide peut signifier "je connais cette information, mais elle est vide", alors que la valeur NULL signifie "je ne connais pas cette information" (par exemple pour un numéro de téléphone).
  • techniquement : une chaîne vide se teste avec champ="", une valeur NULL se teste avec champ IS NULL. Une chaîne non vide se teste avec champ <> "", une valeur non nulle se teste avec champ IS NOT NULL.

Quand on construit une base de données, on doit préciser pour chaque champ s'il peut recevoir la valeur NULL ou pas démonstration.

Afficher les clients (nom et prénom) dont on ne connaît pas la ville.

Votre réponse n°13

Les expressions : pour afficher autre chose qu'un champ brut.

On n'est pas obligé d'afficher des champs bruts, on peut afficher des expressions basées (ou non) sur les champs.

Une que j'utilise souvent est pour améliorer l'affichage du nom et du prénom :

SELECT CONCAT(usr_first_name, ' ', usr_name) AS Nom
FROM user
WHERE usr_special & 256 ;
Nom
Sébastien PASTORE
Georges ESQUIROL
Marie-Pierre LEGRAND
Alexa STROZZI
Gilles GIRARD
Georghy FUSCO
Véronique GAUBERT
Stéphane LOFFREDA
Judes Gisors
Michael DEBORT
Sophie PERIERAS
exécuté en 0.003 sec.

Afficher l'année de naissance d'une personne (remarquez le IS NOT NULL qui permet de n'afficher que les utilisateurs dont on connaît la date de naissance) :

SELECT usr_login, YEAR(usr_date_of_birth) AS `annee de naissance`
FROM user
WHERE usr_date_of_birth IS NOT NULL AND usr_special & 5 = 5;
usr_loginannee de naissance
yayache1998
pbarbin1997
ybarembaum1998
gbeolet1998
ebord1999
cbringuier1997
fcasalta1997
acassagnearu1998
dchecconi1998
......
exécuté en 0.003 sec.

Afficher un prix TTC à partir d'un prix hors taxe : SELECT prix_HT * 1.196 FROM produits ;

Afficher le numéro des produits et le mois auquel ils ont été achetés.

Votre réponse n°14

Afficher le nom et le prénom des clients dans une seule colonne, séparés par un espace.

Votre réponse n°15

Utiliser SELECT sans table (sans FROM).

Parfois, on a besoin d'utiliser SELECT simplement pour évaluer une expression, sans aller chercher des données dans une table.

L'utilisation la plus courante est pour vérifier le fonctionnement des fonctions SQL. Par exemple, pour vérifier des fonctions de date ou de cryptage :

SELECT CURDATE();
CURDATE()
2016-10-31
exécuté en 0 sec.
SELECT NOW();
NOW()
2016-10-31 20:55:56
exécuté en 0 sec.
SELECT PASSWORD('mypassword');
PASSWORD('mypassword')
*FABE5482D5AADF36D028AC443D117BE1180B9725
exécuté en 0 sec.

Le comparateur de chaînes de caractères LIKE.

Très utile pour les recherches, LIKE permet de comparer des chaînes entre elles en utilisant des caractères jokers, c'est à dire des caractères qui remplacent un ou plusieurs caractères.

% remplace 0, 1 ou plusieurs caractères. Par exemple :

  • champ like "méd%" est vrai pour les champs ayant la valeur méd, médecin, médical, médée, etc.
  • champ like "%test%" est vrai pour les champs ayant la valeur greatest hits, test, contest, testament, etc.

_ (underscore) remplace 1 caractère. Par exemple :

  • champ like "par_" est vrai pour les champs ayant la valeur part, pars, pare, etc.
  • champ like "199_-12-31" est vrai pour les champs ayant la valeur 1990-12-31, 1991-12-31, ... 1999-12-31.

Pour compliquer un peu : sous Access, le % s'écrit * et le _ s'écrit ? (respectant ainsi le formalisme des caractères jokers sous DOS, et dans l'explorateur de fichiers en général).

Afficher les produits dont le nom contient Access (écriture SQL standard).

Votre réponse n°16

Afficher les produits dont le nom contient Access (écriture SQL sous Access).

Votre réponse n°17

Copyright © HADEK Fadel SIO 2016

45