Cours 5 : Requêtes imbriquées



Documents pareils
Cours 4 : Agrégats et GROUP BY

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Le langage SQL Rappels

Bases de données cours 4 Construction de requêtes en SQL. Catalin Dima

Langage SQL : créer et interroger une base

TD : Requêtes SQL (BDR.TD2-1) INSA 3IF

Plan. Bases de Données. Sources des transparents. Bases de SQL. L3 Info. Chapitre 4 : SQL LDD Le langage de manipulation de données : LMD

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Le Langage SQL version Oracle

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

TP base de données SQLite. 1 Différents choix possibles et choix de SQLite : 2 Définir une base de donnée avec SQLite Manager

Optimisation SQL. Quelques règles de bases

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

INSTITUT NATIONAL DES TELECOMMUNICATIONS CONTROLE DES CONNAISSANCES. 2. Les questions sont indépendantes les unes des autres.

SQL Serveur Programme de formation. France Belgique Suisse - Canada. Formez vos salariés pour optimiser la productivité de votre entreprise

SQL Historique

Les bases de données

14/04/2014. un ensemble d'informations sur un sujet : exhaustif, non redondant, structuré, persistant. Gaëlle PERRIN SID2 Grenoble.

Bases de données relationnelles

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

16H Cours / 18H TD / 20H TP

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

1 Introduction et installation

Vincent Augusto

Introduction : présentation de la Business Intelligence

INTRODUCTION : Données structurées et accès simplifié

Plan de formation : Certification OCA Oracle 11g. Les administrateurs de base de données (DBA) Oracle gèrent les systèmes informatiques

Durée : 4 heures Le sujet se présente sous la forme de deux dossiers indépendants

TD n 10 : Ma première Base de Données

Systèmes de Gestion de Bases de Données

Bases de Données relationnelles et leurs systèmes de Gestion

clef primaire ; clef étrangère ; projection ; restriction ; jointure ; SQL ; SELECT ; FROM ; WHERE

Introduction au Système de Gestion de Base de Données et aux Base de Données

SOMMAIRE. Travailler avec les requêtes... 3

BTS/CGO P10 SYSTEME INFORMATION Année

SQL. Oracle. pour. 4 e édition. Christian Soutou Avec la participation d Olivier Teste

Cours SQL. Base du langage SQL et des bases de données

Bases de données Cours 4 : Le langage SQL pour ORACLE

Présentation du PL/SQL

Le Langage De Description De Données(LDD)

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

MODE OPERATOIRE OPENOFFICE BASE

Durée : 4 heures coefficient : 4 Le sujet se présente sous la forme de deux dossiers indépendants

La présente publication est protégée par les droits d auteur. Tous droits réservés.

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

XML par la pratique Bases indispensables, concepts et cas pratiques (3ième édition)

Les bases de l optimisation SQL avec DB2 for i

Plan d Exécution Graphique pour des Requêtes SQL Simples

Systèmes d informations nouvelles générations. Répartition, Parallèlisation, hétérogénéité dans les SGBD. Exemple d application d un futur proche

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE

Magasins et entrepôts de données (Datamart, data warehouse) Approche relationnelle pour l'analyse des données en ligne (ROLAP)

Introduction aux Bases de Données 2004/2005

Oracle Décisionnel : Modèle OLAP et Vue matérialisée D BILEK

FileMaker 13. Guide de référence SQL

Résumé S Q L. Auteur: Alexandre PATIN Edition: 22 février alexandre.patin@free.fr URL :

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Décisionnel. SI Virtualisé. Performant. Cloud. SAP BusinessObjects. Dashboards. Expertise. Succès. Service Reporting. Finance. SaaS. Web 2.0.

SAP BusinessObjects Web Intelligence (WebI) BI 4

Performance web. Mesurer. Analyser. Optimiser. Benjamin Lampérier - Benoît Goyheneche. RMLL Beauvais. 8 Juillet 2015

Créer le schéma relationnel d une base de données ACCESS

1 Modélisation d une base de données pour une société de bourse

Administration des bases de données. Jean-Yves Antoine

A QUOI SERVENT LES BASES DE DONNÉES?

Session S12 Les bases de l optimisation SQL avec DB2 for i

Les bases fondamentales du langage Transact SQL

Devenez un véritable développeur web en 3 mois!

Nouveautés CRM 2015 & Migration. By Tanguy Touzard MVP CRM

La rencontre du Big Data et du Cloud

Auto-évaluation SQL. Document: f0453test.fm 19/04/2012. ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium

