récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *}...

46
Récupérer les informations stockées dans la base de manière cohérente. select { <col>[, <col>… ] | *} from <tab> [where <expr>];

Upload: lula-mace

Post on 04-Apr-2015

108 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

◦Récupérer les informations stockées dans la base de manière cohérente.

select { <col>[, <col>… ] | *} from <tab> [where <expr>];

Page 2: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

◦ SELECT <liste de projection> FROM <liste de tables> [WHERE <critère de jointure> AND <critère de

restriction>] [GROUP BY <attributs de partitionnement>] [HAVING <citère de restriction>]

Restriction : ◦ arithmétique (=, <, >, )◦ textuelle (LIKE)◦ sur intervalle (BETWEEN)◦ sur liste (IN)

Possibilité de blocs imbriqués par : IN, EXISTS, NOT EXISTS, ALL, SOME, ANY

Page 3: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

◦ 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;

Page 4: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

◦ L’ajout d’un prédicat sur un ordre select s’exprime dans une clause WHERE par :

SELECT * FROM MA_TABLE WHERE <EXPR>;

◦ Exemple :

SELECT * FROM MA_TABLE WHERE C1 = 600;

Page 5: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Opérateurs de comparaison := , != , <> , <= , >= , < , >

Opérateurs logiques AND, OR, NOT

Exemple :SELECT * from MA_TABLE

where c1 < > 12 and c2 = 15;

Page 6: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

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

Attention : bien que la syntaxe SQL ne soit pas sensible à la casse, les tests sur les

chaînes le sont.

Page 7: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

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% ’ ;

Page 8: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Cas particulier des champs ‘NULL’ :Il sont testés avec le prédicat IS NULL ouIS NOT NULL

Exemple : tous les enregistrements dont la colonne C2 n’est pas remplie :

SELECT * FROM MA_TABLEWHERE C2 IS NULL;

Page 9: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

<search condition> ::= [NOT] <nom_colonne> constante <nom_colonne>

<nom_colonne> LIKE <modèle_de_chaîne><nom_colonne> IN <liste_de_valeurs>

<nom_colonne> (ALL ANY SOME)<liste_de_valeurs>

EXISTS <liste_de_valeurs>UNIQUE <liste_de_valeurs><tuple> MATCH [UNIQUE] <liste_de_tuples>

<nom_colonne> BETWEEN constante AND constante <search condition> AND OR <search condition>

avec : Opérateur de comparaison

Remarque: <liste_de_valeurs> peut être dynamiquement déterminée par une requête

Page 10: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Le produit cartésien de A et B s’exprime enSQL par :

SELECT * FROM A, B;

ATTENTION : le produit cartésien n'a pasde sens logique, c'est la première étaped'une jointure

Page 11: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

La jointure de 2 tables s'effectue en ajoutant un pivot au produit cartésien :

SELECT * FROM A, B WHERE A.C1 = B.C2;

Page 12: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Pour effectuer des jointures multiples :SELECT * FROM T1, T2, T3…

WHEREPIVOT1 AND PIVOT2 AND PIVOT3

AND …ATTENTION : il est indispensable de citerautant de pivots que de jointures.

