• Aucun résultat trouvé

Email : richard.chbeir@u-bourgogne.fr

N/A
N/A
Protected

Academic year: 2022

Partager "Email : richard.chbeir@u-bourgogne.fr"

Copied!
92
0
0

Texte intégral

(1)

 

 Richard CHBEIR Richard CHBEIR Richard CHBEIR Richard CHBEIR

Email : richard.chbeir@u-bourgogne.fr

Structured

Structured Query Query Language

Language

Références Bibliographiques

SQL 2 - SQL 3 Applications à Oracle, 3ème Edition, Pierre DELMAL, ISBN 2-8041-3561-6 Bases de données: objet & Relationnel, Georges Gardarin, Edition Eyrolles, 2-

212-11281-5

Un super site

http://wwwlsi.supelec.fr/yb/poly_bd/poly_33.html

(2)

Plan Plan

Introduction

Requêtes SQL Simples

Opérateurs ensemblistes Jointures

Fonctions Partition

Requêtes imbriquées

(3)

D D é é finition finition

SQL (Structured Query Language)

Est un Langage de Description,

D’interrogation et de Manipulation de

Bases de Données

(4)

Origine Origine

SQUARE

Algèbre relationnelle ~ anglais

(Boyce, Chamberlin, King & Hammer, 1975)

IBM Research (San Jose)

Développement du prototype System/R (Astrahan et al., 1976)

SEQUEL

Structured English QUEry Language

(Chamberlin, Astrahan, Eswaran, Chamberlin,

Griffiths & Lorie, 1976)

(5)

Historique Historique

SQL (Structured Query Language)

Il a été standardisé par l'ANSI/ISO depuis 1986 Il a été intégré à Access, SQL Server, SQL/DS, DB2, puis ORACLE, INGRES, …

Il existe trois versions normalisées, du simple au complexe :

SQL1 86 : version minimale

SQL1 89 : ajout des contraintes de références (PRIMARY KEY, FOREIGN KEY)

SQL2 (92): langage complet à 3 niveaux

SQL 3 : les notions d'objets (TRIGGER, ROLE).

La plupart des systèmes supportent SQL1 complet

(6)

Parties de SQL Parties de SQL

Langage de contrôle des données (LCD) GRANT

REVOKE

Langage de définition des données (LDD) CREATE

ALTER DROP

Langage de manipulation des données (LMD) SELECT

INSERT UPDATE DELETE

SQL1 complet est composé de

(7)

Sch Sch é é ma utilis ma utilis é é

Modèle Logique de Données

Client (noClient, Nom, Téléphone, N°SS)

Article (N° Article, Description, P.U., Quantité en stock) Commande (N° Com, Date, N° Client, N°SS_Employé)

Détail commande (N° Com, N° Article, Quantité) Employé (N°SS, Nom_Employé, Salaire)

Livraison (N°Livraison, Date)

DétailsLivraison (N°Livraison, N°Cmd, N°Art, Quantité)

Modèle Conceptuel de Données

1,n Client

Numéro Nom Téléhpone N°SS

1,1 1,n

1,1

0,n Commande

Numéro cmd Date

0,n

0,n Article Numéro Article Description Quantité en stock Prix Unitaire

Passe Détail Commande

Quantité

0,n Employé N° SS Nom Employé Salaire

Assurer

1,n

Livraison N° Livraison Date DétailsLivraison Quantité

(8)

Requêtes SQL Requêtes SQL

SELECT

permet de faire

La projection La sélection

Le produit cartésien Les jointures

(9)

Requêtes SQL simples Requêtes SQL simples

SELECT

La syntaxe de base est :

SELECT [ALL | DISTINCT] <clause de sélection1> [<clause de sélection2>…]

FROM <Nom Table1> [ <Nom Table2> …]

[ WHERE <condition1> [ [AND |OR] <condition2>….] ]

(10)

Requêtes SQL simples Requêtes SQL simples

SELECT

La syntaxe de base est :

SELECT [ALL | DISTINCT] <clause de sélection1> [<clause de sélection2>…]

FROM <Nom Table1> [ <Nom Table2> …]

[ WHERE <condition1> [ [AND |OR] <condition2>….] ]

la clause de sélection = * | nom_table.* | nom_colonne, nom_table.nom_colonne

(11)

Requêtes SQL simples Requêtes SQL simples

SELECT

La syntaxe de base est :

SELECT [ALL | DISTINCT] <clause de sélection1> [<clause de sélection2>…]

FROM <Nom Table1> [ <Nom Table2> …]

[ WHERE <condition1> [ [AND |OR] <condition2>….] ]

la clause where est facultative. Lorsqu’elle ne figure pas, il s’agit d’effectuer une projection simple

la condition est un booléen qui est vérifié pour les n-uplets retournés

(12)

Requêtes SQL simples Requêtes SQL simples

SELECT

La syntaxe de base est :

SELECT [ALL | DISTINCT] <clause de sélection1> [<clause de sélection2>…]

FROM <Nom Table1> [ <Nom Table2> …]

[ WHERE <condition1> [ [AND |OR] <condition2>….] ]

Condition = | {expression {=|<|>|<=|>=|<>} expression

| expression BETWEEN expression AND expression

| expression {IS NULL |IS NOT NULL}

| expression {IN |NOT IN} listeConstantes

| expression {LIKE |NOT LIKE} patron}

