– SELECT Simple SQL

image_pdfimage_print

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.

selectSELECT 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       3000

SQL> 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.