Page 13: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Pour effectuer une auto-jointure (jointured'une table sur elle même) il est nécessairede déclarer des synonymes dits ALIAS surla table concernée :SELECT a.first_name, b.first_name FROM

employee a, employee b WHERE a.manager_id = b.employee_id;

Page 14: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Concaténation : ||SELECT 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

Page 15: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Majuscule : UPPER(chaîne)

Minuscule : LOWER(chaîne)

Page 16: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Chaîne vers nombre : TO_NUMBER()Nombre vers chaîne : TO_CHAR(ch,

masque)

Le masque permet de définir des règles detransformation pour les nombres :

9 : chiffre quelconque non représenté pour les 0 non significatifs

0 : chiffre quelconque représenté . : point décimal apparent

Page 17: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Objectif Effectuer des opérations en regroupant plusieurs lignes d'un SELECT.

Définition : 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.

Page 18: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Pour regrouper des données, il faut alors utiliser la clause GROUP BY suivi du facteur de groupage.

Select col1,col2, fonction d ’agrégat()

FROM tab1,tab2

where …

group by col1,col2 ;

Page 19: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Exemple : Afficher le nombre total et moyenne d'heures de vol par type d'avion et par année de mise en service, tri par type et année.

SELECT CodeType, AnnServ, SUM(NbHVol),

AVG(NbHVol)

from AVION

GROUP BY CodeType, AnnServ;

Page 20: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Une clause HAVING permet d'opposer un prédicat à un groupe.

Exemple : SELECT NumClient,sum(montant)

FROM commandes

GROUP BY NumClient

HAVING count(*)>3; La clause HAVING élimine des groupes comme

la clause WHERE élimine des lignes.

Page 21: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Moyenne : AVG Somme : SUM Minimum : MIN Maximum : MAX Dénombrement : COUNT Variance : VARIANCE Ecart-type : STTDEV

Page 22: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

C ’est une requête dont le résultat sert de valeur de référence dans le prédicat

On peut imbriquer plusieurs requêtes, le résultat de chaque requête imbriquée servant de valeur de référence dans la condition de sélection de la requête de niveau supérieure: la requête principale.

La sous-requête est évaluée entièrement avant la requête principale.

Page 23: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Exemple : affichez les employés ayant le même poste que l’employé Martin

Solution 1 avec auto-jointure :select nom from employe e1, employe e2 where e1.nom=‘ Martin  ’ and e1.poste=e2.poste ;

Page 24: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Solution 2 : avec sous-requête SELECT nom

FROM employé WHERE poste = (SELECT poste from employé WHERE nom=‘Martin’);

C ’est une sous requête indépendante qui ne renvoie qu ’une ligne.

Page 25: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Sous-requêtes indépendantes ◦ qui renvoie une seul ligne

Une sous-requête de ce type s'utilise lorsque la condition de sélection fait référence à une valeur.

◦ qui renvoie plusieurs lignes Une sous-requête de ce type s'utilise lorsque la

condition de sélection fait référence à une liste de valeurs.

sous requêtes dépendantes La sous-requête est évaluée pour chaque ligne de la

requête principale.

Page 26: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

La condition de sélection utilise un opérateur IN, ou un opérateur simple =, !=, <>, <, >, <=, >= suivi de ALL ou ANY.

Exemple : lister les clients qui ont passé des commandes le 5/6/98.

SELECT NumClient FROM CLIENT

WHERE NumClient IN(SELECT NumClient FROM COMMANDE WHERE DateCommande='05-JUN-98');

=ANY est équivalent à IN !=ALL est équivalent à NOT IN

Page 27: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

La sous-requête est évaluée pour chaque ligne de la requête principale.

Exemple: Lister les vols et les numéros de pilotes qui habitent la même ville d'un départ d'un vol.

SELECT NumPilote, NumVol, VilDep from PILOTE p, VOL where VilDep =(SELECT Adresse from PILOTE where p.NumPilote=PILOTE.NumPilote );

Page 28: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

L'opérateur EXISTS permet de construire un prédicat évalué à VRAI si la sous-requête renvoie au moins une ligne.

SELECT NomCol [, ….] FROM NomTable [, ….][WHERE EXISTS (SELECT …)

Exemple : Lister les vols ayant utilisé au moins une fois un avion de code type '741' .

SELECT NumVol FROM AFFECTATION A WHERE EXISTS(SELECT * from AVION WHERE A.NumAvion=AVION.NumAvion AND CodeType='741');

=> Cette requête utilise une sous-requête dépendante.

Page 29: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Exemple : Lister les avions du même type que l'avion numéro '8832' et mis en service la même année.SELECT NumAvion

FROM AVION

WHERE (AnnServ, CodeType)=(SELECT AnnServ, CodeType from AVION where NumAvion='8832');

Page 30: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

La jointure naturelle peut s ’écrire sous la formeselect *from tab1 natural join tab2 natural join tab3 ...;

si les nom colonnes correspondent, il est inutile d ’expliciter la jointure.

Si les noms de colonnes ne sont pas les mêmes dans les tables alors on écrit explicitement les conditions de jointures

Page 31: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Exemples :◦ Ces trois syntaxes sont identiques

select * from pilote natural join affectation natural join vol;

select * from pilote p natural join affectation a join vol v on v.numvol=a.numvol and a.numpilote.p.numpilote ;

select * from pilote p,affectation a,vol v where v.numvol=a.numvol and a.numpilote.p.numpilote;

Page 32: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Une jointure externe entre deux tables agit comme une jointure naturelle entre deux tables mais permet d ’obtenir aussi les lignes qui n ’ont pas de correspondance entre la table 1 et la table 2.

Table1

col1 col12

a x

b y

c z

Table2

col1 col22

a 1

b 2

Ligne sans correspondance dans la table 2

Lignes avec correspondance

Page 33: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Select * from table1 natural join table2;

◦ ne donne que les lignes en correspondance select * from table1 left outer join table2;

◦ donne toutes les lignes en correspondance et les lignes de table 1 sans correspondance

Table1

col1 col12

a x

b y

c z

Table2

col1 col22

a 1

b 2

Page 34: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Exemple :◦ Liste des clients et somme totale des factures

(même ceux qui n ’ont pas été facturé) :

select Idc,nom,sum(totalfact) from client left outer join facture on client.Idc=facture.idc group by client.idc ;

Page 35: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Même exemple mais avec une autre syntaxe◦ le signe (+) se situe sur la colonne de la table

subordonnée.

select Idc,nom,sum(totalfact) from client , facture where client.Idc=facture.idc (+) group by client.idc ;

Page 36: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Algèbre relationnelle : R U S SQL :

SELECT * FROM RUNIONSELECT * FROM S

Page 37: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Algèbre relationnelle : Intersect (R , S) SQL :

SELECT * FROM R INTERSECT SELECT * FROM S

Page 38: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Algèbre relationnelle : R - S SQL : SELECT * FROM R

MINUS / Except SELECT * FROM S

On peut également représenter la différence par :

SELECT * FROM R where not exists ( select * from S )

Page 39: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Tri des n-uplets selon un ou plusieurs attributs ;

Le tri peut être croissant ou décroissant sur chaque attribut ;

Ajout à la requête d'une clause “ORDER BY” en fin de requête suivie d'une liste de couple (attr, sens)

où attr est un attribut de la relation et sens est :

• « ASC » pour trier de manière croissante• « DESC » pour trier de manière décroissante

Page 40: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

SELECT liste d'attributs FROM liste de relations WHERE condition GROUP BY liste d'attributs HAVING condition ORDER BY liste d'attributs avec sens de tri

Les clauses « WHERE », « GROUP BY », « HAVING » et « ORDER BY » sont facultatives

Il n'est possible d'utiliser la clause « HAVING » qu'aprèsun « GROUP BY »

Page 41: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

La clause INSERT INTO … VALUES permet d'insérer de nouvelles lignes dans la table.

Syntaxe : INSERT INTO <nom_table>

VALUES (valeur1, valeur2,…, valeurn)ou

INSERT INTO <nom_table> (attr1, attr2, …, attrm)VALUES (v1, v2,…, vm)

Si une valeur n'est pas précisée pour un attribut qui n’est pas obligatoire, alors le système insère la valeur NULL ou ce qui a été spécifié dans la clause DEFAULT du CREATE TABLE.

n = nombre d'attributs de la tablem <= n

Page 42: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

Insert into emloye values(123,’Mohammed’, ‘20/05/1970’, ‘maroc’);

Insert into emloye(nom,prénon,pays) values(‘Benali’,’Mohammed, ‘maroc’);

Attention : Les données de type texte ou date doivent être entre ' '. Oracle : n’oubliez pas la clause COMMIT pour rendre les

modifications permanentes SQL Server : le format des dates par défaut à l’insertion est

‘JJ/MM/AA’

Page 43: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

La clause INSERT INTO … SELECT permet d'insérer de nouvelles lignes dans la table à partir d'une table ou vue existante.

Syntaxe :INSERT INTO <nom_table>

SELECT …

INSERT INTO <nom_table> (attr1, attr2, …, attrm)SELECT r1, r2,…, rm

FROM … Si une valeur n'est pas précisée pour un attribut qui n’est pas

obligatoire, alors le système insère la valeur NULL ou ce qui a été spécifié dans la clause DEFAULT du CREATE TABLE.

Page 44: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

1) CREATE TABLE Employé 2000

( id_employe INTEGER, nom VARCHAR(30), prénom VARCHAR(20), DateEmbauche datetime,

id_entreprise INTEGER, Salaire_base MONEY );

2) INSERT INTO Employe2000

SELECT *

FROM Employe

WHERE DateEmbauche> ’01/01/2000’;

Page 45: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

La clause DELETE permet de supprimer des lignes d'une table.

Syntaxe :DELETE FROM <nom_table>

[ WHERE <critère> ]

Exemple :DELETE FROM Employe

WHERE Employe_id=109;

DELETE FROM Employe;Attention si il existe une contrainte référentielle!

Page 46: Récupérer les informations stockées dans la base de manière cohérente. select { [, … ] | *} from [where ];

La clause UPDATE permet de modifier des lignes d'une table.

Syntaxe :UPDATE <nom_table>SET <nom_attribut> = <expression>[ WHERE <critère> ]

Exemple :

UPDATE Employe UPDATE Employe

SET salaire=11500 SET pays = ‘Maroc’;

WHERE id_employe=107;