TP5 : SQL requête SELECT dans une table,

objectif

Objectif :

synthèse sur des éléments abordés :

SELECT  [nom_table.nom_champs, nom_table.nom_champs2.....] 
FROM
nom_table1, nom_table2 …. 
WHERE  [conditions, jointure … ]
ORDER BY [nom_table.nom_champs] [DESC]
[LIMIT]  ;

● Par exemple :

SELECT * FROM catalogue WHERE ref="123abc";     (* : tous les champs)

SELECT Client.NomClient FROM Client WHERE Client.PrivilegeClient=true
ORDER by Client.NomClient;

[conditions]SQL

remarque

lors de l’écriture des chaînes de texte :

création de la table (structure) et insertion des enregistrements

création de la table etudiant

Créer une table pour gérer des étudiants , avec comme nom de la table Etudiant et comme colonnes (champs) dans la table :

Etudiant
idEtudiant
nom
adresse
ville
code_postal
telephone
date_naisssance
sexe
boursier
groupe_id
semestre_id
note_ue1
note_ue2


Utiliser le script ci-dessous pour insérer des enregistrements

-- version 2023

INSERT INTO Etudiant (idEtudiant, nom, adresse, ville, code_postal, telephone, date_naissance, sexe, boursier, groupe_id, semestre_id, note_ue1, note_ue2) VALUES
(1, 'BERNARD', '1 rue sous bois', 'Belfort', '90000', '0384545401', '2005-01-01', 'F', 'N', 1, 1, '11.50', '10.50'),
(19, 'CHAVEAUX', '5 rue du chasseur', 'Strasbourg', '68000', '0384545419', '2005-01-01', 'H', 'N', 2, 2, '10.50', '9.50'),
(20, 'PRETTOT', '8 rue vilapogo', 'Belfort', '90000', '0384545420', '2005-07-12', 'H', 'O', 2, 2, '12.50', '8.50'),
(7, 'RIOT', '67 rue pasteur', 'Montbeliard', '25200', '0384545407', '2005-06-06', 'H', 'N', 2, 1, '13.50', '12.50'),
(8, 'BOISSENIN', '1 rue sous bois', 'Belfort', '90000', '0384545408', '2005-08-09', 'H', 'O', 2, 1, '15.5', '16.50'),
(2, 'PEQUIGNOT', '2 rue de la liberation', 'Valdoie', '90300', '0384545402', '2004-06-06', 'H', 'O', 1, 1, '17.50', '9.50'),
(3, 'ZILLIOX', '7 rue du verger', 'Bavilliers', '90120', '0384545403', '2004-01-01', 'H', 'N', 1, 1, '11.50','9.25'),
(4, 'MONNIER', '3 rue du boulanger', 'TAILLECOURT', '25400', '0384545404', '2004-02-06', 'H', 'O', 1, 1, '9.50', '15.5'),
(5, 'BRISCHOUX', '5 rue du chasseur', 'Belfort', '90000', '0384545405', '2004-05-25', 'H', 'N', 2, 1, '10', '9.50'),
(6, 'DUVAL', '8 rue vilapogo', 'Bavilliers', '90120', '0384545406', '2004-03-11', 'H', 'O', 2, 1, '13.50', '8.50'),
   (10, 'FAIVRE', '7 rue des vergers  de rioz', 'Valdoie', '90300', '0384545410', '2004-01-05', 'H', 'O', 3, 1, '8.50', '12.50'),
(17, 'DELANOE', '7 rue du verger', 'Valdoie', '90300', '0384545417', '2004-01-01', 'H', 'N', 1, 2, '12.50', '14.50'),
(18, 'BONVALOT', '3 rue du boulanger', 'Belfort', '90000', '0384545418', '2004-01-01', 'H', 'O', 1, 2, '10', '11.50'),
(21, 'COULON', '67 rue pasteur', 'Valdoie', '90300', '0384545421', '2004-01-01', 'H', 'N', 2, 2, '17', '6.5'),
(23, 'KENDE', '2 rue de la liberation', 'Bavilliers', '90120', '0384545423', '2004-05-31', 'H', 'N', 3, 2, '15', '7.5'),
(24, 'KLEIN', '7 rue du verger', 'Montbeliard', '25200', '0384545424', '2004-01-01', 'H', 'N', 3, 2, '13', '15'),
(25, 'VALZER', '3 rue du boulanger', 'Valdoie', '90300', '0384545425', '2004-01-06', 'H', 'O', 3, 2, '11', '10'),
(26, 'PY', '5 rue du chasseur', NULL, '90000', '0384545426', '2004-01-10', 'F', 'N', 3, 2, '12.20', '7.90'),
(27, 'VERNET', '8 rue vilapogo', NULL, '90120', '0384545427', '2004-02-02', 'H', 'O', 4, 3, '10.30', '11.85'),
(28, 'BAILLIT', '67 rue pasteur', NULL, '25200', '0384545428', '2004-01-01', 'H', 'N', 4, 3, '7.90', '15.90'),
(16, 'LUZET', '2 rue de la liberation', 'Belfort', '90000', '0384545416', '2003-01-01', 'H', 'O', 1, 2, '10.25', '9.25'),
  (22, 'VALOT', '1 rue sous bois', '', '90000', '0384545422', '2003-12-12', 'H', 'O', 2, 2, '10', '9.20'),
