Le SELECT est l’ordre SQL qui permet de consulter des données existantes, en d’autre termes de LIRE une table.
On peut lire la totalité des données de la table (toutes les lignes ET toutes les colonnes) ou bien filtrer certaines d’entre elles en faisant
- soit une projection: on choisit des colonnes en les listant
- soit une restriction: on choisit certaines colonnes, en imposant une condition à vérifier
La projection fait un filtre ‘vertical’ et la restriction (clause WHERE) un filtre horizontal.
SELECT fait une restriction et/ou une projection
Voici la syntaxe simplifié d’un SELECT:Select
SELECT [nom_table.]* / ALL | [nom_table].nom_col, [DISTINCT [nom_table.]nom_col, ... FROM [nom_user.]table ,... [WHERE condition] [ORDER BY expr [ASC | DESC]]
Passons en revue les principaux paramètres de cette requête:
* | ALL: affiche le contenu de toutes les colonnes de la table
DISTINCT: renvoie une valeur unique en cas de doublon
FROM: introduit le nom de la ou des table(s) à consulter
WHERE: introduit la condition qui filtre les lignes
ORDER BY: tri suivant une colonne ou une expression ascendant (par défaut) ou descendant
remarque: les clauses WHERE et ORDER BY sont optionnelles.
Le nom du propriétaire de la table (schéma) est optionnel. Si non spécifié c’est la table du schéma courant qui est utilisée.
On peut faire un SELECT * pour afficher le nom de toutes les colonnes de la table, ou bien utiliser la commande DESCRIBE nom_table pour les afficher avec leur type.
Afficher des colonnes ou des valeurs
Dans un premier temps nous allons voir comment choisir les colonnes à afficher, sans nous préoccuper du nombre de lignes ramenées.
Voici la syntaxe générale d’un SELECT qui affiche certaines colonnes et toutes les lignes d’une table:
SELECT liste_de_colonnes | ALL | *
from nom_table;
Et un exemple très simple avec notre table de démo.
On choisira ici une seule colonne et on ramènera l’ensemble des lignes de la table (soit 14 lignes).
sql> — afficher le nom de tous les employés
sql> SELECT ename FROM scott.emp;
ENAME
———-
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
14 lignes sélectionnées.
On peut écrire un SELECT extrêmement simple…sans colonne et avec une table bidon (DUAL) , avec des valeurs constantes ou calculées.
Aussi étrange que cela puisse paraître, il peut être utile dans certains cas de ne pas afficher de colonnes d’une table.
Pour par exemple afficher des constantes texte ou numérique, connaître le résultat d’une fonction ou à faire des calculs temporaires d’expression, comme dans les exemples suivants:
sql> # le plus petit SELECT du monde !! sql> # il ne renvoie rien (NULL est un mot réservé) sql> SELECT null FROM dual; SQL> SELECT null FROM dual; N -SQL> SQL> # cette fois on renvoie une valeur…mais CONSTANTE! SQL> SELECT 1 FROM dual; 1 ---------- 1 sql> #on peut de la même façon renvoyer une chaîne… sql> SELECT 'Bonjour!'; +----------+ | Bonjour! | +----------+ | Bonjour! | +----------+ sql> # ou une expression numérique sql> SELECT 1+1; +-----+ | 1+1 | +-----+ | 2 | +-----+ sql> # et pour connaître la date (et l'heure… SQL> SELECT sysdate FROM dual; SYSDATE -------- 16/09/15
Mais on ne peut pas mettre n’importe quoi comme pseudo colonne, il faut soit une constante, soit une expression correcte.
Dans l’exemple suivant TOTO n’est rien de tout cela…et le serveur renvoie une erreur
mysql> select TOTO; ERROR 1054 (42S22): Unknown column 'TOTO' in 'field list' SQL> SELECT toto FROM dual; SELECT toto FROM dual * ERREUR Ó la ligne 1 : ORA-00904: "TOTO": invalid identifier
Clause WHERE et conditions logiques
Après avoir choisi les colonnes à afficher, filtrons les lignes affichées en posant des conditions logiques avec la clause WHERE.
Seules les lignes vérifiant la condition de cette clause (lorsque le résultat de l’expression du WHERE est vrai) seront restituées.
L’expression doit donc être BOOLEENNE (elle peut-être évaluée comme VRAI ou FAUSSE) et peut utiliser n’importe quel opérateur de comparaison en plus de l’égalité.
Les expressions de comparaison que l’on peut classiquement rencontrer sont les suivantes:
a = b a est égal à b
a != b a est différent de b
a > b a est supérieur strictement à b
a < b a est inférieur strictement à b
a >= b a est supérieur ou égal à b
a < =b a est inférieur ou égal à b
et on peut bien sûr les combiner avec les opérateurs logiques ‘AND’ (le ET logique), ‘OR’ (le OU logique non exclusif), XOR (le ou exclusif) ou le ‘NOT’ (la négation).
remarque: Pour éviter toute ambiguïté dans les expressions logiques et s’affranchir des règles de priorités des opérateurs logiques, il est très vivement conseillé de mettre des parenthèses judicieuses dans les expressions.
SQL> SELECT ename, sal FROM scott.emp 2 WHERE sal=3000; ENAME SAL ---------- ---------- SCOTT 3000 FORD 3000 SQL> SELECT ename, sal FROM scott.emp 2 WHERE ename='MILLER'; ENAME SAL ---------- ---------- MILLER 1300
Attention!!! : La comparaison des chaînes de caractères en SQL comme dans tous les langages, est sensible à la casse, vous pouvez donc spécifier le nom “miller” ou “MILLER”, suivant le cas (sauf utilisation de fonction particulière pour gérer la casse…)
remarque: C’est une très bonne idée de faire apparaitre les colonnes de la clause WHERE dans la liste des colonnes à afficher, même si cela peut paraitre superflu. Dans l’exemple qui précède grâce à la colonne ‘date_embauche’ on peut ainsi vérifier l’exactitude des résultats.
Combinons maintenant plusieurs conditions grâce aux opérateurs AND, OR et NOT.
SQL> SELECT ename, hiredate, sal FROM scott.emp 2 WHERE hiredate > '31/12/81' 3 AND sal > 1400; ENAME HIREDATE SAL ---------- -------- ---------- SCOTT 09/12/82 3000SQL> SELECT ename, job, sal FROM scott.emp 2 WHERE (job='MANAGER' or job='PRESIDENT') 3 AND sal > 2500; ENAME JOB SAL ---------- --------- ---------- JONES MANAGER 2975 BLAKE MANAGER 2850 KING PRESIDENT 5000
Le cas des valeurs NULL
Une valeur NULL est une valeur non définie dans une table, car non connue ou par encore renseignée. Un exemple est la commission dans notre table employés.
Une valeur NULL n’est donc PAS NULLE, au sens mathématique du terme, elle est juste indéfinie !!!!
Ainsi l’expression NULL = 0 est toujours fausse!
Attention!! Plus généralement, TOUTE expression qui contient une valeur NULL (indéfinie donc) est toujours fausse car on ne peut comparer une valeur à quelque chose d’indéfini.
Exemple, On cherche les employés qui ont une commission NULL
SQL> SELECT ename, job, comm FROM scott.emp 2 WHERE comm = NULL; aucune ligne sélectionné
…mauvaise idée! Avec le bon opérateur cette fois:
SQL> SELECT ename, job, comm FROM scott.emp 2 WHERE comm IS NULL; ENAME JOB COMM ---------- --------- ---------- SMITH CLERK JONES MANAGER BLAKE MANAGER CLARK MANAGER SCOTT ANALYST KING PRESIDENT ADAMS CLERK JAMES CLERK FORD ANALYST MILLER CLERK DD DD 12 lignes sÚlectionnÚes.