AND est plus fort que OR

On peut utiliser les parenthèses pour définir la priorité de résolution des conditions

(13)

Requêtes SQL simples Requêtes SQL simples

Afficher une table

Afficher toutes les Commandes

SELECT *

FROM Commande

123 789 789 789 456 123 456 123

N°SS Emp

40 15/07/2000 8

40 15/07/2000 7

20 09/07/2000 6

30 09/07/2000 5

10 05/07/2000 4

10 02/06/2000 3

20 02/06/2000 2

10 01/06/2000 1

N°Client Date

N°Com

Table Commande

Algèbre relationnelle : Commande

ATTENTION, si vous sélectionnez tous les attributs de la table,

il n'y a plus de projection

(14)

Requêtes SQL simples Requêtes SQL simples

Projection d'une table

Afficher les noClient et dateCommande de toutes les Commandes

SELECT noClient, dateCommande FROM Commande

Doublons !

15/07/2000 40

15/07/2000 40

09/07/2000 20

09/07/2000 30

05/07/2000 10

02/06/2000 10

02/06/2000 20

01/06/2000 10

dateCommande noClient

(15)

Requêtes SQL simples Requêtes SQL simples

Projection d'une table

Afficher les noClient et dateCommande de toutes les Commandes SELECT ALL noClient, dateCommande

FROM Commande

La forme générale réalise une PROJECTION sans élimination des doublons

Doublons !

15/07/2000 40

15/07/2000 40

09/07/2000 20

09/07/2000 30

05/07/2000 10

02/06/2000 10

02/06/2000 20

01/06/2000 10

dateCommande noClient

(16)

Requêtes SQL simples Requêtes SQL simples

Projection d'une table sans doublons

Afficher les noClient et dateCommande de toutes les Commandes

SELECT DISTINCT noClient, dateCommande FROM Commande

Algèbre relationnelle : π noClient, dateCommande (Commande)

15/07/2000 40

09/07/2000 20

09/07/2000 30

05/07/2000 10

02/06/2000 10

02/06/2000 20

01/06/2000 10

dateCommande noClient

(17)

Requêtes SQL simples Requêtes SQL simples

Sélection dans une table (WHERE)

Afficher les Articles de numéro supérieur à 30 dont le prix est inférieur à 20 Euros

SELECT *

FROM Article

WHERE prixUnitaire < 20 AND noArticle > 30

Algèbre relationnelle : σ prixUnitaire < 20.00 ET noArticle > 30 (Article)

10 10 10

Quantité

15.99 Génévrier

95

10.99 Herbe à puce

70

15.99 Erable argenté

60

prixUnitaire description

noArticle

(18)

Requêtes SQL simples Requêtes SQL simples

Sélection dans une table (WHERE)

Afficher les Articles dont le numéro est

supérieur à 30 et le prix est inférieur à 20 Euros, ou le numéro est inférieur à 20 et le prix est supérieur à 30.

SELECT *

FROM Article

WHERE (prixUnitaire < 20 AND noArticle > 30) OR (prixUnitaire > 30 AND noArticle < 20)

SELECT *

FROM Article

WHERE prixUnitaire < 20 AND noArticle > 30

OR prixUnitaire > 30 AND noArticle < 20

(19)

Requêtes SQL simples Requêtes SQL simples

Sélection dans une table (WHERE)

Afficher les Commandes du mois de juin de l'année 2000

SELECT *

FROM Commande

WHERE dateCommande BETWEEN 01/06/2000 AND 30/06/2000

SELECT *

FROM Commande

WHERE dateCommande >= 01/06/2000 AND dateCommande <=30/06/2000

123 456 123

N°SS Emp

10 02/06/2000 3

20 02/06/2000 2

10 01/06/2000 1

N°Client Date

N°Com

(20)

Requêtes SQL simples Requêtes SQL simples

Sélection dans une table (WHERE)

Afficher les Commandes du Client numéro 10 ou 40 ou 80

SELECT *

FROM Commande

WHERE noClient IN (10; 40; 80)

SELECT *

FROM Commande

WHERE noClient = 10 OR noClient = 40 OR noClient = 80

(21)

Requêtes SQL simples Requêtes SQL simples

Sélection dans une table (WHERE)

Afficher les Clients dont le nomClient commence par D

SELECT *

FROM Client

WHERE nomClient LIKE "D*"

123 456

N°SS Emp

(333)333-3333 Dollard Cash

80

(888)888-8888 Dollard Cash

20

Téléphone Nom_Client

N °

(22)

Requêtes SQL simples Requêtes SQL simples

Sélection dans une table (WHERE)

Afficher les Clients dont le nomClient contient le mot "Dol"

SELECT *

FROM Client

WHERE nomClient LIKE "*Dol*"

123 456

N°SS Emp

(333)333-3333 Dollard Cash

80

(888)888-8888 Dollard Cash

20

Téléphone Nom_Client

N °

(23)

Requêtes SQL simples Requêtes SQL simples

Sélection dans une table (WHERE)

Afficher les Clients dont la 3 ème lettre du nomClient est L et dernière lettre est un h

SELECT *

FROM Client

WHERE nomClient LIKE "??L*h"

123 456

N°SS Emp