(29, 'DUPONT', '8 rue vilapogo', '', '90300', '0384545429', '2003-06-06', 'H', 'O', 4, 3, '13.20', '15.50'),
   (11, 'FAIVRE', '3 rue des vergers', 'Cernay', '68000', '0384545411', '2003-01-01', 'F', 'N', 3, 1, '5.6', '12.05'),
(12, 'DUCHENNE', '5 rue du chasseur', 'Belfort', '90000', '0384545412', '2003-01-01', 'F', 'O', 3, 1, '10.4', '11.3'),
(13, 'BOULANGER', '8 rue vilapogo', 'Belfort', '90000', '0384545413', '2003-01-01', 'F', 'N', 1, 2, '13', '9.20'),
   (9, 'FONTAINE-LEGIOT', '2 rue des vergers', 'Mulhouse', '68000', '0384545409', '2002-01-01', 'H', 'N', 3, 1, '11.25', '12'),
(14, 'MOREAU', '67 rue pasteur', 'Belfort', '90000', '0384545414', '2002-06-01', 'H', 'O', 1, 2, '9', '12.50'),
(15, 'RIGOULOT', '1 rue sous bois', 'Valdoie', '90300', '0384545415', '2002-12-12', 'H', 'N', 1, 2, '15', '10.50');

Requête 1 (expression logique) :

Tester la requête suivante :

+-----------+------------------------+-------------+
| nom       | adresse                | semestre_id |
+-----------+------------------------+-------------+
| BERNARD   | 1 rue sous bois        |           1 |
| BOULANGER | 8 rue vilapogo         |           2 |
| MOREAU    | 67 rue pasteur         |           2 |
| LUZET     | 2 rue de la liberation |           2 |
| BONVALOT  | 3 rue du boulanger     |           2 |
+-----------+------------------------+-------------+

Sur le même principe :

+-----------+-----------+----------+
| nom       | groupe_id | boursier |
+-----------+-----------+----------+
| PEQUIGNOT |         1 | O        |
| MONNIER   |         1 | O        |
+-----------+-----------+----------+

Requête 2 (expression logique et tri sur plusieurs champs ) :

Requête 2-1 :

Tester la requête suivante : Afficher tous les étudiants triés par semestre, puis par groupe, puis par nom dans l’ordre décroissant. Utiliser l’instruction ORDER BY champ1, champ2, champ3 ; remplacer « champ » par le nom du champ suivi de ASC ou DESC (par défaut le tri est fait de façon ascendante)


Utiliser l’instruction ORDER BY « champ1 » après l’instruction WHERE « conditions ». Aidez vous des informations sur : https://www.w3schools.com/SQL/sql_orderby.asp

Requête 2-2 :

Tester la requête suivante :

Sur le même principe :

Requête 2-3 :

Écrire une requête pour sélectionner uniquement les étudiants (nom, groupe, ville, semestre ) du groupe 1 et du semestre 1 ou du semestre 2 et de la ville de « Belfort ». Ordonner la liste résultat par semestre croissant puis par groupe croissant puis par nom de ville croissante (par ordre alphabétique) puis par nom d’étudiant décroissant.


Résultat :

+-----------+-----------+-------------+-------------+
| nom       | groupe_id | ville       | semestre_id |
+-----------+-----------+-------------+-------------+
| ZILLIOX   |         1 | Bavilliers  |           1 |
| BERNARD   |         1 | Belfort     |           1 |
| MONNIER   |         1 | TAILLECOURT |           1 |
| PEQUIGNOT |         1 | Valdoie     |           1 |
| MOREAU    |         1 | Belfort     |           2 |
| LUZET     |         1 | Belfort     |           2 |
| BOULANGER |         1 | Belfort     |           2 |
| BONVALOT  |         1 | Belfort     |           2 |
| PRETTOT   |         2 | Belfort     |           2 |
+-----------+-----------+-------------+-------------+
Requête 2-4 :

