Informatique


Sélectionner des enregistrements

La requête SELECT

La requête SELECT permet de sélectionner un ou plusieurs enregistrements (= occurences ou tuples) dans une table.

Syntaxe
SELECT  [ALL | DISTINCT | DISTINCTROW]   nom_champ1[,nom_champ2,...]  FROM  nom_table1[,nom_table2,...]
	[WHERE condition(s)][ORDER BY Nom_Champs][LIMIT valeur][OFFSET valeur]
  • ALL, DISTINCT, DISTINCTROW
    • ALL renvoie toutes les lignes répondant à la requête (valeur par défaut);
    • DISTINCT renvoie uniquement les lignes différentes les unes des autres;
    • DISTINCTROW renvoie uniquement les lignes dont les valeurs du champ en question sont différentes
  • WHERE
    Permet de fixer des conditions, de poser des filtres afin de renvoyer le résultat le plus précis possible (voir les opérateurs de MySQL).
  • ORDER BY
    Permet d'ordonner les lignes renvoyées selon un ou plusieurs champs, de manière croissante (ASC) ou décroissante (DESC).
  • LIMIT
    Permet de limiter le nombre de lignes retournées.
  • OFFSET
    Permet de compléter l'opérateur LIMIT avec un décalage de n lignes.

Sélectionner tous les enregistrements

Prenons un exemple simple, la table eleve de la database ttsi dont le contenu est le suivant:

  • Sélection de tous les champs pour l'ensemble du contenu de la table.
    Démo
    <?php
    $con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
    $req="SELECT * FROM eleve";
    $reqex=$con->query($req);
    while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
    	echo $ligne['id_ele']." ".$ligne['nom_ele']." ".$ligne['preno_ele']." ".$ligne['daten_ele'];
    	echo "<br>";	
    }
    ?>
    
  • Sélection des champs nom_ele et preno_ele pour l'ensemble du contenu de la table.
    Démo
    <?php
    $con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
    $req="SELECT nom_ele,preno_ele FROM eleve";
    $reqex=$con->query($req);
    while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
    	echo $ligne['nom_ele']." ".$ligne['preno_ele'];
    	echo "<br>";	
    }
    ?>
    

La méthode rowCount()

La méthode rowCount() renvoie le nombre d'enregistrements sélectionné par la requête.

Démo
<?php
$con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
$req="select nom_ele,preno_ele from eleve";
$reqex=$con->query($req);
$total=$reqex->rowCount();
while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
	echo $ligne['nom_ele']." ".$ligne['preno_ele'];
	echo "<br>";
	
}
echo "Nombre d'enregistrements:".$total;
?>

La clause ORDER BY

La clause ORDER BY permet d'ordonner la réponse par ordre croissant (ASC) ou décroissant (DESC).
On peut choisir plusieurs champs en les séparant par des virgules.

Syntaxe
SELECT colonne1, colonne2, colonne3 FROM table ORDER BY colonne1 DESC, colonne2 ASC
Démo
<?php
$con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
$req="SELECT * FROM eleve order by nom_ele ASC";
$reqex=$con->query($req);
while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
	echo $ligne['id_ele']." ".$ligne['nom_ele']." ".$ligne['preno_ele']." ".$ligne['daten_ele'];
	echo "<br>";	
}
?>

La clause DISTINCT

La clause DISTINCT permet d'éviter les doublons, cela veut dire qu'on pourra par exemple déterminer les différents prénoms qu'on a dans une table sans pour autant ramener tous les élèves qui ont ce prénom.

Syntaxe
SELECT DISTINCT colonne FROM table
Démo
<?php
$con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
$req="select distinct preno_ele from eleve";
$reqex=$con->query($req);

while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
	echo $ligne['id_ele']." ".$ligne['nom_ele']." ".$ligne['preno_ele']." ".$ligne['daten_ele'];
	echo "<br>";
}
?>

La clause WHERE

La clause WHERE permet de limiter le nombre d'enregistrements retournés selon des critères de recherche.

Syntaxe
SELECT nom_colonnes FROM nom_table WHERE condition(s)
  • Les opérateurs de comparaison
    Opérateur Signification
    = égal
    < plus petit que
    <= plus petit ou égale
    > plus grand que
    >= plus grand ou égale
    <> ou != différent de
    <=> égal (valable pour NULL aussi)
  • Les opérateurs logiques
    Opérateur Signification
    AND (ou &&) et
    OR (ou ||) ou
    IS NULL les champs vides
    IS NOT NULL Les champs non vides
  • L'opérateur LIKE

    L'opérateur LIKE permet d'utiliser des caractères jockers, ceux-ci remplacent un ou plusieurs caractères.

    LIKE n'est pas sensible à la casse, pour que la recherche soit sensible à la casse il faut utiliser LIKE BINARY.

    Pour faire une recherche sur les caractères '%' et '_' on utilise le caractère d'échappement '\' devant ces deux caractères.

    Opérateur Caractère(s) remplacé(s)
    '%' remplace une chaîne de caractères quelle que soit sa longueur
    '_' remplace un caractère

    Plus étonnant on peut utiliser LIKE avec des types numériques!
    Toutefois, ceci est particulier à MySQL, on évitera donc.

  • L'opérateur BETWEEN

    L'opérateur BETWEEN permet de faire une recherche dans un intervalle.
    On peut faire des recherches dans un intervalle au moyen des opérateurs de comparaison <, <=, > et >=, mais il est souvent plus facile d'utiliser BETWEEN.
    On peut utiliser BETWEEN avec des dates, des nombres et des chaînes de caractères en étant sensible ou non à la casse.

  • L'opérateur IN

    L'opérateur IN permet de faire une recherche selon une liste de valeurs.
    On peut faire des recherches dans une liste de valeurs au moyen des opérateurs de comparaison = et l'opérateur logique or, mais il est souvent plus facile d'utiliser IN.

  • Le cas de NULL

    NULL veut dire "pas de valeur", et bizarrement on ne peut pas utiliser l'opérateur = et l'opérateur <> lorsqu'on compare la valeur d'un champ avec NULL

    C'est pourquoi on dispose de l'opérateur <=> et IS NOT NULL pour tester si un champ contient ou ne contient pas la valeur NULL.