(333)333-3333 Dollard Cash

80

(888)888-8888 Dollard Cash

20

Téléphone Nom_Client

N °

(24)

Requêtes SQL simples Requêtes SQL simples

Sélection dans une table (WHERE)

Afficher les Clients dont le téléphone a été saisi

SELECT *

FROM Client

WHERE Téléphone IS NOT NULL

123 789 789 789 456 123 456 123

N°SS Emp

(333)333-3333 Dollard Cash

80

(444)444-4419 Coco McPoulet

70

(666)666-6666 Comtesse Hasek

60

(555)555-5555 Hafedh Lajoie

50

(666)666-6666 Le Comte Hasek

40

(777)777-7777 Ye San Le Sou

30

(888)888-8888 Dollard Cash

20

(999)999-9999 Hugh Paycheck

10

Téléphone Nom_Client

(25)

Requêtes SQL simples Requêtes SQL simples

Sélection-projection sur une table

Afficher les noClient et dateCommande des Commandes saisies après le 05/07/2000

SELECT noClient, dateCommande FROM Commande

WHERE dateCommande > 05/07/2000

15/07/2000 40

15/07/2000 40

09/07/2000 20

09/07/2000 30

dateCommande noClient

Algèbre relationnelle : π noClient, dateCommande ( σ

dateCommande > 05/07/2000

( Commande))

(26)

Requêtes SQL

Requêtes SQL simples simples

Recherche des valeurs nulles

On utilise l’expression IS [NOT] NULL IS NULL est vraie si et seulement si la valeur associée est absente (valeur nulle) Exemple

Donnez les noms des employés qui n'ont pas de salaire fixe

SELECT N°SS, Nom FROM Employé

WHERE Salaire IS NULL

(27)

Requêtes SQL simples Requêtes SQL simples

Présentation du résultat

Il est possible de trier le résultat d'une requête en utilisant :

ORDER BY nom-de-colonne [ ASC |DESC ] [, nom-de-colonne [ ASC |DESC ] ] ...

ASC = ordre ascendant et DESC = ordre descendant

Par défaut, c'est ASC

(28)

Requêtes SQL simples Requêtes SQL simples

Sélection-projection-triée

Afficher le nom et le téléphone des Clients dont le numéro est différent de 30 par ordre

alphabétique

SELECT Nom, Téléphone FROM Client

WHERE Numéro <> 30 ORDER BY NOM

(444)444-4419 Coco McPoulet

(666)666-6666 Le Comte Hasek

(999)999-9999 Hugh Paycheck

(555)555-5555 Hafedh Lajoie

(333)333-3333 Dollard Cash

(888)888-8888 Dollard Cash

(666)666-6666 Comtesse Hasek

Téléphone Nom

Selon l’ordre de

saisie

(29)

Requêtes SQL simples Requêtes SQL simples

Sélection-projection-triée

Afficher le nom et le téléphone des Clients dont le numéro est différent de 30 par ordre

alphabétique

SELECT Nom, Téléphone FROM Client

WHERE Numéro <> 30

ORDER BY NOM ASC, Téléphone ASC

(444)444-4419 Coco McPoulet

(666)666-6666 Le Comte Hasek

(999)999-9999 Hugh Paycheck

(555)555-5555 Hafedh Lajoie

(333)333-3333 Dollard Cash

(888)888-8888 Dollard Cash

(666)666-6666 Comtesse Hasek

Téléphone Nom

Ordre de saisie est le suivant

(888)888-8888 Dollard Cash

(444)444-4419 Coco McPoulet

(666)666-6666 Le Comte Hasek

(999)999-9999 Hugh Paycheck

(555)555-5555 Hafedh Lajoie

(333)333-3333 Dollard Cash

(666)666-6666 Comtesse Hasek

Téléphone Nom

(30)

Conflits de noms d'attribut Conflits de noms d'attribut

On peut utiliser des ALIAS pour changer l'affichage des attributs. La syntaxe est :

nom-de-colonne [ [AS] Nouveau_nom ]

Le nouveau nom doit être entre deux crochets sous ACCESS

(31)

Requêtes SQL simples Requêtes SQL simples

Projection avec ALIAS

Afficher le numéro de sécurité sociale et le téléphone de tous les Clients

SELECT Nom, Téléphone, N°SS AS [Num Sécurité Sociale]

FROM Client

133 188 164 123 197 486 753 951

Num sécurité sociale

(333)333-3333 Dollard Cash

(444)444-4419 Coco McPoulet

(666)666-6666 Comtesse Hasek

(555)555-5555 Hafedh Lajoie

(666)666-6666 Le Comte Hasek

(777)777-7777 Ye San Le Sou

(888)888-8888 Dollard Cash

(999)999-9999 Hugh Paycheck

Téléphone Nom_Client

Algèbre relationnelle : π nom, Téléphone, ρ

N°SS [Num sécurité Sociale]

( Client)

(32)

Requêtes SQL simples Requêtes SQL simples

Avec paramètres

Afficher le téléphone et le nom du client dont le numéro INSEE est saisi par l'utilisateur

SELECT Nom, Téléphone, N°SS AS [Num sécurité sociale]

FROM Client

WHERE N°SS = [Saisissez le Num Sécurité Sociale]

951

Num sécurité sociale (999)999-9999