Symboles de comparaison et opérateurs logiques

norme ISO MySQL Oracle PostgreSQL SQLserver
!= <> <> != <> != <> != <> !=
&& AND AND && AND AND AND
|| OR OR || OR OR OR
! NOT NOT ! NOT NOT NOT

Dans la requête ci-dessous, simplifier l’expression dans le WHERE:

Requête 2-5 :

Écrire une requête pour sélectionner uniquement les étudiants (nom, groupe, ville, semestre, boursier ) qui sont boursiers ou qui habitent la ville de belfort et qui sont tous du semestre 2 (trier les enregistrements par groupe puis ville puis nom de façon ascendante).

+-----------+-----------+---------+-------------+----------+
| nom       | groupe_id | ville   | semestre_id | boursier |
+-----------+-----------+---------+-------------+----------+
| BONVALOT  |         1 | Belfort |           2 | O        |
| BOULANGER |         1 | Belfort |           2 | N        |
| LUZET     |         1 | Belfort |           2 | O        |
| MOREAU    |         1 | Belfort |           2 | O        |
| VALOT     |         2 |         |           2 | O        |
| PRETTOT   |         2 | Belfort |           2 | O        |
| VALZER    |         3 | Valdoie |           2 | O        |
+-----------+-----------+---------+-------------+----------+

Requête 3 (utilisation de DISTINCT)

Requête 3-1 :

Tester la requête suivante avec et sans le mot clé distinct :

Requête 3-2 :

Écrire la requête pour afficher les villes distinctes de tous les étudiants dont le code postal commence par 90 et dont le nom de ville n’est pas NULL et n’est pas une chaîne vide. Utiliser le mot clé DISTINCT.

+------------+
| ville      |
+------------+
| Belfort    |
| Valdoie    |
| Bavilliers |
+------------+

Requête 4 ( IN : un champ appartient à une liste de valeurs )

Requête 4 :

Écrire une requête pour sélectionner les étudiants et les villes dont la ville appartient à cette liste (‘strasbourg’,‘mulhouse’,‘cernay’). Utiliser l’instruction IN

+-----------------+------------+
| nom             | ville      |
+-----------------+------------+
| FONTAINE-LEGIOT | Mulhouse   |
| FAIVRE          | Cernay     |
| CHAVEAUX        | Strasbourg |
+-----------------+------------+

Requête 5 (utilisation de NULL)

Requête 5.1 :

Écrire la requête pour sélectionner le nom des étudiants dont le champ de la ville est vide (Utiliser l’instruction IS NULL) et dont le sexe est « H ».


+---------+-------+
| nom     | ville |
+---------+-------+
| VERNET  | NULL  |
| BAILLIT | NULL  |
+---------+-------+
Requête 5.2 :

Faire la même requête mais en rajoutant les étudiants dont le champ de la ville est une chaîne de caractères vide

+---------+-------+
| nom     | ville |
+---------+-------+
| VALOT   |       |
| VERNET  | NULL  |
| BAILLIT | NULL  |
| DUPONT  |       |
+---------+-------+

Requête 6 (utilisation de LIKE )

Requête 6.1 :

Requête pour afficher le Nom des étudiants et leur ville. Le nom des étudiants commence par « B » ou « D » et ils habitent une ville qui possède la lettre « o » (triés par nom).

+-----------+---------+
| nom       | ville   |
+-----------+---------+
| BERNARD   | Belfort |
| BOISSENIN | Belfort |
| BONVALOT  | Belfort |
| BOULANGER | Belfort |
| BRISCHOUX | Belfort |
| DELANOE   | Valdoie |
| DUCHENNE  | Belfort |
+-----------+---------+
Requête 6.2 :

Écrire une requête pour afficher le nom la ville et l’adresse des étudiants dont l’adresse est composée du mot « verger » et dont la ville est composée des lettres « er » ou des lettres « a » suivies de « l ».


+---------+------------+----------------------------+
| nom     | ville      | adresse                    |
+---------+------------+----------------------------+
| DELANOE | Valdoie    | 7 rue du verger            |
| FAIVRE  | Cernay     | 3 rue des vergers          |
| FAIVRE  | Valdoie    | 7 rue des vergers  de rioz |
| ZILLIOX | Bavilliers | 7 rue du verger            |
+---------+------------+----------------------------+

