Vous êtes ici : Accueil > Archives > Tutoriels > SQL standard > Manipulation de données : sélection

< Retour

Manipulation de données : sélection

mises à jour : 21+22.08.2004, 09.08.2005

I.1 Sélection de colonnes (ou 'projection')

SELECT * FROM table;

La clause « SELECT » sert à lister la ou les colonnes (ou champs) qui seront choisies. Si il y a plusieurs valeurs, on les sépare avec une virgule entre chaque ; et si on les choisies toutes, on peut mettre une astérisque pour aller plus vite.
La clause « FROM » sert à énoncer la ou les tables dans lesquelles on puise les colonnes (ou champs). Pour plusieurs tables, veillez à bien lire le chapitre >> jointures ;-)

exemple :

SELECT nom, prenom FROM personnes;


Le résultat retournera deux colonnes, le nom et le prénom de toutes les personnes de la table 'personnes'. C'est parce que tous les tuples de la table sont sélectionnés que l'on parle de projection...
Un attribut « DISTINCT » permet d'éliminer les doublons. Selon les versions de SQL, cette clause est soit générale (porte sur tout les champs du « SELECT ») soit spécialisée (sur une seule donnée, entre parenthèses). Les gains de performances et/ou les variations de nombre de résultats entre ces deux syntaxes sont durs à apprécier, mais les deux semblent fonctionner sans problèmes.

exemples :

SELECT DISTINCT nom_commune, nbr_habitants FROM villes_de_france;

Dans ce cas, on rapatrie les quelques 38'000 communes de France...

SELECT DISTINCT( nom_commune ), nbr_habitants FROM villes_de_france;

... mais dans ce cas là, on obtiendra un chiffre inférieur, car on élimine les homonymes. Attention, l'exemple n'est pas très approprié car les homonymes ne sont pas des doublons, mais c'est juste pour dire que l'on peut observer des différences dans le nombre de résultats...


I.2 Sélection de lignes ('sélection')

I.2.a les opérateurs

Les opérateurs de comparaison de prédicat sont les suivants :
=
égal
>
strictement supérieur
>=
supérieur ou égal
<
strictement inférieur
<=
inférieur ou égal
!=
différent (s'écrit parfois « <> »)

... auquels se rajoutent :
BETWEEN
entre
IN
dans
LIKE
ressemble à
Ces autres opérateurs peuvent être inversés par l'utilisation d'un « NOT » devant eux.
>voir les exemples d'utilisation des opérateurs.

À ce propos, les valeurs numériques s'écrivent directement dans les requêtes, mais les chaînes de caractères sont à mettre entre apostrophes (ou simples cotes).
Les caractères jokers « tiret » remplacent un seul caractère (alphanumérique), tandis que « pourcentage » remplace une chaîne de zéro à une infinité de caractères.
Le caractère « dièse » sert à mettre une ligne en commentaire, attention donc de ne pas en mettre dans des requêtes, certains SGBD les interprêtant au pied de la lettre, vos requêtes seraient coupées nettes !

I.2.b prédicats simples

On utilise la clause « WHERE », suivie d'un ou plusieurs prédicats ; seules les lignes répondant au test sur le(s) prédicat(s) seront retournées dans le résultat.

SELECT { * | [liste de colonnes] } FROM table WHERE predicat = valeur ;


I.2.c prédicats composés

Un prédicat peut être composé, càd que l'on peut faire une requête sur deux champs (ou plus) dans la clause « WHERE », et mettre aussi bien « AND » que « OR » entre chacun (selon que l'on veut tous ou l'un/l'autre critères). De plus, l'utilisation de parenthèses permet de définir un ordre de priorité des prédicats.

SELECT { * | [liste de colonnes] } FROM table WHERE predicat = valeur [ { AND | OR } predicat2 = valeur [ ... ] ] ;


exemples :

# On recherche tout les analystes (programmeurs ou non), ayant au moins
# 25 mois d'ancienneté...

SELECT nom, prenom FROM employes WHERE fonction LIKE 'analyste%' AND anciennete >= 25;

# On recherche tout les analystes (programmeurs ou non), ayant soit
# au moins 25 mois d'ancienneté soit un salaire strictement supérieur à 1'200 EUR...

SELECT nom, prenom FROM employes WHERE fonction LIKE 'analyste%' AND ( anciennete >= 25 OR salaire > 1200 );


I.2.d tri des résultats

Les résultats retournés par la requête le sont tel quel, il n'y a pas de tri ! C'est alors la clause « ORDER BY » qui permet d'ordonnancer les résultats par un champ, ou plusieurs... Certaines versions alternatives de SQL peuvent parfois utiliser la clause SORT BY, mais cette syntaxe n'est pas officielle et beaucoup moins répandue (il semblerait que ce ne soit qu'un synonyme).
Les tris sont implicitement croissants (« ASC ») mais peuvent être décroissants en rajoutant « DESC » à la fin.
exemple :

SELECT nom, prenom FROM employes WHERE fonction LIKE 'analyste%' AND ( anciennete >= 25 OR salaire > 1200 ) ORDER BY anciennete DESC, nom ASC;
# la même requête que plus haut, mais on tri d'abord sur l'ancienneté décroissante,
# puis sur le nom.

Les valeurs nulles sont toujours en tête du résultat, quel que soit l'ordre de tri.

Syntaxe générale et exemples syntaxe :

SELECT ... FROM ... [ WHERE ... ][ ORDER BY ... ];

exemples :

SELECT nom, prenom FROM personnes WHERE age >= 18;

# On recherche tout les Dupont 'T' et Dupond 'D'...
SELECT nom, prenom FROM personnes WHERE nom LIKE 'Dupon-';
# ... ou toutes les personnes dont le nom commence par Mau
SELECT nom, prenom FROM personnes WHERE nom LIKE 'Mau%';

# On recherche toutes les communes de Savoie (73) et Hte-Savoie (74)...
SELECT nom_commune, nbr_habitants FROM villes_de_france WHERE code_postal BETWEEN 73000 AND 74999;
# ... les bornes 73000 et 74999 étant incluses dans la recherche

# les personnes qui ont 20, 40 ou 60 ans...
SELECT nom, prenom FROM personnes WHERE age IN ( 20, 40, 60 );

# et celles qui n'ont ni 20, ni 40, ni 60 ans...
SELECT nom, prenom FROM personnes WHERE age NOT IN ( 20, 40, 60 );
# ... en rajoutant un NOT pour inverser le test !


la suite : >> Les jointures.