Hugh Paycheck

Téléphone Nom_Client

Algèbre relationnelle : π nom, Téléphone ( σ

N°SS = [Saisissez le Num sécurité Sociale]

( Client))

(33)

Op Op é é rateurs ensemblistes rateurs ensemblistes

Union

Intersect (Pas implémenté dans Access) Except ou Minus (Pas implémenté dans Access)

Tous les SELECT doivent avoir le même nombre de colonnes sélectionnées, et leurs types doivent être

un à un identiques

(34)

Op Op é é rateurs ensemblistes rateurs ensemblistes

Union

Intersect (Pas implémenté dans Access) Except ou Minus (Pas implémenté dans Access)

Les doublons sont éliminés (DISTINCT implicite) sauf

si l'on spécifie l'opérateur ALL

(35)

Op Op é é rateurs ensemblistes rateurs ensemblistes

Union

Intersect (Pas implémenté dans Access) Except ou Minus (Pas implémenté dans Access)

Les noms des colonnes à l'affichage sont ceux du

premier SELECT

(36)

Op Op é é rateurs ensemblistes rateurs ensemblistes

Syntaxe:

table-expression

{ UNION | EXCEPT |INTERSECT } [ALL] [CORRESPONDING [BY (attributs)] ]

table-expression

(37)

Op Op é é rateurs ensemblistes rateurs ensemblistes

Exemple

Union

Afficher le N°SS et le nom de tous les clients et de tous les employés

(SELECT N°SS as N°INSEE, nomClient as nomPersonne FROM Client)

UNION ALL

(SELECT N°SS, nom_Employé FROM Employé)

M. Barth 123

Mme Kacimi 789

M. Chbeir 456

Dollard Cash Coco McPoulet Comtesse Hasek M. Barth Le Comte Hasek Ye San Le Sou Dollard Cash Hugh Paycheck NomPersonne

133 188 164 123 197 486 753 951 INSEE

(38)

Op Op é é rateurs ensemblistes rateurs ensemblistes

Exemple

Union

Afficher le N°SS et le nom de tous les clients et de tous les employés

(SELECT N°SS as N°INSEE, nomClient as nomPersonne FROM Client)

UNION

(SELECT N°SS, nom_Employé FROM Employé)

Mme Kacimi 789

M. Chbeir 456

Dollard Cash Coco McPoulet Comtesse Hasek M. Barth Le Comte Hasek Ye San Le Sou Dollard Cash Hugh Paycheck NomPersonne

133 188 164 123 197 486 753 951 INSEE

(39)

Op Op é é rateurs ensemblistes rateurs ensemblistes

Exemple

Intersect

Afficher le N°SS et le nom de tous les clients qui sont également employés

(SELECT N°SS as N°INSEE, nomClient as nomPersonne FROM Client)

INTERSECT

(SELECT N°SS, nom_Employé FROM Employé)

M. Barth

NomPersonne

123

N ° INSEE

L'intersection est faite sur la position des colonnes

(40)

Op Op é é rateurs ensemblistes rateurs ensemblistes

Exemple

Intersect

Afficher le N°SS et le nom de tous les clients qui sont également employés

(SELECT N°SS, nomClient as nomPersonne FROM Client)

INTERSECT CORRESPONDING BY (N°SS) (SELECT N°SS, nom_Employé

FROM Employé)

M. Barth

NomPersonne

123

N ° INSEE

L'intersection est faite sur la colonne N°SS

(41)

Op Op é é rateurs ensemblistes rateurs ensemblistes

Exemple

Intersect

Afficher le N°SS et le nom de tous les clients qui sont également employés

(SELECT *

FROM Client)

INTERSECT CORRESPONDING (SELECT *

FROM Employé)

M. Barth

NomPersonne

123

N ° INSEE

L'intersection est faite sur toutes les colonnes communes

(42)

Produit cart

Produit cart é é sien sien

Définition

Il suffit de citer dans une requête

SELECT sans WHERE les relations qui participent au produit après la clause FROM

SELECT *

FROM R1, R2

Algèbre relationnelle : R1 X R2

SELECT *

FROM R1 CROSS JOIN R2

SQL 1

SQL 2

(43)

Produit cart

Produit cart é é sien sien

Exemple

Afficher toutes les combinaisons possibles de lignes de Client et de Commande

SELECT *

FROM Client, Commande

Algèbre relationnelle : Client × Commande

(44)

Conflits de noms d'attributs Conflits de noms d'attributs

Pour lever les ambiguïtés ou pour faciliter la compréhension des

requêtes, deux techniques sont utilisées dans SQL

Préfixage

Renommage

(45)

Conflits de noms d'attributs Conflits de noms d'attributs

Préfixer

les attributs peuvent être préfixés par les noms de relation dans les diverses

clauses Syntaxe

Nom_table . nom_colonne

Exemple

SELECT Client . Nom,…,

FROM Client, …

(46)

Conflits de noms d'attributs Conflits de noms d'attributs

Renommer les relations

Il est parfois utile de renommer les relations

Nom long d'une relation Auto jointure

Il suffit de mettre le nouveau nom après la

relation à renommer (avec ou sans le mot-clé AS)

(47)

Conflits de noms d'attributs Conflits de noms d'attributs

Renommer les relations

