1 Les bases de données Séance 6 L ’extraction de données Le SELECT
2 L’ordre SELECT est suffisamment complexe pour y consacrer une séance entière. L’ordre SELECT Sur une table Sur plusieurs tables Le produit cartésien La clause WHERE Notion de pivot L’opérateur LIKE Base de données VI Ce qui est abordé
3 Récupérer les informations stockées dans la base de manière cohérente. Syntaxe générale : SELECT { [, … ] | *} FROM [WHERE ] Base de données VI L’ordre SELECT MySQL ORACLE
4 Récupérer tous les enregistrements de la table 'ma_table' SELECT * FROM ma_table; Récupérer seulement les colonnes c1 et c2 SELECT c1, c2 FROM ma_table; Base de données VI Forme simple du SELECT MySQL ORACLE
5 L’ajout d’un prédicat sur un ordre select s’exprime dans une clause WHERE par : SELECT * FROM ma_table WHERE ; Exemple : SELECT * FROM ma_table WHERE c1 = 600; Base de données VI Ajout d’un prédicat de sélection
6 Opérateurs de comparaison : =, !=, <>, =, Opérateurs logiques AND, OR, NOT Exemple : SELECT * FROM ma_table WHERE c1 <> 12 AND c2 = 15; Base de données VI Les formes de la clause WHERE MySQL ORACLE
7 L’opérateur LIKE permet de tester les chaînes de caractères avec l’expression d’un motif (pattern) Les méta-caractères sont : _ 1 seul caractère % 0 ou plusieurs caractères Base de données VI L’opérateur LIKE MySQL ORACLE
8 Toutes les peronnes dont le nom commence par 'A' : SELECT * FROM personne WHERE nom LIKE 'A%' ; Tous les prénoms dont le nom contient un 'X' en deuxième position. SELECT prenom FROM personne WHERE nom LIKE '_X%' ; Base de données VI L’opérateur LIKE : Exemples MySQL ORACLE
9 MySQL Concaténation : || SELECT first_name || ' ' || last_name FROM … SELECT CONCAT(first_name,' ', last_name) FROM … Sous-chaînes : SUBSTR(chaîne, pos, long) ATTENTION : En SQL les chaînes de caractères sont indicées à partir de 1 Base de données VI Autres opérateurs de caractères
10 Majuscule : UPPER(chaîne) Minuscule : LOWER(chaîne) Base de données VI Autres opérateurs de caractères MySQL ORACLE
11 MySQL ORACLE Chaîne => nombre : TO_NUMBER() Nombre => chaîne : TO_CHAR(ch,masque) Le masque permet de définir des règles de transformation pour les nombres : 9 : chiffre quelconque non représenté pour les 0 non significatifs 0 : chiffre quelconque représenté. : point décimal apparent MySQL utilise les fonctions CAST() et CONVERT() Base de données VI Conversions texte/nombre
12 Cas particulier des champs ‘NULL’ : Il sont testés avec le prédicat IS NULL ou IS NOT NULL. Exemple : SELECT * FROM ma_table WHERE c2 IS NULL; Base de données VI Le cas particulier de la nullité MySQL ORACLE
13 Le produit cartésien de A et B s’exprime en SQL par : SELECT * FROM A, B; ATTENTION : le produit cartésien n'a pas de sens logique, c'est la première étape d'une jointure. Base de données VI Croiser plusieurs tables MySQL ORACLE
14 Pour effectuer le produit 'A,B', la base de données confronte chaque enregistrement de A à tous les enregistrements de B. Base de données VI Le produit de tables, Le résultat du produit est donc une table dans laquelle on peut sélectionner des lignes.
15 Toutes les combinaisons ne sont pas pertinentes. Base de données VI Le produit de tables 2 Table Chaise Tabouret Echelle 4 3 2, On doit indiquer à la base de données comment sélectionner les bonnes. Nombre de pieds Mobilier Table 4 Chaise 4 Tabouret 3 Echelle 2
16 La jointure correcte de 2 tables s'effectue en ajoutant un pivot au produit cartésien SELECT * FROM A, B WHERE A.c1 = B.c2; Le pivot introduit une contrainte entre les deux tables qui réduit les croisements possibles. Base de données VI Le produit de tables : le pivot
17 Pour effectuer des jointures multiples sur plus de deux tables, on étend le pivot : SELECT * FROM T1, T2, T3, … WHERE AND AND AND … Base de données VI Croiser plus de deux tables MySQL ORACLE
18 SELECT prenom(?) FROM employe, manager WHERE id_manager = id(?) AND id(?) = 23; SELECT employe.prenom FROM employe, manager WHERE id_manager = manager.id AND manager.id = 23; Lorsque deux colonnes portent le même nom dans les deux tables jointes, il peut y avoir un problème : Base de données VI Lever les ambiguïtés MySQL ORACLE
19 Utilisation d’alias : SELECT a.first_name, b.first_name FROM employee [AS] a, employee [AS] b WHERE a.manager_id = b.employee_id; Base de données VI Simplifier l’écriture MySQL ORACLE
20 On peut regrouper plusieurs lignes d'un SELECT pour en extraire une valeur calculée. Un groupe est un ensemble de lignes, résultat d'une requête, qui ont une valeur commune sur un ensemble de colonnes. Cet ensemble de colonnes est appelé le facteur de groupage. Base de données VI Fonctions de groupage
21 Pour regrouper des données, il faut alors utiliser la clause GROUP BY suivi du facteur de groupage. SELECT,, () FROM, WHERE … GROUP BY, Base de données VI Syntaxe de groupage MySQL ORACLE
22 Exemple : calculer les quantités récoltés pour chaque producteur. SELECT numprod, SUM(quantite) FROM recolte GROUP BY numprod ; Base de données VI Groupage : exemple Groupeur MySQL ORACLE
23 Elle permet d'opposer un prédicat à un groupe. SELECT num_client, SUM(montant) FROM commandes GROUP BY num_client HAVING SUM(montant) > 1000; HAVING s’applique sur le résultat de la requête. Base de données VI Groupage : la clause HAVING La clause HAVING élimine des groupes comme la clause WHERE élimine des lignes. MySQL ORACLE
24 Les fonctions suivantes réagissent au groupage AVG() : moyenne SUM() : somme MIN() : minimum MAX() : maximum COUNT() : dénombrement VARIANCE() : variance STDDEV() : écart-type Base de données VI Fonctions de groupage MySQL ORACLE
25 FIN DU COURS