Espace-IRC NETWORK
Bienvenue sur Espace-IRC NETWORK. Nous vous souhaitons une agréable visite.
MENUS :
Eggdrop TCL PHP mIRC HTML
TELECHARGEMENTS
TCL BNC mIRC Eggdrop Logiciels
ARTICLES :
Sécurité - Linux - Windows - Virus - Réseau - Architecture
CHAT

Pseudo

 

Âge  
Sexe   Femme Homme

Ville

 


Identification - Inscris-toi
Login
Mot de passe

Publicité

Articles

Les opérateurs non implémentés

 
Nous avons vu qu’il existait en algèbre relationnelle 5 opérateurs de base et au moins 3 opérateurs supplémentaires.

Un opérateur de base, appelé également opérateur primitif, est par définition un opérateur qu’il est impossible de construire à l’aide des 4 autres.
Si un opérateur de base est non implémenté, il ne faut donc en aucun cas espérer le simuler uniquement à l’aide des autres opérateurs.

Il faut donc en reproduire l’effet en utilisant des sous requêtes.
Des 5 opérateurs de base, seul l’opérateur différence tarde encore à être implémenté dans la majorité des SGBDR.

Parmi les opérateurs supplémentaires (non de base ) repris dans la norme SQL2, seules les équijointure, les jointures externes droite et gauche sont actuellement implémentées par les constructeurs de SGBDR.
L’intersection, la division n’existeront que dans les prochaines versions.
Comme ce ne sont pas des opérateurs de base, nous pouvons espérer les exprimer soit à l’aide des 5 opérateurs de base soit à l’aide de sous requête.
Les solutions présentées ici privilégient une implémentation avec le quantificateur exists. Vu la redondance du langage SQL, d’autres solutions sont évidemment envisageables.

L’opérateur différence : (opérateur de base non implémenté en ISQL)

Exemple : On souhaite connaître les numéros des fournisseurs qui ne fournissent pas la pièce ‘P1’

Sans sous requête ( priorité aux enchaînements des opérateurs)
La réponse est tous les fournisseurs moins les fournisseurs qui fournissent la pièce P1

S[s#] minus SPJ where spj.id_p=’P1’[s#]
non implémentable en isql sans sous requêtes

Avec sous requête (priorité à le description du résultat souhaité A moins B c’est A et non B)

Obtenir les numéros de fournisseurs pour lesquels il n’existe aucune livraison de la pièce P1 effectuée par ce fournisseur

select id_s from S where not exists( select * from SPJ where SPJ.id_p='P1' and SPJ.id_s=S.id_s )

A et non B



Solution avec in select id_s from S where id_s not in ( select id_s from SPJ where SPJ.id_p='P1' )
L’opérateur intersection (non implémenté en ISQL)

Exemple : Quelles sont les pièces stockées à Paris dont au moins une livraison a porté sur plus de 400 unités ?

Sans sous requête ( exprime les enchaînements des opérateurs)
C’est l’intersection entre les pièces stockées à Paris et les pièces qui ont été livrées en plus de 400 unités.
P[p#] where P.city=’Paris’ intersect SPJ where SPJ.qty >400 [p#]

Traduction SQL :
select id_p from P ,SPJ where P.id_p=SPJ.id_p and P.city='Paris' and SPJ.qty >400


avec sous requête (on exprime à l’aide de sous requêtes les caractéristiques du résultat)
Parmi les pièces stockées à Paris, on conserve celles pour lesquelles il existe au moins une livraison (de cette pièce) qui est supérieure à 400



Select id_p from P where P.city='Paris' and exists(select * from SPJ where P.id_p=SPJ.id_p and SPJ.qty >400)


Remarque : cet exemple nous montre au moins 2 manières différentes d’implémenter une intersection.

Intersection correspond à A et B


La division :
Exemple : on veut connaître les numéros de fournisseurs qui ont fourni toutes les catégories de pièces existantes dans la table des pièces.

Sans utilisation de sous requête: ( exprime les enchaînements des opérateurs)
(SPJ[s#,p#] divideby P[p#])[s#]
l’expression de divideby à l’aide des opérateurs de base se fait entre autre en exprimant une différence.
Nous ne pouvons donc pas exprimer une solution ne faisant pas appel à des sous requêtes.


Avec utilisation de sous requête (on exprime à l’aide de sous requêtes les caractéristiques du résultat)
Le principe de base de l’expression d’une division par des sous requêtes :
On pense à résoudre la requête à l’aide d’une division lorsque l’on cherche une réponse à une question pouvant s’exprimer sous la forme toutes les ou tous les :
On veut connaître les élèves qui ont réussi dans toutes les branches.
On veut connaître les véhicules qui ont déjà été prêtés à tous les service
Tous les équivaut à aucun n’est pas. (toutes les voitures sont rouges équivaut à aucune voiture n’est pas rouge)

La division peut donc se modéliser donc à l’aide d’une double négation.

Les numéros de fournisseurs qui ont fourni toutes les catégories de pièces existantes.
équivaut à : conserver les numéros de fournisseurs pour lesquels il n’existe aucune pièce tel qu’il n’existe aucune livraison de cette pièce par ce fournisseur.

équivaut à : les numéros de fournisseurs tel qu’il n’existe aucune pièce pour laquelle il n’existe aucune livraison de cette pièce par ce fournisseur.

select id_s from S where not exists (select * from P where not exists (select * from SPJ where p.id_p=spj.id_p and S.id_s=spj.id_s))

Autre vision :
(SPJ[id_s,id_p] divideby P[id_p])[id_s]
dividende diviseur résultat


select id_s from S where not exists (select * from P where not exists (select * from SPJ where p.id_p=spj.id_p and S.id_s=spj.id_s))

résultat diviseur dividende

moyen mnémotechnique : Dividende diviseur résultat ? résultat diviseur dividende
1 2 3 3 2 1 (avec liaison vers 2 et 3)
Exercices :

Indique pour chaque exercice
a) le raisonnement logique (à l’aide d’intersection, de différence, de division).
b) Une requête SQL implémentant ce raisonnement.

1) On souhaite connaître les fournisseurs qui n’ont jamais fourni plus de 650 pièces identiques au total de toutes leurs livraisons(en fait ceux dont aucune pièce de leur stock n’a baissé de 650 unités)
ID_S
S3
S4

2) Quels sont les identifiants de projets auxquels on a livré toute les sortes de pièces Rouges ?