Exemple : Afficher les coordonnées des Clients qui ont effectué des commandes

SELECT Cl.noClient, nomClient, noTéléphone, noCommande, dateCommande

FROM Client AS Cl, Commande AS Co WHERE Cl.noClient = Co.noClient

SELECT Client.noClient, nomClient, noTéléphone, noCommande, dateCommande

FROM Client, Commande

WHERE Client.noClient = Commande.noClient

(48)

Conflits de noms d'attributs Conflits de noms d'attributs

Attention

Quand on renomme une relation, on ne peut plus préfixer les attributs avec l'ancien nom

SELECT Client.noClient, nomClient, noCommande FROM Client AS Cl, Commande AS Co

WHERE Cl.noClient = Co.noClient

(49)

Thêta

Thêta - - produit produit ( ( thêta thêta - - jointure jointure ) )

Exemple

Afficher toutes les combinaisons possibles de lignes de Client numéro 10 et de Commande

SELECT Client.noClient, nomClient, noTéléphone, noCommande FROM Client, Commande

WHERE Client. noClient = 10

Algèbre relationnelle : π

Client.noClient, nomClient, noTéléphone, noCommande

( Client noClient=10 Commande)

SELECT Client.noClient, nomClient, noTéléphone, noCommande FROM Client JOIN Commande

ON Client.noClient = 10

SELECT Client.noClient, nomClient, noTéléphone, noCommande FROM Client JOIN Commande

USING (Client.noClient = 10)

(50)

Jointure naturelle (*) Jointure naturelle (*)

Exemple

Afficher toutes les informations au sujet des Clients et de leurs Commandes

SELECT Client.noClient, nomClient, noTéléphone, noCommande FROM Client, Commande

WHERE Client.noClient = Commande.noClient

π

Client.noClient, nomClient, noTéléphone, noCommande

( σ

Client.noCliente= Commande.noClient

(Client × Commande))

SELECT Client.noClient, nomClient, noTéléphone, noCommande FROM Client NATURAL JOIN Commande

La jointure avec NATURAL JOIN est faite sur les colonnes de

même nom (noClient)

(51)

Jointure naturelle (*) Jointure naturelle (*)

Exemple

Afficher toutes les informations au sujet des Clients et de leurs Commandes

Quand les noms des colonnes sont différents, on peut utiliser JOIN avec une condition

SELECT Client.noClient, nomClient, noTéléphone, noCommande FROM Client JOIN Commande ON

Client.noClient = Commande.numeroClient

(52)

Jointure naturelle (*) Jointure naturelle (*)

Exemple

Afficher le nom des Clients qui ont passé des Commandes le 01/07/2002

SELECT nomClient FROM Client

WHERE noClient IN (SELECT noClient FROM COMMANDE

WHERE Date = 01/07/2002)

SELECT nomClient

FROM Client Cl, Commande Co

WHERE Cl.noClient = Co.noClient

AND Co.date = 01/07/2002

(53)

Jointure

Jointure naturelle naturelle de de plusieurs tables

plusieurs tables

Exemple

Afficher le nom des Clients qui ont commandé au moins un article Imprimante

SELECT nomClient

FROM Client, Commande, DétailsCommande, Article WHERE description = 'Imprimante' AND

Client.noClient = Commande.noClient AND

Commande.noCommande = DétailsCommande.noCommande AND DétailsCommande.noArticle = Article.noArticle

π nomClient ( σ description = “Imprimante ”

(Client *Commande * DétailsCommande * Article))

(54)

Jointure

Jointure naturelle naturelle de de plusieurs tables

plusieurs tables

Exemple

Afficher le nom des Clients qui ont commandé au moins un article Imprimante

SELECT nomClient FROM Client WHERE noClient IN

SELECT noClient FROM Commande

WHERE noCommande IN

SELECT noCommande FROM DétailsCommande WHERE noArticle IN

SELECT noArticle FROM Article

WHERE description = 'Imprimante'

(55)

Demi Demi - - Jointure Jointure Gauche (> Gauche ( ) )

Exemple

Afficher toutes les informations au sujet des

Clients et de leurs Commandes et des Clients qui n'ont passé aucune commande

SELECT Client.noClient, nomClient, noTéléphone, noCommande FROM Client LEFT OUTER JOIN Commande

(56)

Demi Demi - - Jointure Jointure Droite ( < Droite ( ) )

Exemple

Afficher toutes les informations au sujet des Clients et de leurs Commandes et des

Commandes dont le client n'est pas défini

SELECT Client.noClient, nomClient, noTéléphone, noCommande FROM Client RIGHT OUTER JOIN Commande

(57)

Jointure Externe Jointure Externe

Exemple

Afficher toutes les informations au sujet des

Clients et de leurs Commandes, des Commandes dont le client n'est pas défini, et des Clients qui n'ont pas de commande

SELECT Client.noClient, nomClient, noTéléphone, noCommande

FROM Client FULL OUTER JOIN Commande

(58)

Auto Auto - - Jointure Jointure

Exemple

Afficher les Clients qui ont le même numéro de téléphone

SELECT Client.noClient, Client2.noClient FROM Client, Client AS Client2

WHERE Client.noTéléphone = Client2.noTéléphone AND Client.noClient <> Client2.noClient

L'utilisation d'ALIAS est indispensable