TP Bases de données réparties

1 Introduction. 2 Le modèle relationnel. 3 Algèbre relationnelle 4 SQL. 5 Organisation physique des données 1/228

TP2_1 DE BUSINESS INTELLIGENCE ISIMA ZZ3 F3

Intégrité sémantique dans les bases de données relationnelles

Bases de données. Mihaela Mathieu

MySQL / SQL EXEMPLES

PRACTICE DIRECTION ON THE LENGTH OF BRIEFS AND MOTIONS ON APPEAL

SQL pour. Oracle 10g. Razvan Bizoï. Tsoft, Groupe Eyrolles, 2006, ISBN : , ISBN 13 :

Cours 3. Développement d une application BD. DBA - Maîtrise ASR - Université Evry

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

Réplication E-maj Foreign Data Wrapper PostGIS PostgreSQL-f

Module BDWEB. Maîtrise d informatique Cours 9 - Xquery. Anne Doucet. anne.doucet@lip6.fr

3W Academy Programme de Formation Développeur Intégrateur web Total : 400 heures

Bases de données documentaires et distribuées Cours NFE04

Année Universitaire 2009/2010 Session 2 de Printemps

SQL Server et Active Directory

ÉTUDE DE CAS. Durée : 5 heures Coefficient : 5 CAS FEFORT ÉLÉMENTS DE CORRECTION

Support de Cours REQUÊTES TRANSACT-SQL DANS MICROSOFT SQL SERVER Stéphane N GUESSAN Groupe Pigier Abidjan Version 1.

Utilisation du BDE pour la maintenance des fichiers DBF de l'application TopoCad:

Intégrité des données

Whitepaper. Méthodologie de création de rapports personnalisés SQL Server Reporting Services

Exercices et solutions

Bases de données multidimensionnelles et mise en œuvre dans Oracle

MySQL avec Mac OS X. Quelques manipulations avec le terminal sont nécessaires si une version de MySQL est déjà lancée:

Mysql. Les requêtes préparées Prepared statements

Compétences Business Objects

Sommaire. 2 LINQ to Objects

Transcription:

Cours 5 : Requêtes imbriquées

Rappel Une condition de sélection utilisée dans une clause WHERE ou dans une clause HAVING s exprime sous la forme d une comparaison entre la valeur d un attribut (ou expression) et une valeur de référence qui, dans le cas des requêtes simples, est soit un attribut (ou expression), soit une constante Bases de données 2

Sous-select Le langage SQL étend la notion de valeur de référence au résultat d une requête. Ainsi, l expression d une clause WHERE peut prendre la forme : WHERE attribut opérateur (SELECT ) On dit alors que la requête, dont le résultat sert de valeur de référence, est une requête imbriquée ou une sous-requête Bases de données 3

Requêtes imbriquées Il est possible d imbriquer plusieurs requêtes et il n y a pas de limite dans le nombre de niveaux d imbrication Le résultat de chaque requête imbriquée sert de valeur de référence dans la condition de sélection de la requête de niveau supérieur, appelée requête principale Bases de données 4

Types de requêtes imbriquées La sous-requête peut renvoyer soit une ligne, soit plusieurs Si la sous-requête renvoie plusieurs lignes, nous avons deux cas, selon que la sousrequête est indépendante de la requête principale ou synchronisée avec elle Si la sous-requête est synchronisée avec la requête principale, on parle de requête corrélée. Bases de données 5

Exemple de requête imbriquée renvoyant une seule ligne Donner les numéros des voyages ayant le même type de pension que le voyage numéro 4 SELECT numvoyage FROM Voyage WHERE typepension = (SELECT typepension FROM Voyage WHERE numvoyage = 4) Bases de données 6

Requête imbriquée renvoyant une seule ligne Si la requête ne renvoie rien ou si elle renvoie plusieurs lignes, SQL génère une erreur L attribut et la valeur de référence renvoyée par la sous-requête doivent avoir des types compatibles Bases de données 7

Exemple de requête imbriquée renvoyant une seule ligne (2) Donner les numéros et les dates de départ des voyages ayant le prix le plus bas sur l ensemble de tous les prix SELECT numvoyage, datedeb FROM Tarif WHERE prix = (SELECT MIN(prix) FROM Tarif) 2007-2008 Bases de données 8

Exemple de requête imbriquée renvoyant une seule ligne (2bis) Donner les numéros et les dates de départ des voyages ayant le prix le plus bas sur l ensemble de tous les prix SELECT numvoyage, datedeb FROM Tarif WHERE prix <= ALL(SELECT prix FROM Tarif) 2007-2008 Bases de données 9

