sf sfsfs

Programmation : SQL
TITRE
Gestion de données persistantes : les langages des SGBDR : SQL

I . Commandes d'interrogation      
Expression de la projection    

SELECT liste d'attributs
FROM nom de la relation
     

Pas d'élimination des doubles sauf mention explicite: DISTINCT

Exemple    
SELECT DISTINCT prix FROM produit
pour sélectionner les différents prix de la table produit sans doublons.
           
Expression de la sélection    
SELECT * FROM relation WHERE qualification
qualification est une expression conditionnelle comportant :
une opération de comparaison (=, <, >, ..., like),
AND, OR, NOT,
un caractère générique :
      % peut se substituer à toute chaîne de caractère,
      - peut substituer tout caractère.
           
  Composition Projection - Sélection    

SELECT liste_attributs
FROM nom_de_relation
WHERE qualification

     
Exemple    
(p{#prod, libellé}s(50 <= pu <= 100)Produit)

ce qui donne :
SELECT #prod, libelle
FROM Produit
WHERE (pu <= 100
AND pu >= 50)
           
  Expression de la jointure    
    Produit cartésien      
SELECT *
FROM nom_rel1, nom_rel2 ( , ... )
     
           
    q-jointure      
SELECT *
FROM nom_rel1 ( , ... )
WHERE qualification
     
Exemple    
SELECT
FROM Produit, Stock
WHERE produit.#prod = stock.#prod
 
           
Composition jointure - sélection - projection    
SELECT
FROM nom_rel1, nom_rel2,...
WHERE qualifications
     
Exemple    
SELECT #prod, libelle
FROM Produit, Stock
WHERE Produit.#prod = Stock.#prod
AND Stock.qte <= 0
 
Exemple    
avec SELECT imbriqué (ou sous requête) SELECT #prod, libelle
FROM Produit p1
WHERE p1.#prod IN
(SELECT s.#prod
FROM Stock s
WHERE s.qte <= 0)
Exemple    
produits et adresse des dépôts en rupture de stock:
SELECT p.#prod, libelle, d.#dep, adr
FROM Produit p, Stock, Depot d
WHERE p.#prod = Stock.#prod
AND Stock.qte <= 0
AND d.#dep = Sock.#dep
ou bien:
SELECT #prod, libelle, adr, #dep
FROM Produit, Depot
WHERE #prod IN
(SELECT #prod
FROM Stock
WHERE qte <= 0
AND Stock.#dep = Depot.#dep)
Remarque    
l'avantage de la deuxième solution est de casser les jointures donc on se ramène à une jointure sur deux tableaux.
On fait une sélection sur le stock
           
Nommage des objets:    
Notion du propriétaire : l'utilisateur qui créé l'objet (qui peut donner des droits)
  Relation    
    nom_de_la_relation si elle m'appartient,
nom_propriétaire.nom_de_la_relation sinon.
     
  Attribut    
    nom_de_attribut_donné_lors_de_la_création si pas d'ambiguïté
sinon : désignation_relation.nom_attribut ou alias_relation.Nom_Attribut
     
  Nom des attributs dans la relation résultat    
    Par défaut: ceux de la relation,
sinon: renommage
     
Exemple    
SELECT #prod "Numéro Prod" FROM Produit  
           
Union - Intersection - Différence   (Pas dans la version 4.0 de Sybase)    
    <clause select> UNION / INTERSECT / MINUS <clause select>    
Exemple    
(SELECT #prod FROM Produit WHERE pu>750)
UNION
(SELECT #prod FROM Produit WHERE pu<250)
Ce qui revient à :

SELECT #prod
FROM Produit
WHERE pu>750 or pu>250)
           
Ordonnancement des résultats (ORDER BY)    
Exemple    
SELECT #dep, #prod, qte
FROM Stock
WHERE qte<2000
ORDER BY #prod ASC, qte DESC
par défaut : ordre ASC, c'est à dire ordre croissant
           
Fonction d'agrégation:    
    COUNT cardinal      
    SUM somme      
    AVG moyenne      
    MAX maximum      
    MIN minimum      
Exemples    
Nombre de produits en rupture de stock SELECT COUNT(*) FROM Stock WHERE prod <= 0
  Moyenne des pu des produits stockés dans le dépôt 4 SELECT AVG(pu)
FROM Produit, Depot, Stock
WHERE Depot.#dep = 4
AND Depot.#dep = Stock.#dep
AND Stock.#prod = Produit.#prod
  Dépôt de plus grande capacité SELECT #dep, adr FROM Depot
WHERE volume IN
(SELECT MAX(volume) FROM Depot)
     
La clause GROUP BY    
    GROUP BY liste_attributs HAVING qualification_avec_fonction_d'agrégation    

toujours mettre GROUP BY avec HAVING

Exemples    
produits dans plus de deux dépôts: SELECT #prod
FROM Stock
GROUP BY #prod
HAVING COUNT(*) > 2
Stock
Résultat
#prod 
#dep 
qte
1
1
1

2
2

3
3
3
D1
D2
D3
D2
D3

D2
D3
D4
100
200
30

100
100

200
300
400
#prod
1

3

Ce qui revient à: 3 groupes suivant le produit prod.
Le produit 2 n'entre pas dans le cadre car il n'y a que 2 dépôts ayant ce produit.



II . Calcul relationnel des tuples      
Expression de la projection    
    langage prédicatif à variables n-uplets. Il se déduit du CP1 en considérant dans les fbf que    
    Les variables sont associées à des t-uplets.
     
    Les prédicats comportent :      
    les comparateurs logiques (=, NON =, <, <=, >, >=)
un prédicat unaire associé à chaque relation
Prédicat et Relation  même nom.
     
    Les termes sont des constantes associées:      
    aux valeurs des domaines des attributs,
ou des fonctions de projection d'une variable sur un de ses attribut.
     
Exemples    
p.#prod désigne le numéro du produit p  
    (1) nom et prix unitaire de tous les produits    
    {p.libellé, p.pu | Produit(p)}    
   
(2)
nom et prix des produits stockés dans le dépot d2
   
    {p.libellé, p.pu | Produit(p)ÙEXISTE s Stock(s)Ùs#dep='d2'Ùs#prod=p#produit}    
   
(3)
adresse et numéro des dépôts ayant des produits en rupture de stock
   
    {d.adr, d.#dep | Depot(d)ÙEXISTE s (Stock(s)Ùs.#dep='d'.#depÙs.qte<=0)}    
   
(4)
adresse et numéro des dépôts stockant tout produits
   
    {d.adr, d.#dep | Depot(d)Ù"p.Produit(p)=EXISTE s (Stock(s)Ùp.#prod=#prodÙs.#dep=d.#dep)}