π

Client.noClient, Client2.noClient,

( σ

Client.noTéléphone= Client2.noTéléphone

(Client × ρ

Client2

(Client)))

(59)

Exemple

Afficher les Clients qui ont le même numéro de téléphone

Auto Auto - - Jointure Jointure

SELECT noClient, noClient2

FROM Client JOIN Client AS Client2

ON Client.noTéléphone = Client2.noTéléphone

(60)

Exemple

Afficher les Clients qui ont le même numéro de téléphone

Auto Auto - - Jointure Jointure

SELECT noClient, noClient2 FROM Client NATURAL JOIN

Client AS Client2(noClient2, nomClient2, noTéléphone, N°SS2)

π noClient, noClient2 (Client * ρ Client2(noClient2, nomClient2, noTéléphone, N°SS2) (Client))

La jointure avec NATURAL JOIN est faite sur les colonnes de même nom

(61)

Exemple

Afficher les Employés qui gagnent plus que l'employé "Chbeir"

Auto Auto - - Jointure Jointure

SELECT Employé.N°SS, CHBEIR.N°SS FROM Employé, Employé AS CHBEIR

WHERE Employé.Salaire > CHBEIR.Salaire AND CHBEIR.Nom = "Chbeir"

SELECT Employé.N°SS FROM Employé

WHERE Salaire > (SELECT Salaire FROM Employé

WHERE Nom = "Chbeir")

Une seule valeur doit être retournée

(62)

Expressions g

Expressions g é é n n é é rales sur rales sur les colonnes

les colonnes

Exemple

Afficher la liste des articles avec le prix Unitaire actuel et le prix taxé (augmenté de 15%)

SELECT noArticle, prixUnitaire, prixUnitaire*1.15 AS prixPlusTaxe FROM Article

18.39 15.99

95

29.89 25.99

90

29.89 25.99

81

31.04 26.99

80

12.64 10.99

70

18.39 15.99

60

26.44 22.99

50

29.89 25.99

40

14.94 12.99

20

12.64 10.99

10

prixPlusTaxe prixUnitaire

noArticle

(63)

Expressions g

Expressions g é é n n é é rales sur rales sur les colonnes

les colonnes

SELECT L.noArticle, quantité, prixUnitaire, prixUnitaire*quantité AS total, prixUnitaire*quantité*1.15 AS totalPlusTaxe

FROM DétailsCommande AS L, Article AS A WHERE L.noArticle = A.noArticle

Exemple

Afficher le détail de chacun des Articles commandés

incluant le prix total avant et après la taxe de 15%

(64)

Expression sur colonne du Expression sur colonne du

WHERE WHERE

Exemple

Afficher les Articles dont le prixUnitaire augmenté de 15% est inférieur à 16

SELECT noArticle, prixUnitaire FROM Article

WHERE prixUnitaire*1.15 < 16

(65)

Fonctions Fonctions

Dans SQL, on peut utiliser plusieurs types de fonctions

Fonctions dépendantes du SGBD

Fonctions sur chaînes de caractères Fonctions sur des entiers

Fonctions sur des dates

Fonctions génériques

Fonctions arithmétiques

Fonctions ensemblistes

(66)

Fonctions d

Fonctions d é é pendantes du pendantes du SGBD SGBD

Dans Access

(67)

Fonctions d

Fonctions d é é pendantes du pendantes du SGBD SGBD

Exemple

Afficher les Commandes de la journée

SELECT *

FROM Commande

WHERE dateCommande = Maintenant()

(68)

Fonctions arithm

Fonctions arithm é é tiques et tiques et ensemblistes

ensemblistes

Elles peuvent être utilisées

dans la clause SELECT dans la clause WHERE

Elles agissent sur un ensemble de valeurs d'une colonne

Elles donnent toujours une seule

valeur

(69)

Fonctions arithm

Fonctions arithm é é tiques et tiques et ensemblistes

ensemblistes

FONCTIONS ARITHMETIQUES

+, *, /, -

FONCTIONS ENSEMBLISTES

MAX : Fournit la valeur maximale MIN : Fournit la valeur minimale

COUNT : Fournit la cardinalité d’un ensemble SUM : Somme de toutes les valeurs

AVG : Moyenne de toutes les valeurs Valeurs Numériques

Valeurs numériques, caractère et date

(70)

Fonctions ensemblistes Fonctions ensemblistes

Si l'argument est l'ensemble vide

COUNT donne 0

Les autres fonctions donnent NULL

L'argument de ces fonctions ne peut pas être une fonction

SELECT AVG(SUM(Salaire)) FROM … est invalide Mais on peut faire:

SELECT AVG(x) FROM (SELECT SUM(Salaire) AS x FROM ..))

Les valeurs nulles sont éliminées avant

l'application de la fonction, sauf pour COUNT(*)

(71)

Fonctions ensemblistes Fonctions ensemblistes

COUNT(*)

COUNT(*) compte toutes les lignes d'une table ou d'un résultat d'une sélection

(sans éliminer les doublons)

COUNT(DISTINCT attribut) compte le nombre d'attributs sans doublons

COUNT(DISTINCT *) est invalide

(72)

Fonctions ensemblistes Fonctions ensemblistes

Exemple

Afficher le salaire moyen des employés