Exemples

  • Sélection de l'élève d'id 7.
    Démo
    <?php
    $con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
    $req="select * from eleve where id_ele='7'";
    $reqex=$con->query($req);
    while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
    	echo $ligne['id_ele']." ".$ligne['nom_ele']." ".$ligne['preno_ele']." ".$ligne['daten_ele'];
    	echo "<br>";	
    }
    ?>
    
  • Sélection de tous les élèves dont le nom est supérieur à 'B' ordonnés dans l'ordre alphabétique inverse.
    Démo
    <?php
    $con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
    $req="select * from eleve where nom_ele > 'B' order by nom_ele DESC";
    $reqex=$con->query($req);
    while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
    	echo $ligne['id_ele']." ".$ligne['nom_ele']." ".$ligne['preno_ele']." ".$ligne['daten_ele'];
    	echo "<br>";	
    }
    ?>
    

    La comparaison se fait de gauche à droite lettre par lettre, elle s'arrête dès que les 2 lettres comparées sont différentes.

  • Sélection de tous les élèves dont le nom est supérieur à 'Bm'.
    Démo
    <?php
    $con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
    $req="select * from eleve where nom_ele > 'Bm'";
    $reqex=$con->query($req);
    while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
    	echo $ligne['id_ele']." ".$ligne['nom_ele']." ".$ligne['preno_ele']." ".$ligne['daten_ele'];
    	echo "<br>";	
    }
    ?>
    
  • Sélection de tous les élèves dont le nom est supérieur à 'Bm' et inférieur à 'V'.
    Démo
    <?php
    $con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
    $req="select * from eleve where nom_ele > 'Bm' and nom_ele < 'V'";
    $reqex=$con->query($req);
    while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
    	echo $ligne['id_ele']." ".$ligne['nom_ele']." ".$ligne['preno_ele']." ".$ligne['daten_ele'];
    	echo "<br>";	
    }
    ?>
    
  • Sélection de tous les élèves nés avant 2010.
    Démo
    <?php
    $con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
    $req="select * from eleve where daten_ele < '2010-01-01'";
    $reqex=$con->query($req);
    while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
    	echo $ligne['id_ele']." ".$ligne['nom_ele']." ".$ligne['preno_ele']." ".$ligne['daten_ele'];
    	echo "<br>";	
    }
    ?>
    
  • Sélection de tous les élèves dont les noms commencent par Bl.
    Démo
    <?php
    $con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
    $req="select * from eleve where nom_ele LIKE 'Bl%'";
    $reqex=$con->query($req);
    while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
    	echo $ligne['id_ele']." ".$ligne['nom_ele']." ".$ligne['preno_ele']." ".$ligne['daten_ele'];
    	echo "<br>";	
    }
    ?>
    
  • Sélection de tous les élèves dont le prénom commence par n'importe quelle lettre suivie de 'ea' et n'importe quelle chaîne de caractères.
    Démo
    <?php
    $con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
    $req="select * from eleve where preno_ele LIKE '_ea%'";
    $reqex=$con->query($req);
    while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
    	echo $ligne['id_ele']." ".$ligne['nom_ele']." ".$ligne['preno_ele']." ".$ligne['daten_ele'];
    	echo "<br>";	
    }
    ?>
    
  • Sélection de tous les élèves nés entre le 1er janvier et le 31 décembre 2000.
    Démo
    <?php
    $con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
    $req="select * from eleve where daten_ele BETWEEN '2010-01-01'AND '2010-12-31'";
    $reqex=$con->query($req);
    while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
    	echo $ligne['id_ele']." ".$ligne['nom_ele']." ".$ligne['preno_ele']." ".$ligne['daten_ele'];
    	echo "<br>";	
    }
    ?>
    
  • Sélection de tous les élèves dont le noms commencent par B jusqu'à L.
    Démo
    <?php
    $con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
    $req="select * from eleve where nom_ele BETWEEN 'B'AND 'L'";
    $reqex=$con->query($req);
    while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
    	echo $ligne['id_ele']." ".$ligne['nom_ele']." ".$ligne['preno_ele']." ".$ligne['daten_ele'];
    	echo "<br>";	
    }
    ?>
    
  • Sélection les élèves Blier, Lefevre et Ventura.
    Démo
    <?php
    $con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
    $req="select * from eleve where nom_ele IN ('Blier','Lefevre','Ventura')";
    $reqex=$con->query($req);
    while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
    	echo $ligne['id_ele']." ".$ligne['nom_ele']." ".$ligne['preno_ele']." ".$ligne['daten_ele'];
    	echo "<br>";	
    }
    ?>
    
  • Sélection des élèves dont le champ daten_ele ne contient pas NULL.
    Démo
    <?php
    $con = new PDO("mysql:host=localhost;dbname=ttsi;charset=utf-8", "root", "");
    //$req="select * from eleve where daten_ele <> NULL"; //ne fonctionne pas
    $req="select * from eleve where daten_ele IS NOT NULL";
    $reqex=$con->query($req);
    
    while($ligne=$reqex->fetch(PDO::FETCH_ASSOC)){
    	echo $ligne['id_ele']." ".$ligne['nom_ele']." ".$ligne['preno_ele']." ".$ligne['daten_ele'];
    	echo "<br>";
    	
    }
    ?>