Requêtes imbriquées renvoyant plusieurs lignes La condition de sélection emploie alors : L opérateur IN (équivalent à = ANY) L opérateur NOT IN (équivalent à!= ALL) Un opérateur simple ( =,!=, <>, <, >, <=, >=) suivi de ALL ou ANY L opérateur EXISTS Bases de données 10

Rappel ANY : la condition est vraie si elle est vérifiée pour au moins une des valeurs renvoyées par la sous-requête ALL : la condition est vraie si elle est vérifiée pour chacune des valeurs renvoyées par la sous-requête IN : la condition est vraie si elle est vérifiée pour une des valeurs renvoyées par la sousrequête Bases de données 11

Exemple de requête imbriquée renvoyant plusieurs lignes Donner les numéros des voyages passant pour une ville où passe aussi le voyage numéro 4 SELECT DISTINCT numvoyage FROM Etape WHERE numville IN (SELECT numville FROM Etape WHERE numvoyage = 4) 2007-2008 Bases de données 12

Jointure interne ou requête imbriquée? SELECT DISTINCT nomvoyage FROM Voyage V, Tarif T WHERE V.numVoyage = T.numVoyage AND datedeb > '31-10-14' SELECT nomvoyage FROM Voyage WHERE numvoyage IN (SELECT numvoyage FROM Tarif WHERE datedeb > '31-10-14') Dans le premier cas on pourrait obtenir la date de départ comme résultat du SELECT alors que c est impossible dans le deuxième cas Bases de données 13

GROUP BY dans un sous-select rendant plusieurs lignes Dates de départ des voyages dont la durée totale est de moins de 10 jours SELECT DISTINCT datedeb FROM Tarif WHERE numvoyage IN (SELECT numvoyage FROM Etape GROUP BY numvoyage HAVING SUM(duree) < 10) 2007-2008 Bases de données 14

GROUP BY dans un sous-select rendant plusieurs lignes (2) Nombre de voyages dont la durée totale est de moins de 10 jours SELECT COUNT(*) FROM Voyage WHERE numvoyage IN (SELECT numvoyage FROM Etape GROUP BY numvoyage HAVING SUM(duree) < 10) Bases de données 15

Exemple de requête imbriquée avec NOT IN Numéros des voyages dont il n y a pas eu de départs après le mois de septembre 2014 SELECT numvoyage FROM Voyage WHERE numvoyage NOT IN (SELECT numvoyage FROM Tarif WHERE datedeb > '30-09-14') Bases de données 16

Exemple de requête imbriquée avec NOT IN (suite) Remarque: NOT IN n est pas équivalent à IN + la négation de la condition SELECT numvoyage FROM Voyage WHERE numvoyage IN (SELECT numvoyage FROM Tarif WHERE datedeb <= '30-09-14') Cela renvoie plutôt les numéros des voyages qui ont eu au moins un départ avant 1 er octobre 2014 Bases de données 17

Extension SQL2 Les lignes résultats peuvent être des listes d attributs... WHERE (attribut 1, attribut 2, ) opérateur (SELECT attribut 1, attribut 2,...) Bases de données 18

Exemple SELECT DISTINCT numvoyage, numville FROM Etape WHERE (numville, duree) = (SELECT numville, duree FROM Etape WHERE numordre = 1 AND numvoyage = 10) Bases de données 19

Exemple de requête imbriquée et corrélée Pour chaque voyage, donner les dates de départ pour lesquelles le prix est le moins cher SELECT numvoyage, datedeb FROM Tarif T WHERE prix = (SELECT MIN(prix) FROM Tarif TT WHERE TT.numVoyage = T.numVoyage) Bases de données 20

Exemple de requête imbriquée et corrélée (bis) Pour chaque voyage, donner les dates de départ pour lesquelles le prix est le moins cher SELECT numvoyage, datedeb FROM Tarif T WHERE prix <= ALL (SELECT prix FROM Tarif TT WHERE TT.numVoyage = T.numVoyage) Bases de données 21

Solution sans corrélation (SQL2) SELECT numvoyage, datedeb FROM Tarif WHERE (numvoyage, prix) IN (SELECT numvoyage, MIN(prix) FROM Tarif GROUP BY numvoyage) Bases de données 22