Afficher les employés qui gagnent plus que le salaire moyen

SELECT AVG(Salaire) FROM Employé

SELECT Nom

FROM Employé

WHERE Salaire >=(SELECT AVG(Salaire)

FROM EMployé)

(73)

Fonctions ensemblistes Fonctions ensemblistes

Exemple

Afficher le nombre de salariés qui ont un salaire fixe

Afficher le nombre d'employés qui ne gagnent pas le même salaire

SELECT COUNT(*) FROM Employé

WHERE Salaire IS NOT NULL

SELECT COUNT(DISTINCT Salaire)

FROM Employé

(74)

Partition d'une table avec Partition d'une table avec

GROUP BY GROUP BY

Exemple

Afficher le nombre de Commandes de chaque Client (qui a passé au moins une Commande)

SELECT noClient, COUNT(*) AS nombreCommandes FROM Commande

GROUP BY noClient

noClient nombreCommandes

10 3

20 2

30 1

40 2

Table Commande

noCommande dateCommande noClient

1 01/06/2000 10

3 02/06/2000 10

4 05/07/2000 10

2 02/06/2000 20

6 09/07/2000 20

5 09/07/2000 30

7 15/07/2000 40

8 15/07/2000 40

(75)

Partition d'une table avec Partition d'une table avec

GROUP BY GROUP BY

Il faut dire que le GROUP BY exige

SELECT noClient, NomClient AS nombreCommandes FROM Commande

GROUP BY noClient

SELECT noClient, COUNT(*) AS nombreCommandes FROM Commande

GROUP BY noClient

SELECT noClient, NomClient FROM Commande

GROUP BY noClient, NomClient

(76)

Partition d'une table avec Partition d'une table avec

GROUP BY GROUP BY

Il faut dire que le GROUP BY exige

SELECT noClient, count(*) AS nombreCommandes FROM Commande

SELECT COUNT(*) AS nombreCommandes FROM Commande

SELECT noClient, Count(*) AS nombreCommandes FROM Commande

GROUP BY noClient

(77)

Partition d'une table avec Partition d'une table avec

GROUP BY GROUP BY

Il faut dire que le GROUP BY exige

SELECT NomClient FROM Commande GROUP BY NomClient

SELECT noClient, NomClient FROM Commande

GROUP BY noClient

SELECT NomClient FROM Commande

GROUP BY noClient, NomClient

(78)

Partition d'une table avec Partition d'une table avec

GROUP BY GROUP BY

SELECT noCommande, noArticle, SUM(quantitéLivrée) AS totalLivré, COUNT(*)AS nombreLivraisons

FROM DétailLivraison

GROUP BY noCommande, noArticle

noCommande noArticle totalLivré nombreLivraisons

1 10 10 2

1 70 5 1

1 90 1 1

2 40 2 1

2 95 1 1

3 20 1 1

4 40 1 1

5 70 2 1

Table DétailLivraison

noLivraison noCommande noArticle quantitéLivrée

100 1 10 7

101 1 10 3

100 1 70 5

102 2 40 2

102 2 95 1

100 3 20 1

103 1 90 1

104 4 40 1

105 5 70 2

Exemple

Pour chacune des

Pour chacune des d d étailsLivraison é tailsLivraison (pour lesquelles au (pour lesquelles au moins une

moins une Livraison Livraison a é a ét t é é effectué effectu ée), afficher le e), afficher le noCommande

noCommande et et noArticle noArticle , la quantité , la quantit é totale livré totale livr ée et le e et le nombre de

nombre de Livraisons Livraisons effectué effectu ées es

(79)

Clause HAVING Clause HAVING

Exemple

Afficher le nombre de Commandes de chaque Client qui a passé deux Commandes ou plus

noClient nombreCommandes

10 3

20 2

30 1

40 2

Table Commande

noCommande dateCommande noClient

1 01/06/2000 10

3 02/06/2000 10

4 05/07/2000 10

2 02/06/2000 20

6 09/07/2000 20

5 09/07/2000 30

7 15/07/2000 40

8 15/07/2000 40

(80)

Clause HAVING Clause HAVING

Exemple

Afficher le nombre de Commandes de chaque Client qui a passé deux Commandes ou plus

SELECT noClient, COUNT(*) AS nombreCommandes FROM Commande

GROUP BY noClient WHERE COUNT(*) >= 2

SELECT noClient, COUNT(*) AS nombreCommandes FROM Commande

GROUP BY noClient

HAVING COUNT(*) >= 2

Mais la clause WHERE ne peut pas être utilisée après GROUP BY

(81)

Clause HAVING Clause HAVING

Exemple

Afficher le nombre de Commandes de chaque Client passées après le 02/06/2000

SELECT noClient, COUNT(*) AS nombreCommandes FROM Commande

WHERE dateCommande > '02/06/2000' GROUP BY noClient

noClient nombreCommandes

10 1

20 1

30 1

40 2

Table Commande

noCommande dateCommande noClient

1 01/06/2000 10

3 02/06/2000 10

4 05/07/2000 10

2 02/06/2000 20

6 09/07/2000 20

5 09/07/2000 30

7 15/07/2000 40

8 15/07/2000 40

(82)

Clause HAVING Clause HAVING

Exemple

Afficher le nombre de Commandes de chaque Client qui a passé deux Commandes ou plus après le 02/06/2000