Requête 7 (requête avec des dates, fonctions now(), day(), month(), year())

Requête 7 :

Écrire une requête pour afficher le nom et la date de naissance des étudiants dont la date de naissance est comprise entre le "2003-1-1" And "2003-12-31", qui sont des hommes et qui habitent Belfort ou Montbéliard (utiliser le code postal 90000 (Belfort) et 25200(Montbéliard)). Proposer une deuxième solution avec comme condition (dans le « WHERE ») : l’année est égale à "2003". (trier l’affichage par date de naissance)

+-------+----------------+
| nom   | date_naissance |
+-------+----------------+
| LUZET | 2003-01-01     |
| VALOT | 2003-12-12     |
+-------+----------------+
* selon les mises à jour, votre résultat peut être différent
Aidez vous des informations sur https://www.w3schools.com/sql/sql_ref_mysql.asp. Rechercher la fonction « YEAR ».



Pour les plus rapides

Requête 8 (utilisation de LIMIT )

Requête 8.1 :

La requête ci-dessous retourne les 10 enregistrements de la position 6 à 15

SELECT nom 
FROM Etudiant 
ORDER BY nom
LIMIT 5,10 ;

(https://dev.mysql.com/doc/refman/5.7/en/select.html) Tester et utiliser la lien ci-dessous pour https://www.w3schools.com/SQL/sql_top.asp

Requête 8.2 :

Dans une page Web, on désire sélectionner les 6 premiers étudiants triés par Groupe (descendant : plus grand au plus petit) puis par Nom (pour ordre alphabétique). Écrire la requête, utiliser l’instruction LIMIT pour limiter le nombre d’enregistrements sélectionnés.


+----------+-----------+
| nom      | groupe_id |
+----------+-----------+
| BAILLIT  |         4 |
| DUPONT   |         4 |
| VERNET   |         4 |
| DUCHENNE |         3 |
| FAIVRE   |         3 |
| FAIVRE   |         3 |
+----------+-----------+
Requête 8.3 :

sélectionner les 4 suivants

+-----------------+-----------+
| nom             | groupe_id |
+-----------------+-----------+
| FONTAINE-LEGIOT |         3 |
| KENDE           |         3 |
| KLEIN           |         3 |
| PY              |         3 |
+-----------------+-----------+ 

Le mot clé LIMIT n’est pas standard

Requête 9 (expressions régulières)

Aidez vous des informations la documentation en annexe (suivre le lien) pour les expressions régulières ou sur : https://dev.mysql.com/doc/refman/5.7/en/regexp.html et https://www.w3schools.com/SQL/sql_like.asp Avec la documentation ci dessus (cas de LIKE puis de REGEXP):


Requête 9.1 :
Requête 9.2 :

Remarque : LIKE est plus rapide que REGEXP, voir article http://billauer.co.il/blog/2020/12/mysql-index-pattern-matching-performance/

+---------+-------------+
| nom     | code_postal |
+---------+-------------+
| BAILLIT |       25200 |
+---------+-------------+


Pour comprendre les expressions régulières, voici 1 site web intéressant : regex101

Requête 10

Requête 10 :

Écrire une requête pour sélectionner les étudiants qui ont plus de 20 ans après le 30 septembre de la fin de l’année universitaire (mois de naissance inférieur à 10 si c’est l’année de leur 20 ans). Ces étudiants devaient payer une sécurité sociale si ils n’étaient pas boursiers . Ordonner les étudiants du plus jeune au plus vieux.

commencer par tester :

SELECT day(now()); 
SELECT month(now()); 
SELECT year(now());

idée : plus de 20 ans entre aujourd’hui et leur date de naissance ou 20 ans et …..

+-----------------+----------------+
| nom             | date_naissance |
+-----------------+----------------+
| FAIVRE          | 2003-01-01     |
| BOULANGER       | 2003-01-01     |
| RIGOULOT        | 2002-12-12     |
| FONTAINE-LEGIOT | 2002-01-01     |
+-----------------+----------------+

* selon les mises à jour, votre résultat peut être différent

Si les dates ne sont pas correctes, utiliser l’instruction SQL suivante pour les mettre à jour UPDATE Etudiant SET date_naissance=DATE_ADD(date_naissance,INTERVAL 1 YEAR);


info 1 - info 2