Exemple de requête imbriquée et corrélée (2) Pour chaque voyage, donner les numéros de ses étapes qui durent plus longtemps que sa dernière étape SELECT numvoyage, numordre FROM Etape E WHERE duree > (SELECT duree FROM Etape EE WHERE EE.numVoyage = E.numVoyage AND numordre = (SELECT MAX(numOrdre) FROM Etape EEE WHERE EEE.numVoyage = EE.numVoyage)) Bases de données 23

Exemple de requête imbriquée et corrélée (3) Donner les numéros des voyages ayant plus de deux dates de départ SELECT DISTINCT numvoyage FROM Tarif T WHERE 2 < (SELECT COUNT(*) FROM Tarif TT WHERE TT.numVoyage = T.numVoyage) Bases de données 24

Exemple de requête imbriquée et corrélée (3bis) Solution sans corrélation SELECT numvoyage FROM Tarif GROUP BY numvoyage HAVING COUNT(*) > 2 Bases de données 25

Opérateur EXISTS... WHERE EXISTS (sous-select) Cet opérateur permet de construire un prédicat évalué à vrai si la sous-requête renvoie au moins une ligne Bases de données 26

Exemple Numéros des voyages qui font au moins 6 étapes SELECT numvoyage FROM Voyage V WHERE EXISTS (SELECT * FROM Etape E WHERE numordre = 6 AND E.numVoyage = V.numVoyage) La projection * de la sous-requête est sans signification. La projection pourrait être une constante quelconque Bases de données 27

Exemple (2) Numéros des voyages qui font moins de 6 étapes SELECT numvoyage FROM Voyage V WHERE NOT EXISTS (SELECT 'A' FROM Etape E WHERE numordre = 6 AND E.numVoyage = V.numVoyage) Bases de données 28

Jointure interne et imbrication : questions Pour chaque ville de Grèce, donnée par son numéro et son nom, trouver le nombre de voyages qu y passent SELECT E.numVille, nomville, COUNT(DISTINCT numvoyage) FROM Etape E, Ville V, Pays P WHERE E.numVille = V.numVille AND V.numPays = P.numPays AND UPPER(nomPays) = 'GRÈCE' GROUP BY E.numVille, nomville Bases de données 29

Jointure interne et imbrication : questions (2) Pour la période du second semestre 2014, donner les noms et numéros des villes où passent des voyages dont le prix moyen sur cette période est inférieur à 900 SELECT DISTINCT V.numVille, nomville FROM Etape E, Ville V WHERE E.numVille = V.numVille AND numvoyage IN (SELECT numvoyage FROM Tarif WHERE datedeb BETWEEN '01-07-14' AND '31-12-14' GROUP BY numvoyage HAVING AVG(prix) < 900) Bases de données 30

Jointure interne et imbrication : questions (3) Pour la période du second semestre 2014, donner les numéros et noms des villes où passent des voyages dont le prix moyen sur cette période est inférieur au prix moyen de ce voyage pendant 2014... AND numvoyage IN (SELECT numvoyage FROM Tarif T... HAVING AVG(prix) < (SELECT AVG(prix) FROM Tarif WHERE numvoyage = T.numVoyage AND TO_CHAR(dateDeb, 'YYYY') = '2014') Bases de données 31

Jointure interne et imbrication : questions (4) Donner les numéros et les noms des voyages en demi-pension qui ne font pas étape en Grèce SELECT DISTINCT V.numVoyage, nomvoyage FROM Voyage V, Etape E WHERE V.numVoyage = E.numVoyage AND UPPER(typePension) = 'DP' AND numville NOT IN (SELECT numville FROM Ville WHERE numpays IN (SELECT numpays FROM Pays WHERE UPPER(nomPays)= 'GRÈCE')) Bases de données 32

Jointure interne et imbrication : questions (4bis) Donner les numéros et les noms des voyages en demi-pension qui ne font pas étape en Grèce SELECT DISTINCT V.numVoyage, nomvoyage FROM Voyage V, Etape E WHERE V.numVoyage = E.numVoyage AND UPPER(typePension) = 'DP' AND numville NOT IN (SELECT numville FROM Ville V, Pays P WHERE V.numPays = P.numPays AND UPPER(nomPays)= 'GRÈCE') Bases de données 33

Jointure interne et imbrication : questions (5) Pour chaque voyage donné par son numéro et son nom, donner le numéro et le nom de la ville où ce voyage fait sa dernière étape SELECT E.numVoyage, nomvoyage, E.numVille, nomville FROM Ville V, Etape E, Voyage VO WHERE V.numVille = E.numVille AND E.numVoyage = VO.numVoyage AND numordre = (SELECT MAX(numOrdre) FROM Etape WHERE numvoyage = VO.numVoyage)