SELECT noClient, COUNT(*) AS nombreCommandes FROM Commande

WHERE dateCommande > '02/06/2000' GROUP BY noClient

HAVING COUNT(*) >= 2

noClient nombreCommandes

10 1

20 1

30 1

40 2

Table Commande

noCommande dateCommande noClient

1 01/06/2000 10

3 02/06/2000 10

4 05/07/2000 10

2 02/06/2000 20

6 09/07/2000 20

5 09/07/2000 30

7 15/07/2000 40

8 15/07/2000 40

(83)

SELECT imbriqu SELECT imbriqu é é

Exemple

Afficher toutes les informations concernant les Clients qui ont passé au moins une Commande

SELECT noClient, nomClient, noTéléphone FROM Client

WHERE noClient IN (SELECT noClient FROM Commande)

SELECT Client.noClient, nomClient, noTéléphone FROM Client, Commande

WHERE Client.noClient = Commande.noClient

(84)

SELECT imbriqu SELECT imbriqu é é

Exemple

Afficher les LigneCommandes pour

lesquelles au moins une Livraison a été effectuée

SELECT *

FROM LigneCommande

WHERE (noCommande,noArticle) IN

(SELECT noCommande, noArticle

FROM DétailLivraison)

(85)

SELECT imbriqu SELECT imbriqu é é

Exemple

Afficher les Commandes de M. Chbeir

SELECT *

FROM Commande WHERE noClient =

(SELECT noClient FROM Client

WHERE nomClient = 'Chbeir')

Attention si plusieurs lignes sont renvoyées par la SELECT imbriquée

(86)

SELECT imbriqu

SELECT imbriqu é é corr corr é é l l é é

Exemple

Afficher les informations au sujet des Clients qui ont passé au moins une Commande

SELECT *

FROM Client

WHERE 0 <

(SELECT COUNT(*) FROM Commande

WHERE noClient = Client.noClient)

POUR chaque ligne de Client

Exécuter le SELECT suivant : (SELECT COUNT(*)

FROM Commande

WHERE noClient = Client.noClient) SI le compte retourné > 0

Placer la ligne de Client dans la table du résultat à retourner FIN SI

FIN POUR

Référence à une

colonne non locale

(87)

Condition ALL Condition ALL

Exemple

Afficher les employés qui touchent un salaire supérieur à n'importe quel autre employé (le plus élevé)

SELECT *

FROM Employé

WHERE Salaire >= ALL (

SELECT Salaire

FROM Employé)

(88)

Condition ALL Condition ALL

Exemple

Afficher les Commandes qui ont été

passées après la dernière Livraison (c'est- à-dire à une date ultérieure)

SELECT * FROM Commande

WHERE dateCommande > ALL

(SELECT dateLivraison

FROM Livraison)

(89)

Condition ANY (SOME) Condition ANY (SOME)

Exemple

Afficher les employés qui touchent un salaire supérieur à un employé

quelconque dont le nom commence par c

SELECT *

FROM Employé

WHERE Salaire > ANY (

SELECT Salaire

FROM Employé

WHERE Nom_employe like "c*")

(90)

Condition ALL Condition ALL

Exemple

Afficher les Commandes qui ont été passées après au moins une des Livraisons

SELECT * FROM Commande

WHERE dateCommande > ANY

(SELECT dateLivraison

FROM Livraison)

(91)

Test d

Test d ’ ’ ensemble vide EXISTS ensemble vide EXISTS

Exemple

Afficher les Clients qui ont passé au moins une Commande

SELECT *

FROM Client WHERE EXISTS (SELECT *

FROM Commande

WHERE noClient = Client.noClient)

POUR chaque ligne de Client

Exécuter le SELECT suivant :

(SELECT *

FROM Commande

WHERE noClient = Client.noClient) SI le résultat de la sélection n'est pas vide

Placer la ligne de Client dans la table du résultat à retourner FIN SI

FIN POUR

Référence à une

colonne non locale

(92)

Test d

Test d ’ ’ ensemble vide EXISTS ensemble vide EXISTS

Exemple

Afficher les Clients qui ne sont pas en même temps des employés

SELECT *

FROM Client e WHERE NOT EXISTS (SELECT *

FROM Employé

WHERE N°SS_Employé = e.N°SS)

Références

Documents relatifs

Si le calcul est long seulement pour certain index, une thread peut être encore entrain de faire des calculs alors que les autres ont finis. =&gt; problème de répartition de

Nous ne chercherons pas ici à donner une définition générale de cette notion déjà visitée en sciences politique, en économie, en sociologie ou encore en histoire,

Fournisseur (NumF, NomF, Status) Produit (NumP, NomP, Poids) Fournit (NumF, NumP, Qté). Fournit [NumF] ⊆

Now that we’ve covered the fundamentals of Android UI design, the next chapter focuses on binding application components using Intents, Broadcast Receivers, and Adapters. You will

The notion of the normal elements of a FJH becomes very useful in the study of its subhypergroups.. This Lemma will be proved by induction. Such subhypergroups will be

Client.noClient nomClient noTéléphone noCommande dateCommande Commande..

Permet en effet de définir des variables avec un niveau de visibilité global de

Les variables locales se définissent dans la partie DECLARE d’un bloc