ID_J
J4

3) On souhaite les identifiants des pièces qui ont été livrées à tous les projets.
ID_P
P3

4) On souhaite connaître les fournisseurs qui ont fait au minimum 4 livraisons représentant au moins trois pièces différentes.

ID_S
S5

5) Quels sont les identifiants de fournisseurs qui ont fourni au moins une fois chacune des pièces Bleues ?
ID_S
S2
S5

6) on souhaite connaître le nombre de livraisons de moins de 350 unités pour l’ensemble des fournisseurs qui n’ont jamais fourni à paris.
Réponse : 8


7) on souhaite les fournisseurs qui fournissent au moins dans trois villes différentes et dont les pièces qu’ils fournissent proviennent d’au moins deux villes différentes.

ID_S
S2
S5

8) quels sont les identifiants de fournisseurs qui ne livrent aucune pièce bleue

ID_S
S1
S4

9) On souhaite connaître les identifiants des fournisseurs qui ont livré à tous les projets.
ID_S
S2

10) On souhaite obtenir les identifiants de fournisseurs qui ont au moins fourni une fois chaque pièce qui existe dans la table des pièces.
ID_S
S5

Annexe :
Comment implémenter la division à l’aide des 5 opérateurs de base.

RAPPEL : On ne peut diviser la table T1 par T2 qui si les champs de l’entête T2 existent aussi dans l’entête de T1.

Soit T1 : T2 T1 divideby T2
Champ1 Champ2 Champ2 champ1
A X X A
A Y Z C
A Z D
B X
B Y
C X
C Z
D X
D Y
D Z

Les 5 étapes pour implémenter la division à l’aide des autres opérateurs :

Etape 1 : ne retenir de T1 que les champs ne faisant pas partie de T2 soit R1= T1[champs absents de T2]
R1 Champ1
A
B cette table (R1) fournit toutes les solutions potentielles :
C
D


Etape 2 : créer toutes les combinaisons possible entre R1 et T2 soit R2 = R1 times T2
R2 Champ1 champ2
A X
A Z
B X
B Z cette table (R2) comprend toutes les associations potentielles
C X
C Z
D X
D Z

Etape 3 :Ne conserver de R2 que les combinaisons absentes de T1 soit R3= R2 minus T1

R3 Champ1 champ2
B Z cette table R3 représente les associations qui manquent
pour faire partie du résultat


Etape 4 : Ne conserver de R3 que les champs absent de T2 soit R4 = R3[champs absents de T2]

R4 Champ1
B cette table R4 représente ce qui n’est pas solution.

Etape 5 : retirer des solutions potentielles (R1) ce qui n’est pas solution soit solution = R1minus R4

solution champ 1
A
C
D
 
 

Voir aussi:
- [Snippet mIRC] - Détecteur de flood
- Commandes aléatoires IRCop
- Remote - La liste des événements relatifs à l'action d'une personne
- Fenêtre - Comment créer une fenetre utilisateur et quel paramétrage choisir
- [Snippet mIRC] - Envoyer une notice lorsqu'un utilisateur rejoins un salon